From bcce7da22bc932c249b6ee1e60d64c45e9aeced8 Mon Sep 17 00:00:00 2001 From: morkt Date: Fri, 7 Nov 2014 02:45:48 +0400 Subject: [PATCH] added audio playback support. --- GARbro.GUI.csproj | 4 + MainWindow.xaml.cs | 58 + NAudio.cs | 83 + packages.config | 1 + packages/NAudio.1.7.1/NAudio.1.7.1.nupkg | Bin 0 -> 445364 bytes packages/NAudio.1.7.1/NAudio.1.7.1.nuspec | 14 + packages/NAudio.1.7.1/lib/net35/NAudio.XML | 20853 ++++++++++++++++ .../NAudio.1.7.1/lib/windows8/NAudio.Win8.XML | 12401 +++++++++ packages/NAudio.1.7.1/license.txt | 31 + packages/NAudio.1.7.1/readme.txt | 72 + packages/NVorbis.0.8.3.0/COPYING | 20 + .../NVorbis.0.8.3.0/NVorbis.0.8.3.0.nupkg | Bin 0 -> 42909 bytes .../NVorbis.0.8.3.0/NVorbis.0.8.3.0.nuspec | 20 + packages/NVorbis.0.8.3.0/README | 120 + packages/NVorbis.0.8.3.0/lib/NVorbis.XML | 672 + 15 files changed, 34349 insertions(+) create mode 100644 NAudio.cs create mode 100644 packages/NAudio.1.7.1/NAudio.1.7.1.nupkg create mode 100644 packages/NAudio.1.7.1/NAudio.1.7.1.nuspec create mode 100644 packages/NAudio.1.7.1/lib/net35/NAudio.XML create mode 100644 packages/NAudio.1.7.1/lib/windows8/NAudio.Win8.XML create mode 100644 packages/NAudio.1.7.1/license.txt create mode 100644 packages/NAudio.1.7.1/readme.txt create mode 100644 packages/NVorbis.0.8.3.0/COPYING create mode 100644 packages/NVorbis.0.8.3.0/NVorbis.0.8.3.0.nupkg create mode 100644 packages/NVorbis.0.8.3.0/NVorbis.0.8.3.0.nuspec create mode 100644 packages/NVorbis.0.8.3.0/README create mode 100644 packages/NVorbis.0.8.3.0/lib/NVorbis.XML diff --git a/GARbro.GUI.csproj b/GARbro.GUI.csproj index a532d932..cde7277d 100644 --- a/GARbro.GUI.csproj +++ b/GARbro.GUI.csproj @@ -83,6 +83,9 @@ packages\WindowsAPICodePack-Shell.1.1\lib\Microsoft.WindowsAPICodePack.Shell.dll + + packages\NAudio.1.7.1\lib\net35\NAudio.dll + False packages\Ookii.Dialogs.1.0\lib\net35\Ookii.Dialogs.Wpf.dll @@ -141,6 +144,7 @@ + diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs index d8c64ce8..142f4ca4 100644 --- a/MainWindow.xaml.cs +++ b/MainWindow.xaml.cs @@ -44,6 +44,7 @@ using Rnd.Windows; using System.Collections.Specialized; using System.Collections.ObjectModel; using Microsoft.Win32; +using NAudio.Wave; namespace GARbro.GUI { @@ -98,6 +99,11 @@ namespace GARbro.GUI /// protected override void OnClosing (CancelEventArgs e) { + if (null != m_audio) + { + m_audio.Dispose(); + m_audio = null; + } SaveSettings(); base.OnClosing (e); } @@ -707,6 +713,11 @@ namespace GARbro.GUI var vm = ViewModel; if (null == vm) return; + if ("audio" == entry.Type) + { + PlayFile (entry.Source); + return; + } if (vm.IsArchive) // tried to open file inside archive { var arc_vm = vm as ArchiveViewModel; @@ -771,6 +782,53 @@ namespace GARbro.GUI } } + Stream OpenEntry (Entry entry) + { + var vm = ViewModel; + if (vm.IsArchive) + return m_app.CurrentArchive.OpenEntry (entry); + else + return File.OpenRead (Path.Combine (vm.Path, entry.Name)); + } + + WaveOutEvent m_audio; + + private void PlayFile (Entry entry) + { + try + { + using (var input = OpenEntry (entry)) + { + var sound = AudioFormat.Read (input); + if (null == sound) + return; + + if (m_audio != null) + { + m_audio.PlaybackStopped -= OnPlaybackStopped; + m_audio.Dispose(); + } + var wave_stream = new WaveStreamImpl (sound); + m_audio = new WaveOutEvent(); + m_audio.Init (wave_stream); + m_audio.PlaybackStopped += OnPlaybackStopped; + m_audio.Play(); + var fmt = wave_stream.WaveFormat; + SetStatusText (string.Format ("Playing {0} / {2}bps / {1}Hz", entry.Name, + fmt.SampleRate, sound.SourceBitrate / 1000)); + } + } + catch (Exception X) + { + SetStatusText (X.Message); + } + } + + private void OnPlaybackStopped (object sender, StoppedEventArgs e) + { + SetStatusText (""); + } + /// /// Launch specified file. /// diff --git a/NAudio.cs b/NAudio.cs new file mode 100644 index 00000000..aeb5e0e1 --- /dev/null +++ b/NAudio.cs @@ -0,0 +1,83 @@ +//! \file NAudio.cs +//! \date Thu Nov 06 23:27:00 2014 +//! \brief NAudio wrappers for GameRes audio resources. +// +// Copyright (C) 2014 by morkt +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + +using NAudio.Wave; + +namespace GARbro +{ + public class WaveStreamImpl : WaveStream + { + GameRes.SoundInput m_input; + WaveFormat m_format; + + public override WaveFormat WaveFormat { get { return m_format; } } + + public override long Position + { + get { return m_input.Position; } + set { m_input.Position = value; } + } + + public override long Length { get { return m_input.Length; } } + + public WaveStreamImpl (GameRes.SoundInput input) + { + m_input = input; + var format = m_input.Format; + m_format = WaveFormat.CreateCustomFormat ((WaveFormatEncoding)format.FormatTag, + (int)format.SamplesPerSecond, + format.Channels, + (int)format.AverageBytesPerSecond, + format.BlockAlign, + format.BitsPerSample); + } + + public override int Read (byte[] buffer, int offset, int count) + { + return m_input.Read (buffer, offset, count); + } + + public override int ReadByte () + { + return m_input.ReadByte(); + } + + #region IDisposable Members + bool disposed = false; + protected override void Dispose (bool disposing) + { + if (!disposed) + { + if (disposing) + { + m_input.Dispose(); + } + disposed = true; + base.Dispose (disposing); + } + } + #endregion + } +} diff --git a/packages.config b/packages.config index 316816f4..133611cc 100644 --- a/packages.config +++ b/packages.config @@ -1,5 +1,6 @@  + diff --git a/packages/NAudio.1.7.1/NAudio.1.7.1.nupkg b/packages/NAudio.1.7.1/NAudio.1.7.1.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..3e212412e906dfdd9e07667ca0f289196be99063 GIT binary patch literal 445364 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�sa~y;iQy@U%Xja5BNm0%I}mvo7IljJY2P{ z|5;W1d8xjxb@5mC`s5L+?ad?j)YeILy0y*qLy;yT%ILxS$bW^T8QY;7!@`8dAGN@e zwcs46-n1IBaFMRgmo~DOdcmBB0mTA65e3@)CS4JLQK3G>nf{X)9xTZ0S82XyLsRF@ zS)8vGUDL*IJ=AdnXn&oVo+9k4K4QHjT1e&WJE_x~X6AHui$zezjl+|q>Uc%%O{6TMjRdN~)!!^IHf#Q%l|H`!8d+^qcf z!YPrBmwu12v>th_M`ioGvL>D6k))IUBj2Kdd)@8ZU8h_Pw42=Y;HEd1w<{8agx0q^GT`sqm3JCa5qd`2xT_?9 zlfZ6B;H`0}mx8R>m(=D(j8AmUVh}vQF<_)|nDnckZS*cPZ=4?qsdfoyR9T zYp(3#?1ljK@EY&n87@d&yiOfF>q91$#^s}$a*fpYcP4eJvj>+PcyG4(9J07j{9aEP zvp34|W4^$5<06!tumifxMwdD0{Z&QIR{*R|Q!-uY6O#8hr-w&w`_;#rj+`~UgHh~a z6uQ`j@db?J%*c6j$XLN3>xBbVDm#&ZNNW?OHl6{B^;el4wybh{Rh4*Atmkc;LZ#o1 zW%e2+!a_F$tiPcyqIdGgiaKq4IZs2i{*E{vkVCv|r^0w;2GEM)c~PGh>tYAMl-AF* z=3Pz0}r2e3#);LOjAh63Fev3kr@?+A6PK(Moj~N00RCl{K0P{TtVB1 z485a{%cjHdXQ-0|y@%>*0hoGCUL!C!9N^yRQg6R~eog7Pf1p^Do5n+>7+u1uwxD}Q zRuM_8va`g0PTn^1kk`+}8>Bl%p0Quxh3gl++Tm;^2O~0?>Fwq>gF;x=%C?SnxY#nb&wYSpVPu0 zKUVqlP&G#ku@OT!B4Q)RvHyW1n|`DkIXD`Bq?)>S$~|#OKSynsYAr_$wGl%(qRvLt zal|kiF^nVXZA3js#BD^JBN8?uA?8fH(huM}8|V3cH%?kKY?+76o5|)EGW~?LY<^|W zG+w90Wb+#bs*%kB2db6LZ4NY4HYG(sb+Rb~1Wo^`{kxX-5YBv1D!Kat&$#~zc$p(? zEX8~XmBYjE$~}TbCFeGxl`?`RUrZlR1T_+o^Bmy^g!MZ~octaR=+@W4BcR~5pk`1( ztK#>#mVp;fawp!g*(Pru2LVF63lN3?WeQ#>r8Pk)I_2!#vk;YjvW}fAuV?%uuY@wL zfbfNpth~uRirjR&WnsA8URCK9h&LC&`bD+VgWYDkrAK1J#(do2XkSr9<} z0lv-u++1EI4@97y4P_Nn%RWRT8(fLJO_(MZ#ycJ{BybWbOZ;@^c`$jBG)Z11o)?oR z6IE)EC);ku+sBd82umubjs#@g4&Qkwn<|CoADCR5(E#J_(ailvbho(NV^p?ItKz;$ zrnjC39%_Z&$~W6=pz_L(cA%J?M@mbN=gKQT#(`{QM6uoWgd#m@_eFdT{2?3$ji(&r z+jPsJ69CAy|2M8Lg8nY=}2o)#~&;nL`Tje#=0JfMY1h>qjV8tK8;Fn z2f94?jf^-Rh{#=n?6s>jRZX6RJvIo~eRwypH}4BI3EC;{?Zn@Jrg7S6R038K_2}i) zr%eEKQ`D8DbsOR%g$X+_juax1o=A`ND-6cD2)zsvV?`2CW15mcmB*&Gf5%%O@s zF7?oU>XFo^{fQKT`HaMWN69Pg54Cmy`TZG?O~LE}DDm81u$UDal@loYR@$KyEPEc- zj_k$oHlM}X@f?PUu`9UndN}$ez_l>$ObjqbpoV#Z85WF*tGYsR_7SA936ncu=rZ7S zC|=nXiLxO0lM~UkhVMEp{quNS1onT3SEf{p!tjk?8wyKHH?Jc@Y^H;MgU1b zAb%7h`eP*#{VZZFixxD35!Y3_*BQYmUX(BlBns{r=R0JC0IKoBi(>PBv>7rA%Ezds zPLfny>wT2f^v8WI`KsA~fr);T|hmeo& z54Bb+;Gu7|IMy7F&i0$G2T@PJ@yxZ$;4AnvL>=8F>j8t_YKF4be}{fC4%fHRK& zzBy!gn{)tKmtZC!L@4(%=F#tq_?FMNULkAeRivz?B2}8X8J()%z?*EiKVV-&a<4-l zqYXroqL1-IlgEq3{p{?J3~GM#M0UlC3|fBVrMBKzr3lpbMXotCc31kos<^{liwCGn zg`!y*KeTf##M7fI<5N2EbiW>38E@;vbC3GamGRCQ@y@m}S}lbS`64S5c)xxZWGT9m zuD#)8B`EG+2@cIrSs#x{R?di5wl&&3Hl~L1 zyVm1@o(zc~`y4h_cBwkg+(gWroX0#;5E*pML{grJ%FHKHh5fi{-j7-6QL{m@*Mz|2 z#q)1Qu95eZNYcAK>)Qhc{R_$zS zUm`I9-th{eP07@Z#vh1_1eL`dI3L7AnE!$-(3!(7tC`|8@ucyt!O)D@?2xasF5 z=lc)`?O1L>#Ttjg8BM~eSy?}$9`d>$602F+h>yQniKINyu&ONXq#T)VU`5)SXpDz< zeK(B7nE=~{DTbHjtxK^?_;ed;y0*(oA+t3*^CT~3J5ZY%E92HJ+GsY#9(GRQwfsOE zaUe$=WFrpZh=Xm!!5ndjjW~oO4z&@7a>QXa;xLXl+(sPE5l7gFBRJwn8*wB@OtleH zIbxcPn8p#)ZNzkLYS6wZv^8c*?B_?a|*yP(y{Y1nbi?-BpIq`QL0-7qLV{`ufRvnTc)d9Z2yFL5!?{VIRByHl1V zyg8*Gf3Uc~=#KzZvk|)A{z(irQo#FY2pebjs^mByv6^^A?oFuv4bQgY2Fn_7_G3Gb z)#TnH^gaTOjiqK84j~$zoglE2UD$mEc7GRkqQD+NRV9db`0@0`wy(o*5O6e&ROLK= za|a>jC~$4AYy^w;7}eeeK2V$F`-iKf>PD%O-=&O^NT=d2h2x$)rMWVDR6E#*C&4TC zHrbM-sO3D8wGP+qc1l_tuh2S*jDJK`N!C>G5AqPBhi4xJDr_2uq1c|YchKNu=jIsI zBOq2p_3CsRv5sp!ggz2au-+)=F&oVZJ3r)yzko_%rt9JqXz4!pgO%OwbH~0B8z39A zuMBAQvv4IlnqE26cE?=q8gg?x5%({mo#khpc5eP*-I9IBSopI;*95jmty z9+H&vC>&nf5KDBE_t-&#*}e7=2QGIA49x*U1Hm~vB{*ki1ZVGp;2eh_w2~QIea~fD z+pRaQ`LRbjxt2HD{Y0ZZ**y_pe{qiTLeM{F3LBPYcN&%4yI7BM@1Y@7T}H^T%0774 zcY8ao<EZm!Q>1{pV4b2NOeR!P>U;Whl$R%EUHW{l;J@3-%@%rUVOe;E&x!F01P0~zaM zOvm&$={~>p2@*LDgOzx62%B>2}iEFJcxP84zfE#fAfxPxPXIF1EsjfSrdW7lW5 z@0M|XV~b8>-Hs0jibc)(3{`S)!f)}G$&%Su`)lAMHXo{lHw64pwCxC82dh}WgDBbO zK!oN1Hp9Q*;N@iib49GNe(NdlZwRaVpk+4@UOWkO$b?nEQ9PIfqbbmkEkfXk=^?j& zUujX4yTjm)arZEA*Kqe9;I8HFvEUxc-TQ*Oj=K*8_b~3B2JU+9&VW1a=fG?P0t5_% z`;jrupP^QHO&QSpyiZEyK>URYJmffxTVw}Fbm{?DW9SxSw8oahgCla(DDA(2S2Q5| zbFbli1K4A!!W~el+V4PoQ1)AoV~=ttqShfQWTSqADBOr)Bklr3s!&4dw}|So1Kf?! zi8gc(LQ`$%UW7Vr=stv6ZRmcLe)p6^4{mMaJe-i_AcJ6w9z|LJR7f=3w^c z``X2ehb7(?kPo2!CfX1-**kdCz0+>GcXGsUY{YLk;w~F;7f0M}Bktyidu+r#9C5FW zxR)dDvk~`k#QiqnevWv+Mm)d~zqJv+RmFPK*%F^SzYy{g4?2r}XDfWsZ!tMyvUveH zYGkvI9JR9fV{#154(ul_qNTkb5Mr2Yo<$C5QvKwJ`(^W7<^q*+5xK-f`-3)H4{|;q zu@R4O#Dnf0nDLG0KF>y-vjTMvO}W`iLJ{~bVlzk7zeZXs^ayubiif80tfh{2Dm+A% z=ti_etJzn}BQBbGuJADVsUFl^&?yIGtv~@lftAN2Z0;7v66dh976;j3HB3j>^B7+z zYME$y+1+??=W-k#Gn{TM!v!Vw;XmNPmynQ*rNb+lX}y_&B}mKXVY--beh<^#0rt&5 zYK!nuF2cub#A6)sxQ%$6Bc8AkPjJMOHsVQD68A4nv+K)27s?n5~j%l0}~f0DZib;4>_r?Q5*aWTkR>)=_yb*_Nx zsrLy|xr98d_bHE)@DOR0ap9GF?DNd*9w7JlEP>X=40;cE3V)+rB%?=KLWS8EEZ1dhc|FT_*FY{u3#YVis5wF^aS2^NeHi8`MvKLS)ui9xd65NSY z*}0?A_6ao|?}IgRzxjUc^A=b6{o3We-PLY4V?$KvH$DqnT<+Ih?tfDIeS^2{H>hoI z=56~m@~fbFQOVl&8=`GDI&Hg8v~3pF;BEUgYTKLLZTk+^wl`DT-oV=Sh8@~AlCi2p z+peIt?Lt~%-nI!>&8z1S5C5&9V-y;$7;^4@?9SfAY~(&g=Ue3bB|6_GXAYh3kn>7( zzUzd2&k6g!6ZQjg{vDnFR_&1;GkgMCcFiQ)^hrQN$ld^;yYtkU0TkNj17`npp#Ad^ z+CNp?{`u!5$Nu?Xl4JjTG0Cxiqz=da33NF2Pj!c5|I~Ll_K(@&*gvfuj{P&S!)5;* z)FJGjhU|0%f*j~VAjE+=2$XSPAp+$bI2(Zq4qSjhB?p!wVA!Tr2Q#hk~i9@~4qMd+}!qe~#hLEdHFqpML(dUxFhyIge#;0l`#b`*McCDqv}dNu38E zRs%~Xa1nr56)YctrvQl6!SWM$G=T3paSs6SeJAcX06%czHUNm#!wL|{Y$<&gwp4J! z8{6?-9I9F@+TTz`XGtwnHDpQMNC-*>jdyD+!Bk}#Yab(a6=A7PGybnY>=}fm`p@!w zqX_0EMs0=3h=|=wSmNn1AvkpKdMbw1X>^{2(IeH~YJ*gp*BqC%H?#{7o5 zCa7f}=nxw<+&?Pzx|V&y6;~w6ejTiaejO~tV*7Y(_m70VCVq#EtudcRx?v+VS?l+x zFq7AbW85F31hQ`csltaUoiP81K0Sr4D$O6Nbf+V&Q|B=-TUN7w==8%5+vHumUISej z0X+L=Rra0d(v`#E0q|MSeS09W z;@_>z(0Fz-o^nPlBAb828RjeKfb-MnywW+~Z0{R7-`O8%cTmawc?Z>GWXJ7a+B?aL zg=JUxgePi$KUH0$3+(f8lzIWS>t~UuZMFn8DsQ&LisfDS)MaOU=5l}Ta)04+f9Z06 z#oRHFWZ`S(u0i)V%uV*qw=VZKs=Kvhe+(5i?C9jF49VVB9Wx(>ar1$2_1t`j^Pxe| z%dILmSoTET!^xGncL!IZolXq5>^16&LOw>|#{KPGF5_fh?#%y3+q(cpRbBhTGv~~lb7m$9nIy~%0h0iN z$C*ih1Q8K=si3H+h?s{8f}%X+=ovs|7({$lc_>=7)>^gJTKl-If9q{+Yi(_Z ztJb1zt*zF2+uq(jv<=_-t+mf%l0dEZyMZ}-@3q%{t-bcz@3p}cwQ)Q+1f*ImQTh=; z!>T}!0#rw!!f5wPb0CNZ^mgtWb3DM8L8}j3G(l?&Tr@#T z2QGhl-sG`Ilj4`*9$@$&e$n}^<<;Pq--qUI6{P9e)131ReT&n@G&oOUXDf}(8+?dS z4nnY%d>a`uj(KjpjNBPD@84_0DUoYr+APcFC}O&>#x1zNodfR7Rm- zt-~q@!Q9kB-~Qo;vJfmHHd~KDMYBe&Eo-+U)J7fG;77(~7Y(M<5#(r`W1xE3I)pZ#*~1_HktGskAZNKHi(hL6@fJJwb?Kj|x%-UJte03AJ)> zumTDfCL2{bom49?pNMBxGgepEOCNh^_I%-n6GY}_ROajxRd0~>8go{)?wki;%SNeQ z0Sk7|>fV)N>&|b+W_4EaK^R3+=lcv^e9a>AN++S41Ec!7*FVBE7#pwByW37&U!!dT z)H3bVPv9(V=E@G6=I)b9ayo#S73$t@VP|`qHVW z;e}DPzG3ovao0o6od#Ajvd$uKWY#&It6&U8xW>OV(ltRi(q7CN5dO>dWJgGi<%H|p zdnv`#)W>=7hzPjur<^iWSkJOrF!736IHvo#i%@ZR_bj-pN)?t55#MSbdCSc1-jzZ0 z@=hpw_6$tqt5u17C!B~%;tcv^G7?#~M?#Yn?B*r|3{!J@fY{4<>4Wu5ZrEpm(AVhB z*-_S;ULWbI(WI@}H8F0J%+Cu40GC8rhpoO^(p=rgR{?wF?z3GNlO14WnaAo2RQ>4T zhkWXzdib3ma!QDf@x;Spn8m?cMa6mA=A{tk=Wq$;d;AgR&-{>lo&T47ogb2~2Zh@k zy6H479$b8SeP(4m3jpT&P?w?EEs78agAlJ!`4H~#l>0Q*XlYqghUf=#;0y@Mh?Aj% z85TRMf{*ip1A17>tve{AeYTsSy#hyB)!ode`qf#@BFQfSy>#Sub;q9Vpn zq~^2hxE^~0j~P+x&5F~S$JBNGEh}cJJDZL14}i%}tTY-buiS?Dla8-W8>^kwemN{>jR-yN;qIcY z>(HRAX#(WE}Vy{*{g!@Ot)RU|tf>(mam(A+y zCFzT}O@1Sl`OFj(Ze|=)%o@$gGN*WrUqpC8iEx-a-1bDc>aUOS`fK|_6qV@k_$>OI zGP|@Eg2MqYYhMJz?LNjA`E9Ljfymb~_Qg>(zdzBBuc+FU=Cvz|_M-3D2P2DQy>YfZ zURfg%dkm~u+lFBm@D*lu5$_63c$9}Im7U8tGK|?;K(@ zvNT}LrB$O5)GO}z?%2;*~I(nthmG&#QY=oMmcw$Z21Xsv3I(0(pajp4HaC z5y3{vq!|nYRIMdGL?=Ias7`)zsFUY4Fx>BMlzZe`W(J*pkL0^Isb?nEsP;DnWDf2S z8(e6mI%T!^Qj_V5`)6&!V*_dkB1H#{4J3%pV*{>W=8B@?j=>#Pzs4uVOP7Kj4`((Q zBu4BR)#5=}FB4iwAuCfwNL*GWJ}{lDObLk(B?DbgW|a|)HS!~EXCt>Mz$VrSNO#Hv zE3|3lBe*p1o6sPB0@IyM2sMr!+3pJCjSHclC7@s|Wb!%QopPTN9Su#%PY}jgtr=3D z9*Ml$o=#<_K0$mW?$jX-V>k zgK*1&t?J5-B&L;-fnIf+q%7H=!PL4uij#;937NbLo&@Su7dsSAvLR`2LG{(}%hnle zfJjtkrYaS_ERr;ixCvN|@xmCqt#CzD-fKuq(9=e3+DOMH#nMJ&EFI7B>pn*3%L$&A ze4m(O-{tfA8qIX98eoNFo~2kRZT9+BtCx94^r%2{gycKbkm5y$)iaOBGY)D{EV ze%}#~+(g8?32RHMsO9p}zLeIoTx>O3YrV48W*g(C+%4g6mtpQ{j1?LbjO=FXuqFIx zQ4D85+i=GIuvuimVfVuhA`2MpNF35sz$0mh6`A_J0PZHEW3vi(Bo?iw{z80qd*L64 z&&>hwNE}9+`gH-k4#16KM~;sCl-U19M$fT0ppQck8YhfS(VvwoGUacbJ#R1v)IJ>SoqNRqYOy5zjo{^zpWe%@ep%PhCGdPI0!t1 z%0I1VJL7t5{iM-+5mx7|D|h;_o>lU&H7fJZ*(&H9WghLx%%c@xRy^XpaWIMKbTjy+ zSk#y^grC#ex|bukj_m9s81*E1<%N@G-YEN#z_=B2i_C;fxPBf59#@Lq zMq+i?q$=O{eBVq`-C;EO#ZH`z+HL&xsZg-l6BYY6a;l;JUKcQR&3 zdijSm`$Qgy%HG{E+@IkqL@K7->;1Iyi#0vQjoChlIoe)=ktU#aFWFQ`iMT}^`Rnxz z`26xo^-L-EaYXmLY+&x;^t?S_oPoTJ?X}jTcvax*hA$O_ju_Av|bSQBA|Y%?oJA#pkPr zLs5I-abarDRjBjCWIB_yif5TYq||z49t*9?adEY#{de-a9c589!rf4+v$WF+(Ip3I1Rc*wHd~3C zQihv5-s@-N@QeSXh+9URmKny z3LCfZxc}NH-v$Z0#%N7;B^JE1i#v38VEy4bu)AKw73q)gECGQG=Xwa|AdVYkTrIiS zrgCvPH(N3Fj;tz%-fn94)jW5%uZqb%cs=q{O7G*$SHNj+*0T1MOh3e!;XLZjc0?ST zhQY54_mT#WzYc2_sn{`Hy6KL|0`Dl&kd#MYhcy^7Kx-CvM*|H>Wk_ZjJQ(YO0w9bX zv)!ST1r$zx{~6O_RY7B6Kc?v+ejnynRW;r|2yK82~-b!#w6hpkVH)$2g!RHk;`x>cSIk(Up8F`qegF?f+C-Mm% zD`Zn7Z#X5BQ{oixfOR^?Y1CNuVl3}9g|lOE5wl6c;e=nPJ}RNqb@@f^yes6$_S6h7AwTaBcKN@)URApD?cSK~;d^u+^a-tD2XfALUc=LL&fQs$LC@apG(Ga(3 zE|*+49Y>r@!=_LL8Ul?pEoT>IkjQ^AL9UxI(um1rA?Fs(OXn*T`lDoR|JvTVhIoHw zmahgQQ#J zNarDJO^l6NtJr3#k!)AZ=za2cd9siktp>AOl8ItlVlYZ7gu+j%+#U@bDyIgQwYRHf zx~tR}2s%+7(fD4tr$;1Kxdttf)x{}2B8@eC`dq08aXtq2H{Dx~_YMoC+`D|4Zt&qO zdlz~`YZQt5cLH&5@bMMu*UqA6e%Kr6%Q zY>MGRq<0py^R3J(xhDEUUZ6o7*{&FXLlq)FKPbfH`9l>Vq{FV!Y-+ShcknXK)V)ML zBW>C9F_*JwdTlwUkaZOnBgpA2WYL5irVXbY11_@_8Nmc+LfYaP4z&8n9A{EJ6fUoO z1t(@cjy7|dmQJP<_Dx{t3%$TwWOk%Nd)^B?Zw#%vW|1!#3R-|XW+}#shlUE2Hm$YY z6SD5v^Zi?-p?T;)#F@3wHJfnm#0uo3e5`ngyBh%oB2TF>y@UG|Lr2un?slFKxya(f ziD{F^9mbG@WVI|ICv_7u+i_{NCS60~uEtjy=-pez_;)*5K1;tE)ec&u2GCbBuWV5K zf3?s58sFc#hvjk1`2>sj!y7dFF6IyJkEB=X8f`lNWEZ|&ji&Bcah!c}K1rzKvow#Q zV0S}6JuaH#jt(@(wU5xsXja9vyMjuthp6nIZ9C>9ktYvoZS>u@q&0UgZ2KZhTFzan zsVlL|ma6r#*4(nCG!61@$|@-NKkw;ax|Ym)Luae+J^>RHzkW1(XUuy5hv~sk=N=R$ zlPb&-ikZy1+%eS_niA42Rh^?&s+`^kt8$V~h!g1i&uZOu$4A;$dVQfDxq#Z}r&uO# z;f_w{8p=*extSCF!>;zdSepM-lofulW+;dr)(qv`hc0{+w^ZlTuuDwOvm9~m7s!S| zkjttenbg!DV3Z@Jtx>5!HiS}fJ`+_8T5Dv26m{nkUd^$%f8-9(;$9^)e!L|;x>;yU zn@l>acQugQ!$_JyigGn+vxvLv!Ye^KiJl9adm0UaBt-R3+6WbvJ!IJ}ZLF0wWYPS~ zWu95sH{g=@?8(wrUWY8<&Ey^dG2D@ z4z<@eFx;+xE8Go3rgy`?5pLIk!Zq9f0g(Xx(Y~Hsc{B3bxOaC))B25jFf@1`-Oon= z-*heakssw{e?T}4QB;rEUnVSfwGHaE9&Ug%81VX3Ig8f z2lT*?0Q|rp@WTK<=7VLvxRdh#X(~Szz3tmNRya|+r>I|4nTLj8L;dnnUB!7~YQtjo zXDQdi;%tN>2RoEbA0BRe!Ku&Czx!^Tv4S2=3Yb zg9I(hy5m?fseC!kJ4oKtkeze6_l|XEdo;cDGHQ1&cgfWd%zSh}G9Khh18{KV8SypS zkH!2uF`(0D6rEmVI=wgqoxTn_{VkxA=s+L9!w*&Q@bAFGKLHOv%sl*1h=(7p=Hc%k z_E9H=c=!#)!w-je`0ap)BQlR2speczgoEfCBKEfs)#Q`>jGiq%y8S(PEIuj3*MQsK z1^7}QyhEYKIHPg?+TRAwE+5B_@=3tII{@bWw+^7|=K)3UJw&>O zh`wW`{W;9`??#?KKYI>9;=sPd}n~`9GEUHD!KXncol|E`KwQh1q?)_P#)zSv}j++PY-f z60EMz(8`YytQor9uv)L&xdHB$0q(5l#+7*_^<>owuhSpcD?bA3mGN!8e3GTLUe1vG zD%LQ6k}Q5ofV#LHp#c^i|2=`n($64iEN60PEN8X|aL{7q?vp}`mCq<5{Aei5mIWb9 z#$cY9qp3F;dFa<#-%+b<$yrei(+WhIGF!*?9E)dAa32v$A5d+$lL*BRW0jzVKkg+S zNk6DXo=3lvB62qoSDltbSY0(#m-78Y9RG&~t}7#aOol}|F+D%Kb&rUK2=PJ$IwQVD zzi-j+d-S6bB_B`1(hhD*{)&EY(GQnL|A&6q@{B?!4*hEB*GRt+^qblY6&x#w4taMQ zfA8b(qx^k|zwhujc{0A^`8$WdOZmHzzt{8kUj9DH-`)Ium%r4n(03Gnr}1|If6wLb z7XIGI-!Jm_JN(_t-#_p-b}GJY{GHC|eiopnb@uUGzh_q~Pw z622W}h5h?tRnJZC2(7Imiap-aq5MuyKk-)m&u=F?#2+%`5x zxCgV@?B>}V>2|O=%I#$HAa^R8E$(zSTNCaau_WEOVoA9tvSrJ&YI)Pf-e>+1>{y`t zi`T{M_qk=uCP+NP`_wjOMQFTrap~cnQ*$lo5k5)DHQinmV-?S*oaPPlWnQK6wR@!#sHiOkRD22cFkP+`L93 ztK&T@^SkuSgp|81$N=Mrx4x>Ir~ES3Ia&3CQr9&5;{@8%?!Ak^3|ib%G~_<+15{?} zHM^EfJXk%3FbZ+^6+#ha8ngL%BzVWbEwtUte)#&^ReKjzZ=qo@;_WdtshUB6LEAU) zEedbnFp8_T9b_8{AiEwV;5^Oo#PeB7SIpDrx?jnjpN_ns~+99b+ZoLej`JZ7soqORM|1SlZlQief5FN);^_qSp>(fx;5PI5D6v1Nf<6wAr(bg`V`o+y@6-8Eua=-w!n)7*!} zvdG;dmebuoi)FFfa5h`ca684)?RJZ$$Guc6z3wit^tq3SvSk7|a70cOf{Svk; zar0tX>dqC*IqunFS>|pP%X0T_v7GCES1jkbzZJ_0*I3Gy^W8CGxxk$vmX+>&v8-|z zi)FQYfmqhKu2?Q~w~A%0yGtyNd$(9Fa=$2+i`^&1;<|gpQgYuG%R0ATEbHB-bJ()M zEsEt5caB&tb(f0eGWRO6Y;^AuOWFOBST?y&ilySdA(qYVdt$lVtyu=kmgnQaIRLy< z|KPxL0J=KH;mg!f%RHHC`mi&X1J(~iOL(-FCdMDG+M{QR%%~XfRsx%dlf(vH_eNV^XaSeAopXzTBPjOin0cp zXD$yEHz4c>+P5~wvF^rf59>u#YmAFSd%TE=7w){V$64N-O17d$c4XW(N;x)g+1u+> ze;f~XrGFB#zZkOrG-Q8Ck>kh8{E0GOROU~W`BI4QpqPa38*inYj0#kTfjoTG7?E-L z`Ks|x0@nzMSh<=ddgU4^i71y`LzZ*Q$9gmf==9@wuowQ5kp0Dw{ih-OOQ9~E=lq!1 zd=7Ox3B#7s7tm(1HHBvX$lzZiIRBTaDVS!$`69M3+ka)4&VPVtFJtm7bFSVh9?{A# ze^6F%A6h=(2*b(32NDZJt}{kF)pH|yf=t8V%d5g)godgr#;0$9_h z>T%xSdVGZ^#p>X!->?B~844H%3H?d@L_W_l5JhH94N1*V5`g#1DnFB!9uu7u-T@5( zLs1sY6$+qF8BX9;F99Rag)rNbO|PCC)`j59CYusxwT4`RKrFpB zQ1rYR;?h?`lH}(h``(cKHDAI!6goCE{k#FquSK=K?&mA7hi56mUI2ykygeDp!|Ow} ziPs0U3GAT_qf-9|WYU*qKyWD)IWq%GDZBp)&YJ+)@(?6mgVsO%PXsarsh1ZJYa29c z+n>CZ!OB8n=myGt39r?irX0YooX(C!{+^iDZQYkyvFBo1s8l{Dz1n#EIxkIgNtU#g;NfY7@l<%WlJlS%@eNkum}d zMSzrGH$=;u2*W-V)9#c>jWk|53*$7;8@3ueqRGAAZh}WiH(3h*SG7nI@7pc{WZ>Dk_ z!3rG;t72fi*7MAYr=P|f^kq;8JGZ3RQkBqV0S%=;>mU9ejylA)y;p@>xKOhfhY{ob!~YJ% z__n`SBOasK-C;zdfB5@AG`788jW{w~+D%&tR9+9-&i5%^4p~91-efhs>WmPndXon8 zeM$nDl@k!S{HwTMf8}4JFT4teMXmOe(7(NFnb#fnCz?j0-$#Y^}TC$_LzFL4yrPy9L#E*uP7 zY$A>&5@c4-v3e+_{iJrfSBCDYwBi#dax8j%#~d~%c1#m^M`xjvA*V?9TtCE*{g>h} zB$?-Q4NesjCZEx;sZs^+VcDU2x|4a;@D%!r1gTO#{)%Rw8Ry~IFL*>!VTOxWel6pX z${Rla^$&+s(d?5rZcX3)w`!3IXXVW}Piq-T+XPqnN{AB5;Ppc=^Yw)0*01n(;yz?% z{ucq8?JI;$hR{XJ6KeZB^6yN!GgkOI7dHKdTPO>Ad+Q z=VcKjY52_$3gHXg+Hi>~Q&~?&;V?}i(#mi;t1*hX815{iW%C~XI7Y~Jb1=b{kPa90 ztNf}FLgt%Gvm&f5&;xArcilOrpr93$)01;)MTgdYuY{^_${!loA09xbOBJ0i3Fvf* z(89L`j9+wQD$E7|!qC6FNSm>cjB5hzvRU3eU5rdo3c<##%Ho*FS zMiXMYR>pVRpZ%`!Odl;)ISZpkam4NG&>C*^n>ydSa)wNc+Uti*Or=#hJ4m=LmR&k1 zZPZnps;l8i@3aIUZT2<5eQ1S$5TR4zDW9)eB0E-u9ZSNFWd`3((IW3sY+vDVnGYw1 zNDy>dL|$IPDROAJpxFxd8hG&>y8l;+U@0X^Vj9?o&0^8zklKH!58ozEq}N2_ip}vm%qQ|Z{13K zr|`F%znl1bCx0K~?<@FvWLO@i$+=<2c?Pc$iesq}Iu@`j1Z=}Sx1l{Eku9FbD@qn# zBC^n070AMIK0B0!4a?xEk^`~0KzR$yJ|QkVA+qw30Wx5dk^$vF29$kS`M8pm70Akp zCo8`;SXP$zBP+`y4>o(Uvcl~gPG=LO!bXt_Wlt)UMJj9-sj%6{mXOXRfvns(P&RC= zmJQ_rvSHHzS^0>_230~;IIj{fG$P)+2H;|z|F^BGn*U!MSM&e%YW{Cy3hO^(9yA>V zs#Z_`Av^Rt!lUBdf3F^(z*)J=;FUKuK!K}#6&D7wZ=)xV*h8;e6-=JWfCO^|Irt+( zbl)eGcE??-N0{Cy8p>-FYvt> zpI{!Blq6Mzy+NI3QiTN)&g5`<CgV( zu*8EQmbi_p@MEao4d978!tTEOLz*}?RC7fYR&V!(_U(h&;^Wn9u|O*t+K!d_1WV@| z#q|-b3bsnYAQ4fJWZcv15S;%jr0ZgJaid$08QnMUxs&TR-ub(@^wHS>uND|L;byeL z`7ecoyDVQ7oGjy{Okhd0<|h>PujBcoj{hB{yQvgguxK0zL(YEX9@KFOkjlLx-*B%9 zdUC(Ud<5XQTDyXZO~$n{@OP}#%AYo%B{Dq#P_GAoPXQ2TEomt|CUAku<9#I2+0k8r zpu4wdRYuT=L{ zm8xfOsk}3fwUPV2Eae*SrG)+u`1xMyY+)heJ~2LJc;}7+ouj&7cj7!Hnt@7Gmqb;j z^y)I%pCe2u5j9YI4&`a=p(juMeR0X?S-k`qJLbCUmW;aWn=^auqr*L2r`FoKOmD4U zwlubsfX<_`u~dH2P`5?df>&ZZ09$B|{q-m-pZQ9hHJ<%voHZER50mM9Bg!$0Z!02=On(MM3fhh^&+e9|#}!ml(v!5|I_S&iF=x;Zgs z#U_1>=$z46&Qspmra0bj>Tp93D; z(ES*s+Kg16L8>oczk*Y(O2*k8^>w~IWr*4%m{sckbafA($4#Z@(S>prMGYXwlX3R= z_L0sDzCD{Q{TNyMi4SovqVC2yCBSfA^zChj<7Hpm_hhYX&caaqKMi8off!zj{tFd^ z_REOk6}JA&5A3`Ot9#=rPX}DK^mByV3wzrUNdHPN{VIipk>Fm**ST(Y8&&sFGPt;@ zZ35IX?O{XRM;RDy*MY*}oU#%N&noj7W&Y3z#_>%N(c7k#pEj^5;_SnDyn`T{aT*># zee+~Y0siTEO#e^9t@gu@y83m5l1aG)P>0b4_Z6FykVMPm@$NAlmauK-n( z5V(wLRDKu&ECS#eZZ;}gNiROls5~3OJOh|NVnAsw?9ch3v@-0@dsXGdR_ZrH^~M+S zPo;n~%3}QDK~&Sben#etDxYhW*h~)3J1XsA%~Wj!^b&n!+d3 zaf_w^rSoB>aGwH>r2dQ0)@Y*h!8Fr)pGPO$m4BS;uV7$$oibZnC(bl;vLCTftp%B_ z^*zU;&N0M&K>ct$3CDAw()?6LYVEj)pL;Z0XLq<}>v0|H%(gT!O~-jtako<|$4s@; zPGUW7s%PTJZklTHO?FfcpNbiPW0~p|6SCKYaGJ<&KM3a4>_ZI3LbmU)zd)%*OrzMgooRE(&xMx57rL*Wh@I-F*#Z$QAeun;rSOLIWjmi>lJ zBkZpcc9bc{&!HuO1{7t))lT!NNd_jb95X>jDQG7{M=5Btf=*y4mt4-N&GzKQ5Gb2( zi;%QAmfXdWVaQy9I49C)-BPZTF;pksxwiwxcf+9gZa7eUo;@lz_Tk3^K*!i62`lG9De5N0;OoNh#X-FTx0;u30Z0O}qo zgZ(QEM&7{Z*Yp`RA?4Pup==%u38j_B6YBcmM4w8VS>3nG+Tv)T&FC5vu^y&rl;#_1pNJ+bktbyy-K7~4rXgB}h#w|~y@7%h8wl7hKp5DRRLVh* zHe_Q$%8%9Q?<2lc;UvxE_-Y!o!SNLd7>;k0%BU93sHHNhZj5tE4>oZ*hf_LF`E&r4 z#{`5>bN&%;rx~l3_EXOamdRf&gwnwhx_~*EW1EPN@!dPd75E-{)6w87_M<4 z#r`(<1|l_OGGp7P7~Xm|-YEMa&Ly41-Hhg3VDKeSq<4_dKjYD-9b)qS3P|XzVQlQ# zhQ_DQ;64WK2A6&p<-=th%=UvB&P9k^PS~EUybtxgopqtMvH$q;q4+Kh;=5i`{)HgI zP2}x15C!b>4Y}RP7{vf%3*fuFpzT2kW6o6w+~Nmbp>R6FIM>1FE-(0mkXO7e=4?X@ zQ~VgXT)4pZqkyIpLo~gSY1($sKlbhG(lU9Yo!X6NxC^}qGTvF=ab%8=^-_*xk{=0i z>n%uhtrrH@UKLhnD5=|lbiJQ5p8#Fq!rcj^`+X!oqRF9%?gq}2gCjaD9MOG1dNWLi zSY#%Z;aQ9Wqy58YVjLLND~q_r#VV(hX(qj>ri4rP0HR8+^-D+nk{Rqr*2OM9j^f&e zPiPH(oQX}oz)LFwqSoJ4Du;*bP7s{WBQbkzDBl{(%uxMJ4Or<*1}il}NM4mS0+u`? zz=kq9vMXQ4Zx>}!+wV+sCPigjcVM3`*^!4{IDnwShB;S+9pn9C1V$B+?Oae zqx5^(Lu0QCczLh13Ii`>bobb(w>JMSq2cKD5mw@k#+aEH(QW@1fqLyfL`8>1nwmWj z{}^Rm!!app+Hn39Rf>~vGW*-U{KQ(qNBwz_lD^YHHqNheDrKU*Mt4w5IRmF{I?BYh z1J^v;wSMCTc>fg{z7YTq{5-(_1@MkA_{RXh5AaQ4@E(Bw8{nM)*t-qyoJeq{7%DBv zvs<%i7HO0x=#kjO1oRXVu#j?(al9*l&_5YM>;R$#O@`=7LU>SVExiky&gqI1*s+)g z$)4A8BY4ZLoy-@QZ`o@Z5cf7F?LSAoI}gtPkacfFA*?V0Jzn^$tBW*}HL6n5onAw> zNyT+027*EW=zTQRI^?mcKb&F8edu_kmZmR1X5FNnb-H*kQ6`OdUB}Z!8iI#rV?rhh z7gPSA(WHX=4ux}b7kLM^L!P0)H$>!)%hA$NAHz+_M+_y{O#}1ovoMsJ2^@X-W~vImkVGaO}Otby9_3-(`lg$&G)j?40~M0o(y*g2Cs3#4Uaouw4-6@aK6 z#-N6NNCQ|eAmTAY0nJPhQ0?*s1pi@G@%m7_DFcf)F(}?76tCN0-4COzwj2!~JfOv#Hx>pafY z3??epgg9$FWFcbLnUp-<#>M0gp9^+G`B^wg2iMaNGT)FxW%JCcdkwhnu09_kp{>zewFpQ2BC zgFb~Ca=qxel2c6|<>e}rmjaYGB3|6s_n_EQ^hNa02q9sARu%S@AnXG^%FnA%UJX#L z4x*=ypQ5+u+tyKAaNKWS0{=56y}~^Us%fjqUGzDI>$IdNDo>N$J@EkQy`h0*Pn(U{KRy8poYx8RR2 z?xfiaU;5PW$R*ynm+!ye%*e|@IxW>3Ot`U0njoT>hkF%=F zSmz6rVkguU9&Dy#w;AKeD|y^$giX$IjaJ%BTenftANLd(#yWqha`Ch(FIEg+`S;38 zY39vwD3-Bcjr|KE@*)e)8kEyOhN zy8dFg`vbjlLE5K$z_c$z+N=FUUN<0WOynYlW@4mG%8HdmR!H{jSx8<9cqO4Jle|*w zl}g83ma}IKJZsZ6>00uvW6wHBF7gfXexu6!m3fahUJvK})c+lCRPp`dp?Kpx|Ixv3 zbv6eN5Kh#!LX+<*Bz&a$2qQhdZ{L#Hy(>Rta0y~QGkOL$kkme5Jok% zyHWuPUI)3IO|^H5b>5?St_W~d&PTg}%9>j+39!eQyzBu?$&ukc;D&Vx>XBrWl}PcP z-$LH=Gqx@CmS`$pH?gvlseHqfO~7xG+4dA=fi(~F0?uRXWmdjr%DuhE*=(vjVaiRv z@3ASfnpwMdOV)aD_3z0L>i1PNPqAqq0?O9Knog~Y)6Zx+HPJq{jy%dp z-Zp3)LO$gD4mru6Y~O~BOhn3SJ{~gci8h@Ei5g=c_Zy8ht{coFhTIgEEztbslwJcPM5vX!2 z*M0x+ZpD|~e$L+I?0!_Zvfro&d1eIUDIl-wyu3=1Dj%Pxe7xz`>weRZBmLV{`ioTh zi~RI|%sy?HWmH~fJ8>5*(k5P#w&0AS)GIGm=QWMIP7CsCo7ky|lwb0A({yhQa*izI z9~+d}QQ9UzG&@OH8GAg+`;cEZd&2nlfcZuXBx8>S=CgkM($?UWUnXRVT?{Ihn!!W{ zGtn~1MeJe}ztjj1lRY*MN~T7$hnc>%$gMuVeGPdX7L_uhu~r@xwkgA>{1Z5)C#ZguGFNYnkn31sN&UX|)!Yu!nL@bU!sEEb&$1vWX!jAtAJN~RVnLEOf6D_#0wM>|V@+)Gr`c{twY=k3 zi(wxJuF$kH0vKlLG%!-a@{e#>WZjz>ui2-NM}KqPTMINIo3Dx_a1spf*kGv2jOQKKa7obeK_I%mUTI%E$DKT8G9*4AIYm`7~FQbg6u;P#lh=B z*M!Q*r_(L6O&mR8$6`1h)wMEcCIl;{^(uD{9=Zgw9&^qxtM`(bXDIjf0u-pt2unA-zl91b{J;yYAqkxuDAGj6O0k|6eO1h zBrd)U;@c4THcC5df|0EZN7j(e)m}Pfj-0aSTJ7e7}r639R(gx?otvb-vyor~TiiKG~G5AH)5NU$Zn)SJV;x>$u1C7R!M} z+^Ha>9?FVdX=6KrwCl|Utre#pf>aE9BFbp5_nLWzV^_Xq1YQJYIGy}nRltK4-w0nA zk?ym7J+>ePWI9R;$qj}l?(b7wR|dH_n7Es{qe<96h&2_MLJqcOD?rW<;LW~&#hbx% zdb?NnyJ4(@V=~h6JZX}%l%nD}4{_a7%(#^wAjSFad?JRnZ6&Xd@^y+%t!QbwssJk8 zQ&ya6O(aJxQWxY-=8u{ymP3D+p$^bZnl*MY(jsrnK`s*6nC zJJanmeV4BEIEQ44eG8gJeFFPjiwQB?kq}F+tC2X3;O!~*$36+QjD0B>xNR0OU2A=o z`v-d~K&|K6>tK$sH*inZPg0pWkS{=H)g@T&3`_7$M7W%@DUE!yeUGW?5&FF6sCkrw zjficIH(Cto^S&4DXv8?b+aW$_N~rxfwh&;r2N?hDb)8ukD@O>$wrFSwt)>Yw*S*cB!tjuCe`C3Zyo-}Hm4;1ivQSBb zu%=z6oS05CCAYV+M$7a!R)DNo_9istNU+y=e8f6c_BufWELQw3#LLATbfvbWaE)O! zeM>u0;5#Fs>lz!h^5uNratnX2!2Ru)i6YJ?BEdOu+{k^0*ZoW1PGM-GSAb}0l`U*A zD_0PY$*~oWQmmE}w`LBESp1FlTC?By4sv!E4-K1~Pe%CMQJn9ta(`i8B{CWW*o1n} z>`VL_R?N3F0a@W5=`oUKUncEC^Y6g;6i>OQj`P{yt}yoH92FwB9|T9P_an+G+VkEF z&iVeH>5D4ELRrSN?x1OH8x^75Fu2C#u_t1UH~jaH-bENM{d0r*loUUQ6t{aRW|D=8 zlov2UcedN(v$Il)P41|%oK{MuXc9MoP1H`7V#n`kP0S-`CRwkUuw{>4oapC)ioAsj z9?%v;DVWYV2_8xf^V^mdS>ez9k>Sv^i;vo(44>r@66d0L2(H12-MGUUl^U4GHz@Yn zp!oNN23M(snwRQ)=4Rf2G;9=yI!7!4@(xRlu zC}oaO=4fTMC1f&n5QN(j9Sa~M)xFRE;x-^B+NNw!C*e}&un6mnwo{rq-d1B3)0TVt z26dWk{ZgC-4=-`-O`1i+d-)_EiSk=M<06?OWvv4z@ei9P_D9`&H+V-p$5NKucYNo; za89|zbB;^MDZkayJ&#Xt_k4&d)_7$qx3`j6K2jC;s04KQ4;ZK0wUB;BZKCb#{47UU^^P{cUN}X!>j*tnT2A#PR|fyP9;~MQp9_O6oji%gV#Pkcr2tb{Na`CTYyMJi+sUbJ5W3yKpl5+yGLd>M|{A~KXzQr+p z!QyOQhbyu;CPv0*u0ci04JZ<)-|3ZUL@&;_T@V!J0+sg*g1lE&0+y+qpHSz<x$c|JZ>?Vz24%Z%!lP0l$W2SRR44Q;rt$(XqMMUBa2YpxWo(o( zwhSzye?Fhfh!U<2O1N5;aCNAJYovs$5^64YoL|0GoLBfy$g4mCya_qqax~|B6&H?! zA2{cWCFdiCsuQ2jnz>Ha2030U47S#1Fh><(ZBT^fzRE>Xhzmn}cC^oD7jnjdGGQEr zL=4V6;j;@pK7+-${oiFUzs=-^Xfsk4HzZTT%5rh2ENi^6X8B?+ z3s5F3ppd0do4MF4%f;1gW(cg5!ZLlV57Vlo&{b_}6qk8JQ05J)h#Nv2cZn2mebA=< z)91PMTs~k-hjuy@Qs92G3P4`73LsU@YP~co7_tA~V)_t`GdGm{$uX@i3utwjqSa*~ zT5S|sUF!8Can@KPyl^RJ6&MqaQNbvumwIdfi{UrbST#aQA(%eG2XDDSz5Bf0!e!YM zlx36f`X-;(E2?mts@m;lDPB3m>u3ArD|7jPGGP{ltc2Qa*(+pOwc8=QQ_9=C{QzZq zM5!v15_Y8AEtmLvc%??{L2TiSSFS)7vEPI@+y5A>KL<#+mMjk^-@T?GDgbCYM!@!3n#27JXAHT_n*AG0;;^VIV77MU z6udrw!%7r9`%=F+o<4!XR8LQWoDttoUUer!*%|NW#}7YjR1kj50m_;UmnNjoptjjx z`%?87i$DwYfAcv$;?u1OsMz`>ICm>^9mm~h4kTo@CnYDf7-Tv*4TEn9pNZr8vr!w9 zn~<~9aig|aoo6vr6x2`w?ByU{4r>1hLL8O-;0r;S*=yYqMPq_10c zOyr&?_=p~_7a#A*Vbv)7YRyu;e#5U<;>4@CRRsKyv*XxRx(?vd`&hEMJ|Uy_t6@Hh z_P6C*ofexjrzi#cvCBdV_JOF`@2bfp2cJgZ>jN;)4RKcc&s_iF^ESBfe|V+6A!7d# zNnZmGa{MA|}N&5VWir=7__MgeLs_t0fuHs*i&UxWDlExbQtAw&T z#ZaS1IcuOmmLt_oiBz{Z(u5yrMDjmxKk<(F*{~nX>|J9Y&$0W?<34EYh`Vb)aeJBl z0P)Pw+K%}=mK}38mL2mQn%-I;6FaW~O!mf%HWu>M$hn+ZJ7@LjYkF7W{+F!fH7HxR z2kB9FGI16Gdtjx0Q?!2V0B6N6sO*HPS8jw6uiONqj=;Ov62G8wGc1|PEim%aMo~wp z_hwt{C~`LKpeiTUV5@Zu#pO{re)3j#S}P6=&gmZTD@}k-(WOoUHA>r5b(SVifS;*nT~&Ec@6z8vv%@Ur z1KmlGg}CK#OWn)Td2bPavDW$tDfbrC+&+pYA*jyHp`GBP69BmHnm=&aRLh zRYLJj8tVbLw#&CLxS^*brNOv>!QPr{#^-&J{ipI6MmOw)J}`6 zE2OK_efBaOIYY{P_g&aYmcrG|lbxQQyuKijY`Ycb)8y%5=8ffw-}Lpu48=19(co{_ zJc-BPZ`To$jKSZof>vg3<8RkN!pp*kUBe`A27h?~o5?>YF-wf+NL1%Y9Op>jb0pL` z{E}%x%~t|Fw|Z-XP_^4>rcPPcY;f)c&X_1W>cbB7k{(t=U}pj1BQ=E_95LIG`cBnt z+^Ec(l(|cpH!G8?H2emfX7}^%$|T{atT0nsj}eIo|71iYw9Xb5;++}cvYhZu+pH)- zKB^L6b0LjEhhgL=ZZDUdl)7I(XF&RC#nHYX+NtEz&7q_+l820!vs(k2FB=fw=@Oq8 zQ5}i0s`6x2i;(nMYb1ee<#xgO7^nVx-RoN~t~ad$KoibmTQDrHC3;Lf&VRH0epd&*3fLXI4o=SXRC zf{O{(Ec6qWJ}B1P)6y$!9qaAObze|Jow1-ahNug|$1ix?9JoeE+R7!$ zJI~(yIRdpOOGS!f3+xQYQ#Ko~vD2f!)&q7;A0os?j!o0ax8lPGWAj`F`Jy zwzAx7D`kKfQIr&nlCo3y25+1J%J8Hiudwg;v2z~I%|0gY6X)G8Z1g6uEfPx3HR0^h z*s6L(X}o$x5m?%4n-Ihvh4pux_2cl1L=wj$uRf#Y$VDTA`b=5sjVMGJR3#$ym9cVG zSWgST5p~PJilxk+l4P;jdafL;fm79zTMg9hq{Z6KF;>WLl-M$pnskXHqxyw|FjLO& z@+E{|H4eby;=LGDJ=OE6m;B}iT^Orj0Ob6uu3f*o4hIZ?$LJV%Di{Rh+48J&z6 zrRf;X@G&;daH`O*v)VhI_1*QXq}IXe3~O{VW3iUI+C(vHn3)7?u@f{2()qo;)VCXk zEQo~W>hsT#b&slZMJ<&+WN(Df>1-yRsPC(sk>qWsGlh0%Qf#FbEXi~OP{x;m?l!7c ze%^@RHWHtVutf;#)@m$!7N}+)g{oMl>A76C)T-gu+mT#Hm9vt5|FqQS{UElxt7Fs3 z$Sf0~(&J|@oQbfV&`~HJAlNf8V&F%aJbf$R_nc^bGBSG0awz}Q)zdn6Dm?;6DZFMM zuQj*a$I0r!LsoYhIlU!tj0ndh<-2Ey@_p;@!8Fxc8-mEVTJ z8W2)E#Sa2^js4@OM<8l!TrFd?GMHu+06@$qGx=l|-wyY|vL{D6+&_fu(>8f_KXiwC zoeu;}u|D}vj8Av0R64hUEVlHa(`d8Sm}~m%GKE-a_L`P?R!_F4yVkJu#7%c{FG68E zUy;%qO2Z?GU8EQ9W=>b*?YBI+W*?2Bt33x>6@N^mf8Si1aE0h1k>pe);b6J0lQCmH zS?^tGKf^=&GMZ7&$li3PShGgXvu2DDunLg@2**BRh}he@rYR=|z%nK9vdJ%@>nnRh zTp-{-sChTR%UsAUG!GKZoTS9HAdD_(LVhDxrj>x4mc zJ0eqCXse=Kg7e{%PhD<$)r+~=i`hN5;t{e_B5>L?(T^wVW-M2WhYIHvM{5dcp@nll zsx^+*SiK(Xp|g9bNZkmiw~IvH)L8AQ-kfp9pbyf$W(=v`vZ`lgsGfEEH0jG0L4f{= zIwv&qm7$QxH^zB>6Y2}eioTH8yPg8~3=uelGU$x#SY8f3z&XTS-r)tin|nvQ*WzbH z&xTPKv(Hh(=_N_ER>u|sEcF0O72q5XaE<~j^8m||!Mfu!#IyUDXV0LRcdSg3Akgfy zz}meNQto#u-U@3brP)itAPrq754AmViF1!^b9t!7!%cel4NZFK&?yKSf9 ze|YNK5kLNPmy>BU3TI~;&B6i|vpFzk;{|FGjaJ&4m&UEbc`eJ9rg3?A9=7I|HYOxr z>4e&ayE|=Cf@az@I=_%Mvi$a%O8fT0#VX-OB3EOwaAc-2RVY*yEHyCsBuKX4?sSTx zN~Kdq=k9cptmL6${d!@f`)&m{!VtCGmF8>GtaQ(-Hq`ZUudbK-b*-_|L7Mgib?t>< zz1}I!w3m=`ysy71IH$QLIn?=1Ko5MrGYGfq1BQ!6d4Ie*yL6^# z+Y4}XxPx=NV`ZjaQ}cO@*M7)ne@pX|_&-dw}+1Ih>_2@CaOMZHBJcT>o57(>8h<>QIrB5as7lh>ZSHLsera6I0$9RpP zI1Os)gQTP!hgZ|1v>40UhGsekV+YUaBPUKYa@v_mXG@J}Wu%x9gJ!7MDaRJ0ILD7y z{yUL5q7cZNc%cLhGhXRAAI`5?vrMf8O_Uq0;9dmQre%MfGx|M3V?};Yoid(#yA`Sn zTcymko_JfU0FDP>%iM60p|zwM0$nZ$bdeY6A{EQU9)K;)yp5AzD7#u6DfhX{J+=&= z9p1{PhOgxBRr@_VtVj9m@Du9n@Kthl_)0lD41rkL%4dhSs;_`zmkRd>py;pD!{S4~Q}hi&nQYglS> zUieY3z zOm@l@fqnB8p;@hj?r@*>fqBh;W?+M4Qx7JkK&MIRhNQRF2HndtC%q#y?;0cJ@usA* zj4GjXDs(u&5VKM6QbuN@u&UW8tT~yD3LgRBO(GHPh#_Kc>zb^b!K_MU(3^}(rAQRb z)ltY0s+s{+&48-rP*e@gS~b@Xz+%JmpdDOB?vsK8CV7AJcl-9mEGqP38@U zX6wFgG~8LZkjEClD9#ttp-D0i;8S`g=V#IP$(X!M9S}u#J_D7!)kK*=r2U*w_#rE# zGI+D@{D?_%HQt#UraRBE>zW$1%R63kULZ(IZ$7EVYnf^<{A@dU=6HuORO#BiIqp@z=zkyYo}uD>F=&`wvRdSqnlNg1?Q11tXowU~9u|zB1&CShk%N@|_s?ddDGH4jhSg8O3=Bn%|D3 z=03qbjK@ld-{7w^1$U#e_TdcgVmQ9eRAeXwcy=k+o7kQ{%NB(6qR!X zeY$;*ATDPbdjw7Hey_=Wq(&{j<81hI0SJPL8{b-L=hxSu7nL^HV;@Ozm8J_NouiaF zL*so7J#r25h_?A7)iysOZS(qY+kCdFZ4%%)0A>P^MJv4AYlYuKE1ZQ^2oS^V95A+c z7*7IYHZTBUIJS%nC})9Y;c^s)SZNAXPU$&0o>M9FSO{&nj6Q|(8&Gm?UjZgtQr1V}+zm%6-VsXn*rwOQnYE zVtii=ubb4gMn*zbXkKCevzwiu$;-jO_8cIQ27_4Po6dGii3(kj&bTp*F}j9ZMVb zm#D~A+HlT8aA!Gv6LmB$fN3~ih~h!6gfo)Ng6Az%vQ*XN=ZET3U>H+x0>jm5*$OOL z)_&Xy^h{Lu&Fpo+zB$meas~KszPDaBgHLP&w7|o#XZkRaCH3Bzq6{E({jZLS{todQ z77hEYWk1MSoNKI)@_nMJkbCo9hxI10P)DxPqn6(IWK?kv#aQQ``J$ z;!OK#^yu>?ZieX2Wl>%f+kD?3|NE-^?;qrUf0h5Ie1CG>1IG`;$oDYvCWU@l(D zy>tv`F6$#A3f>M8`a4V39b0Yt_ZBM=V7M->e)UG=t-N@^5|;BJXFp6vt&ig5w=5`p zgzlg&Y8!3AM9D@ zIN$EvhgvTq+up5%Yz6TRysvO_B+)Ht|3%PSJMH5^@J21e0R+ln@)9>LLvtGQW!7=C z6cqOzTKv3+Q_c-YIXFL&$awEu312lty>b_EjF9=O*n~Ad8Zc1}nrpT4M+w@U&#dzJ z@n|K3HTzGNJkWf#H{noLwL}W392}GGRi3;f-)CQj@-4&(_oTmmTmb@~ExD2^sWIx8 z%e!mQRM`&fO}T?kC>z36auWa21OGNiAJLo<16{1VyJRwk`Eo<1tVMe zgt$HlL+*Xw%~o(-l<4q)^boQi>-; ztzlZJ+_{&70)xgSbqUrMa~)vmSouCOE7v4>PXvZ6{so|;FWm`S|8RUgSElkTl2Z5N_CJeC-fy-V=UVkpL%SsTaV$7?XFy19e}Et^UkMLko9W*ZHvVe#+vN_MSRvi7mz zNHZaaJK}1ppiMkzXDSuVbbMM5ZcLfjN3Pi$**n$1_DDa=HKB}>uNjXrNkth&dCju_ zN!Z|-bA@NH=8>QubZvP&6H&ZGWl3<*|*w+XrrZc>5m1W#41B+V|Kl`ySh5-vfh)$_>2laf90TK!1vTj~is)WBb5; z5BSTz$Mb{sJV7%)MQFU-paiKsw&q-ObS7!44N6t#jZv>5si~(Kb@xlNuzy8Wazk)d|oHrL4($y zH&Cm}pq~t>1UXcNHZ7hpBtl+w)m{>zX(dP&w_xm)|BHL_)t&|o40YU(`Oc5Q`77Uf z2b}HKc+QU}s}yPY3N>~o)jry8K`1}(0iIWYJsx0BIEq1I&)+168nXg=;4y0uZr6dr z&Cu*gL;*b;vnN7#ljn}b#r>`~ZE?D=Z~IdoG*n(n@*wbK81c$$Nj~adc{S;e3ExZx zcUX!M(d9M7gK(Ez<2?xHDf-HYqA!dOw^EzSM&+%!pHX}%60qf8gIAjbpq1Z1KmQmn zWI`<@a_3CIgP=bbf%HZ&KzbuIK&tE&Z^kOaA^UTcUjSf=hdmjJvqajGEGDLWoh7SP zs}eeb5}JBF8Ub#Sf(XUN1c};LL!vfTs1-o2&;B&%*xy+GB{{QQi_$R>!Y7baRKc6I zGDr#mn^K9;fX^TiT3h9m45s5fGHp(1Ce4zOT`&4+D@mYMCoJKoMFOODFOBID4Anj9 zo96vSe#+XiyAmu`BeN%q>`OtWQm)S*AU^@8>3QTL`lScU$sH^qck=hf{mIFk$jLoQ zPTnYTa;L~iFm7cB%gG%|PQIz+$t=S@h6oc&LiE*2Jc*36G{R@ZJu>SwgjbX%DjLq5h|F8x zP;CVJmnV3Aj>jJzGyU*IOpH1cRTHCMAsbmgKXCF)DDMOFcX$yLM}~6Fn4gg`J?#0# z0ZS&doELcHL^DDYu1GV}2Yl34e@G&f!3O9+j~DHXh}s;~CXXSy^dYsQs2E(C6NCJR3&H4S|pgBh(Lpz>D;w zN%G$@M0VPTHPv|Q^NAfRJ72QeyQ(70aWq4POt~-n!c4Q6JOxuT*`kLeRim-DCXG># z+S8}u-meAs|6}hxz@w_RzVS2X%$%7sXA&|AOhPCLeN3SwbdWBHBAu8bVt@b%BmUh#_MsuxkPUAlRv=eX*OQv5~>PS375r^K}U_Y+)#RV1~X+@Raqr9 z%(-ojv2U8k*p{=2PaL_6=JwoAC+`5h8XSA$GY&^8Lho6 zdAK#@eG;J;N-NLlsg_~0AF$QbeFuwSin$H%5H zTsY2{7TG@^)5h&>JPCWKd$gHL=pLO%x<}_7NB8JX)Vp|Sh0;Bm8Q#RoE?hPjDKY?| zOG0PDkOUd3#Mn2_OPX49J>gPR(OP3U6}Hlo*5C{)wPUg0{Bq@$$IwTq1qsi@Vwjx= z9cp+w8Z*L`me9l+v!o{0Ur|&n;Qk@{kl#hE#1}#-E3R9Zc-Oqvoc5~4enAPbTQock zT@25F-{SNVVJM4eKDs6Y9c-7xlSp({U-&ZxwThZjbcXkwl4p~EwfB21F>~}rgDaI5 zbaHp?AzUi^7sU-m8~?^OC6L=zuSW{TQs_22EBvk|E3Vmp~}Z^G76grMi19otkV;D(h+eww^t!QUIK?fF}FpAp+3(J>TxJ4 z+)UON9>JDwEPfx(^{Y6@>!K-ukI_6FzxTCp37wz+rU6!OPEDIr6XP1*jx}q)mzTXr zXZ0y7l{WGW>3&=XQF8mZ-kpYiWE|g*9mo1HIPORKpZihLz>mCxyIjDv$d` zC5TiJ=X>?W;YC*b&Q4v+){;BMzYko9a|jxLk|zQ31S@kDT|AK)`<7I3qo;TcMU}ci z_e!kN^|IWhYV|0X*|BwW7jT)>pD?**i|SiwNebv6fUbc8%!_Z{_}WM1JQ216N1@MY zFH;5EgWvq(8?>RV2DvPk)EVG(-jX`2YJu-YeMKFv0_61)r9ZC= zRE%b_CgdflIx!@!*Y#i2Ul;6yM*m+YC>q;P$*U?F1}+#;aVWRq;TxqTPZa6g;2SIk z@=w3PV)%CgX5%-}?8l%#7_b?a@Q$Z~85<#+tMWLk%D8xYK6UGbi7D$9^*-RN_xn9b z7EYB_I_vfLGC%Ar-nMFzTsiRy;}b<*e7iqG3!SHV#2oqzt;KYaFOGTh2AVN%q~A>^ znm4x+^X9jC-n>c7n>UJiGj@)#4K#1w!1HG8S8(3ELCl*sHJmr&dogc*=Q#6bXMb!T zw;#9vvLCmP+m9b(4{B6E_OJo&a+4&H#6+?r$gnS=2ld$0gI*HvL6?di^dbb&U%G8k zXHEPbEBZ#rH_N6|7=^3is@Y7t;iWE@Q)hA+E$-KDLdX0zb-q43-nA|vp=GjbUFPgs z(QnzcE=2eB@WmD@FxKnQ74BKl-S`wt4$C}Zn0KPycA4sJy*Br@7%kD;BIOg2GKE(n zI0?P&GVX0u*%YeekE)(TJt&`I-BPc4#JeUKAwJ@sQDeKyRpbaiWXE^ ze|sozFre9n1DY#Dc?)ktK1bTiC`{GEYb})+WJ|PJ_@#3Q>15W!tFe*r*j_&_WT`0Y zX7~!RkR|G!uKE13-sxJSplD_=E~r1g4a6mPs_;kTUt~PidKr}T!eJqfD(W9=?z6Vp zUNKnkace=!8Prwa`_23&@vu0;uM%Zr&T;y4;a6`iCbA*L96O0IgJqx8m_a1%asBw~ zF~gtuF{XhZc|#ouaI9Z{F=lY)_+O0`$ng`670|Q)zsCxy8t16|mY*&A@n=g@C=iL? z`VroOm8(<_ucKbrbhb4#w#2!O_{KwNGlBL)P}Kd-bmb1W;eLd8USXN<1lX3+j%sgv zfp}&HT^OnErpB??$X6n(l(C=j@>et$de(hcE*De$N+7{8T zVP_HBO#Rws?$@xj$9`?I=+`c5*stMx(XYLCOuvQ~OvsL;i5>rTfqhncN}I-seO-#^ zvl@#&tJ(4Tx`y^P{+Yc}-Eb&w%<`9ocUpV~6K{O(;8JHWjaVb11Cobx$Fu=Va23pAO zc@aV&w}avK7W;~~h981pB?_7MD(W5k356RpMiE#n#2FrO5_?6rYvOVj??Qi=#{s4YoyMP9ToXi zk8Y-SP7;riT6mM|MX7Xa!

tsWU4XODU>gniRCaT%2TE&PtA{4 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

d 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 z
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 z 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 pXc#_VAz6{|A_v1>FDu literal 0 HcmV?d00001 diff --git a/packages/NAudio.1.7.1/NAudio.1.7.1.nuspec b/packages/NAudio.1.7.1/NAudio.1.7.1.nuspec new file mode 100644 index 00000000..ebe7d7e3 --- /dev/null +++ b/packages/NAudio.1.7.1/NAudio.1.7.1.nuspec @@ -0,0 +1,14 @@ + + + + NAudio + 1.7.1 + Mark Heath + Mark Heath + http://naudio.codeplex.com/license + http://naudio.codeplex.com/ + false + NAudio, an audio library for .NET + C# .NET audio sound + + \ No newline at end of file diff --git a/packages/NAudio.1.7.1/lib/net35/NAudio.XML b/packages/NAudio.1.7.1/lib/net35/NAudio.XML new file mode 100644 index 00000000..e474c5b9 --- /dev/null +++ b/packages/NAudio.1.7.1/lib/net35/NAudio.XML @@ -0,0 +1,20853 @@ + + + + NAudio + + + + + a-law decoder + based on code from: + http://hazelware.luggle.com/tutorials/mulawcompression.html + + + + + only 512 bytes required, so just use a lookup + + + + + Converts an a-law encoded byte to a 16 bit linear sample + + a-law encoded byte + Linear sample + + + + A-law encoder + + + + + Encodes a single 16 bit sample to a-law + + 16 bit PCM sample + a-law encoded byte + + + + SpanDSP - a series of DSP components for telephony + + g722_decode.c - The ITU G.722 codec, decode part. + + Written by Steve Underwood <steveu@coppice.org> + + Copyright (C) 2005 Steve Underwood + Ported to C# by Mark Heath 2011 + + Despite my general liking of the GPL, I place my own contributions + to this code in the public domain for the benefit of all mankind - + even the slimy ones who might try to proprietize my work and use it + to my detriment. + + Based in part on a single channel G.722 codec which is: + Copyright (c) CMU 1993 + Computer Science, Speech Group + Chengxiang Lu and Alex Hauptmann + + + + + hard limits to 16 bit samples + + + + + Decodes a buffer of G722 + + Codec state + Output buffer (to contain decompressed PCM samples) + + Number of bytes in input G722 data to decode + Number of samples written into output buffer + + + + Encodes a buffer of G722 + + Codec state + Output buffer (to contain encoded G722) + PCM 16 bit samples to encode + Number of samples in the input buffer to encode + Number of encoded bytes written into output buffer + + + + Stores state to be used between calls to Encode or Decode + + + + + Creates a new instance of G722 Codec State for a + new encode or decode session + + Bitrate (typically 64000) + Special options + + + + ITU Test Mode + TRUE if the operating in the special ITU test mode, with the band split filters disabled. + + + + + TRUE if the G.722 data is packed + + + + + 8kHz Sampling + TRUE if encode from 8k samples/second + + + + + Bits Per Sample + 6 for 48000kbps, 7 for 56000kbps, or 8 for 64000kbps. + + + + + Signal history for the QMF (x) + + + + + Band + + + + + In bit buffer + + + + + Number of bits in InBuffer + + + + + Out bit buffer + + + + + Number of bits in OutBuffer + + + + + Band data for G722 Codec + + + + s + + + sp + + + sz + + + r + + + a + + + ap + + + p + + + d + + + b + + + bp + + + sg + + + nb + + + det + + + + G722 Flags + + + + + None + + + + + Using a G722 sample rate of 8000 + + + + + Packed + + + + + mu-law decoder + based on code from: + http://hazelware.luggle.com/tutorials/mulawcompression.html + + + + + only 512 bytes required, so just use a lookup + + + + + Converts a mu-law encoded byte to a 16 bit linear sample + + mu-law encoded byte + Linear sample + + + + mu-law encoder + based on code from: + http://hazelware.luggle.com/tutorials/mulawcompression.html + + + + + Encodes a single 16 bit sample to mu-law + + 16 bit PCM sample + mu-law encoded byte + + + + Audio Capture Client + + + + + Gets a pointer to the buffer + + Pointer to the buffer + + + + Gets a pointer to the buffer + + Number of frames to read + Buffer flags + Pointer to the buffer + + + + Gets the size of the next packet + + + + + Release buffer + + Number of frames written + + + + Release the COM object + + + + + Windows Vista CoreAudio AudioClient + + + + + Initialize the Audio Client + + Share Mode + Stream Flags + Buffer Duration + Periodicity + Wave Format + Audio Session GUID (can be null) + + + + Determines whether if the specified output format is supported + + The share mode. + The desired format. + + true if [is format supported] [the specified share mode]; otherwise, false. + + + + + Determines if the specified output format is supported in shared mode + + Share Mode + Desired Format + Output The closest match format. + + true if [is format supported] [the specified share mode]; otherwise, false. + + + + + Starts the audio stream + + + + + Stops the audio stream. + + + + + Set the Event Handle for buffer synchro. + + The Wait Handle to setup + + + + Resets the audio stream + Reset is a control method that the client calls to reset a stopped audio stream. + Resetting the stream flushes all pending data and resets the audio clock stream + position to 0. This method fails if it is called on a stream that is not stopped + + + + + Dispose + + + + + Mix Format, + Can be called before initialize + + + + + Gets the buffer size (must initialize first) + + + + + Gets the stream latency (must initialize first) + + + + + Gets the current padding (must initialize first) + + + + + Gets the default device period (can be called before initialize) + + + + + Gets the minimum device period (can be called before initialize) + + + + + Gets the AudioClockClient service + + + + + Gets the AudioRenderClient service + + + + + Gets the AudioCaptureClient service + + + + + Audio Client Buffer Flags + + + + + None + + + + + AUDCLNT_BUFFERFLAGS_DATA_DISCONTINUITY + + + + + AUDCLNT_BUFFERFLAGS_SILENT + + + + + AUDCLNT_BUFFERFLAGS_TIMESTAMP_ERROR + + + + + The AudioClientProperties structure is used to set the parameters that describe the properties of the client's audio stream. + + http://msdn.microsoft.com/en-us/library/windows/desktop/hh968105(v=vs.85).aspx + + + + The size of the buffer for the audio stream. + + + + + Boolean value to indicate whether or not the audio stream is hardware-offloaded + + + + + An enumeration that is used to specify the category of the audio stream. + + + + + A bit-field describing the characteristics of the stream. Supported in Windows 8.1 and later. + + + + + AUDCLNT_SHAREMODE + + + + + AUDCLNT_SHAREMODE_SHARED, + + + + + AUDCLNT_SHAREMODE_EXCLUSIVE + + + + + AUDCLNT_STREAMFLAGS + + + + + None + + + + + AUDCLNT_STREAMFLAGS_CROSSPROCESS + + + + + AUDCLNT_STREAMFLAGS_LOOPBACK + + + + + AUDCLNT_STREAMFLAGS_EVENTCALLBACK + + + + + AUDCLNT_STREAMFLAGS_NOPERSIST + + + + + Defines values that describe the characteristics of an audio stream. + + + + + No stream options. + + + + + The audio stream is a 'raw' stream that bypasses all signal processing except for endpoint specific, always-on processing in the APO, driver, and hardware. + + + + + Audio Clock Client + + + + + Get Position + + + + + Dispose + + + + + Characteristics + + + + + Frequency + + + + + Adjusted Position + + + + + Can Adjust Position + + + + + Audio Endpoint Volume Channel + + + + + Volume Level + + + + + Volume Level Scalar + + + + + Audio Endpoint Volume Channels + + + + + Channel Count + + + + + Indexer - get a specific channel + + + + + Audio Endpoint Volume Notifiaction Delegate + + Audio Volume Notification Data + + + + Audio Endpoint Volume Step Information + + + + + Step + + + + + StepCount + + + + + Audio Endpoint Volume Volume Range + + + + + Minimum Decibels + + + + + Maximum Decibels + + + + + Increment Decibels + + + + + Audio Meter Information Channels + + + + + Metering Channel Count + + + + + Get Peak value + + Channel index + Peak value + + + + Audio Render Client + + + + + Gets a pointer to the buffer + + Number of frames requested + Pointer to the buffer + + + + Release buffer + + Number of frames written + Buffer flags + + + + Release the COM object + + + + + Specifies the category of an audio stream. + + + + + Other audio stream. + + + + + Media that will only stream when the app is in the foreground. + + + + + Media that can be streamed when the app is in the background. + + + + + Real-time communications, such as VOIP or chat. + + + + + Alert sounds. + + + + + Sound effects. + + + + + Game sound effects. + + + + + Background audio for games. + + + + + Audio Volume Notification Data + + + + + Audio Volume Notification Data + + + + + + + + + Event Context + + + + + Muted + + + + + Master Volume + + + + + Channels + + + + + Channel Volume + + + + + AUDCLNT_E_NOT_INITIALIZED + + + + + AUDCLNT_E_UNSUPPORTED_FORMAT + + + + + AUDCLNT_E_DEVICE_IN_USE + + + + + Defined in AudioClient.h + + + + + Defined in AudioClient.h + + + + + Multimedia Device Collection + + + + + Get Enumerator + + Device enumerator + + + + Device count + + + + + Get device by index + + Device index + Device at the specified index + + + + Property Keys + + + + + PKEY_DeviceInterface_FriendlyName + + + + + PKEY_AudioEndpoint_FormFactor + + + + + PKEY_AudioEndpoint_ControlPanelPageProvider + + + + + PKEY_AudioEndpoint_Association + + + + + PKEY_AudioEndpoint_PhysicalSpeakers + + + + + PKEY_AudioEndpoint_GUID + + + + + PKEY_AudioEndpoint_Disable_SysFx + + + + + PKEY_AudioEndpoint_FullRangeSpeakers + + + + + PKEY_AudioEndpoint_Supports_EventDriven_Mode + + + + + PKEY_AudioEndpoint_JackSubType + + + + + PKEY_AudioEngine_DeviceFormat + + + + + PKEY_AudioEngine_OEMFormat + + + + + PKEY _Devie_FriendlyName + + + + + Envelope generator (ADSR) + + + + + Creates and Initializes an Envelope Generator + + + + + Sets the attack curve + + + + + Sets the decay release curve + + + + + Read the next volume multiplier from the envelope generator + + A volume multiplier + + + + Trigger the gate + + If true, enter attack phase, if false enter release phase (unless already idle) + + + + Reset to idle state + + + + + Get the current output level + + + + + Attack Rate (seconds * SamplesPerSecond) + + + + + Decay Rate (seconds * SamplesPerSecond) + + + + + Release Rate (seconds * SamplesPerSecond) + + + + + Sustain Level (1 = 100%) + + + + + Current envelope state + + + + + Envelope State + + + + + Idle + + + + + Attack + + + + + Decay + + + + + Sustain + + + + + Release + + + + + Fully managed resampler, based on Cockos WDL Resampler + + + + + Creates a new Resampler + + + + + sets the mode + if sinc set, it overrides interp or filtercnt + + + + + Sets the filter parameters + used for filtercnt>0 but not sinc + + + + + Set feed mode + + if true, that means the first parameter to ResamplePrepare will specify however much input you have, not how much you want + + + + Reset + + + + + Prepare + note that it is safe to call ResamplePrepare without calling ResampleOut (the next call of ResamplePrepare will function as normal) + nb inbuffer was WDL_ResampleSample **, returning a place to put the in buffer, so we return a buffer and offset + + req_samples is output samples desired if !wantInputDriven, or if wantInputDriven is input samples that we have + + + + returns number of samples desired (put these into *inbuffer) + + + + http://tech.ebu.ch/docs/tech/tech3306-2009.pdf + + + + + WaveFormat + + + + + Data Chunk Position + + + + + Data Chunk Length + + + + + Riff Chunks + + + + + Audio Subtype GUIDs + http://msdn.microsoft.com/en-us/library/windows/desktop/aa372553%28v=vs.85%29.aspx + + + + + Advanced Audio Coding (AAC). + + + + + Not used + + + + + Dolby AC-3 audio over Sony/Philips Digital Interface (S/PDIF). + + + + + Encrypted audio data used with secure audio path. + + + + + Digital Theater Systems (DTS) audio. + + + + + Uncompressed IEEE floating-point audio. + + + + + MPEG Audio Layer-3 (MP3). + + + + + MPEG-1 audio payload. + + + + + Windows Media Audio 9 Voice codec. + + + + + Uncompressed PCM audio. + + + + + Windows Media Audio 9 Professional codec over S/PDIF. + + + + + Windows Media Audio 9 Lossless codec or Windows Media Audio 9.1 codec. + + + + + Windows Media Audio 8 codec, Windows Media Audio 9 codec, or Windows Media Audio 9.1 codec. + + + + + Windows Media Audio 9 Professional codec or Windows Media Audio 9.1 Professional codec. + + + + + Dolby Digital (AC-3). + + + + + MPEG-4 and AAC Audio Types + http://msdn.microsoft.com/en-us/library/windows/desktop/dd317599(v=vs.85).aspx + Reference : wmcodecdsp.h + + + + + Dolby Audio Types + http://msdn.microsoft.com/en-us/library/windows/desktop/dd317599(v=vs.85).aspx + Reference : wmcodecdsp.h + + + + + Dolby Audio Types + http://msdn.microsoft.com/en-us/library/windows/desktop/dd317599(v=vs.85).aspx + Reference : wmcodecdsp.h + + + + + μ-law coding + http://msdn.microsoft.com/en-us/library/windows/desktop/dd390971(v=vs.85).aspx + Reference : Ksmedia.h + + + + + Adaptive delta pulse code modulation (ADPCM) + http://msdn.microsoft.com/en-us/library/windows/desktop/dd390971(v=vs.85).aspx + Reference : Ksmedia.h + + + + + Dolby Digital Plus formatted for HDMI output. + http://msdn.microsoft.com/en-us/library/windows/hardware/ff538392(v=vs.85).aspx + Reference : internet + + + + + MSAudio1 - unknown meaning + Reference : wmcodecdsp.h + + + + + IMA ADPCM ACM Wrapper + + + + + WMSP2 - unknown meaning + Reference: wmsdkidl.h + + + + + Creates an instance of either the sink writer or the source reader. + + + + + Creates an instance of the sink writer or source reader, given a URL. + + + + + Creates an instance of the sink writer or source reader, given an IUnknown pointer. + + + + + CLSID_MFReadWriteClassFactory + + + + + Media Foundation Errors + + + + RANGES + 14000 - 14999 = General Media Foundation errors + 15000 - 15999 = ASF parsing errors + 16000 - 16999 = Media Source errors + 17000 - 17999 = MEDIAFOUNDATION Network Error Events + 18000 - 18999 = MEDIAFOUNDATION WMContainer Error Events + 19000 - 19999 = MEDIAFOUNDATION Media Sink Error Events + 20000 - 20999 = Renderer errors + 21000 - 21999 = Topology Errors + 25000 - 25999 = Timeline Errors + 26000 - 26999 = Unused + 28000 - 28999 = Transform errors + 29000 - 29999 = Content Protection errors + 40000 - 40999 = Clock errors + 41000 - 41999 = MF Quality Management Errors + 42000 - 42999 = MF Transcode API Errors + + + + + MessageId: MF_E_PLATFORM_NOT_INITIALIZED + + MessageText: + + Platform not initialized. Please call MFStartup().%0 + + + + + MessageId: MF_E_BUFFERTOOSMALL + + MessageText: + + The buffer was too small to carry out the requested action.%0 + + + + + MessageId: MF_E_INVALIDREQUEST + + MessageText: + + The request is invalid in the current state.%0 + + + + + MessageId: MF_E_INVALIDSTREAMNUMBER + + MessageText: + + The stream number provided was invalid.%0 + + + + + MessageId: MF_E_INVALIDMEDIATYPE + + MessageText: + + The data specified for the media type is invalid, inconsistent, or not supported by this object.%0 + + + + + MessageId: MF_E_NOTACCEPTING + + MessageText: + + The callee is currently not accepting further input.%0 + + + + + MessageId: MF_E_NOT_INITIALIZED + + MessageText: + + This object needs to be initialized before the requested operation can be carried out.%0 + + + + + MessageId: MF_E_UNSUPPORTED_REPRESENTATION + + MessageText: + + The requested representation is not supported by this object.%0 + + + + + MessageId: MF_E_NO_MORE_TYPES + + MessageText: + + An object ran out of media types to suggest therefore the requested chain of streaming objects cannot be completed.%0 + + + + + MessageId: MF_E_UNSUPPORTED_SERVICE + + MessageText: + + The object does not support the specified service.%0 + + + + + MessageId: MF_E_UNEXPECTED + + MessageText: + + An unexpected error has occurred in the operation requested.%0 + + + + + MessageId: MF_E_INVALIDNAME + + MessageText: + + Invalid name.%0 + + + + + MessageId: MF_E_INVALIDTYPE + + MessageText: + + Invalid type.%0 + + + + + MessageId: MF_E_INVALID_FILE_FORMAT + + MessageText: + + The file does not conform to the relevant file format specification. + + + + + MessageId: MF_E_INVALIDINDEX + + MessageText: + + Invalid index.%0 + + + + + MessageId: MF_E_INVALID_TIMESTAMP + + MessageText: + + An invalid timestamp was given.%0 + + + + + MessageId: MF_E_UNSUPPORTED_SCHEME + + MessageText: + + The scheme of the given URL is unsupported.%0 + + + + + MessageId: MF_E_UNSUPPORTED_BYTESTREAM_TYPE + + MessageText: + + The byte stream type of the given URL is unsupported.%0 + + + + + MessageId: MF_E_UNSUPPORTED_TIME_FORMAT + + MessageText: + + The given time format is unsupported.%0 + + + + + MessageId: MF_E_NO_SAMPLE_TIMESTAMP + + MessageText: + + The Media Sample does not have a timestamp.%0 + + + + + MessageId: MF_E_NO_SAMPLE_DURATION + + MessageText: + + The Media Sample does not have a duration.%0 + + + + + MessageId: MF_E_INVALID_STREAM_DATA + + MessageText: + + The request failed because the data in the stream is corrupt.%0\n. + + + + + MessageId: MF_E_RT_UNAVAILABLE + + MessageText: + + Real time services are not available.%0 + + + + + MessageId: MF_E_UNSUPPORTED_RATE + + MessageText: + + The specified rate is not supported.%0 + + + + + MessageId: MF_E_THINNING_UNSUPPORTED + + MessageText: + + This component does not support stream-thinning.%0 + + + + + MessageId: MF_E_REVERSE_UNSUPPORTED + + MessageText: + + The call failed because no reverse playback rates are available.%0 + + + + + MessageId: MF_E_UNSUPPORTED_RATE_TRANSITION + + MessageText: + + The requested rate transition cannot occur in the current state.%0 + + + + + MessageId: MF_E_RATE_CHANGE_PREEMPTED + + MessageText: + + The requested rate change has been pre-empted and will not occur.%0 + + + + + MessageId: MF_E_NOT_FOUND + + MessageText: + + The specified object or value does not exist.%0 + + + + + MessageId: MF_E_NOT_AVAILABLE + + MessageText: + + The requested value is not available.%0 + + + + + MessageId: MF_E_NO_CLOCK + + MessageText: + + The specified operation requires a clock and no clock is available.%0 + + + + + MessageId: MF_S_MULTIPLE_BEGIN + + MessageText: + + This callback and state had already been passed in to this event generator earlier.%0 + + + + + MessageId: MF_E_MULTIPLE_BEGIN + + MessageText: + + This callback has already been passed in to this event generator.%0 + + + + + MessageId: MF_E_MULTIPLE_SUBSCRIBERS + + MessageText: + + Some component is already listening to events on this event generator.%0 + + + + + MessageId: MF_E_TIMER_ORPHANED + + MessageText: + + This timer was orphaned before its callback time arrived.%0 + + + + + MessageId: MF_E_STATE_TRANSITION_PENDING + + MessageText: + + A state transition is already pending.%0 + + + + + MessageId: MF_E_UNSUPPORTED_STATE_TRANSITION + + MessageText: + + The requested state transition is unsupported.%0 + + + + + MessageId: MF_E_UNRECOVERABLE_ERROR_OCCURRED + + MessageText: + + An unrecoverable error has occurred.%0 + + + + + MessageId: MF_E_SAMPLE_HAS_TOO_MANY_BUFFERS + + MessageText: + + The provided sample has too many buffers.%0 + + + + + MessageId: MF_E_SAMPLE_NOT_WRITABLE + + MessageText: + + The provided sample is not writable.%0 + + + + + MessageId: MF_E_INVALID_KEY + + MessageText: + + The specified key is not valid. + + + + + MessageId: MF_E_BAD_STARTUP_VERSION + + MessageText: + + You are calling MFStartup with the wrong MF_VERSION. Mismatched bits? + + + + + MessageId: MF_E_UNSUPPORTED_CAPTION + + MessageText: + + The caption of the given URL is unsupported.%0 + + + + + MessageId: MF_E_INVALID_POSITION + + MessageText: + + The operation on the current offset is not permitted.%0 + + + + + MessageId: MF_E_ATTRIBUTENOTFOUND + + MessageText: + + The requested attribute was not found.%0 + + + + + MessageId: MF_E_PROPERTY_TYPE_NOT_ALLOWED + + MessageText: + + The specified property type is not allowed in this context.%0 + + + + + MessageId: MF_E_PROPERTY_TYPE_NOT_SUPPORTED + + MessageText: + + The specified property type is not supported.%0 + + + + + MessageId: MF_E_PROPERTY_EMPTY + + MessageText: + + The specified property is empty.%0 + + + + + MessageId: MF_E_PROPERTY_NOT_EMPTY + + MessageText: + + The specified property is not empty.%0 + + + + + MessageId: MF_E_PROPERTY_VECTOR_NOT_ALLOWED + + MessageText: + + The vector property specified is not allowed in this context.%0 + + + + + MessageId: MF_E_PROPERTY_VECTOR_REQUIRED + + MessageText: + + A vector property is required in this context.%0 + + + + + MessageId: MF_E_OPERATION_CANCELLED + + MessageText: + + The operation is cancelled.%0 + + + + + MessageId: MF_E_BYTESTREAM_NOT_SEEKABLE + + MessageText: + + The provided bytestream was expected to be seekable and it is not.%0 + + + + + MessageId: MF_E_DISABLED_IN_SAFEMODE + + MessageText: + + The Media Foundation platform is disabled when the system is running in Safe Mode.%0 + + + + + MessageId: MF_E_CANNOT_PARSE_BYTESTREAM + + MessageText: + + The Media Source could not parse the byte stream.%0 + + + + + MessageId: MF_E_SOURCERESOLVER_MUTUALLY_EXCLUSIVE_FLAGS + + MessageText: + + Mutually exclusive flags have been specified to source resolver. This flag combination is invalid.%0 + + + + + MessageId: MF_E_MEDIAPROC_WRONGSTATE + + MessageText: + + MediaProc is in the wrong state%0 + + + + + MessageId: MF_E_RT_THROUGHPUT_NOT_AVAILABLE + + MessageText: + + Real time I/O service can not provide requested throughput.%0 + + + + + MessageId: MF_E_RT_TOO_MANY_CLASSES + + MessageText: + + The workqueue cannot be registered with more classes.%0 + + + + + MessageId: MF_E_RT_WOULDBLOCK + + MessageText: + + This operation cannot succeed because another thread owns this object.%0 + + + + + MessageId: MF_E_NO_BITPUMP + + MessageText: + + Internal. Bitpump not found.%0 + + + + + MessageId: MF_E_RT_OUTOFMEMORY + + MessageText: + + No more RT memory available.%0 + + + + + MessageId: MF_E_RT_WORKQUEUE_CLASS_NOT_SPECIFIED + + MessageText: + + An MMCSS class has not been set for this work queue.%0 + + + + + MessageId: MF_E_INSUFFICIENT_BUFFER + + MessageText: + + Insufficient memory for response.%0 + + + + + MessageId: MF_E_CANNOT_CREATE_SINK + + MessageText: + + Activate failed to create mediasink. Call OutputNode::GetUINT32(MF_TOPONODE_MAJORTYPE) for more information. %0 + + + + + MessageId: MF_E_BYTESTREAM_UNKNOWN_LENGTH + + MessageText: + + The length of the provided bytestream is unknown.%0 + + + + + MessageId: MF_E_SESSION_PAUSEWHILESTOPPED + + MessageText: + + The media session cannot pause from a stopped state.%0 + + + + + MessageId: MF_S_ACTIVATE_REPLACED + + MessageText: + + The activate could not be created in the remote process for some reason it was replaced with empty one.%0 + + + + + MessageId: MF_E_FORMAT_CHANGE_NOT_SUPPORTED + + MessageText: + + The data specified for the media type is supported, but would require a format change, which is not supported by this object.%0 + + + + + MessageId: MF_E_INVALID_WORKQUEUE + + MessageText: + + The operation failed because an invalid combination of workqueue ID and flags was specified.%0 + + + + + MessageId: MF_E_DRM_UNSUPPORTED + + MessageText: + + No DRM support is available.%0 + + + + + MessageId: MF_E_UNAUTHORIZED + + MessageText: + + This operation is not authorized.%0 + + + + + MessageId: MF_E_OUT_OF_RANGE + + MessageText: + + The value is not in the specified or valid range.%0 + + + + + MessageId: MF_E_INVALID_CODEC_MERIT + + MessageText: + + The registered codec merit is not valid.%0 + + + + + MessageId: MF_E_HW_MFT_FAILED_START_STREAMING + + MessageText: + + Hardware MFT failed to start streaming due to lack of hardware resources.%0 + + + + + MessageId: MF_S_ASF_PARSEINPROGRESS + + MessageText: + + Parsing is still in progress and is not yet complete.%0 + + + + + MessageId: MF_E_ASF_PARSINGINCOMPLETE + + MessageText: + + Not enough data have been parsed to carry out the requested action.%0 + + + + + MessageId: MF_E_ASF_MISSINGDATA + + MessageText: + + There is a gap in the ASF data provided.%0 + + + + + MessageId: MF_E_ASF_INVALIDDATA + + MessageText: + + The data provided are not valid ASF.%0 + + + + + MessageId: MF_E_ASF_OPAQUEPACKET + + MessageText: + + The packet is opaque, so the requested information cannot be returned.%0 + + + + + MessageId: MF_E_ASF_NOINDEX + + MessageText: + + The requested operation failed since there is no appropriate ASF index.%0 + + + + + MessageId: MF_E_ASF_OUTOFRANGE + + MessageText: + + The value supplied is out of range for this operation.%0 + + + + + MessageId: MF_E_ASF_INDEXNOTLOADED + + MessageText: + + The index entry requested needs to be loaded before it can be available.%0 + + + + + MessageId: MF_E_ASF_TOO_MANY_PAYLOADS + + MessageText: + + The packet has reached the maximum number of payloads.%0 + + + + + MessageId: MF_E_ASF_UNSUPPORTED_STREAM_TYPE + + MessageText: + + Stream type is not supported.%0 + + + + + MessageId: MF_E_ASF_DROPPED_PACKET + + MessageText: + + One or more ASF packets were dropped.%0 + + + + + MessageId: MF_E_NO_EVENTS_AVAILABLE + + MessageText: + + There are no events available in the queue.%0 + + + + + MessageId: MF_E_INVALID_STATE_TRANSITION + + MessageText: + + A media source cannot go from the stopped state to the paused state.%0 + + + + + MessageId: MF_E_END_OF_STREAM + + MessageText: + + The media stream cannot process any more samples because there are no more samples in the stream.%0 + + + + + MessageId: MF_E_SHUTDOWN + + MessageText: + + The request is invalid because Shutdown() has been called.%0 + + + + + MessageId: MF_E_MP3_NOTFOUND + + MessageText: + + The MP3 object was not found.%0 + + + + + MessageId: MF_E_MP3_OUTOFDATA + + MessageText: + + The MP3 parser ran out of data before finding the MP3 object.%0 + + + + + MessageId: MF_E_MP3_NOTMP3 + + MessageText: + + The file is not really a MP3 file.%0 + + + + + MessageId: MF_E_MP3_NOTSUPPORTED + + MessageText: + + The MP3 file is not supported.%0 + + + + + MessageId: MF_E_NO_DURATION + + MessageText: + + The Media stream has no duration.%0 + + + + + MessageId: MF_E_INVALID_FORMAT + + MessageText: + + The Media format is recognized but is invalid.%0 + + + + + MessageId: MF_E_PROPERTY_NOT_FOUND + + MessageText: + + The property requested was not found.%0 + + + + + MessageId: MF_E_PROPERTY_READ_ONLY + + MessageText: + + The property is read only.%0 + + + + + MessageId: MF_E_PROPERTY_NOT_ALLOWED + + MessageText: + + The specified property is not allowed in this context.%0 + + + + + MessageId: MF_E_MEDIA_SOURCE_NOT_STARTED + + MessageText: + + The media source is not started.%0 + + + + + MessageId: MF_E_UNSUPPORTED_FORMAT + + MessageText: + + The Media format is recognized but not supported.%0 + + + + + MessageId: MF_E_MP3_BAD_CRC + + MessageText: + + The MPEG frame has bad CRC.%0 + + + + + MessageId: MF_E_NOT_PROTECTED + + MessageText: + + The file is not protected.%0 + + + + + MessageId: MF_E_MEDIA_SOURCE_WRONGSTATE + + MessageText: + + The media source is in the wrong state%0 + + + + + MessageId: MF_E_MEDIA_SOURCE_NO_STREAMS_SELECTED + + MessageText: + + No streams are selected in source presentation descriptor.%0 + + + + + MessageId: MF_E_CANNOT_FIND_KEYFRAME_SAMPLE + + MessageText: + + No key frame sample was found.%0 + + + + + MessageId: MF_E_NETWORK_RESOURCE_FAILURE + + MessageText: + + An attempt to acquire a network resource failed.%0 + + + + + MessageId: MF_E_NET_WRITE + + MessageText: + + Error writing to the network.%0 + + + + + MessageId: MF_E_NET_READ + + MessageText: + + Error reading from the network.%0 + + + + + MessageId: MF_E_NET_REQUIRE_NETWORK + + MessageText: + + Internal. Entry cannot complete operation without network.%0 + + + + + MessageId: MF_E_NET_REQUIRE_ASYNC + + MessageText: + + Internal. Async op is required.%0 + + + + + MessageId: MF_E_NET_BWLEVEL_NOT_SUPPORTED + + MessageText: + + Internal. Bandwidth levels are not supported.%0 + + + + + MessageId: MF_E_NET_STREAMGROUPS_NOT_SUPPORTED + + MessageText: + + Internal. Stream groups are not supported.%0 + + + + + MessageId: MF_E_NET_MANUALSS_NOT_SUPPORTED + + MessageText: + + Manual stream selection is not supported.%0 + + + + + MessageId: MF_E_NET_INVALID_PRESENTATION_DESCRIPTOR + + MessageText: + + Invalid presentation descriptor.%0 + + + + + MessageId: MF_E_NET_CACHESTREAM_NOT_FOUND + + MessageText: + + Cannot find cache stream.%0 + + + + + MessageId: MF_I_MANUAL_PROXY + + MessageText: + + The proxy setting is manual.%0 + + + + duplicate removed + MessageId=17011 Severity=Informational Facility=MEDIAFOUNDATION SymbolicName=MF_E_INVALID_REQUEST + Language=English + The request is invalid in the current state.%0 + . + + MessageId: MF_E_NET_REQUIRE_INPUT + + MessageText: + + Internal. Entry cannot complete operation without input.%0 + + + + + MessageId: MF_E_NET_REDIRECT + + MessageText: + + The client redirected to another server.%0 + + + + + MessageId: MF_E_NET_REDIRECT_TO_PROXY + + MessageText: + + The client is redirected to a proxy server.%0 + + + + + MessageId: MF_E_NET_TOO_MANY_REDIRECTS + + MessageText: + + The client reached maximum redirection limit.%0 + + + + + MessageId: MF_E_NET_TIMEOUT + + MessageText: + + The server, a computer set up to offer multimedia content to other computers, could not handle your request for multimedia content in a timely manner. Please try again later.%0 + + + + + MessageId: MF_E_NET_CLIENT_CLOSE + + MessageText: + + The control socket is closed by the client.%0 + + + + + MessageId: MF_E_NET_BAD_CONTROL_DATA + + MessageText: + + The server received invalid data from the client on the control connection.%0 + + + + + MessageId: MF_E_NET_INCOMPATIBLE_SERVER + + MessageText: + + The server is not a compatible streaming media server.%0 + + + + + MessageId: MF_E_NET_UNSAFE_URL + + MessageText: + + Url.%0 + + + + + MessageId: MF_E_NET_CACHE_NO_DATA + + MessageText: + + Data is not available.%0 + + + + + MessageId: MF_E_NET_EOL + + MessageText: + + End of line.%0 + + + + + MessageId: MF_E_NET_BAD_REQUEST + + MessageText: + + The request could not be understood by the server.%0 + + + + + MessageId: MF_E_NET_INTERNAL_SERVER_ERROR + + MessageText: + + The server encountered an unexpected condition which prevented it from fulfilling the request.%0 + + + + + MessageId: MF_E_NET_SESSION_NOT_FOUND + + MessageText: + + Session not found.%0 + + + + + MessageId: MF_E_NET_NOCONNECTION + + MessageText: + + There is no connection established with the Windows Media server. The operation failed.%0 + + + + + MessageId: MF_E_NET_CONNECTION_FAILURE + + MessageText: + + The network connection has failed.%0 + + + + + MessageId: MF_E_NET_INCOMPATIBLE_PUSHSERVER + + MessageText: + + The Server service that received the HTTP push request is not a compatible version of Windows Media Services (WMS). This error may indicate the push request was received by IIS instead of WMS. Ensure WMS is started and has the HTTP Server control protocol properly enabled and try again.%0 + + + + + MessageId: MF_E_NET_SERVER_ACCESSDENIED + + MessageText: + + The Windows Media server is denying access. The username and/or password might be incorrect.%0 + + + + + MessageId: MF_E_NET_PROXY_ACCESSDENIED + + MessageText: + + The proxy server is denying access. The username and/or password might be incorrect.%0 + + + + + MessageId: MF_E_NET_CANNOTCONNECT + + MessageText: + + Unable to establish a connection to the server.%0 + + + + + MessageId: MF_E_NET_INVALID_PUSH_TEMPLATE + + MessageText: + + The specified push template is invalid.%0 + + + + + MessageId: MF_E_NET_INVALID_PUSH_PUBLISHING_POINT + + MessageText: + + The specified push publishing point is invalid.%0 + + + + + MessageId: MF_E_NET_BUSY + + MessageText: + + The requested resource is in use.%0 + + + + + MessageId: MF_E_NET_RESOURCE_GONE + + MessageText: + + The Publishing Point or file on the Windows Media Server is no longer available.%0 + + + + + MessageId: MF_E_NET_ERROR_FROM_PROXY + + MessageText: + + The proxy experienced an error while attempting to contact the media server.%0 + + + + + MessageId: MF_E_NET_PROXY_TIMEOUT + + MessageText: + + The proxy did not receive a timely response while attempting to contact the media server.%0 + + + + + MessageId: MF_E_NET_SERVER_UNAVAILABLE + + MessageText: + + The server is currently unable to handle the request due to a temporary overloading or maintenance of the server.%0 + + + + + MessageId: MF_E_NET_TOO_MUCH_DATA + + MessageText: + + The encoding process was unable to keep up with the amount of supplied data.%0 + + + + + MessageId: MF_E_NET_SESSION_INVALID + + MessageText: + + Session not found.%0 + + + + + MessageId: MF_E_OFFLINE_MODE + + MessageText: + + The requested URL is not available in offline mode.%0 + + + + + MessageId: MF_E_NET_UDP_BLOCKED + + MessageText: + + A device in the network is blocking UDP traffic.%0 + + + + + MessageId: MF_E_NET_UNSUPPORTED_CONFIGURATION + + MessageText: + + The specified configuration value is not supported.%0 + + + + + MessageId: MF_E_NET_PROTOCOL_DISABLED + + MessageText: + + The networking protocol is disabled.%0 + + + + + MessageId: MF_E_ALREADY_INITIALIZED + + MessageText: + + This object has already been initialized and cannot be re-initialized at this time.%0 + + + + + MessageId: MF_E_BANDWIDTH_OVERRUN + + MessageText: + + The amount of data passed in exceeds the given bitrate and buffer window.%0 + + + + + MessageId: MF_E_LATE_SAMPLE + + MessageText: + + The sample was passed in too late to be correctly processed.%0 + + + + + MessageId: MF_E_FLUSH_NEEDED + + MessageText: + + The requested action cannot be carried out until the object is flushed and the queue is emptied.%0 + + + + + MessageId: MF_E_INVALID_PROFILE + + MessageText: + + The profile is invalid.%0 + + + + + MessageId: MF_E_INDEX_NOT_COMMITTED + + MessageText: + + The index that is being generated needs to be committed before the requested action can be carried out.%0 + + + + + MessageId: MF_E_NO_INDEX + + MessageText: + + The index that is necessary for the requested action is not found.%0 + + + + + MessageId: MF_E_CANNOT_INDEX_IN_PLACE + + MessageText: + + The requested index cannot be added in-place to the specified ASF content.%0 + + + + + MessageId: MF_E_MISSING_ASF_LEAKYBUCKET + + MessageText: + + The ASF leaky bucket parameters must be specified in order to carry out this request.%0 + + + + + MessageId: MF_E_INVALID_ASF_STREAMID + + MessageText: + + The stream id is invalid. The valid range for ASF stream id is from 1 to 127.%0 + + + + + MessageId: MF_E_STREAMSINK_REMOVED + + MessageText: + + The requested Stream Sink has been removed and cannot be used.%0 + + + + + MessageId: MF_E_STREAMSINKS_OUT_OF_SYNC + + MessageText: + + The various Stream Sinks in this Media Sink are too far out of sync for the requested action to take place.%0 + + + + + MessageId: MF_E_STREAMSINKS_FIXED + + MessageText: + + Stream Sinks cannot be added to or removed from this Media Sink because its set of streams is fixed.%0 + + + + + MessageId: MF_E_STREAMSINK_EXISTS + + MessageText: + + The given Stream Sink already exists.%0 + + + + + MessageId: MF_E_SAMPLEALLOCATOR_CANCELED + + MessageText: + + Sample allocations have been canceled.%0 + + + + + MessageId: MF_E_SAMPLEALLOCATOR_EMPTY + + MessageText: + + The sample allocator is currently empty, due to outstanding requests.%0 + + + + + MessageId: MF_E_SINK_ALREADYSTOPPED + + MessageText: + + When we try to sopt a stream sink, it is already stopped %0 + + + + + MessageId: MF_E_ASF_FILESINK_BITRATE_UNKNOWN + + MessageText: + + The ASF file sink could not reserve AVIO because the bitrate is unknown.%0 + + + + + MessageId: MF_E_SINK_NO_STREAMS + + MessageText: + + No streams are selected in sink presentation descriptor.%0 + + + + + MessageId: MF_S_SINK_NOT_FINALIZED + + MessageText: + + The sink has not been finalized before shut down. This may cause sink generate a corrupted content.%0 + + + + + MessageId: MF_E_METADATA_TOO_LONG + + MessageText: + + A metadata item was too long to write to the output container.%0 + + + + + MessageId: MF_E_SINK_NO_SAMPLES_PROCESSED + + MessageText: + + The operation failed because no samples were processed by the sink.%0 + + + + + MessageId: MF_E_VIDEO_REN_NO_PROCAMP_HW + + MessageText: + + There is no available procamp hardware with which to perform color correction.%0 + + + + + MessageId: MF_E_VIDEO_REN_NO_DEINTERLACE_HW + + MessageText: + + There is no available deinterlacing hardware with which to deinterlace the video stream.%0 + + + + + MessageId: MF_E_VIDEO_REN_COPYPROT_FAILED + + MessageText: + + A video stream requires copy protection to be enabled, but there was a failure in attempting to enable copy protection.%0 + + + + + MessageId: MF_E_VIDEO_REN_SURFACE_NOT_SHARED + + MessageText: + + A component is attempting to access a surface for sharing that is not shared.%0 + + + + + MessageId: MF_E_VIDEO_DEVICE_LOCKED + + MessageText: + + A component is attempting to access a shared device that is already locked by another component.%0 + + + + + MessageId: MF_E_NEW_VIDEO_DEVICE + + MessageText: + + The device is no longer available. The handle should be closed and a new one opened.%0 + + + + + MessageId: MF_E_NO_VIDEO_SAMPLE_AVAILABLE + + MessageText: + + A video sample is not currently queued on a stream that is required for mixing.%0 + + + + + MessageId: MF_E_NO_AUDIO_PLAYBACK_DEVICE + + MessageText: + + No audio playback device was found.%0 + + + + + MessageId: MF_E_AUDIO_PLAYBACK_DEVICE_IN_USE + + MessageText: + + The requested audio playback device is currently in use.%0 + + + + + MessageId: MF_E_AUDIO_PLAYBACK_DEVICE_INVALIDATED + + MessageText: + + The audio playback device is no longer present.%0 + + + + + MessageId: MF_E_AUDIO_SERVICE_NOT_RUNNING + + MessageText: + + The audio service is not running.%0 + + + + + MessageId: MF_E_TOPO_INVALID_OPTIONAL_NODE + + MessageText: + + The topology contains an invalid optional node. Possible reasons are incorrect number of outputs and inputs or optional node is at the beginning or end of a segment. %0 + + + + + MessageId: MF_E_TOPO_CANNOT_FIND_DECRYPTOR + + MessageText: + + No suitable transform was found to decrypt the content. %0 + + + + + MessageId: MF_E_TOPO_CODEC_NOT_FOUND + + MessageText: + + No suitable transform was found to encode or decode the content. %0 + + + + + MessageId: MF_E_TOPO_CANNOT_CONNECT + + MessageText: + + Unable to find a way to connect nodes%0 + + + + + MessageId: MF_E_TOPO_UNSUPPORTED + + MessageText: + + Unsupported operations in topoloader%0 + + + + + MessageId: MF_E_TOPO_INVALID_TIME_ATTRIBUTES + + MessageText: + + The topology or its nodes contain incorrectly set time attributes%0 + + + + + MessageId: MF_E_TOPO_LOOPS_IN_TOPOLOGY + + MessageText: + + The topology contains loops, which are unsupported in media foundation topologies%0 + + + + + MessageId: MF_E_TOPO_MISSING_PRESENTATION_DESCRIPTOR + + MessageText: + + A source stream node in the topology does not have a presentation descriptor%0 + + + + + MessageId: MF_E_TOPO_MISSING_STREAM_DESCRIPTOR + + MessageText: + + A source stream node in the topology does not have a stream descriptor%0 + + + + + MessageId: MF_E_TOPO_STREAM_DESCRIPTOR_NOT_SELECTED + + MessageText: + + A stream descriptor was set on a source stream node but it was not selected on the presentation descriptor%0 + + + + + MessageId: MF_E_TOPO_MISSING_SOURCE + + MessageText: + + A source stream node in the topology does not have a source%0 + + + + + MessageId: MF_E_TOPO_SINK_ACTIVATES_UNSUPPORTED + + MessageText: + + The topology loader does not support sink activates on output nodes.%0 + + + + + MessageId: MF_E_SEQUENCER_UNKNOWN_SEGMENT_ID + + MessageText: + + The sequencer cannot find a segment with the given ID.%0\n. + + + + + MessageId: MF_S_SEQUENCER_CONTEXT_CANCELED + + MessageText: + + The context was canceled.%0\n. + + + + + MessageId: MF_E_NO_SOURCE_IN_CACHE + + MessageText: + + Cannot find source in source cache.%0\n. + + + + + MessageId: MF_S_SEQUENCER_SEGMENT_AT_END_OF_STREAM + + MessageText: + + Cannot update topology flags.%0\n. + + + + + MessageId: MF_E_TRANSFORM_TYPE_NOT_SET + + MessageText: + + A valid type has not been set for this stream or a stream that it depends on.%0 + + + + + MessageId: MF_E_TRANSFORM_STREAM_CHANGE + + MessageText: + + A stream change has occurred. Output cannot be produced until the streams have been renegotiated.%0 + + + + + MessageId: MF_E_TRANSFORM_INPUT_REMAINING + + MessageText: + + The transform cannot take the requested action until all of the input data it currently holds is processed or flushed.%0 + + + + + MessageId: MF_E_TRANSFORM_PROFILE_MISSING + + MessageText: + + The transform requires a profile but no profile was supplied or found.%0 + + + + + MessageId: MF_E_TRANSFORM_PROFILE_INVALID_OR_CORRUPT + + MessageText: + + The transform requires a profile but the supplied profile was invalid or corrupt.%0 + + + + + MessageId: MF_E_TRANSFORM_PROFILE_TRUNCATED + + MessageText: + + The transform requires a profile but the supplied profile ended unexpectedly while parsing.%0 + + + + + MessageId: MF_E_TRANSFORM_PROPERTY_PID_NOT_RECOGNIZED + + MessageText: + + The property ID does not match any property supported by the transform.%0 + + + + + MessageId: MF_E_TRANSFORM_PROPERTY_VARIANT_TYPE_WRONG + + MessageText: + + The variant does not have the type expected for this property ID.%0 + + + + + MessageId: MF_E_TRANSFORM_PROPERTY_NOT_WRITEABLE + + MessageText: + + An attempt was made to set the value on a read-only property.%0 + + + + + MessageId: MF_E_TRANSFORM_PROPERTY_ARRAY_VALUE_WRONG_NUM_DIM + + MessageText: + + The array property value has an unexpected number of dimensions.%0 + + + + + MessageId: MF_E_TRANSFORM_PROPERTY_VALUE_SIZE_WRONG + + MessageText: + + The array or blob property value has an unexpected size.%0 + + + + + MessageId: MF_E_TRANSFORM_PROPERTY_VALUE_OUT_OF_RANGE + + MessageText: + + The property value is out of range for this transform.%0 + + + + + MessageId: MF_E_TRANSFORM_PROPERTY_VALUE_INCOMPATIBLE + + MessageText: + + The property value is incompatible with some other property or mediatype set on the transform.%0 + + + + + MessageId: MF_E_TRANSFORM_NOT_POSSIBLE_FOR_CURRENT_OUTPUT_MEDIATYPE + + MessageText: + + The requested operation is not supported for the currently set output mediatype.%0 + + + + + MessageId: MF_E_TRANSFORM_NOT_POSSIBLE_FOR_CURRENT_INPUT_MEDIATYPE + + MessageText: + + The requested operation is not supported for the currently set input mediatype.%0 + + + + + MessageId: MF_E_TRANSFORM_NOT_POSSIBLE_FOR_CURRENT_MEDIATYPE_COMBINATION + + MessageText: + + The requested operation is not supported for the currently set combination of mediatypes.%0 + + + + + MessageId: MF_E_TRANSFORM_CONFLICTS_WITH_OTHER_CURRENTLY_ENABLED_FEATURES + + MessageText: + + The requested feature is not supported in combination with some other currently enabled feature.%0 + + + + + MessageId: MF_E_TRANSFORM_NEED_MORE_INPUT + + MessageText: + + The transform cannot produce output until it gets more input samples.%0 + + + + + MessageId: MF_E_TRANSFORM_NOT_POSSIBLE_FOR_CURRENT_SPKR_CONFIG + + MessageText: + + The requested operation is not supported for the current speaker configuration.%0 + + + + + MessageId: MF_E_TRANSFORM_CANNOT_CHANGE_MEDIATYPE_WHILE_PROCESSING + + MessageText: + + The transform cannot accept mediatype changes in the middle of processing.%0 + + + + + MessageId: MF_S_TRANSFORM_DO_NOT_PROPAGATE_EVENT + + MessageText: + + The caller should not propagate this event to downstream components.%0 + + + + + MessageId: MF_E_UNSUPPORTED_D3D_TYPE + + MessageText: + + The input type is not supported for D3D device.%0 + + + + + MessageId: MF_E_TRANSFORM_ASYNC_LOCKED + + MessageText: + + The caller does not appear to support this transform's asynchronous capabilities.%0 + + + + + MessageId: MF_E_TRANSFORM_CANNOT_INITIALIZE_ACM_DRIVER + + MessageText: + + An audio compression manager driver could not be initialized by the transform.%0 + + + + + MessageId: MF_E_LICENSE_INCORRECT_RIGHTS + + MessageText: + + You are not allowed to open this file. Contact the content provider for further assistance.%0 + + + + + MessageId: MF_E_LICENSE_OUTOFDATE + + MessageText: + + The license for this media file has expired. Get a new license or contact the content provider for further assistance.%0 + + + + + MessageId: MF_E_LICENSE_REQUIRED + + MessageText: + + You need a license to perform the requested operation on this media file.%0 + + + + + MessageId: MF_E_DRM_HARDWARE_INCONSISTENT + + MessageText: + + The licenses for your media files are corrupted. Contact Microsoft product support.%0 + + + + + MessageId: MF_E_NO_CONTENT_PROTECTION_MANAGER + + MessageText: + + The APP needs to provide IMFContentProtectionManager callback to access the protected media file.%0 + + + + + MessageId: MF_E_LICENSE_RESTORE_NO_RIGHTS + + MessageText: + + Client does not have rights to restore licenses.%0 + + + + + MessageId: MF_E_BACKUP_RESTRICTED_LICENSE + + MessageText: + + Licenses are restricted and hence can not be backed up.%0 + + + + + MessageId: MF_E_LICENSE_RESTORE_NEEDS_INDIVIDUALIZATION + + MessageText: + + License restore requires machine to be individualized.%0 + + + + + MessageId: MF_S_PROTECTION_NOT_REQUIRED + + MessageText: + + Protection for stream is not required.%0 + + + + + MessageId: MF_E_COMPONENT_REVOKED + + MessageText: + + Component is revoked.%0 + + + + + MessageId: MF_E_TRUST_DISABLED + + MessageText: + + Trusted functionality is currently disabled on this component.%0 + + + + + MessageId: MF_E_WMDRMOTA_NO_ACTION + + MessageText: + + No Action is set on WMDRM Output Trust Authority.%0 + + + + + MessageId: MF_E_WMDRMOTA_ACTION_ALREADY_SET + + MessageText: + + Action is already set on WMDRM Output Trust Authority.%0 + + + + + MessageId: MF_E_WMDRMOTA_DRM_HEADER_NOT_AVAILABLE + + MessageText: + + DRM Heaader is not available.%0 + + + + + MessageId: MF_E_WMDRMOTA_DRM_ENCRYPTION_SCHEME_NOT_SUPPORTED + + MessageText: + + Current encryption scheme is not supported.%0 + + + + + MessageId: MF_E_WMDRMOTA_ACTION_MISMATCH + + MessageText: + + Action does not match with current configuration.%0 + + + + + MessageId: MF_E_WMDRMOTA_INVALID_POLICY + + MessageText: + + Invalid policy for WMDRM Output Trust Authority.%0 + + + + + MessageId: MF_E_POLICY_UNSUPPORTED + + MessageText: + + The policies that the Input Trust Authority requires to be enforced are unsupported by the outputs.%0 + + + + + MessageId: MF_E_OPL_NOT_SUPPORTED + + MessageText: + + The OPL that the license requires to be enforced are not supported by the Input Trust Authority.%0 + + + + + MessageId: MF_E_TOPOLOGY_VERIFICATION_FAILED + + MessageText: + + The topology could not be successfully verified.%0 + + + + + MessageId: MF_E_SIGNATURE_VERIFICATION_FAILED + + MessageText: + + Signature verification could not be completed successfully for this component.%0 + + + + + MessageId: MF_E_DEBUGGING_NOT_ALLOWED + + MessageText: + + Running this process under a debugger while using protected content is not allowed.%0 + + + + + MessageId: MF_E_CODE_EXPIRED + + MessageText: + + MF component has expired.%0 + + + + + MessageId: MF_E_GRL_VERSION_TOO_LOW + + MessageText: + + The current GRL on the machine does not meet the minimum version requirements.%0 + + + + + MessageId: MF_E_GRL_RENEWAL_NOT_FOUND + + MessageText: + + The current GRL on the machine does not contain any renewal entries for the specified revocation.%0 + + + + + MessageId: MF_E_GRL_EXTENSIBLE_ENTRY_NOT_FOUND + + MessageText: + + The current GRL on the machine does not contain any extensible entries for the specified extension GUID.%0 + + + + + MessageId: MF_E_KERNEL_UNTRUSTED + + MessageText: + + The kernel isn't secure for high security level content.%0 + + + + + MessageId: MF_E_PEAUTH_UNTRUSTED + + MessageText: + + The response from protected environment driver isn't valid.%0 + + + + + MessageId: MF_E_NON_PE_PROCESS + + MessageText: + + A non-PE process tried to talk to PEAuth.%0 + + + + + MessageId: MF_E_REBOOT_REQUIRED + + MessageText: + + We need to reboot the machine.%0 + + + + + MessageId: MF_S_WAIT_FOR_POLICY_SET + + MessageText: + + Protection for this stream is not guaranteed to be enforced until the MEPolicySet event is fired.%0 + + + + + MessageId: MF_S_VIDEO_DISABLED_WITH_UNKNOWN_SOFTWARE_OUTPUT + + MessageText: + + This video stream is disabled because it is being sent to an unknown software output.%0 + + + + + MessageId: MF_E_GRL_INVALID_FORMAT + + MessageText: + + The GRL file is not correctly formed, it may have been corrupted or overwritten.%0 + + + + + MessageId: MF_E_GRL_UNRECOGNIZED_FORMAT + + MessageText: + + The GRL file is in a format newer than those recognized by this GRL Reader.%0 + + + + + MessageId: MF_E_ALL_PROCESS_RESTART_REQUIRED + + MessageText: + + The GRL was reloaded and required all processes that can run protected media to restart.%0 + + + + + MessageId: MF_E_PROCESS_RESTART_REQUIRED + + MessageText: + + The GRL was reloaded and the current process needs to restart.%0 + + + + + MessageId: MF_E_USERMODE_UNTRUSTED + + MessageText: + + The user space is untrusted for protected content play.%0 + + + + + MessageId: MF_E_PEAUTH_SESSION_NOT_STARTED + + MessageText: + + PEAuth communication session hasn't been started.%0 + + + + + MessageId: MF_E_PEAUTH_PUBLICKEY_REVOKED + + MessageText: + + PEAuth's public key is revoked.%0 + + + + + MessageId: MF_E_GRL_ABSENT + + MessageText: + + The GRL is absent.%0 + + + + + MessageId: MF_S_PE_TRUSTED + + MessageText: + + The Protected Environment is trusted.%0 + + + + + MessageId: MF_E_PE_UNTRUSTED + + MessageText: + + The Protected Environment is untrusted.%0 + + + + + MessageId: MF_E_PEAUTH_NOT_STARTED + + MessageText: + + The Protected Environment Authorization service (PEAUTH) has not been started.%0 + + + + + MessageId: MF_E_INCOMPATIBLE_SAMPLE_PROTECTION + + MessageText: + + The sample protection algorithms supported by components are not compatible.%0 + + + + + MessageId: MF_E_PE_SESSIONS_MAXED + + MessageText: + + No more protected environment sessions can be supported.%0 + + + + + MessageId: MF_E_HIGH_SECURITY_LEVEL_CONTENT_NOT_ALLOWED + + MessageText: + + WMDRM ITA does not allow protected content with high security level for this release.%0 + + + + + MessageId: MF_E_TEST_SIGNED_COMPONENTS_NOT_ALLOWED + + MessageText: + + WMDRM ITA cannot allow the requested action for the content as one or more components is not properly signed.%0 + + + + + MessageId: MF_E_ITA_UNSUPPORTED_ACTION + + MessageText: + + WMDRM ITA does not support the requested action.%0 + + + + + MessageId: MF_E_ITA_ERROR_PARSING_SAP_PARAMETERS + + MessageText: + + WMDRM ITA encountered an error in parsing the Secure Audio Path parameters.%0 + + + + + MessageId: MF_E_POLICY_MGR_ACTION_OUTOFBOUNDS + + MessageText: + + The Policy Manager action passed in is invalid.%0 + + + + + MessageId: MF_E_BAD_OPL_STRUCTURE_FORMAT + + MessageText: + + The structure specifying Output Protection Level is not the correct format.%0 + + + + + MessageId: MF_E_ITA_UNRECOGNIZED_ANALOG_VIDEO_PROTECTION_GUID + + MessageText: + + WMDRM ITA does not recognize the Explicite Analog Video Output Protection guid specified in the license.%0 + + + + + MessageId: MF_E_NO_PMP_HOST + + MessageText: + + IMFPMPHost object not available.%0 + + + + + MessageId: MF_E_ITA_OPL_DATA_NOT_INITIALIZED + + MessageText: + + WMDRM ITA could not initialize the Output Protection Level data.%0 + + + + + MessageId: MF_E_ITA_UNRECOGNIZED_ANALOG_VIDEO_OUTPUT + + MessageText: + + WMDRM ITA does not recognize the Analog Video Output specified by the OTA.%0 + + + + + MessageId: MF_E_ITA_UNRECOGNIZED_DIGITAL_VIDEO_OUTPUT + + MessageText: + + WMDRM ITA does not recognize the Digital Video Output specified by the OTA.%0 + + + + + MessageId: MF_E_CLOCK_INVALID_CONTINUITY_KEY + + MessageText: + + The continuity key supplied is not currently valid.%0 + + + + + MessageId: MF_E_CLOCK_NO_TIME_SOURCE + + MessageText: + + No Presentation Time Source has been specified.%0 + + + + + MessageId: MF_E_CLOCK_STATE_ALREADY_SET + + MessageText: + + The clock is already in the requested state.%0 + + + + + MessageId: MF_E_CLOCK_NOT_SIMPLE + + MessageText: + + The clock has too many advanced features to carry out the request.%0 + + + + + MessageId: MF_S_CLOCK_STOPPED + + MessageText: + + Timer::SetTimer returns this success code if called happened while timer is stopped. Timer is not going to be dispatched until clock is running%0 + + + + + MessageId: MF_E_NO_MORE_DROP_MODES + + MessageText: + + The component does not support any more drop modes.%0 + + + + + MessageId: MF_E_NO_MORE_QUALITY_LEVELS + + MessageText: + + The component does not support any more quality levels.%0 + + + + + MessageId: MF_E_DROPTIME_NOT_SUPPORTED + + MessageText: + + The component does not support drop time functionality.%0 + + + + + MessageId: MF_E_QUALITYKNOB_WAIT_LONGER + + MessageText: + + Quality Manager needs to wait longer before bumping the Quality Level up.%0 + + + + + MessageId: MF_E_QM_INVALIDSTATE + + MessageText: + + Quality Manager is in an invalid state. Quality Management is off at this moment.%0 + + + + + MessageId: MF_E_TRANSCODE_NO_CONTAINERTYPE + + MessageText: + + No transcode output container type is specified.%0 + + + + + MessageId: MF_E_TRANSCODE_PROFILE_NO_MATCHING_STREAMS + + MessageText: + + The profile does not have a media type configuration for any selected source streams.%0 + + + + + MessageId: MF_E_TRANSCODE_NO_MATCHING_ENCODER + + MessageText: + + Cannot find an encoder MFT that accepts the user preferred output type.%0 + + + + + MessageId: MF_E_ALLOCATOR_NOT_INITIALIZED + + MessageText: + + Memory allocator is not initialized.%0 + + + + + MessageId: MF_E_ALLOCATOR_NOT_COMMITED + + MessageText: + + Memory allocator is not committed yet.%0 + + + + + MessageId: MF_E_ALLOCATOR_ALREADY_COMMITED + + MessageText: + + Memory allocator has already been committed.%0 + + + + + MessageId: MF_E_STREAM_ERROR + + MessageText: + + An error occurred in media stream.%0 + + + + + MessageId: MF_E_INVALID_STREAM_STATE + + MessageText: + + Stream is not in a state to handle the request.%0 + + + + + MessageId: MF_E_HW_STREAM_NOT_CONNECTED + + MessageText: + + Hardware stream is not connected yet.%0 + + + + + Major Media Types + http://msdn.microsoft.com/en-us/library/windows/desktop/aa367377%28v=vs.85%29.aspx + + + + + Default + + + + + Audio + + + + + Video + + + + + Protected Media + + + + + Synchronized Accessible Media Interchange (SAMI) captions. + + + + + Script stream + + + + + Still image stream. + + + + + HTML stream. + + + + + Binary stream. + + + + + A stream that contains data files. + + + + + Chunk Identifier helpers + + + + + Chunk identifier to Int32 (replaces mmioStringToFOURCC) + + four character chunk identifier + Chunk identifier as int 32 + + + + Allows us to add descriptions to interop members + + + + + Field description + + + + + String representation + + + + + + The description + + + + + IMFActivate, defined in mfobjects.h + + + + + Provides a generic way to store key/value pairs on an object. + http://msdn.microsoft.com/en-gb/library/windows/desktop/ms704598%28v=vs.85%29.aspx + + + + + Retrieves the value associated with a key. + + + + + Retrieves the data type of the value associated with a key. + + + + + Queries whether a stored attribute value equals a specified PROPVARIANT. + + + + + Compares the attributes on this object with the attributes on another object. + + + + + Retrieves a UINT32 value associated with a key. + + + + + Retrieves a UINT64 value associated with a key. + + + + + Retrieves a double value associated with a key. + + + + + Retrieves a GUID value associated with a key. + + + + + Retrieves the length of a string value associated with a key. + + + + + Retrieves a wide-character string associated with a key. + + + + + Retrieves a wide-character string associated with a key. This method allocates the memory for the string. + + + + + Retrieves the length of a byte array associated with a key. + + + + + Retrieves a byte array associated with a key. + + + + + Retrieves a byte array associated with a key. This method allocates the memory for the array. + + + + + Retrieves an interface pointer associated with a key. + + + + + Associates an attribute value with a key. + + + + + Removes a key/value pair from the object's attribute list. + + + + + Removes all key/value pairs from the object's attribute list. + + + + + Associates a UINT32 value with a key. + + + + + Associates a UINT64 value with a key. + + + + + Associates a double value with a key. + + + + + Associates a GUID value with a key. + + + + + Associates a wide-character string with a key. + + + + + Associates a byte array with a key. + + + + + Associates an IUnknown pointer with a key. + + + + + Locks the attribute store so that no other thread can access it. + + + + + Unlocks the attribute store. + + + + + Retrieves the number of attributes that are set on this object. + + + + + Retrieves an attribute at the specified index. + + + + + Copies all of the attributes from this object into another attribute store. + + + + + Retrieves the value associated with a key. + + + + + Retrieves the data type of the value associated with a key. + + + + + Queries whether a stored attribute value equals a specified PROPVARIANT. + + + + + Compares the attributes on this object with the attributes on another object. + + + + + Retrieves a UINT32 value associated with a key. + + + + + Retrieves a UINT64 value associated with a key. + + + + + Retrieves a double value associated with a key. + + + + + Retrieves a GUID value associated with a key. + + + + + Retrieves the length of a string value associated with a key. + + + + + Retrieves a wide-character string associated with a key. + + + + + Retrieves a wide-character string associated with a key. This method allocates the memory for the string. + + + + + Retrieves the length of a byte array associated with a key. + + + + + Retrieves a byte array associated with a key. + + + + + Retrieves a byte array associated with a key. This method allocates the memory for the array. + + + + + Retrieves an interface pointer associated with a key. + + + + + Associates an attribute value with a key. + + + + + Removes a key/value pair from the object's attribute list. + + + + + Removes all key/value pairs from the object's attribute list. + + + + + Associates a UINT32 value with a key. + + + + + Associates a UINT64 value with a key. + + + + + Associates a double value with a key. + + + + + Associates a GUID value with a key. + + + + + Associates a wide-character string with a key. + + + + + Associates a byte array with a key. + + + + + Associates an IUnknown pointer with a key. + + + + + Locks the attribute store so that no other thread can access it. + + + + + Unlocks the attribute store. + + + + + Retrieves the number of attributes that are set on this object. + + + + + Retrieves an attribute at the specified index. + + + + + Copies all of the attributes from this object into another attribute store. + + + + + Creates the object associated with this activation object. + + + + + Shuts down the created object. + + + + + Detaches the created object from the activation object. + + + + + Represents a generic collection of IUnknown pointers. + + + + + Retrieves the number of objects in the collection. + + + + + Retrieves an object in the collection. + + + + + Adds an object to the collection. + + + + + Removes an object from the collection. + + + + + Removes an object from the collection. + + + + + Removes all items from the collection. + + + + + IMFMediaEvent - Represents an event generated by a Media Foundation object. Use this interface to get information about the event. + http://msdn.microsoft.com/en-us/library/windows/desktop/ms702249%28v=vs.85%29.aspx + Mfobjects.h + + + + + Retrieves the value associated with a key. + + + + + Retrieves the data type of the value associated with a key. + + + + + Queries whether a stored attribute value equals a specified PROPVARIANT. + + + + + Compares the attributes on this object with the attributes on another object. + + + + + Retrieves a UINT32 value associated with a key. + + + + + Retrieves a UINT64 value associated with a key. + + + + + Retrieves a double value associated with a key. + + + + + Retrieves a GUID value associated with a key. + + + + + Retrieves the length of a string value associated with a key. + + + + + Retrieves a wide-character string associated with a key. + + + + + Retrieves a wide-character string associated with a key. This method allocates the memory for the string. + + + + + Retrieves the length of a byte array associated with a key. + + + + + Retrieves a byte array associated with a key. + + + + + Retrieves a byte array associated with a key. This method allocates the memory for the array. + + + + + Retrieves an interface pointer associated with a key. + + + + + Associates an attribute value with a key. + + + + + Removes a key/value pair from the object's attribute list. + + + + + Removes all key/value pairs from the object's attribute list. + + + + + Associates a UINT32 value with a key. + + + + + Associates a UINT64 value with a key. + + + + + Associates a double value with a key. + + + + + Associates a GUID value with a key. + + + + + Associates a wide-character string with a key. + + + + + Associates a byte array with a key. + + + + + Associates an IUnknown pointer with a key. + + + + + Locks the attribute store so that no other thread can access it. + + + + + Unlocks the attribute store. + + + + + Retrieves the number of attributes that are set on this object. + + + + + Retrieves an attribute at the specified index. + + + + + Copies all of the attributes from this object into another attribute store. + + + + + Retrieves the event type. + + + virtual HRESULT STDMETHODCALLTYPE GetType( + /* [out] */ __RPC__out MediaEventType *pmet) = 0; + + + + + Retrieves the extended type of the event. + + + virtual HRESULT STDMETHODCALLTYPE GetExtendedType( + /* [out] */ __RPC__out GUID *pguidExtendedType) = 0; + + + + + Retrieves an HRESULT that specifies the event status. + + + virtual HRESULT STDMETHODCALLTYPE GetStatus( + /* [out] */ __RPC__out HRESULT *phrStatus) = 0; + + + + + Retrieves the value associated with the event, if any. + + + virtual HRESULT STDMETHODCALLTYPE GetValue( + /* [out] */ __RPC__out PROPVARIANT *pvValue) = 0; + + + + + Implemented by the Microsoft Media Foundation sink writer object. + + + + + Adds a stream to the sink writer. + + + + + Sets the input format for a stream on the sink writer. + + + + + Initializes the sink writer for writing. + + + + + Delivers a sample to the sink writer. + + + + + Indicates a gap in an input stream. + + + + + Places a marker in the specified stream. + + + + + Notifies the media sink that a stream has reached the end of a segment. + + + + + Flushes one or more streams. + + + + + (Finalize) Completes all writing operations on the sink writer. + + + + + Queries the underlying media sink or encoder for an interface. + + + + + Gets statistics about the performance of the sink writer. + + + + + IMFTransform, defined in mftransform.h + + + + + Retrieves the minimum and maximum number of input and output streams. + + + virtual HRESULT STDMETHODCALLTYPE GetStreamLimits( + /* [out] */ __RPC__out DWORD *pdwInputMinimum, + /* [out] */ __RPC__out DWORD *pdwInputMaximum, + /* [out] */ __RPC__out DWORD *pdwOutputMinimum, + /* [out] */ __RPC__out DWORD *pdwOutputMaximum) = 0; + + + + + Retrieves the current number of input and output streams on this MFT. + + + virtual HRESULT STDMETHODCALLTYPE GetStreamCount( + /* [out] */ __RPC__out DWORD *pcInputStreams, + /* [out] */ __RPC__out DWORD *pcOutputStreams) = 0; + + + + + Retrieves the stream identifiers for the input and output streams on this MFT. + + + virtual HRESULT STDMETHODCALLTYPE GetStreamIDs( + DWORD dwInputIDArraySize, + /* [size_is][out] */ __RPC__out_ecount_full(dwInputIDArraySize) DWORD *pdwInputIDs, + DWORD dwOutputIDArraySize, + /* [size_is][out] */ __RPC__out_ecount_full(dwOutputIDArraySize) DWORD *pdwOutputIDs) = 0; + + + + + Gets the buffer requirements and other information for an input stream on this Media Foundation transform (MFT). + + + virtual HRESULT STDMETHODCALLTYPE GetInputStreamInfo( + DWORD dwInputStreamID, + /* [out] */ __RPC__out MFT_INPUT_STREAM_INFO *pStreamInfo) = 0; + + + + + Gets the buffer requirements and other information for an output stream on this Media Foundation transform (MFT). + + + virtual HRESULT STDMETHODCALLTYPE GetOutputStreamInfo( + DWORD dwOutputStreamID, + /* [out] */ __RPC__out MFT_OUTPUT_STREAM_INFO *pStreamInfo) = 0; + + + + + Gets the global attribute store for this Media Foundation transform (MFT). + + + virtual HRESULT STDMETHODCALLTYPE GetAttributes( + /* [out] */ __RPC__deref_out_opt IMFAttributes **pAttributes) = 0; + + + + + Retrieves the attribute store for an input stream on this MFT. + + + virtual HRESULT STDMETHODCALLTYPE GetInputStreamAttributes( + DWORD dwInputStreamID, + /* [out] */ __RPC__deref_out_opt IMFAttributes **pAttributes) = 0; + + + + + Retrieves the attribute store for an output stream on this MFT. + + + virtual HRESULT STDMETHODCALLTYPE GetOutputStreamAttributes( + DWORD dwOutputStreamID, + /* [out] */ __RPC__deref_out_opt IMFAttributes **pAttributes) = 0; + + + + + Removes an input stream from this MFT. + + + virtual HRESULT STDMETHODCALLTYPE DeleteInputStream( + DWORD dwStreamID) = 0; + + + + + Adds one or more new input streams to this MFT. + + + virtual HRESULT STDMETHODCALLTYPE AddInputStreams( + DWORD cStreams, + /* [in] */ __RPC__in DWORD *adwStreamIDs) = 0; + + + + + Gets an available media type for an input stream on this Media Foundation transform (MFT). + + + virtual HRESULT STDMETHODCALLTYPE GetInputAvailableType( + DWORD dwInputStreamID, + DWORD dwTypeIndex, + /* [out] */ __RPC__deref_out_opt IMFMediaType **ppType) = 0; + + + + + Retrieves an available media type for an output stream on this MFT. + + + virtual HRESULT STDMETHODCALLTYPE GetOutputAvailableType( + DWORD dwOutputStreamID, + DWORD dwTypeIndex, + /* [out] */ __RPC__deref_out_opt IMFMediaType **ppType) = 0; + + + + + Sets, tests, or clears the media type for an input stream on this Media Foundation transform (MFT). + + + virtual HRESULT STDMETHODCALLTYPE SetInputType( + DWORD dwInputStreamID, + /* [in] */ __RPC__in_opt IMFMediaType *pType, + DWORD dwFlags) = 0; + + + + + Sets, tests, or clears the media type for an output stream on this Media Foundation transform (MFT). + + + virtual HRESULT STDMETHODCALLTYPE SetOutputType( + DWORD dwOutputStreamID, + /* [in] */ __RPC__in_opt IMFMediaType *pType, + DWORD dwFlags) = 0; + + + + + Gets the current media type for an input stream on this Media Foundation transform (MFT). + + + virtual HRESULT STDMETHODCALLTYPE GetInputCurrentType( + DWORD dwInputStreamID, + /* [out] */ __RPC__deref_out_opt IMFMediaType **ppType) = 0; + + + + + Gets the current media type for an output stream on this Media Foundation transform (MFT). + + + virtual HRESULT STDMETHODCALLTYPE GetOutputCurrentType( + DWORD dwOutputStreamID, + /* [out] */ __RPC__deref_out_opt IMFMediaType **ppType) = 0; + + + + + Queries whether an input stream on this Media Foundation transform (MFT) can accept more data. + + + virtual HRESULT STDMETHODCALLTYPE GetInputStatus( + DWORD dwInputStreamID, + /* [out] */ __RPC__out DWORD *pdwFlags) = 0; + + + + + Queries whether the Media Foundation transform (MFT) is ready to produce output data. + + + virtual HRESULT STDMETHODCALLTYPE GetOutputStatus( + /* [out] */ __RPC__out DWORD *pdwFlags) = 0; + + + + + Sets the range of time stamps the client needs for output. + + + virtual HRESULT STDMETHODCALLTYPE SetOutputBounds( + LONGLONG hnsLowerBound, + LONGLONG hnsUpperBound) = 0; + + + + + Sends an event to an input stream on this Media Foundation transform (MFT). + + + virtual HRESULT STDMETHODCALLTYPE ProcessEvent( + DWORD dwInputStreamID, + /* [in] */ __RPC__in_opt IMFMediaEvent *pEvent) = 0; + + + + + Sends a message to the Media Foundation transform (MFT). + + + virtual HRESULT STDMETHODCALLTYPE ProcessMessage( + MFT_MESSAGE_TYPE eMessage, + ULONG_PTR ulParam) = 0; + + + + + Delivers data to an input stream on this Media Foundation transform (MFT). + + + virtual /* [local] */ HRESULT STDMETHODCALLTYPE ProcessInput( + DWORD dwInputStreamID, + IMFSample *pSample, + DWORD dwFlags) = 0; + + + + + Generates output from the current input data. + + + virtual /* [local] */ HRESULT STDMETHODCALLTYPE ProcessOutput( + DWORD dwFlags, + DWORD cOutputBufferCount, + /* [size_is][out][in] */ MFT_OUTPUT_DATA_BUFFER *pOutputSamples, + /* [out] */ DWORD *pdwStatus) = 0; + + + + + See mfobjects.h + + + + + Unknown event type. + + + + + Signals a serious error. + + + + + Custom event type. + + + + + A non-fatal error occurred during streaming. + + + + + Session Unknown + + + + + Raised after the IMFMediaSession::SetTopology method completes asynchronously + + + + + Raised by the Media Session when the IMFMediaSession::ClearTopologies method completes asynchronously. + + + + + Raised when the IMFMediaSession::Start method completes asynchronously. + + + + + Raised when the IMFMediaSession::Pause method completes asynchronously. + + + + + Raised when the IMFMediaSession::Stop method completes asynchronously. + + + + + Raised when the IMFMediaSession::Close method completes asynchronously. + + + + + Raised by the Media Session when it has finished playing the last presentation in the playback queue. + + + + + Raised by the Media Session when the playback rate changes. + + + + + Raised by the Media Session when it completes a scrubbing request. + + + + + Raised by the Media Session when the session capabilities change. + + + + + Raised by the Media Session when the status of a topology changes. + + + + + Raised by the Media Session when a new presentation starts. + + + + + Raised by a media source a new presentation is ready. + + + + + License acquisition is about to begin. + + + + + License acquisition is complete. + + + + + Individualization is about to begin. + + + + + Individualization is complete. + + + + + Signals the progress of a content enabler object. + + + + + A content enabler object's action is complete. + + + + + Raised by a trusted output if an error occurs while enforcing the output policy. + + + + + Contains status information about the enforcement of an output policy. + + + + + A media source started to buffer data. + + + + + A media source stopped buffering data. + + + + + The network source started opening a URL. + + + + + The network source finished opening a URL. + + + + + Raised by a media source at the start of a reconnection attempt. + + + + + Raised by a media source at the end of a reconnection attempt. + + + + + Raised by the enhanced video renderer (EVR) when it receives a user event from the presenter. + + + + + Raised by the Media Session when the format changes on a media sink. + + + + + Source Unknown + + + + + Raised when a media source starts without seeking. + + + + + Raised by a media stream when the source starts without seeking. + + + + + Raised when a media source seeks to a new position. + + + + + Raised by a media stream after a call to IMFMediaSource::Start causes a seek in the stream. + + + + + Raised by a media source when it starts a new stream. + + + + + Raised by a media source when it restarts or seeks a stream that is already active. + + + + + Raised by a media source when the IMFMediaSource::Stop method completes asynchronously. + + + + + Raised by a media stream when the IMFMediaSource::Stop method completes asynchronously. + + + + + Raised by a media source when the IMFMediaSource::Pause method completes asynchronously. + + + + + Raised by a media stream when the IMFMediaSource::Pause method completes asynchronously. + + + + + Raised by a media source when a presentation ends. + + + + + Raised by a media stream when the stream ends. + + + + + Raised when a media stream delivers a new sample. + + + + + Signals that a media stream does not have data available at a specified time. + + + + + Raised by a media stream when it starts or stops thinning the stream. + + + + + Raised by a media stream when the media type of the stream changes. + + + + + Raised by a media source when the playback rate changes. + + + + + Raised by the sequencer source when a segment is completed and is followed by another segment. + + + + + Raised by a media source when the source's characteristics change. + + + + + Raised by a media source to request a new playback rate. + + + + + Raised by a media source when it updates its metadata. + + + + + Raised by the sequencer source when the IMFSequencerSource::UpdateTopology method completes asynchronously. + + + + + Sink Unknown + + + + + Raised by a stream sink when it completes the transition to the running state. + + + + + Raised by a stream sink when it completes the transition to the stopped state. + + + + + Raised by a stream sink when it completes the transition to the paused state. + + + + + Raised by a stream sink when the rate has changed. + + + + + Raised by a stream sink to request a new media sample from the pipeline. + + + + + Raised by a stream sink after the IMFStreamSink::PlaceMarker method is called. + + + + + Raised by a stream sink when the stream has received enough preroll data to begin rendering. + + + + + Raised by a stream sink when it completes a scrubbing request. + + + + + Raised by a stream sink when the sink's media type is no longer valid. + + + + + Raised by the stream sinks of the EVR if the video device changes. + + + + + Provides feedback about playback quality to the quality manager. + + + + + Raised when a media sink becomes invalid. + + + + + The audio session display name changed. + + + + + The volume or mute state of the audio session changed + + + + + The audio device was removed. + + + + + The Windows audio server system was shut down. + + + + + The grouping parameters changed for the audio session. + + + + + The audio session icon changed. + + + + + The default audio format for the audio device changed. + + + + + The audio session was disconnected from a Windows Terminal Services session + + + + + The audio session was preempted by an exclusive-mode connection. + + + + + Trust Unknown + + + + + The output policy for a stream changed. + + + + + Content protection message + + + + + The IMFOutputTrustAuthority::SetPolicy method completed. + + + + + DRM License Backup Completed + + + + + DRM License Backup Progress + + + + + DRM License Restore Completed + + + + + DRM License Restore Progress + + + + + DRM License Acquisition Completed + + + + + DRM Individualization Completed + + + + + DRM Individualization Progress + + + + + DRM Proximity Completed + + + + + DRM License Store Cleaned + + + + + DRM Revocation Download Completed + + + + + Transform Unknown + + + + + Sent by an asynchronous MFT to request a new input sample. + + + + + Sent by an asynchronous MFT when new output data is available from the MFT. + + + + + Sent by an asynchronous Media Foundation transform (MFT) when a drain operation is complete. + + + + + Sent by an asynchronous MFT in response to an MFT_MESSAGE_COMMAND_MARKER message. + + + + + Media Foundation attribute guids + http://msdn.microsoft.com/en-us/library/windows/desktop/ms696989%28v=vs.85%29.aspx + + + + + Specifies whether an MFT performs asynchronous processing. + + + + + Enables the use of an asynchronous MFT. + + + + + Contains flags for an MFT activation object. + + + + + Specifies the category for an MFT. + + + + + Contains the class identifier (CLSID) of an MFT. + + + + + Contains the registered input types for a Media Foundation transform (MFT). + + + + + Contains the registered output types for a Media Foundation transform (MFT). + + + + + Contains the symbolic link for a hardware-based MFT. + + + + + Contains the display name for a hardware-based MFT. + + + + + Contains a pointer to the stream attributes of the connected stream on a hardware-based MFT. + + + + + Specifies whether a hardware-based MFT is connected to another hardware-based MFT. + + + + + Specifies the preferred output format for an encoder. + + + + + Specifies whether an MFT is registered only in the application's process. + + + + + Contains configuration properties for an encoder. + + + + + Specifies whether a hardware device source uses the system time for time stamps. + + + + + Contains an IMFFieldOfUseMFTUnlock pointer, which can be used to unlock the MFT. + + + + + Contains the merit value of a hardware codec. + + + + + Specifies whether a decoder is optimized for transcoding rather than for playback. + + + + + Contains a pointer to the proxy object for the application's presentation descriptor. + + + + + Contains a pointer to the presentation descriptor from the protected media path (PMP). + + + + + Specifies the duration of a presentation, in 100-nanosecond units. + + + + + Specifies the total size of the source file, in bytes. + + + + + Specifies the audio encoding bit rate for the presentation, in bits per second. + + + + + Specifies the video encoding bit rate for the presentation, in bits per second. + + + + + Specifies the MIME type of the content. + + + + + Specifies when a presentation was last modified. + + + + + The identifier of the playlist element in the presentation. + + + + + Contains the preferred RFC 1766 language of the media source. + + + + + The time at which the presentation must begin, relative to the start of the media source. + + + + + Specifies whether the audio streams in the presentation have a variable bit rate. + + + + + Media type Major Type + + + + + Media Type subtype + + + + + Audio block alignment + + + + + Audio average bytes per second + + + + + Audio number of channels + + + + + Audio samples per second + + + + + Audio bits per sample + + + + + Enables the source reader or sink writer to use hardware-based Media Foundation transforms (MFTs). + + + + + Contains additional format data for a media type. + + + + + Specifies for a media type whether each sample is independent of the other samples in the stream. + + + + + Specifies for a media type whether the samples have a fixed size. + + + + + Contains a DirectShow format GUID for a media type. + + + + + Specifies the preferred legacy format structure to use when converting an audio media type. + + + + + Specifies for a media type whether the media data is compressed. + + + + + Approximate data rate of the video stream, in bits per second, for a video media type. + + + + + Specifies the payload type of an Advanced Audio Coding (AAC) stream. + 0 - The stream contains raw_data_block elements only + 1 - Audio Data Transport Stream (ADTS). The stream contains an adts_sequence, as defined by MPEG-2. + 2 - Audio Data Interchange Format (ADIF). The stream contains an adif_sequence, as defined by MPEG-2. + 3 - The stream contains an MPEG-4 audio transport stream with a synchronization layer (LOAS) and a multiplex layer (LATM). + + + + + Specifies the audio profile and level of an Advanced Audio Coding (AAC) stream, as defined by ISO/IEC 14496-3. + + + + + Main interface for using Media Foundation with NAudio + + + + + initializes MediaFoundation - only needs to be called once per process + + + + + Enumerate the installed MediaFoundation transforms in the specified category + + A category from MediaFoundationTransformCategories + + + + + uninitializes MediaFoundation + + + + + Creates a Media type + + + + + Creates a media type from a WaveFormat + + + + + Creates a memory buffer of the specified size + + Memory buffer size in bytes + The memory buffer + + + + Creates a sample object + + The sample object + + + + Creates a new attributes store + + Initial size + The attributes store + + + + Creates a media foundation byte stream based on a stream object + (usable with WinRT streams) + + The input stream + A media foundation byte stream + + + + Creates a source reader based on a byte stream + + The byte stream + A media foundation source reader + + + + Interop definitions for MediaFoundation + thanks to Lucian Wischik for the initial work on many of these definitions (also various interfaces) + n.b. the goal is to make as much of this internal as possible, and provide + better .NET APIs using the MediaFoundationApi class instead + + + + + All streams + + + + + First audio stream + + + + + First video stream + + + + + Media source + + + + + Media Foundation SDK Version + + + + + Media Foundation API Version + + + + + Media Foundation Version + + + + + Initializes Microsoft Media Foundation. + + + + + Shuts down the Microsoft Media Foundation platform + + + + + Creates an empty media type. + + + + + Initializes a media type from a WAVEFORMATEX structure. + + + + + Converts a Media Foundation audio media type to a WAVEFORMATEX structure. + + TODO: try making second parameter out WaveFormatExtraData + + + + Creates the source reader from a URL. + + + + + Creates the source reader from a byte stream. + + + + + Creates the sink writer from a URL or byte stream. + + + + + Creates a Microsoft Media Foundation byte stream that wraps an IRandomAccessStream object. + + + + + Gets a list of Microsoft Media Foundation transforms (MFTs) that match specified search criteria. + + + + + Creates an empty media sample. + + + + + Allocates system memory and creates a media buffer to manage it. + + + + + Creates an empty attribute store. + + + + + Gets a list of output formats from an audio encoder. + + + + + IMFByteStream + http://msdn.microsoft.com/en-gb/library/windows/desktop/ms698720%28v=vs.85%29.aspx + + + + + Retrieves the characteristics of the byte stream. + virtual HRESULT STDMETHODCALLTYPE GetCapabilities(/*[out]*/ __RPC__out DWORD *pdwCapabilities) = 0; + + + + + Retrieves the length of the stream. + virtual HRESULT STDMETHODCALLTYPE GetLength(/*[out]*/ __RPC__out QWORD *pqwLength) = 0; + + + + + Sets the length of the stream. + virtual HRESULT STDMETHODCALLTYPE SetLength(/*[in]*/ QWORD qwLength) = 0; + + + + + Retrieves the current read or write position in the stream. + virtual HRESULT STDMETHODCALLTYPE GetCurrentPosition(/*[out]*/ __RPC__out QWORD *pqwPosition) = 0; + + + + + Sets the current read or write position. + virtual HRESULT STDMETHODCALLTYPE SetCurrentPosition(/*[in]*/ QWORD qwPosition) = 0; + + + + + Queries whether the current position has reached the end of the stream. + virtual HRESULT STDMETHODCALLTYPE IsEndOfStream(/*[out]*/ __RPC__out BOOL *pfEndOfStream) = 0; + + + + + Reads data from the stream. + virtual HRESULT STDMETHODCALLTYPE Read(/*[size_is][out]*/ __RPC__out_ecount_full(cb) BYTE *pb, /*[in]*/ ULONG cb, /*[out]*/ __RPC__out ULONG *pcbRead) = 0; + + + + + Begins an asynchronous read operation from the stream. + virtual /*[local]*/ HRESULT STDMETHODCALLTYPE BeginRead(/*[out]*/ _Out_writes_bytes_(cb) BYTE *pb, /*[in]*/ ULONG cb, /*[in]*/ IMFAsyncCallback *pCallback, /*[in]*/ IUnknown *punkState) = 0; + + + + + Completes an asynchronous read operation. + virtual /*[local]*/ HRESULT STDMETHODCALLTYPE EndRead(/*[in]*/ IMFAsyncResult *pResult, /*[out]*/ _Out_ ULONG *pcbRead) = 0; + + + + + Writes data to the stream. + virtual HRESULT STDMETHODCALLTYPE Write(/*[size_is][in]*/ __RPC__in_ecount_full(cb) const BYTE *pb, /*[in]*/ ULONG cb, /*[out]*/ __RPC__out ULONG *pcbWritten) = 0; + + + + + Begins an asynchronous write operation to the stream. + virtual /*[local]*/ HRESULT STDMETHODCALLTYPE BeginWrite(/*[in]*/ _In_reads_bytes_(cb) const BYTE *pb, /*[in]*/ ULONG cb, /*[in]*/ IMFAsyncCallback *pCallback, /*[in]*/ IUnknown *punkState) = 0; + + + + + Completes an asynchronous write operation. + virtual /*[local]*/ HRESULT STDMETHODCALLTYPE EndWrite(/*[in]*/ IMFAsyncResult *pResult, /*[out]*/ _Out_ ULONG *pcbWritten) = 0; + + + + + Moves the current position in the stream by a specified offset. + virtual HRESULT STDMETHODCALLTYPE Seek(/*[in]*/ MFBYTESTREAM_SEEK_ORIGIN SeekOrigin, /*[in]*/ LONGLONG llSeekOffset, /*[in]*/ DWORD dwSeekFlags, /*[out]*/ __RPC__out QWORD *pqwCurrentPosition) = 0; + + + + + Clears any internal buffers used by the stream. + virtual HRESULT STDMETHODCALLTYPE Flush( void) = 0; + + + + + Closes the stream and releases any resources associated with the stream. + virtual HRESULT STDMETHODCALLTYPE Close( void) = 0; + + + + + IMFMediaBuffer + http://msdn.microsoft.com/en-gb/library/windows/desktop/ms696261%28v=vs.85%29.aspx + + + + + Gives the caller access to the memory in the buffer. + + + + + Unlocks a buffer that was previously locked. + + + + + Retrieves the length of the valid data in the buffer. + + + + + Sets the length of the valid data in the buffer. + + + + + Retrieves the allocated size of the buffer. + + + + + Represents a description of a media format. + http://msdn.microsoft.com/en-us/library/windows/desktop/ms704850%28v=vs.85%29.aspx + + + + + Retrieves the value associated with a key. + + + + + Retrieves the data type of the value associated with a key. + + + + + Queries whether a stored attribute value equals a specified PROPVARIANT. + + + + + Compares the attributes on this object with the attributes on another object. + + + + + Retrieves a UINT32 value associated with a key. + + + + + Retrieves a UINT64 value associated with a key. + + + + + Retrieves a double value associated with a key. + + + + + Retrieves a GUID value associated with a key. + + + + + Retrieves the length of a string value associated with a key. + + + + + Retrieves a wide-character string associated with a key. + + + + + Retrieves a wide-character string associated with a key. This method allocates the memory for the string. + + + + + Retrieves the length of a byte array associated with a key. + + + + + Retrieves a byte array associated with a key. + + + + + Retrieves a byte array associated with a key. This method allocates the memory for the array. + + + + + Retrieves an interface pointer associated with a key. + + + + + Associates an attribute value with a key. + + + + + Removes a key/value pair from the object's attribute list. + + + + + Removes all key/value pairs from the object's attribute list. + + + + + Associates a UINT32 value with a key. + + + + + Associates a UINT64 value with a key. + + + + + Associates a double value with a key. + + + + + Associates a GUID value with a key. + + + + + Associates a wide-character string with a key. + + + + + Associates a byte array with a key. + + + + + Associates an IUnknown pointer with a key. + + + + + Locks the attribute store so that no other thread can access it. + + + + + Unlocks the attribute store. + + + + + Retrieves the number of attributes that are set on this object. + + + + + Retrieves an attribute at the specified index. + + + + + Copies all of the attributes from this object into another attribute store. + + + + + Retrieves the major type of the format. + + + + + Queries whether the media type is a compressed format. + + + + + Compares two media types and determines whether they are identical. + + + + + Retrieves an alternative representation of the media type. + + + + + Frees memory that was allocated by the GetRepresentation method. + + + + + http://msdn.microsoft.com/en-gb/library/windows/desktop/ms702192%28v=vs.85%29.aspx + + + + + Retrieves the value associated with a key. + + + + + Retrieves the data type of the value associated with a key. + + + + + Queries whether a stored attribute value equals a specified PROPVARIANT. + + + + + Compares the attributes on this object with the attributes on another object. + + + + + Retrieves a UINT32 value associated with a key. + + + + + Retrieves a UINT64 value associated with a key. + + + + + Retrieves a double value associated with a key. + + + + + Retrieves a GUID value associated with a key. + + + + + Retrieves the length of a string value associated with a key. + + + + + Retrieves a wide-character string associated with a key. + + + + + Retrieves a wide-character string associated with a key. This method allocates the memory for the string. + + + + + Retrieves the length of a byte array associated with a key. + + + + + Retrieves a byte array associated with a key. + + + + + Retrieves a byte array associated with a key. This method allocates the memory for the array. + + + + + Retrieves an interface pointer associated with a key. + + + + + Associates an attribute value with a key. + + + + + Removes a key/value pair from the object's attribute list. + + + + + Removes all key/value pairs from the object's attribute list. + + + + + Associates a UINT32 value with a key. + + + + + Associates a UINT64 value with a key. + + + + + Associates a double value with a key. + + + + + Associates a GUID value with a key. + + + + + Associates a wide-character string with a key. + + + + + Associates a byte array with a key. + + + + + Associates an IUnknown pointer with a key. + + + + + Locks the attribute store so that no other thread can access it. + + + + + Unlocks the attribute store. + + + + + Retrieves the number of attributes that are set on this object. + + + + + Retrieves an attribute at the specified index. + + + + + Copies all of the attributes from this object into another attribute store. + + + + + Retrieves flags associated with the sample. + + + + + Sets flags associated with the sample. + + + + + Retrieves the presentation time of the sample. + + + + + Sets the presentation time of the sample. + + + + + Retrieves the duration of the sample. + + + + + Sets the duration of the sample. + + + + + Retrieves the number of buffers in the sample. + + + + + Retrieves a buffer from the sample. + + + + + Converts a sample with multiple buffers into a sample with a single buffer. + + + + + Adds a buffer to the end of the list of buffers in the sample. + + + + + Removes a buffer at a specified index from the sample. + + + + + Removes all buffers from the sample. + + + + + Retrieves the total length of the valid data in all of the buffers in the sample. + + + + + Copies the sample data to a buffer. + + + + + IMFSourceReader interface + http://msdn.microsoft.com/en-us/library/windows/desktop/dd374655%28v=vs.85%29.aspx + + + + + Queries whether a stream is selected. + + + + + Selects or deselects one or more streams. + + + + + Gets a format that is supported natively by the media source. + + + + + Gets the current media type for a stream. + + + + + Sets the media type for a stream. + + + + + Seeks to a new position in the media source. + + + + + Reads the next sample from the media source. + + + + + Flushes one or more streams. + + + + + Queries the underlying media source or decoder for an interface. + + + + + Gets an attribute from the underlying media source. + + + + + Contains flags that indicate the status of the IMFSourceReader::ReadSample method + http://msdn.microsoft.com/en-us/library/windows/desktop/dd375773(v=vs.85).aspx + + + + + No Error + + + + + An error occurred. If you receive this flag, do not make any further calls to IMFSourceReader methods. + + + + + The source reader reached the end of the stream. + + + + + One or more new streams were created + + + + + The native format has changed for one or more streams. The native format is the format delivered by the media source before any decoders are inserted. + + + + + The current media has type changed for one or more streams. To get the current media type, call the IMFSourceReader::GetCurrentMediaType method. + + + + + There is a gap in the stream. This flag corresponds to an MEStreamTick event from the media source. + + + + + All transforms inserted by the application have been removed for a particular stream. + + + + + Media Foundation Transform Categories + + + + + MFT_CATEGORY_VIDEO_DECODER + + + + + MFT_CATEGORY_VIDEO_ENCODER + + + + + MFT_CATEGORY_VIDEO_EFFECT + + + + + MFT_CATEGORY_MULTIPLEXER + + + + + MFT_CATEGORY_DEMULTIPLEXER + + + + + MFT_CATEGORY_AUDIO_DECODER + + + + + MFT_CATEGORY_AUDIO_ENCODER + + + + + MFT_CATEGORY_AUDIO_EFFECT + + + + + MFT_CATEGORY_VIDEO_PROCESSOR + + + + + MFT_CATEGORY_OTHER + + + + + Contains information about an input stream on a Media Foundation transform (MFT) + + + + + Maximum amount of time between an input sample and the corresponding output sample, in 100-nanosecond units. + + + + + Bitwise OR of zero or more flags from the _MFT_INPUT_STREAM_INFO_FLAGS enumeration. + + + + + The minimum size of each input buffer, in bytes. + + + + + Maximum amount of input data, in bytes, that the MFT holds to perform lookahead. + + + + + The memory alignment required for input buffers. If the MFT does not require a specific alignment, the value is zero. + + + + + Contains information about an output buffer for a Media Foundation transform. + + + + + Output stream identifier. + + + + + Pointer to the IMFSample interface. + + + + + Before calling ProcessOutput, set this member to zero. + + + + + Before calling ProcessOutput, set this member to NULL. + + + + + Contains information about an output stream on a Media Foundation transform (MFT). + + + + + Bitwise OR of zero or more flags from the _MFT_OUTPUT_STREAM_INFO_FLAGS enumeration. + + + + + Minimum size of each output buffer, in bytes. + + + + + The memory alignment required for output buffers. + + + + + Defines messages for a Media Foundation transform (MFT). + + + + + Requests the MFT to flush all stored data. + + + + + Requests the MFT to drain any stored data. + + + + + Sets or clears the Direct3D Device Manager for DirectX Video Accereration (DXVA). + + + + + Drop samples - requires Windows 7 + + + + + Command Tick - requires Windows 8 + + + + + Notifies the MFT that streaming is about to begin. + + + + + Notifies the MFT that streaming is about to end. + + + + + Notifies the MFT that an input stream has ended. + + + + + Notifies the MFT that the first sample is about to be processed. + + + + + Marks a point in the stream. This message applies only to asynchronous MFTs. Requires Windows 7 + + + + + Contains media type information for registering a Media Foundation transform (MFT). + + + + + The major media type. + + + + + The Media Subtype + + + + + Contains statistics about the performance of the sink writer. + + + + + The size of the structure, in bytes. + + + + + The time stamp of the most recent sample given to the sink writer. + + + + + The time stamp of the most recent sample to be encoded. + + + + + The time stamp of the most recent sample given to the media sink. + + + + + The time stamp of the most recent stream tick. + + + + + The system time of the most recent sample request from the media sink. + + + + + The number of samples received. + + + + + The number of samples encoded. + + + + + The number of samples given to the media sink. + + + + + The number of stream ticks received. + + + + + The amount of data, in bytes, currently waiting to be processed. + + + + + The total amount of data, in bytes, that has been sent to the media sink. + + + + + The number of pending sample requests. + + + + + The average rate, in media samples per 100-nanoseconds, at which the application sent samples to the sink writer. + + + + + The average rate, in media samples per 100-nanoseconds, at which the sink writer sent samples to the encoder + + + + + The average rate, in media samples per 100-nanoseconds, at which the sink writer sent samples to the media sink. + + + + + Contains flags for registering and enumeration Media Foundation transforms (MFTs). + + + + + None + + + + + The MFT performs synchronous data processing in software. + + + + + The MFT performs asynchronous data processing in software. + + + + + The MFT performs hardware-based data processing, using either the AVStream driver or a GPU-based proxy MFT. + + + + + The MFT that must be unlocked by the application before use. + + + + + For enumeration, include MFTs that were registered in the caller's process. + + + + + The MFT is optimized for transcoding rather than playback. + + + + + For enumeration, sort and filter the results. + + + + + Bitwise OR of all the flags, excluding MFT_ENUM_FLAG_SORTANDFILTER. + + + + + Indicates the status of an input stream on a Media Foundation transform (MFT). + + + + + None + + + + + The input stream can receive more data at this time. + + + + + Describes an input stream on a Media Foundation transform (MFT). + + + + + No flags set + + + + + Each media sample (IMFSample interface) of input data must contain complete, unbroken units of data. + + + + + Each media sample that the client provides as input must contain exactly one unit of data, as defined for the MFT_INPUT_STREAM_WHOLE_SAMPLES flag. + + + + + All input samples must be the same size. + + + + + MTF Input Stream Holds buffers + + + + + The MFT does not hold input samples after the IMFTransform::ProcessInput method returns. + + + + + This input stream can be removed by calling IMFTransform::DeleteInputStream. + + + + + This input stream is optional. + + + + + The MFT can perform in-place processing. + + + + + Defines flags for the IMFTransform::ProcessOutput method. + + + + + None + + + + + The MFT can still generate output from this stream without receiving any more input. + + + + + The format has changed on this output stream, or there is a new preferred format for this stream. + + + + + The MFT has removed this output stream. + + + + + There is no sample ready for this stream. + + + + + Indicates whether a Media Foundation transform (MFT) can produce output data. + + + + + None + + + + + There is a sample available for at least one output stream. + + + + + Describes an output stream on a Media Foundation transform (MFT). + + + + + No flags set + + + + + Each media sample (IMFSample interface) of output data from the MFT contains complete, unbroken units of data. + + + + + Each output sample contains exactly one unit of data, as defined for the MFT_OUTPUT_STREAM_WHOLE_SAMPLES flag. + + + + + All output samples are the same size. + + + + + The MFT can discard the output data from this output stream, if requested by the client. + + + + + This output stream is optional. + + + + + The MFT provides the output samples for this stream, either by allocating them internally or by operating directly on the input samples. + + + + + The MFT can either provide output samples for this stream or it can use samples that the client allocates. + + + + + The MFT does not require the client to process the output for this stream. + + + + + The MFT might remove this output stream during streaming. + + + + + Defines flags for processing output samples in a Media Foundation transform (MFT). + + + + + None + + + + + Do not produce output for streams in which the pSample member of the MFT_OUTPUT_DATA_BUFFER structure is NULL. + + + + + Regenerates the last output sample. + + + + + Process Output Status flags + + + + + None + + + + + The Media Foundation transform (MFT) has created one or more new output streams. + + + + + Defines flags for the setting or testing the media type on a Media Foundation transform (MFT). + + + + + None + + + + + Test the proposed media type, but do not set it. + + + + + MIDI In Message Information + + + + + Create a new MIDI In Message EventArgs + + + + + + + The Raw message received from the MIDI In API + + + + + The raw message interpreted as a MidiEvent + + + + + The timestamp in milliseconds for this message + + + + + these will become extension methods once we move to .NET 3.5 + + + + + Checks if the buffer passed in is entirely full of nulls + + + + + Converts to a string containing the buffer described in hex + + + + + Decodes the buffer using the specified encoding, stopping at the first null + + + + + Concatenates the given arrays into a single array. + + The arrays to concatenate + The concatenated resulting array. + + + + Helper to get descriptions + + + + + Describes the Guid by looking for a FieldDescription attribute on the specified class + + + + + WavePosition extension methods + + + + + Get Position as timespan + + + + + Methods for converting between IEEE 80-bit extended double precision + and standard C# double precision. + + + + + Converts a C# double precision number to an 80-bit + IEEE extended double precision number (occupying 10 bytes). + + The double precision number to convert to IEEE extended. + An array of 10 bytes containing the IEEE extended number. + + + + Converts an IEEE 80-bit extended precision number to a + C# double precision number. + + The 80-bit IEEE extended number (as an array of 10 bytes). + A C# double precision number that is a close representation of the IEEE extended number. + + + + General purpose native methods for internal NAudio use + + + + + ASIODriverCapability holds all the information from the ASIODriver. + Use ASIODriverExt to get the Capabilities + + + + + ASIO Sample Type + + + + + Int 16 MSB + + + + + Int 24 MSB (used for 20 bits as well) + + + + + Int 32 MSB + + + + + IEEE 754 32 bit float + + + + + IEEE 754 64 bit double float + + + + + 32 bit data with 16 bit alignment + + + + + 32 bit data with 18 bit alignment + + + + + 32 bit data with 20 bit alignment + + + + + 32 bit data with 24 bit alignment + + + + + Int 16 LSB + + + + + Int 24 LSB + used for 20 bits as well + + + + + Int 32 LSB + + + + + IEEE 754 32 bit float, as found on Intel x86 architecture + + + + + IEEE 754 64 bit double float, as found on Intel x86 architecture + + + + + 32 bit data with 16 bit alignment + + + + + 32 bit data with 18 bit alignment + + + + + 32 bit data with 20 bit alignment + + + + + 32 bit data with 24 bit alignment + + + + + DSD 1 bit data, 8 samples per byte. First sample in Least significant bit. + + + + + DSD 1 bit data, 8 samples per byte. First sample in Most significant bit. + + + + + DSD 8 bit data, 1 sample per byte. No Endianness required. + + + + + Flags for use with acmDriverAdd + + + + + ACM_DRIVERADDF_LOCAL + + + + + ACM_DRIVERADDF_GLOBAL + + + + + ACM_DRIVERADDF_FUNCTION + + + + + ACM_DRIVERADDF_NOTIFYHWND + + + + + ADSR sample provider allowing you to specify attack, decay, sustain and release values + + + + + Like IWaveProvider, but makes it much simpler to put together a 32 bit floating + point mixing engine + + + + + Fill the specified buffer with 32 bit floating point samples + + The buffer to fill with samples. + Offset into buffer + The number of samples to read + the number of samples written to the buffer. + + + + Gets the WaveFormat of this Sample Provider. + + The wave format. + + + + Creates a new AdsrSampleProvider with default values + + + + + Reads audio from this sample provider + + + + + Enters the Release phase + + + + + Attack time in seconds + + + + + Release time in seconds + + + + + The output WaveFormat + + + + + Sample Provider to allow fading in and out + + + + + Creates a new FadeInOutSampleProvider + + The source stream with the audio to be faded in or out + If true, we start faded out + + + + Requests that a fade-in begins (will start on the next call to Read) + + Duration of fade in milliseconds + + + + Requests that a fade-out begins (will start on the next call to Read) + + Duration of fade in milliseconds + + + + Reads samples from this sample provider + + Buffer to read into + Offset within buffer to write to + Number of samples desired + Number of samples read + + + + WaveFormat of this SampleProvider + + + + + Allows any number of inputs to be patched to outputs + Uses could include swapping left and right channels, turning mono into stereo, + feeding different input sources to different soundcard outputs etc + + + + + Creates a multiplexing sample provider, allowing re-patching of input channels to different + output channels + + Input sample providers. Must all be of the same sample rate, but can have any number of channels + Desired number of output channels. + + + + persistent temporary buffer to prevent creating work for garbage collector + + + + + Reads samples from this sample provider + + Buffer to be filled with sample data + Offset into buffer to start writing to, usually 0 + Number of samples required + Number of samples read + + + + Connects a specified input channel to an output channel + + Input Channel index (zero based). Must be less than InputChannelCount + Output Channel index (zero based). Must be less than OutputChannelCount + + + + The output WaveFormat for this SampleProvider + + + + + The number of input channels. Note that this is not the same as the number of input wave providers. If you pass in + one stereo and one mono input provider, the number of input channels is three. + + + + + The number of output channels, as specified in the constructor. + + + + + Allows you to: + 1. insert a pre-delay of silence before the source begins + 2. skip over a certain amount of the beginning of the source + 3. only play a set amount from the source + 4. insert silence at the end after the source is complete + + + + + Creates a new instance of offsetSampleProvider + + The Source Sample Provider to read from + + + + Reads from this sample provider + + Sample buffer + Offset within sample buffer to read to + Number of samples required + Number of samples read + + + + Number of samples of silence to insert before playing source + + + + + Amount of silence to insert before playing + + + + + Number of samples in source to discard + + + + + Amount of audio to skip over from the source before beginning playback + + + + + Number of samples to read from source (if 0, then read it all) + + + + + Amount of audio to take from the source (TimeSpan.Zero means play to end) + + + + + Number of samples of silence to insert after playing source + + + + + Amount of silence to insert after playing source + + + + + The WaveFormat of this SampleProvider + + + + + Converts an IWaveProvider containing 32 bit PCM to an + ISampleProvider + + + + + Helper base class for classes converting to ISampleProvider + + + + + Source Wave Provider + + + + + Source buffer (to avoid constantly creating small buffers during playback) + + + + + Initialises a new instance of SampleProviderConverterBase + + Source Wave provider + + + + Reads samples from the source wave provider + + Sample buffer + Offset into sample buffer + Number of samples required + Number of samples read + + + + Ensure the source buffer exists and is big enough + + Bytes required + + + + Wave format of this wave provider + + + + + Initialises a new instance of Pcm32BitToSampleProvider + + Source Wave Provider + + + + Reads floating point samples from this sample provider + + sample buffer + offset within sample buffer to write to + number of samples required + number of samples provided + + + + Utility class for converting to SampleProvider + + + + + Helper function to go from IWaveProvider to a SampleProvider + Must already be PCM or IEEE float + + The WaveProvider to convert + A sample provider + + + + Converts a sample provider to 16 bit PCM, optionally clipping and adjusting volume along the way + + + + + Generic interface for all WaveProviders. + + + + + Fill the specified buffer with wave data. + + The buffer to fill of wave data. + Offset into buffer + The number of bytes to read + the number of bytes written to the buffer. + + + + Gets the WaveFormat of this WaveProvider. + + The wave format. + + + + Creates a new SampleToWaveProvider16 + + the source provider + + + + Reads bytes from this wave stream + + The destination buffer + Offset into the destination buffer + Number of bytes read + Number of bytes read. + + + + + + + + + Volume of this channel. 1.0 = full scale + + + + + Signal Generator + Sin, Square, Triangle, SawTooth, White Noise, Pink Noise, Sweep. + + + Posibility to change ISampleProvider + Example : + --------- + WaveOut _waveOutGene = new WaveOut(); + WaveGenerator wg = new SignalGenerator(); + wg.Type = ... + wg.Frequency = ... + wg ... + _waveOutGene.Init(wg); + _waveOutGene.Play(); + + + + + Initializes a new instance for the Generator (Default :: 44.1Khz, 2 channels, Sinus, Frequency = 440, Gain = 1) + + + + + Initializes a new instance for the Generator (UserDef SampleRate & Channels) + + Desired sample rate + Number of channels + + + + Reads from this provider. + + + + + Private :: Random for WhiteNoise & Pink Noise (Value form -1 to 1) + + Random value from -1 to +1 + + + + The waveformat of this WaveProvider (same as the source) + + + + + Frequency for the Generator. (20.0 - 20000.0 Hz) + Sin, Square, Triangle, SawTooth, Sweep (Start Frequency). + + + + + Return Log of Frequency Start (Read only) + + + + + End Frequency for the Sweep Generator. (Start Frequency in Frequency) + + + + + Return Log of Frequency End (Read only) + + + + + Gain for the Generator. (0.0 to 1.0) + + + + + Channel PhaseReverse + + + + + Type of Generator. + + + + + Length Seconds for the Sweep Generator. + + + + + Signal Generator type + + + + + Pink noise + + + + + White noise + + + + + Sweep + + + + + Sine wave + + + + + Square wave + + + + + Triangle Wave + + + + + Sawtooth wave + + + + + Helper class turning an already 64 bit floating point IWaveProvider + into an ISampleProvider - hopefully not needed for most applications + + + + + Initializes a new instance of the WaveToSampleProvider class + + Source wave provider, must be IEEE float + + + + Reads from this provider + + + + + Fully managed resampling sample provider, based on the WDL Resampler + + + + + Constructs a new resampler + + Source to resample + Desired output sample rate + + + + Reads from this sample provider + + + + + Output WaveFormat + + + + + Useful extension methods to make switching between WaveAndSampleProvider easier + + + + + Converts a WaveProvider into a SampleProvider (only works for PCM) + + WaveProvider to convert + + + + + Allows sending a SampleProvider directly to an IWavePlayer without needing to convert + back to an IWaveProvider + + The WavePlayer + + + + + + Recording using waveIn api with event callbacks. + Use this for recording in non-gui applications + Events are raised as recorded buffers are made available + + + + + Generic interface for wave recording + + + + + Start Recording + + + + + Stop Recording + + + + + Recording WaveFormat + + + + + Indicates recorded data is available + + + + + Indicates that all recorded data has now been received. + + + + + Prepares a Wave input device for recording + + + + + Retrieves the capabilities of a waveIn device + + Device to test + The WaveIn device capabilities + + + + Start recording + + + + + Stop recording + + + + + Dispose pattern + + + + + Microphone Level + + + + + Dispose method + + + + + Indicates recorded data is available + + + + + Indicates that all recorded data has now been received. + + + + + Returns the number of Wave In devices available in the system + + + + + Milliseconds for the buffer. Recommended value is 100ms + + + + + Number of Buffers to use (usually 2 or 3) + + + + + The device number to use + + + + + WaveFormat we are recording in + + + + + Audio Capture using Wasapi + See http://msdn.microsoft.com/en-us/library/dd370800%28VS.85%29.aspx + + + + + Initialises a new instance of the WASAPI capture class + + + + + Initialises a new instance of the WASAPI capture class + + Capture device to use + + + + Gets the default audio capture device + + The default audio capture device + + + + To allow overrides to specify different flags (e.g. loopback) + + + + + Start Recording + + + + + Stop Recording (requests a stop, wait for RecordingStopped event to know it has finished) + + + + + Dispose + + + + + Indicates recorded data is available + + + + + Indicates that all recorded data has now been received. + + + + + Share Mode - set before calling StartRecording + + + + + Recording wave format + + + + + Contains the name and CLSID of a DirectX Media Object + + + + + Initializes a new instance of DmoDescriptor + + + + + Name + + + + + Clsid + + + + + DirectX Media Object Enumerator + + + + + Get audio effect names + + Audio effect names + + + + Get audio encoder names + + Audio encoder names + + + + Get audio decoder names + + Audio decoder names + + + + DMO Guids for use with DMOEnum + dmoreg.h + + + + + MediaErr.h + + + + + DMO_PARTIAL_MEDIATYPE + + + + + defined in Medparam.h + + + + + Windows Media Resampler Props + wmcodecdsp.h + + + + + Range is 1 to 60 + + + + + Specifies the channel matrix. + + + + + Attempting to implement the COM IMediaBuffer interface as a .NET object + Not sure what will happen when I pass this to an unmanaged object + + + + + IMediaBuffer Interface + + + + + Set Length + + Length + HRESULT + + + + Get Max Length + + Max Length + HRESULT + + + + Get Buffer and Length + + Pointer to variable into which to write the Buffer Pointer + Pointer to variable into which to write the Valid Data Length + HRESULT + + + + Creates a new Media Buffer + + Maximum length in bytes + + + + Dispose and free memory for buffer + + + + + Finalizer + + + + + Set length of valid data in the buffer + + length + HRESULT + + + + Gets the maximum length of the buffer + + Max length (output parameter) + HRESULT + + + + Gets buffer and / or length + + Pointer to variable into which buffer pointer should be written + Pointer to variable into which valid data length should be written + HRESULT + + + + Loads data into this buffer + + Data to load + Number of bytes to load + + + + Retrieves the data in the output buffer + + buffer to retrieve into + offset within that buffer + + + + Length of data in the media buffer + + + + + Media Object + + + + + Creates a new Media Object + + Media Object COM interface + + + + Gets the input media type for the specified input stream + + Input stream index + Input type index + DMO Media Type or null if there are no more input types + + + + Gets the DMO Media Output type + + The output stream + Output type index + DMO Media Type or null if no more available + + + + retrieves the media type that was set for an output stream, if any + + Output stream index + DMO Media Type or null if no more available + + + + Enumerates the supported input types + + Input stream index + Enumeration of input types + + + + Enumerates the output types + + Output stream index + Enumeration of supported output types + + + + Querys whether a specified input type is supported + + Input stream index + Media type to check + true if supports + + + + Sets the input type helper method + + Input stream index + Media type + Flags (can be used to test rather than set) + + + + Sets the input type + + Input stream index + Media Type + + + + Sets the input type to the specified Wave format + + Input stream index + Wave format + + + + Requests whether the specified Wave format is supported as an input + + Input stream index + Wave format + true if supported + + + + Helper function to make a DMO Media Type to represent a particular WaveFormat + + + + + Checks if a specified output type is supported + n.b. you may need to set the input type first + + Output stream index + Media type + True if supported + + + + Tests if the specified Wave Format is supported for output + n.b. may need to set the input type first + + Output stream index + Wave format + True if supported + + + + Helper method to call SetOutputType + + + + + Sets the output type + n.b. may need to set the input type first + + Output stream index + Media type to set + + + + Set output type to the specified wave format + n.b. may need to set input type first + + Output stream index + Wave format + + + + Get Input Size Info + + Input Stream Index + Input Size Info + + + + Get Output Size Info + + Output Stream Index + Output Size Info + + + + Process Input + + Input Stream index + Media Buffer + Flags + Timestamp + Duration + + + + Process Output + + Flags + Output buffer count + Output buffers + + + + Gives the DMO a chance to allocate any resources needed for streaming + + + + + Tells the DMO to free any resources needed for streaming + + + + + Gets maximum input latency + + input stream index + Maximum input latency as a ref-time + + + + Flushes all buffered data + + + + + Report a discontinuity on the specified input stream + + Input Stream index + + + + Is this input stream accepting data? + + Input Stream index + true if accepting data + + + + Experimental code, not currently being called + Not sure if it is necessary anyway + + + + + Number of input streams + + + + + Number of output streams + + + + + Media Object Size Info + + + + + Media Object Size Info + + + + + ToString + + + + + Minimum Buffer Size, in bytes + + + + + Max Lookahead + + + + + Alignment + + + + + MP_PARAMINFO + + + + + MP_TYPE + + + + + MPT_INT + + + + + MPT_FLOAT + + + + + MPT_BOOL + + + + + MPT_ENUM + + + + + MPT_MAX + + + + + MP_CURVE_TYPE + + + + + uuids.h, ksuuids.h + + + + + implements IMediaObject (DirectX Media Object) + implements IMFTransform (Media Foundation Transform) + On Windows XP, it is always an MM (if present at all) + + + + + Windows Media MP3 Decoder (as a DMO) + WORK IN PROGRESS - DO NOT USE! + + + + + Creates a new Resampler based on the DMO Resampler + + + + + Dispose code - experimental at the moment + Was added trying to track down why Resampler crashes NUnit + This code not currently being called by ResamplerDmoStream + + + + + Media Object + + + + + BiQuad filter + + + + + Passes a single sample through the filter + + Input sample + Output sample + + + + Set this up as a low pass filter + + Sample Rate + Cut-off Frequency + Bandwidth + + + + Set this up as a peaking EQ + + Sample Rate + Centre Frequency + Bandwidth (Q) + Gain in decibels + + + + Set this as a high pass filter + + + + + Create a low pass filter + + + + + Create a High pass filter + + + + + Create a bandpass filter with constant skirt gain + + + + + Create a bandpass filter with constant peak gain + + + + + Creates a notch filter + + + + + Creaes an all pass filter + + + + + Create a Peaking EQ + + + + + H(s) = A * (s^2 + (sqrt(A)/Q)*s + A)/(A*s^2 + (sqrt(A)/Q)*s + 1) + + + + a "shelf slope" parameter (for shelving EQ only). + When S = 1, the shelf slope is as steep as it can be and remain monotonically + increasing or decreasing gain with frequency. The shelf slope, in dB/octave, + remains proportional to S for all other values for a fixed f0/Fs and dBgain. + Gain in decibels + + + + H(s) = A * (A*s^2 + (sqrt(A)/Q)*s + 1)/(s^2 + (sqrt(A)/Q)*s + A) + + + + + + + + + + Type to represent complex number + + + + + Real Part + + + + + Imaginary Part + + + + + Summary description for FastFourierTransform. + + + + + This computes an in-place complex-to-complex FFT + x and y are the real and imaginary arrays of 2^m points. + + + + + Applies a Hamming Window + + Index into frame + Frame size (e.g. 1024) + Multiplier for Hamming window + + + + Applies a Hann Window + + Index into frame + Frame size (e.g. 1024) + Multiplier for Hann window + + + + Applies a Blackman-Harris Window + + Index into frame + Frame size (e.g. 1024) + Multiplier for Blackmann-Harris window + + + + Summary description for ImpulseResponseConvolution. + + + + + A very simple mono convolution algorithm + + + This will be very slow + + + + + This is actually a downwards normalize for data that will clip + + + + + Represents an entry in a Cakewalk drum map + + + + + Describes this drum map entry + + + + + User customisable note name + + + + + Input MIDI note number + + + + + Output MIDI note number + + + + + Output port + + + + + Output MIDI Channel + + + + + Velocity adjustment + + + + + Velocity scaling - in percent + + + + + Represents a Cakewalk Drum Map file (.map) + + + + + Parses a Cakewalk Drum Map file + + Path of the .map file + + + + Describes this drum map + + + + + The drum mappings in this drum map + + + + + Channel Mode + + + + + Stereo + + + + + Joint Stereo + + + + + Dual Channel + + + + + Mono + + + + + MP3 Frame decompressor using the Windows Media MP3 Decoder DMO object + + + + + Interface for MP3 frame by frame decoder + + + + + Decompress a single MP3 frame + + Frame to decompress + Output buffer + Offset within output buffer + Bytes written to output buffer + + + + Tell the decoder that we have repositioned + + + + + PCM format that we are converting into + + + + + Initializes a new instance of the DMO MP3 Frame decompressor + + + + + + Decompress a single frame of MP3 + + + + + Alerts us that a reposition has occured so the MP3 decoder needs to reset its state + + + + + Dispose of this obejct and clean up resources + + + + + Converted PCM WaveFormat + + + + + An ID3v2 Tag + + + + + Reads an ID3v2 tag from a stream + + + + + Creates a new ID3v2 tag from a collection of key-value pairs. + + A collection of key-value pairs containing the tags to include in the ID3v2 tag. + A new ID3v2 tag + + + + Convert the frame size to a byte array. + + The frame body size. + + + + + Creates an ID3v2 frame for the given key-value pair. + + + + + + + + Gets the Id3v2 Header size. The size is encoded so that only 7 bits per byte are actually used. + + + + + + + Creates the Id3v2 tag header and returns is as a byte array. + + The Id3v2 frames that will be included in the file. This is used to calculate the ID3v2 tag size. + + + + + Creates the Id3v2 tag for the given key-value pairs and returns it in the a stream. + + + + + + + Raw data from this tag + + + + + Represents an MP3 Frame + + + + + Reads an MP3 frame from a stream + + input stream + A valid MP3 frame, or null if none found + + + Reads an MP3Frame from a stream + http://mpgedit.org/mpgedit/mpeg_format/mpeghdr.htm has some good info + also see http://www.codeproject.com/KB/audio-video/mpegaudioinfo.aspx + + A valid MP3 frame, or null if none found + + + + Constructs an MP3 frame + + + + + checks if the four bytes represent a valid header, + if they are, will parse the values into Mp3Frame + + + + + Sample rate of this frame + + + + + Frame length in bytes + + + + + Bit Rate + + + + + Raw frame data (includes header bytes) + + + + + MPEG Version + + + + + MPEG Layer + + + + + Channel Mode + + + + + The number of samples in this frame + + + + + The channel extension bits + + + + + The bitrate index (directly from the header) + + + + + Whether the Copyright bit is set + + + + + Whether a CRC is present + + + + + Not part of the MP3 frame itself - indicates where in the stream we found this header + + + + + MP3 Frame Decompressor using ACM + + + + + Creates a new ACM frame decompressor + + The MP3 source format + + + + Decompresses a frame + + The MP3 frame + destination buffer + Offset within destination buffer + Bytes written into destination buffer + + + + Resets the MP3 Frame Decompressor after a reposition operation + + + + + Disposes of this MP3 frame decompressor + + + + + Finalizer ensuring that resources get released properly + + + + + Output format (PCM) + + + + + MPEG Layer flags + + + + + Reserved + + + + + Layer 3 + + + + + Layer 2 + + + + + Layer 1 + + + + + MPEG Version Flags + + + + + Version 2.5 + + + + + Reserved + + + + + Version 2 + + + + + Version 1 + + + + + Represents a Xing VBR header + + + + + Load Xing Header + + Frame + Xing Header + + + + Sees if a frame contains a Xing header + + + + + Number of frames + + + + + Number of bytes + + + + + VBR Scale property + + + + + The MP3 frame + + + + + Soundfont generator + + + + + + + + + + Gets the generator type + + + + + Generator amount as an unsigned short + + + + + Generator amount as a signed short + + + + + Low byte amount + + + + + High byte amount + + + + + Instrument + + + + + Sample Header + + + + + base class for structures that can read themselves + + + + + Generator types + + + + Start address offset + + + End address offset + + + Start loop address offset + + + End loop address offset + + + Start address coarse offset + + + Modulation LFO to pitch + + + Vibrato LFO to pitch + + + Modulation envelope to pitch + + + Initial filter cutoff frequency + + + Initial filter Q + + + Modulation LFO to filter Cutoff frequency + + + Modulation envelope to filter cutoff frequency + + + End address coarse offset + + + Modulation LFO to volume + + + Unused + + + Chorus effects send + + + Reverb effects send + + + Pan + + + Unused + + + Unused + + + Unused + + + Delay modulation LFO + + + Frequency modulation LFO + + + Delay vibrato LFO + + + Frequency vibrato LFO + + + Delay modulation envelope + + + Attack modulation envelope + + + Hold modulation envelope + + + Decay modulation envelope + + + Sustain modulation envelop + + + Release modulation envelope + + + Key number to modulation envelope hold + + + Key number to modulation envelope decay + + + Delay volume envelope + + + Attack volume envelope + + + Hold volume envelope + + + Decay volume envelope + + + Sustain volume envelope + + + Release volume envelope + + + Key number to volume envelope hold + + + Key number to volume envelope decay + + + Instrument + + + Reserved + + + Key range + + + Velocity range + + + Start loop address coarse offset + + + Key number + + + Velocity + + + Initial attenuation + + + Reserved + + + End loop address coarse offset + + + Coarse tune + + + Fine tune + + + Sample ID + + + Sample modes + + + Reserved + + + Scale tuning + + + Exclusive class + + + Overriding root key + + + Unused + + + Unused + + + + A soundfont info chunk + + + + + + + + + + SoundFont Version + + + + + WaveTable sound engine + + + + + Bank name + + + + + Data ROM + + + + + Creation Date + + + + + Author + + + + + Target Product + + + + + Copyright + + + + + Comments + + + + + Tools + + + + + ROM Version + + + + + SoundFont instrument + + + + + + + + + + instrument name + + + + + Zones + + + + + Instrument Builder + + + + + Transform Types + + + + + Linear + + + + + Modulator + + + + + + + + + + Source Modulation data type + + + + + Destination generator type + + + + + Amount + + + + + Source Modulation Amount Type + + + + + Source Transform Type + + + + + Controller Sources + + + + + No Controller + + + + + Note On Velocity + + + + + Note On Key Number + + + + + Poly Pressure + + + + + Channel Pressure + + + + + Pitch Wheel + + + + + Pitch Wheel Sensitivity + + + + + Source Types + + + + + Linear + + + + + Concave + + + + + Convex + + + + + Switch + + + + + Modulator Type + + + + + + + + + + + A SoundFont Preset + + + + + + + + + + Preset name + + + + + Patch Number + + + + + Bank number + + + + + Zones + + + + + Class to read the SoundFont file presets chunk + + + + + + + + + + The Presets contained in this chunk + + + + + The instruments contained in this chunk + + + + + The sample headers contained in this chunk + + + + + just reads a chunk ID at the current position + + chunk ID + + + + reads a chunk at the current position + + + + + creates a new riffchunk from current position checking that we're not + at the end of this chunk first + + the new chunk + + + + useful for chunks that just contain a string + + chunk as string + + + + A SoundFont Sample Header + + + + + The sample name + + + + + Start offset + + + + + End offset + + + + + Start loop point + + + + + End loop point + + + + + Sample Rate + + + + + Original pitch + + + + + Pitch correction + + + + + Sample Link + + + + + SoundFont Sample Link Type + + + + + + + + + + SoundFont sample modes + + + + + No loop + + + + + Loop Continuously + + + + + Reserved no loop + + + + + Loop and continue + + + + + Sample Link Type + + + + + Mono Sample + + + + + Right Sample + + + + + Left Sample + + + + + Linked Sample + + + + + ROM Mono Sample + + + + + ROM Right Sample + + + + + ROM Left Sample + + + + + ROM Linked Sample + + + + + SoundFont Version Structure + + + + + Major Version + + + + + Minor Version + + + + + Builds a SoundFont version + + + + + Reads a SoundFont Version structure + + + + + Writes a SoundFont Version structure + + + + + Gets the length of this structure + + + + + Represents a SoundFont + + + + + Loads a SoundFont from a file + + Filename of the SoundFont + + + + Loads a SoundFont from a stream + + stream + + + + + + + + + The File Info Chunk + + + + + The Presets + + + + + The Instruments + + + + + The Sample Headers + + + + + The Sample Data + + + + + A SoundFont zone + + + + + + + + + + Modulators for this Zone + + + + + Generators for this Zone + + + + + Summary description for Fader. + + + + + Required designer variable. + + + + + Creates a new Fader control + + + + + Clean up any resources being used. + + + + + + + + + + + + + + + + + + + + + + + + + Required method for Designer support - do not modify + the contents of this method with the code editor. + + + + + Minimum value of this fader + + + + + Maximum value of this fader + + + + + Current value of this fader + + + + + Fader orientation + + + + + Pan slider control + + + + + Required designer variable. + + + + + Creates a new PanSlider control + + + + + Clean up any resources being used. + + + + + Required method for Designer support - do not modify + the contents of this method with the code editor. + + + + + + + + + + + + + + + + + + + + + True when pan value changed + + + + + The current Pan setting + + + + + Control that represents a potentiometer + TODO list: + Optional Log scale + Optional reverse scale + Keyboard control + Optional bitmap mode + Optional complete draw mode + Tooltip support + + + + + Creates a new pot control + + + + + Draws the control + + + + + Handles the mouse down event to allow changing value by dragging + + + + + Handles the mouse up event to allow changing value by dragging + + + + + Handles the mouse down event to allow changing value by dragging + + + + + Required designer variable. + + + + + Clean up any resources being used. + + true if managed resources should be disposed; otherwise, false. + + + + Required method for Designer support - do not modify + the contents of this method with the code editor. + + + + + Value changed event + + + + + Minimum Value of the Pot + + + + + Maximum Value of the Pot + + + + + The current value of the pot + + + + + Implements a rudimentary volume meter + + + + + Basic volume meter + + + + + On Fore Color Changed + + + + + Paints the volume meter + + + + + Required designer variable. + + + + + Clean up any resources being used. + + true if managed resources should be disposed; otherwise, false. + + + + Required method for Designer support - do not modify + the contents of this method with the code editor. + + + + + Current Value + + + + + Minimum decibels + + + + + Maximum decibels + + + + + Meter orientation + + + + + VolumeSlider control + + + + + Required designer variable. + + + + + Creates a new VolumeSlider control + + + + + Clean up any resources being used. + + + + + Required method for Designer support - do not modify + the contents of this method with the code editor. + + + + + + + + + + + + + + + + + + + + Volume changed event + + + + + The volume for this control + + + + + Windows Forms control for painting audio waveforms + + + + + Constructs a new instance of the WaveFormPainter class + + + + + On Resize + + + + + On ForeColor Changed + + + + + + Add Max Value + + + + + + On Paint + + + + + Required designer variable. + + + + + Clean up any resources being used. + + true if managed resources should be disposed; otherwise, false. + + + + Required method for Designer support - do not modify + the contents of this method with the code editor. + + + + + Control for viewing waveforms + + + + + Required designer variable. + + + + + Creates a new WaveViewer control + + + + + Clean up any resources being used. + + + + + + + + + + Required method for Designer support - do not modify + the contents of this method with the code editor. + + + + + sets the associated wavestream + + + + + The zoom level, in samples per pixel + + + + + Start position (currently in bytes) + + + + + Represents a MIDI Channel AfterTouch Event. + + + + + Represents an individual MIDI event + + + + The MIDI command code + + + + Creates a MidiEvent from a raw message received using + the MME MIDI In APIs + + The short MIDI message + A new MIDI Event + + + + Constructs a MidiEvent from a BinaryStream + + The binary stream of MIDI data + The previous MIDI event (pass null for first event) + A new MidiEvent + + + + Converts this MIDI event to a short message (32 bit integer) that + can be sent by the Windows MIDI out short message APIs + Cannot be implemented for all MIDI messages + + A short message + + + + Default constructor + + + + + Creates a MIDI event with specified parameters + + Absolute time of this event + MIDI channel number + MIDI command code + + + + Whether this is a note off event + + + + + Whether this is a note on event + + + + + Determines if this is an end track event + + + + + Displays a summary of the MIDI event + + A string containing a brief description of this MIDI event + + + + Utility function that can read a variable length integer from a binary stream + + The binary stream + The integer read + + + + Writes a variable length integer to a binary stream + + Binary stream + The value to write + + + + Exports this MIDI event's data + Overriden in derived classes, but they should call this version + + Absolute time used to calculate delta. + Is updated ready for the next delta calculation + Stream to write to + + + + The MIDI Channel Number for this event (1-16) + + + + + The Delta time for this event + + + + + The absolute time for this event + + + + + The command code for this event + + + + + Creates a new ChannelAfterTouchEvent from raw MIDI data + + A binary reader + + + + Creates a new Channel After-Touch Event + + Absolute time + Channel + After-touch pressure + + + + Calls base class export first, then exports the data + specific to this event + MidiEvent.Export + + + + + The aftertouch pressure value + + + + + Represents a MIDI control change event + + + + + Reads a control change event from a MIDI stream + + Binary reader on the MIDI stream + + + + Creates a control change event + + Time + MIDI Channel Number + The MIDI Controller + Controller value + + + + Describes this control change event + + A string describing this event + + + + + + + + + Calls base class export first, then exports the data + specific to this event + MidiEvent.Export + + + + + The controller number + + + + + The controller value + + + + + Represents a MIDI key signature event event + + + + + Represents a MIDI meta event + + + + + Empty constructor + + + + + Custom constructor for use by derived types, who will manage the data themselves + + Meta event type + Meta data length + Absolute time + + + + Reads a meta-event from a stream + + A binary reader based on the stream of MIDI data + A new MetaEvent object + + + + Describes this Meta event + + String describing the metaevent + + + + + + + + + Gets the type of this meta event + + + + + Reads a new track sequence number event from a MIDI stream + + The MIDI stream + the data length + + + + Creates a new Key signature event with the specified data + + + + + Describes this event + + String describing the event + + + + Calls base class export first, then exports the data + specific to this event + MidiEvent.Export + + + + + Number of sharps or flats + + + + + Major or Minor key + + + + + MIDI MetaEvent Type + + + + Track sequence number + + + Text event + + + Copyright + + + Sequence track name + + + Track instrument name + + + Lyric + + + Marker + + + Cue point + + + Program (patch) name + + + Device (port) name + + + MIDI Channel (not official?) + + + MIDI Port (not official?) + + + End track + + + Set tempo + + + SMPTE offset + + + Time signature + + + Key signature + + + Sequencer specific + + + + MIDI command codes + + + + Note Off + + + Note On + + + Key After-touch + + + Control change + + + Patch change + + + Channel after-touch + + + Pitch wheel change + + + Sysex message + + + Eox (comes at end of a sysex message) + + + Timing clock (used when synchronization is required) + + + Start sequence + + + Continue sequence + + + Stop sequence + + + Auto-Sensing + + + Meta-event + + + + MidiController enumeration + http://www.midi.org/techspecs/midimessages.php#3 + + + + Bank Select (MSB) + + + Modulation (MSB) + + + Breath Controller + + + Foot controller (MSB) + + + Main volume + + + Pan + + + Expression + + + Bank Select LSB + + + Sustain + + + Portamento On/Off + + + Sostenuto On/Off + + + Soft Pedal On/Off + + + Legato Footswitch + + + Reset all controllers + + + All notes off + + + + A helper class to manage collection of MIDI events + It has the ability to organise them in tracks + + + + + Creates a new Midi Event collection + + Initial file type + Delta Ticks Per Quarter Note + + + + Gets events on a specified track + + Track number + The list of events + + + + Adds a new track + + The new track event list + + + + Adds a new track + + Initial events to add to the new track + The new track event list + + + + Removes a track + + Track number to remove + + + + Clears all events + + + + + Adds an event to the appropriate track depending on file type + + The event to be added + The original (or desired) track number + When adding events in type 0 mode, the originalTrack parameter + is ignored. If in type 1 mode, it will use the original track number to + store the new events. If the original track was 0 and this is a channel based + event, it will create new tracks if necessary and put it on the track corresponding + to its channel number + + + + Sorts, removes empty tracks and adds end track markers + + + + + Gets an enumerator for the lists of track events + + + + + Gets an enumerator for the lists of track events + + + + + The number of tracks + + + + + The absolute time that should be considered as time zero + Not directly used here, but useful for timeshifting applications + + + + + The number of ticks per quarter note + + + + + Gets events on a specific track + + Track number + The list of events + + + + The MIDI file type + + + + + Utility class for comparing MidiEvent objects + + + + + Compares two MidiEvents + Sorts by time, with EndTrack always sorted to the end + + + + + Class able to read a MIDI file + + + + + Opens a MIDI file for reading + + Name of MIDI file + + + + Opens a MIDI file for reading + + Name of MIDI file + If true will error on non-paired note events + + + + Describes the MIDI file + + A string describing the MIDI file and its events + + + + Exports a MIDI file + + Filename to export to + Events to export + + + + MIDI File format + + + + + The collection of events in this MIDI file + + + + + Number of tracks in this MIDI file + + + + + Delta Ticks Per Quarter Note + + + + + Represents a MIDI in device + + + + + Opens a specified MIDI in device + + The device number + + + + Closes this MIDI in device + + + + + Closes this MIDI in device + + + + + Start the MIDI in device + + + + + Stop the MIDI in device + + + + + Reset the MIDI in device + + + + + Gets the MIDI in device info + + + + + Closes the MIDI out device + + True if called from Dispose + + + + Cleanup + + + + + Called when a MIDI message is received + + + + + An invalid MIDI message + + + + + Gets the number of MIDI input devices available in the system + + + + + MIDI In Device Capabilities + + + + + wMid + + + + + wPid + + + + + vDriverVersion + + + + + Product Name + + + + + Support - Reserved + + + + + Gets the manufacturer of this device + + + + + Gets the product identifier (manufacturer specific) + + + + + Gets the product name + + + + + MIM_OPEN + + + + + MIM_CLOSE + + + + + MIM_DATA + + + + + MIM_LONGDATA + + + + + MIM_ERROR + + + + + MIM_LONGERROR + + + + + MIM_MOREDATA + + + + + MOM_OPEN + + + + + MOM_CLOSE + + + + + MOM_DONE + + + + + Represents a MIDI message + + + + + Creates a new MIDI message + + Status + Data parameter 1 + Data parameter 2 + + + + Creates a new MIDI message from a raw message + + A packed MIDI message from an MMIO function + + + + Creates a Note On message + + Note number + Volume + MIDI channel + A new MidiMessage object + + + + Creates a Note Off message + + Note number + Volume + MIDI channel (1-16) + A new MidiMessage object + + + + Creates a patch change message + + The patch number + The MIDI channel number (1-16) + A new MidiMessageObject + + + + Creates a Control Change message + + The controller number to change + The value to set the controller to + The MIDI channel number (1-16) + A new MidiMessageObject + + + + Returns the raw MIDI message data + + + + + Represents a MIDI out device + + + + + Gets the MIDI Out device info + + + + + Opens a specified MIDI out device + + The device number + + + + Closes this MIDI out device + + + + + Closes this MIDI out device + + + + + Resets the MIDI out device + + + + + Sends a MIDI out message + + Message + Parameter 1 + Parameter 2 + + + + Sends a MIDI message to the MIDI out device + + The message to send + + + + Closes the MIDI out device + + True if called from Dispose + + + + Send a long message, for example sysex. + + The bytes to send. + + + + Cleanup + + + + + Gets the number of MIDI devices available in the system + + + + + Gets or sets the volume for this MIDI out device + + + + + class representing the capabilities of a MIDI out device + MIDIOUTCAPS: http://msdn.microsoft.com/en-us/library/dd798467%28VS.85%29.aspx + + + + + Queries whether a particular channel is supported + + Channel number to test + True if the channel is supported + + + + Gets the manufacturer of this device + + + + + Gets the product identifier (manufacturer specific) + + + + + Gets the product name + + + + + Returns the number of supported voices + + + + + Gets the polyphony of the device + + + + + Returns true if the device supports all channels + + + + + Returns true if the device supports patch caching + + + + + Returns true if the device supports separate left and right volume + + + + + Returns true if the device supports MIDI stream out + + + + + Returns true if the device supports volume control + + + + + Returns the type of technology used by this MIDI out device + + + + + MIDICAPS_VOLUME + + + + + separate left-right volume control + MIDICAPS_LRVOLUME + + + + + MIDICAPS_CACHE + + + + + MIDICAPS_STREAM + driver supports midiStreamOut directly + + + + + Represents the different types of technology used by a MIDI out device + + from mmsystem.h + + + The device is a MIDI port + + + The device is a MIDI synth + + + The device is a square wave synth + + + The device is an FM synth + + + The device is a MIDI mapper + + + The device is a WaveTable synth + + + The device is a software synth + + + + Represents a note MIDI event + + + + + Reads a NoteEvent from a stream of MIDI data + + Binary Reader for the stream + + + + Creates a MIDI Note Event with specified parameters + + Absolute time of this event + MIDI channel number + MIDI command code + MIDI Note Number + MIDI Note Velocity + + + + + + + + + Describes the Note Event + + Note event as a string + + + + + + + + + The MIDI note number + + + + + The note velocity + + + + + The note name + + + + + Represents a MIDI note on event + + + + + Reads a new Note On event from a stream of MIDI data + + Binary reader on the MIDI data stream + + + + Creates a NoteOn event with specified parameters + + Absolute time of this event + MIDI channel number + MIDI note number + MIDI note velocity + MIDI note duration + + + + Calls base class export first, then exports the data + specific to this event + MidiEvent.Export + + + + + The associated Note off event + + + + + Get or set the Note Number, updating the off event at the same time + + + + + Get or set the channel, updating the off event at the same time + + + + + The duration of this note + + + There must be a note off event + + + + + Represents a MIDI patch change event + + + + + Gets the default MIDI instrument names + + + + + Reads a new patch change event from a MIDI stream + + Binary reader for the MIDI stream + + + + Creates a new patch change event + + Time of the event + Channel number + Patch number + + + + Describes this patch change event + + String describing the patch change event + + + + Gets as a short message for sending with the midiOutShortMsg API + + short message + + + + Calls base class export first, then exports the data + specific to this event + MidiEvent.Export + + + + + The Patch Number + + + + + Represents a MIDI pitch wheel change event + + + + + Reads a pitch wheel change event from a MIDI stream + + The MIDI stream to read from + + + + Creates a new pitch wheel change event + + Absolute event time + Channel + Pitch wheel value + + + + Describes this pitch wheel change event + + String describing this pitch wheel change event + + + + Gets a short message + + Integer to sent as short message + + + + Calls base class export first, then exports the data + specific to this event + MidiEvent.Export + + + + + Pitch Wheel Value 0 is minimum, 0x2000 (8192) is default, 0x4000 (16384) is maximum + + + + + Represents a Sequencer Specific event + + + + + Reads a new sequencer specific event from a MIDI stream + + The MIDI stream + The data length + + + + Creates a new Sequencer Specific event + + The sequencer specific data + Absolute time of this event + + + + Describes this MIDI text event + + A string describing this event + + + + Calls base class export first, then exports the data + specific to this event + MidiEvent.Export + + + + + The contents of this sequencer specific + + + + + Reads a new time signature event from a MIDI stream + + The MIDI stream + The data length + + + + Describes this time signature event + + A string describing this event + + + + Calls base class export first, then exports the data + specific to this event + MidiEvent.Export + + + + + Hours + + + + + Minutes + + + + + Seconds + + + + + Frames + + + + + SubFrames + + + + + Represents a MIDI sysex message + + + + + Reads a sysex message from a MIDI stream + + Stream of MIDI data + a new sysex message + + + + Describes this sysex message + + A string describing the sysex message + + + + Calls base class export first, then exports the data + specific to this event + MidiEvent.Export + + + + + Represents a MIDI tempo event + + + + + Reads a new tempo event from a MIDI stream + + The MIDI stream + the data length + + + + Creates a new tempo event with specified settings + + Microseconds per quarter note + Absolute time + + + + Describes this tempo event + + String describing the tempo event + + + + Calls base class export first, then exports the data + specific to this event + MidiEvent.Export + + + + + Microseconds per quarter note + + + + + Tempo + + + + + Represents a MIDI text event + + + + + Reads a new text event from a MIDI stream + + The MIDI stream + The data length + + + + Creates a new TextEvent + + The text in this type + MetaEvent type (must be one that is + associated with text data) + Absolute time of this event + + + + Describes this MIDI text event + + A string describing this event + + + + Calls base class export first, then exports the data + specific to this event + MidiEvent.Export + + + + + The contents of this text event + + + + + Represents a MIDI time signature event + + + + + Reads a new time signature event from a MIDI stream + + The MIDI stream + The data length + + + + Creates a new TimeSignatureEvent + + Time at which to create this event + Numerator + Denominator + Ticks in Metronome Click + No of 32nd Notes in Quarter Click + + + + Creates a new time signature event with the specified parameters + + + + + Describes this time signature event + + A string describing this event + + + + Calls base class export first, then exports the data + specific to this event + MidiEvent.Export + + + + + Numerator (number of beats in a bar) + + + + + Denominator (Beat unit), + 1 means 2, 2 means 4 (crochet), 3 means 8 (quaver), 4 means 16 and 5 means 32 + + + + + Ticks in a metronome click + + + + + Number of 32nd notes in a quarter note + + + + + The time signature + + + + + Represents a MIDI track sequence number event event + + + + + Reads a new track sequence number event from a MIDI stream + + The MIDI stream + the data length + + + + Describes this event + + String describing the event + + + + Calls base class export first, then exports the data + specific to this event + MidiEvent.Export + + + + + Boolean mixer control + + + + + Represents a mixer control + + + + + Mixer Handle + + + + + Number of Channels + + + + + Mixer Handle Type + + + + + Gets all the mixer controls + + Mixer Handle + Mixer Line + Mixer Handle Type + + + + + Gets a specified Mixer Control + + Mixer Handle + Line ID + Control ID + Number of Channels + Flags to use (indicates the meaning of mixerHandle) + + + + + Gets the control details + + + + + Gets the control details + + + + + + Returns true if this is a boolean control + + Control type + + + + Determines whether a specified mixer control type is a list text control + + + + + String representation for debug purposes + + + + + Mixer control name + + + + + Mixer control type + + + + + Is this a boolean control + + + + + True if this is a list text control + + + + + True if this is a signed control + + + + + True if this is an unsigned control + + + + + True if this is a custom control + + + + + Gets the details for this control + + memory pointer + + + + The current value of the control + + + + + Custom Mixer control + + + + + Get the data for this custom control + + pointer to memory to receive data + + + + List text mixer control + + + + + Get the details for this control + + Memory location to read to + + + Represents a Windows mixer device + + + Connects to the specified mixer + The index of the mixer to use. + This should be between zero and NumberOfDevices - 1 + + + Retrieve the specified MixerDestination object + The ID of the destination to use. + Should be between 0 and DestinationCount - 1 + + + The number of mixer devices available + + + The number of destinations this mixer supports + + + The name of this mixer device + + + The manufacturer code for this mixer device + + + The product identifier code for this mixer device + + + + A way to enumerate the destinations + + + + + A way to enumerate all available devices + + + + + Mixer control types + + + + Custom + + + Boolean meter + + + Signed meter + + + Peak meter + + + Unsigned meter + + + Boolean + + + On Off + + + Mute + + + Mono + + + Loudness + + + Stereo Enhance + + + Button + + + Decibels + + + Signed + + + Unsigned + + + Percent + + + Slider + + + Pan + + + Q-sound pan + + + Fader + + + Volume + + + Bass + + + Treble + + + Equaliser + + + Single Select + + + Mux + + + Multiple select + + + Mixer + + + Micro time + + + Milli time + + + + Represents a mixer line (source or destination) + + + + + Creates a new mixer destination + + Mixer Handle + Destination Index + Mixer Handle Type + + + + Creates a new Mixer Source For a Specified Source + + Mixer Handle + Destination Index + Source Index + Flag indicating the meaning of mixerHandle + + + + Creates a new Mixer Source + + Wave In Device + + + + Gets the specified source + + + + + Describes this Mixer Line (for diagnostic purposes) + + + + + Mixer Line Name + + + + + Mixer Line short name + + + + + The line ID + + + + + Component Type + + + + + Mixer destination type description + + + + + Number of channels + + + + + Number of sources + + + + + Number of controls + + + + + Is this destination active + + + + + Is this destination disconnected + + + + + Is this destination a source + + + + + Enumerator for the controls on this Mixer Limne + + + + + Enumerator for the sources on this Mixer Line + + + + + The name of the target output device + + + + + Mixer Interop Flags + + + + + MIXER_OBJECTF_HANDLE = 0x80000000; + + + + + MIXER_OBJECTF_MIXER = 0x00000000; + + + + + MIXER_OBJECTF_HMIXER + + + + + MIXER_OBJECTF_WAVEOUT + + + + + MIXER_OBJECTF_HWAVEOUT + + + + + MIXER_OBJECTF_WAVEIN + + + + + MIXER_OBJECTF_HWAVEIN + + + + + MIXER_OBJECTF_MIDIOUT + + + + + MIXER_OBJECTF_HMIDIOUT + + + + + MIXER_OBJECTF_MIDIIN + + + + + MIXER_OBJECTF_HMIDIIN + + + + + MIXER_OBJECTF_AUX + + + + + MIXER_GETCONTROLDETAILSF_VALUE = 0x00000000; + MIXER_SETCONTROLDETAILSF_VALUE = 0x00000000; + + + + + MIXER_GETCONTROLDETAILSF_LISTTEXT = 0x00000001; + MIXER_SETCONTROLDETAILSF_LISTTEXT = 0x00000001; + + + + + MIXER_GETCONTROLDETAILSF_QUERYMASK = 0x0000000F; + MIXER_SETCONTROLDETAILSF_QUERYMASK = 0x0000000F; + MIXER_GETLINECONTROLSF_QUERYMASK = 0x0000000F; + + + + + MIXER_GETLINECONTROLSF_ALL = 0x00000000; + + + + + MIXER_GETLINECONTROLSF_ONEBYID = 0x00000001; + + + + + MIXER_GETLINECONTROLSF_ONEBYTYPE = 0x00000002; + + + + + MIXER_GETLINEINFOF_DESTINATION = 0x00000000; + + + + + MIXER_GETLINEINFOF_SOURCE = 0x00000001; + + + + + MIXER_GETLINEINFOF_LINEID = 0x00000002; + + + + + MIXER_GETLINEINFOF_COMPONENTTYPE = 0x00000003; + + + + + MIXER_GETLINEINFOF_TARGETTYPE = 0x00000004; + + + + + MIXER_GETLINEINFOF_QUERYMASK = 0x0000000F; + + + + + Mixer Line Flags + + + + + Audio line is active. An active line indicates that a signal is probably passing + through the line. + + + + + Audio line is disconnected. A disconnected line's associated controls can still be + modified, but the changes have no effect until the line is connected. + + + + + Audio line is an audio source line associated with a single audio destination line. + If this flag is not set, this line is an audio destination line associated with zero + or more audio source lines. + + + + + BOUNDS structure + + + + + dwMinimum / lMinimum / reserved 0 + + + + + dwMaximum / lMaximum / reserved 1 + + + + + reserved 2 + + + + + reserved 3 + + + + + reserved 4 + + + + + reserved 5 + + + + + METRICS structure + + + + + cSteps / reserved[0] + + + + + cbCustomData / reserved[1], number of bytes for control details + + + + + reserved 2 + + + + + reserved 3 + + + + + reserved 4 + + + + + reserved 5 + + + + + MIXERCONTROL struct + http://msdn.microsoft.com/en-us/library/dd757293%28VS.85%29.aspx + + + + + Mixer Line Component type enumeration + + + + + Audio line is a destination that cannot be defined by one of the standard component types. A mixer device is required to use this component type for line component types that have not been defined by Microsoft Corporation. + MIXERLINE_COMPONENTTYPE_DST_UNDEFINED + + + + + Audio line is a digital destination (for example, digital input to a DAT or CD audio device). + MIXERLINE_COMPONENTTYPE_DST_DIGITAL + + + + + Audio line is a line level destination (for example, line level input from a CD audio device) that will be the final recording source for the analog-to-digital converter (ADC). Because most audio cards for personal computers provide some sort of gain for the recording audio source line, the mixer device will use the MIXERLINE_COMPONENTTYPE_DST_WAVEIN type. + MIXERLINE_COMPONENTTYPE_DST_LINE + + + + + Audio line is a destination used for a monitor. + MIXERLINE_COMPONENTTYPE_DST_MONITOR + + + + + Audio line is an adjustable (gain and/or attenuation) destination intended to drive speakers. This is the typical component type for the audio output of audio cards for personal computers. + MIXERLINE_COMPONENTTYPE_DST_SPEAKERS + + + + + Audio line is an adjustable (gain and/or attenuation) destination intended to drive headphones. Most audio cards use the same audio destination line for speakers and headphones, in which case the mixer device simply uses the MIXERLINE_COMPONENTTYPE_DST_SPEAKERS type. + MIXERLINE_COMPONENTTYPE_DST_HEADPHONES + + + + + Audio line is a destination that will be routed to a telephone line. + MIXERLINE_COMPONENTTYPE_DST_TELEPHONE + + + + + Audio line is a destination that will be the final recording source for the waveform-audio input (ADC). This line typically provides some sort of gain or attenuation. This is the typical component type for the recording line of most audio cards for personal computers. + MIXERLINE_COMPONENTTYPE_DST_WAVEIN + + + + + Audio line is a destination that will be the final recording source for voice input. This component type is exactly like MIXERLINE_COMPONENTTYPE_DST_WAVEIN but is intended specifically for settings used during voice recording/recognition. Support for this line is optional for a mixer device. Many mixer devices provide only MIXERLINE_COMPONENTTYPE_DST_WAVEIN. + MIXERLINE_COMPONENTTYPE_DST_VOICEIN + + + + + Audio line is a source that cannot be defined by one of the standard component types. A mixer device is required to use this component type for line component types that have not been defined by Microsoft Corporation. + MIXERLINE_COMPONENTTYPE_SRC_UNDEFINED + + + + + Audio line is a digital source (for example, digital output from a DAT or audio CD). + MIXERLINE_COMPONENTTYPE_SRC_DIGITAL + + + + + Audio line is a line-level source (for example, line-level input from an external stereo) that can be used as an optional recording source. Because most audio cards for personal computers provide some sort of gain for the recording source line, the mixer device will use the MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY type. + MIXERLINE_COMPONENTTYPE_SRC_LINE + + + + + Audio line is a microphone recording source. Most audio cards for personal computers provide at least two types of recording sources: an auxiliary audio line and microphone input. A microphone audio line typically provides some sort of gain. Audio cards that use a single input for use with a microphone or auxiliary audio line should use the MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE component type. + MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE + + + + + Audio line is a source originating from the output of an internal synthesizer. Most audio cards for personal computers provide some sort of MIDI synthesizer (for example, an Adlib®-compatible or OPL/3 FM synthesizer). + MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER + + + + + Audio line is a source originating from the output of an internal audio CD. This component type is provided for audio cards that provide an audio source line intended to be connected to an audio CD (or CD-ROM playing an audio CD). + MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC + + + + + Audio line is a source originating from an incoming telephone line. + MIXERLINE_COMPONENTTYPE_SRC_TELEPHONE + + + + + Audio line is a source originating from personal computer speaker. Several audio cards for personal computers provide the ability to mix what would typically be played on the internal speaker with the output of an audio card. Some audio cards support the ability to use this output as a recording source. + MIXERLINE_COMPONENTTYPE_SRC_PCSPEAKER + + + + + Audio line is a source originating from the waveform-audio output digital-to-analog converter (DAC). Most audio cards for personal computers provide this component type as a source to the MIXERLINE_COMPONENTTYPE_DST_SPEAKERS destination. Some cards also allow this source to be routed to the MIXERLINE_COMPONENTTYPE_DST_WAVEIN destination. + MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT + + + + + Audio line is a source originating from the auxiliary audio line. This line type is intended as a source with gain or attenuation that can be routed to the MIXERLINE_COMPONENTTYPE_DST_SPEAKERS destination and/or recorded from the MIXERLINE_COMPONENTTYPE_DST_WAVEIN destination. + MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY + + + + + Audio line is an analog source (for example, analog output from a video-cassette tape). + MIXERLINE_COMPONENTTYPE_SRC_ANALOG + + + + + Represents a signed mixer control + + + + + Gets details for this contrl + + + + + String Representation for debugging purposes + + + + + + The value of the control + + + + + Minimum value for this control + + + + + Maximum value for this control + + + + + Value of the control represented as a percentage + + + + + Represents an unsigned mixer control + + + + + Gets the details for this control + + + + + String Representation for debugging purposes + + + + + The control value + + + + + The control's minimum value + + + + + The control's maximum value + + + + + Value of the control represented as a percentage + + + + + Helper methods for working with audio buffers + + + + + Ensures the buffer is big enough + + + + + + + + Ensures the buffer is big enough + + + + + + + + An encoding for use with file types that have one byte per character + + + + + The one and only instance of this class + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A very basic circular buffer implementation + + + + + Create a new circular buffer + + Max buffer size in bytes + + + + Write data to the buffer + + Data to write + Offset into data + Number of bytes to write + number of bytes written + + + + Read from the buffer + + Buffer to read into + Offset into read buffer + Bytes to read + Number of bytes actually read + + + + Resets the buffer + + + + + Advances the buffer, discarding bytes + + Bytes to advance + + + + Maximum length of this circular buffer + + + + + Number of bytes currently stored in the circular buffer + + + + + A util class for conversions + + + + + linear to dB conversion + + linear value + decibel value + + + + dB to linear conversion + + decibel value + linear value + + + + HResult + + + + + S_OK + + + + + S_FALSE + + + + + E_INVALIDARG (from winerror.h) + + + + + MAKE_HRESULT macro + + + + + Helper to deal with the fact that in Win Store apps, + the HResult property name has changed + + COM Exception + The HResult + + + + Pass-through stream that ignores Dispose + Useful for dealing with MemoryStreams that you want to re-use + + + + + Creates a new IgnoreDisposeStream + + The source stream + + + + Flushes the underlying stream + + + + + Reads from the underlying stream + + + + + Seeks on the underlying stream + + + + + Sets the length of the underlying stream + + + + + Writes to the underlying stream + + + + + Dispose - by default (IgnoreDispose = true) will do nothing, + leaving the underlying stream undisposed + + + + + The source stream all other methods fall through to + + + + + If true the Dispose will be ignored, if false, will pass through to the SourceStream + Set to true by default + + + + + Can Read + + + + + Can Seek + + + + + Can write to the underlying stream + + + + + Gets the length of the underlying stream + + + + + Gets or sets the position of the underlying stream + + + + + In-place and stable implementation of MergeSort + + + + + MergeSort a list of comparable items + + + + + MergeSort a list + + + + + A thread-safe Progress Log Control + + + + + Creates a new progress log control + + + + + Log a message + + + + + Clear the log + + + + + Required designer variable. + + + + + Clean up any resources being used. + + true if managed resources should be disposed; otherwise, false. + + + + Required method for Designer support - do not modify + the contents of this method with the code editor. + + + + + The contents of the log as text + + + + + Audio Endpoint Volume + + + + + Volume Step Up + + + + + Volume Step Down + + + + + Creates a new Audio endpoint volume + + IAudioEndpointVolume COM interface + + + + Dispose + + + + + Finalizer + + + + + On Volume Notification + + + + + Volume Range + + + + + Hardware Support + + + + + Step Information + + + + + Channels + + + + + Master Volume Level + + + + + Master Volume Level Scalar + + + + + Mute + + + + + Audio Meter Information + + + + + Peak Values + + + + + Hardware Support + + + + + Master Peak Value + + + + + Device State + + + + + DEVICE_STATE_ACTIVE + + + + + DEVICE_STATE_DISABLED + + + + + DEVICE_STATE_NOTPRESENT + + + + + DEVICE_STATE_UNPLUGGED + + + + + DEVICE_STATEMASK_ALL + + + + + Endpoint Hardware Support + + + + + Volume + + + + + Mute + + + + + Meter + + + + + is defined in WTypes.h + + + + + The EDataFlow enumeration defines constants that indicate the direction + in which audio data flows between an audio endpoint device and an application + + + + + Audio rendering stream. + Audio data flows from the application to the audio endpoint device, which renders the stream. + + + + + Audio capture stream. Audio data flows from the audio endpoint device that captures the stream, + to the application + + + + + Audio rendering or capture stream. Audio data can flow either from the application to the audio + endpoint device, or from the audio endpoint device to the application. + + + + + n.b. WORK IN PROGRESS - this code will probably do nothing but crash at the moment + Defined in AudioClient.h + + + + + The GetBufferSize method retrieves the size (maximum capacity) of the endpoint buffer. + + + + + The GetService method accesses additional services from the audio client object. + + The interface ID for the requested service. + Pointer to a pointer variable into which the method writes the address of an instance of the requested interface. + + + + defined in MMDeviceAPI.h + + + + + IMMNotificationClient + + + + + Device State Changed + + + + + Device Added + + + + + Device Removed + + + + + Default Device Changed + + + + + Property Value Changed + + + + + + + is defined in propsys.h + + + + + implements IMMDeviceEnumerator + + + + + MMDevice STGM enumeration + + + + + PROPERTYKEY is defined in wtypes.h + + + + + Format ID + + + + + Property ID + + + + + + + + + + + from Propidl.h. + http://msdn.microsoft.com/en-us/library/aa380072(VS.85).aspx + contains a union so we have to do an explicit layout + + + + + Creates a new PropVariant containing a long value + + + + + Helper method to gets blob data + + + + + Interprets a blob as an array of structs + + + + + allows freeing up memory, might turn this into a Dispose method? + + + + + Gets the type of data in this PropVariant + + + + + Property value + + + + + The ERole enumeration defines constants that indicate the role + that the system has assigned to an audio endpoint device + + + + + Games, system notification sounds, and voice commands. + + + + + Music, movies, narration, and live music recording + + + + + Voice communications (talking to another person). + + + + + MM Device + + + + + To string + + + + + Audio Client + + + + + Audio Meter Information + + + + + Audio Endpoint Volume + + + + + Properties + + + + + Friendly name for the endpoint + + + + + Friendly name of device + + + + + Device ID + + + + + Data Flow + + + + + Device State + + + + + MM Device Enumerator + + + + + Enumerate Audio Endpoints + + Desired DataFlow + State Mask + Device Collection + + + + Get Default Endpoint + + Data Flow + Role + Device + + + + Get device by ID + + Device ID + Device + + + + Creates a new MM Device Enumerator + + + + + Property Store class, only supports reading properties at the moment. + + + + + Contains property guid + + Looks for a specific key + True if found + + + + Gets property key at sepecified index + + Index + Property key + + + + Gets property value at specified index + + Index + Property value + + + + Creates a new property store + + IPropertyStore COM interface + + + + Property Count + + + + + Gets property by index + + Property index + The property + + + + Indexer by guid + + Property Key + Property or null if not found + + + + Property Store Property + + + + + Property Key + + + + + Property Value + + + + + Main ASIODriver Class. To use this class, you need to query first the GetASIODriverNames() and + then use the GetASIODriverByName to instantiate the correct ASIODriver. + This is the first ASIODriver binding fully implemented in C#! + + Contributor: Alexandre Mutel - email: alexandre_mutel at yahoo.fr + + + + + Gets the ASIO driver names installed. + + a list of driver names. Use this name to GetASIODriverByName + + + + Instantiate a ASIODriver given its name. + + The name of the driver + an ASIODriver instance + + + + Instantiate the ASIO driver by GUID. + + The GUID. + an ASIODriver instance + + + + Inits the ASIODriver.. + + The sys handle. + + + + + Gets the name of the driver. + + + + + + Gets the driver version. + + + + + + Gets the error message. + + + + + + Starts this instance. + + + + + Stops this instance. + + + + + Gets the channels. + + The num input channels. + The num output channels. + + + + Gets the latencies (n.b. does not throw an exception) + + The input latency. + The output latency. + + + + Gets the size of the buffer. + + Size of the min. + Size of the max. + Size of the preferred. + The granularity. + + + + Determines whether this instance can use the specified sample rate. + + The sample rate. + + true if this instance [can sample rate] the specified sample rate; otherwise, false. + + + + + Gets the sample rate. + + + + + + Sets the sample rate. + + The sample rate. + + + + Gets the clock sources. + + The clocks. + The num sources. + + + + Sets the clock source. + + The reference. + + + + Gets the sample position. + + The sample pos. + The time stamp. + + + + Gets the channel info. + + The channel number. + if set to true [true for input info]. + + + + + Creates the buffers. + + The buffer infos. + The num channels. + Size of the buffer. + The callbacks. + + + + Disposes the buffers. + + + + + Controls the panel. + + + + + Futures the specified selector. + + The selector. + The opt. + + + + Notifies OutputReady to the ASIODriver. + + + + + + Releases this instance. + + + + + Handles the exception. Throws an exception based on the error. + + The error to check. + Method name + + + + Inits the vTable method from GUID. This is a tricky part of this class. + + The ASIO GUID. + + + + Internal VTable structure to store all the delegates to the C++ COM method. + + + + + Callback used by the ASIODriverExt to get wave data + + + + + ASIODriverExt is a simplified version of the ASIODriver. It provides an easier + way to access the capabilities of the Driver and implement the callbacks necessary + for feeding the driver. + Implementation inspired from Rob Philpot's with a managed C++ ASIO wrapper BlueWave.Interop.Asio + http://www.codeproject.com/KB/mcpp/Asio.Net.aspx + + Contributor: Alexandre Mutel - email: alexandre_mutel at yahoo.fr + + + + + Initializes a new instance of the class based on an already + instantiated ASIODriver instance. + + A ASIODriver already instantiated. + + + + Allows adjustment of which is the first output channel we write to + + Output Channel offset + Input Channel offset + + + + Starts playing the buffers. + + + + + Stops playing the buffers. + + + + + Shows the control panel. + + + + + Releases this instance. + + + + + Determines whether the specified sample rate is supported. + + The sample rate. + + true if [is sample rate supported]; otherwise, false. + + + + + Sets the sample rate. + + The sample rate. + + + + Creates the buffers for playing. + + The number of outputs channels. + The number of input channel. + if set to true [use max buffer size] else use Prefered size + + + + Builds the capabilities internally. + + + + + Callback called by the ASIODriver on fill buffer demand. Redirect call to external callback. + + Index of the double buffer. + if set to true [direct process]. + + + + Callback called by the ASIODriver on event "Samples rate changed". + + The sample rate. + + + + Asio message call back. + + The selector. + The value. + The message. + The opt. + + + + + Buffers switch time info call back. + + The asio time param. + Index of the double buffer. + if set to true [direct process]. + + + + + Gets the driver used. + + The ASIOdriver. + + + + Gets or sets the fill buffer callback. + + The fill buffer callback. + + + + Gets the capabilities of the ASIODriver. + + The capabilities. + + + + This class stores convertors for different interleaved WaveFormat to ASIOSampleType separate channel + format. + + + + + Selects the sample convertor based on the input WaveFormat and the output ASIOSampleTtype. + + The wave format. + The type. + + + + + Optimized convertor for 2 channels SHORT + + + + + Generic convertor for SHORT + + + + + Optimized convertor for 2 channels FLOAT + + + + + Generic convertor SHORT + + + + + Optimized convertor for 2 channels SHORT + + + + + Generic convertor for SHORT + + + + + Optimized convertor for 2 channels FLOAT + + + + + Generic convertor SHORT + + + + + Generic converter 24 LSB + + + + + Generic convertor for float + + + + + ASIO common Exception. + + + + + Gets the name of the error. + + The error. + the name of the error + + + + Represents an installed ACM Driver + + + + + Helper function to determine whether a particular codec is installed + + The short name of the function + Whether the codec is installed + + + + Attempts to add a new ACM driver from a file + + Full path of the .acm or dll file containing the driver + Handle to the driver + + + + Removes a driver previously added using AddLocalDriver + + Local driver to remove + + + + Show Format Choose Dialog + + Owner window handle, can be null + Window title + Enumeration flags. None to get everything + Enumeration format. Only needed with certain enumeration flags + The selected format + Textual description of the selected format + Textual description of the selected format tag + True if a format was selected + + + + Finds a Driver by its short name + + Short Name + The driver, or null if not found + + + + Gets a list of the ACM Drivers installed + + + + + The callback for acmDriverEnum + + + + + Creates a new ACM Driver object + + Driver handle + + + + ToString + + + + + Gets all the supported formats for a given format tag + + Format tag + Supported formats + + + + Opens this driver + + + + + Closes this driver + + + + + Dispose + + + + + Gets the maximum size needed to store a WaveFormat for ACM interop functions + + + + + The short name of this driver + + + + + The full name of this driver + + + + + The driver ID + + + + + The list of FormatTags for this ACM Driver + + + + + Interop structure for ACM driver details (ACMDRIVERDETAILS) + http://msdn.microsoft.com/en-us/library/dd742889%28VS.85%29.aspx + + + + + ACMDRIVERDETAILS_SHORTNAME_CHARS + + + + + ACMDRIVERDETAILS_LONGNAME_CHARS + + + + + ACMDRIVERDETAILS_COPYRIGHT_CHARS + + + + + ACMDRIVERDETAILS_LICENSING_CHARS + + + + + ACMDRIVERDETAILS_FEATURES_CHARS + + + + + DWORD cbStruct + + + + + FOURCC fccType + + + + + FOURCC fccComp + + + + + WORD wMid; + + + + + WORD wPid + + + + + DWORD vdwACM + + + + + DWORD vdwDriver + + + + + DWORD fdwSupport; + + + + + DWORD cFormatTags + + + + + DWORD cFilterTags + + + + + HICON hicon + + + + + TCHAR szShortName[ACMDRIVERDETAILS_SHORTNAME_CHARS]; + + + + + TCHAR szLongName[ACMDRIVERDETAILS_LONGNAME_CHARS]; + + + + + TCHAR szCopyright[ACMDRIVERDETAILS_COPYRIGHT_CHARS]; + + + + + TCHAR szLicensing[ACMDRIVERDETAILS_LICENSING_CHARS]; + + + + + TCHAR szFeatures[ACMDRIVERDETAILS_FEATURES_CHARS]; + + + + + Flags indicating what support a particular ACM driver has + + + + ACMDRIVERDETAILS_SUPPORTF_CODEC - Codec + + + ACMDRIVERDETAILS_SUPPORTF_CONVERTER - Converter + + + ACMDRIVERDETAILS_SUPPORTF_FILTER - Filter + + + ACMDRIVERDETAILS_SUPPORTF_HARDWARE - Hardware + + + ACMDRIVERDETAILS_SUPPORTF_ASYNC - Async + + + ACMDRIVERDETAILS_SUPPORTF_LOCAL - Local + + + ACMDRIVERDETAILS_SUPPORTF_DISABLED - Disabled + + + + ACM_DRIVERENUMF_NOLOCAL, Only global drivers should be included in the enumeration + + + + + ACM_DRIVERENUMF_DISABLED, Disabled ACM drivers should be included in the enumeration + + + + + ACM Format + + + + + Format Index + + + + + Format Tag + + + + + Support Flags + + + + + WaveFormat + + + + + WaveFormat Size + + + + + Format Description + + + + + ACMFORMATCHOOSE + http://msdn.microsoft.com/en-us/library/dd742911%28VS.85%29.aspx + + + + + DWORD cbStruct; + + + + + DWORD fdwStyle; + + + + + HWND hwndOwner; + + + + + LPWAVEFORMATEX pwfx; + + + + + DWORD cbwfx; + + + + + LPCTSTR pszTitle; + + + + + TCHAR szFormatTag[ACMFORMATTAGDETAILS_FORMATTAG_CHARS]; + + + + + TCHAR szFormat[ACMFORMATDETAILS_FORMAT_CHARS]; + + + + + LPTSTR pszName; + n.b. can be written into + + + + + DWORD cchName + Should be at least 128 unless name is zero + + + + + DWORD fdwEnum; + + + + + LPWAVEFORMATEX pwfxEnum; + + + + + HINSTANCE hInstance; + + + + + LPCTSTR pszTemplateName; + + + + + LPARAM lCustData; + + + + + ACMFORMATCHOOSEHOOKPROC pfnHook; + + + + + None + + + + + ACMFORMATCHOOSE_STYLEF_SHOWHELP + + + + + ACMFORMATCHOOSE_STYLEF_ENABLEHOOK + + + + + ACMFORMATCHOOSE_STYLEF_ENABLETEMPLATE + + + + + ACMFORMATCHOOSE_STYLEF_ENABLETEMPLATEHANDLE + + + + + ACMFORMATCHOOSE_STYLEF_INITTOWFXSTRUCT + + + + + ACMFORMATCHOOSE_STYLEF_CONTEXTHELP + + + + + ACMFORMATDETAILS + http://msdn.microsoft.com/en-us/library/dd742913%28VS.85%29.aspx + + + + + ACMFORMATDETAILS_FORMAT_CHARS + + + + + DWORD cbStruct; + + + + + DWORD dwFormatIndex; + + + + + DWORD dwFormatTag; + + + + + DWORD fdwSupport; + + + + + LPWAVEFORMATEX pwfx; + + + + + DWORD cbwfx; + + + + + TCHAR szFormat[ACMFORMATDETAILS_FORMAT_CHARS]; + + + + + Format Enumeration Flags + + + + + None + + + + + ACM_FORMATENUMF_CONVERT + The WAVEFORMATEX structure pointed to by the pwfx member of the ACMFORMATDETAILS structure is valid. The enumerator will only enumerate destination formats that can be converted from the given pwfx format. + + + + + ACM_FORMATENUMF_HARDWARE + The enumerator should only enumerate formats that are supported as native input or output formats on one or more of the installed waveform-audio devices. This flag provides a way for an application to choose only formats native to an installed waveform-audio device. This flag must be used with one or both of the ACM_FORMATENUMF_INPUT and ACM_FORMATENUMF_OUTPUT flags. Specifying both ACM_FORMATENUMF_INPUT and ACM_FORMATENUMF_OUTPUT will enumerate only formats that can be opened for input or output. This is true regardless of whether this flag is specified. + + + + + ACM_FORMATENUMF_INPUT + Enumerator should enumerate only formats that are supported for input (recording). + + + + + ACM_FORMATENUMF_NCHANNELS + The nChannels member of the WAVEFORMATEX structure pointed to by the pwfx member of the ACMFORMATDETAILS structure is valid. The enumerator will enumerate only a format that conforms to this attribute. + + + + + ACM_FORMATENUMF_NSAMPLESPERSEC + The nSamplesPerSec member of the WAVEFORMATEX structure pointed to by the pwfx member of the ACMFORMATDETAILS structure is valid. The enumerator will enumerate only a format that conforms to this attribute. + + + + + ACM_FORMATENUMF_OUTPUT + Enumerator should enumerate only formats that are supported for output (playback). + + + + + ACM_FORMATENUMF_SUGGEST + The WAVEFORMATEX structure pointed to by the pwfx member of the ACMFORMATDETAILS structure is valid. The enumerator will enumerate all suggested destination formats for the given pwfx format. This mechanism can be used instead of the acmFormatSuggest function to allow an application to choose the best suggested format for conversion. The dwFormatIndex member will always be set to zero on return. + + + + + ACM_FORMATENUMF_WBITSPERSAMPLE + The wBitsPerSample member of the WAVEFORMATEX structure pointed to by the pwfx member of the ACMFORMATDETAILS structure is valid. The enumerator will enumerate only a format that conforms to this attribute. + + + + + ACM_FORMATENUMF_WFORMATTAG + The wFormatTag member of the WAVEFORMATEX structure pointed to by the pwfx member of the ACMFORMATDETAILS structure is valid. The enumerator will enumerate only a format that conforms to this attribute. The dwFormatTag member of the ACMFORMATDETAILS structure must be equal to the wFormatTag member. + + + + + ACM_FORMATSUGGESTF_WFORMATTAG + + + + + ACM_FORMATSUGGESTF_NCHANNELS + + + + + ACM_FORMATSUGGESTF_NSAMPLESPERSEC + + + + + ACM_FORMATSUGGESTF_WBITSPERSAMPLE + + + + + ACM_FORMATSUGGESTF_TYPEMASK + + + + + ACM Format Tag + + + + + Format Tag Index + + + + + Format Tag + + + + + Format Size + + + + + Support Flags + + + + + Standard Formats Count + + + + + Format Description + + + + + ACMFORMATTAGDETAILS_FORMATTAG_CHARS + + + + + DWORD cbStruct; + + + + + DWORD dwFormatTagIndex; + + + + + DWORD dwFormatTag; + + + + + DWORD cbFormatSize; + + + + + DWORD fdwSupport; + + + + + DWORD cStandardFormats; + + + + + TCHAR szFormatTag[ACMFORMATTAGDETAILS_FORMATTAG_CHARS]; + + + + + Interop definitions for Windows ACM (Audio Compression Manager) API + + + + + http://msdn.microsoft.com/en-us/library/dd742916%28VS.85%29.aspx + MMRESULT acmFormatSuggest( + HACMDRIVER had, + LPWAVEFORMATEX pwfxSrc, + LPWAVEFORMATEX pwfxDst, + DWORD cbwfxDst, + DWORD fdwSuggest); + + + + + http://msdn.microsoft.com/en-us/library/dd742928%28VS.85%29.aspx + MMRESULT acmStreamOpen( + LPHACMSTREAM phas, + HACMDRIVER had, + LPWAVEFORMATEX pwfxSrc, + LPWAVEFORMATEX pwfxDst, + LPWAVEFILTER pwfltr, + DWORD_PTR dwCallback, + DWORD_PTR dwInstance, + DWORD fdwOpen + + + + + A version with pointers for troubleshooting + + + + + http://msdn.microsoft.com/en-us/library/dd742910%28VS.85%29.aspx + UINT ACMFORMATCHOOSEHOOKPROC acmFormatChooseHookProc( + HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam + + + + ACM_METRIC_COUNT_DRIVERS + + + ACM_METRIC_COUNT_CODECS + + + ACM_METRIC_COUNT_CONVERTERS + + + ACM_METRIC_COUNT_FILTERS + + + ACM_METRIC_COUNT_DISABLED + + + ACM_METRIC_COUNT_HARDWARE + + + ACM_METRIC_COUNT_LOCAL_DRIVERS + + + ACM_METRIC_COUNT_LOCAL_CODECS + + + ACM_METRIC_COUNT_LOCAL_CONVERTERS + + + ACM_METRIC_COUNT_LOCAL_FILTERS + + + ACM_METRIC_COUNT_LOCAL_DISABLED + + + ACM_METRIC_HARDWARE_WAVE_INPUT + + + ACM_METRIC_HARDWARE_WAVE_OUTPUT + + + ACM_METRIC_MAX_SIZE_FORMAT + + + ACM_METRIC_MAX_SIZE_FILTER + + + ACM_METRIC_DRIVER_SUPPORT + + + ACM_METRIC_DRIVER_PRIORITY + + + + AcmStream encapsulates an Audio Compression Manager Stream + used to convert audio from one format to another + + + + + Creates a new ACM stream to convert one format to another. Note that + not all conversions can be done in one step + + The source audio format + The destination audio format + + + + Creates a new ACM stream to convert one format to another, using a + specified driver identified and wave filter + + the driver identifier + the source format + the wave filter + + + + Returns the number of output bytes for a given number of input bytes + + Number of input bytes + Number of output bytes + + + + Returns the number of source bytes for a given number of destination bytes + + Number of destination bytes + Number of source bytes + + + + Suggests an appropriate PCM format that the compressed format can be converted + to in one step + + The compressed format + The PCM format + + + + Report that we have repositioned in the source stream + + + + + Converts the contents of the SourceBuffer into the DestinationBuffer + + The number of bytes in the SourceBuffer + that need to be converted + The number of source bytes actually converted + The number of converted bytes in the DestinationBuffer + + + + Converts the contents of the SourceBuffer into the DestinationBuffer + + The number of bytes in the SourceBuffer + that need to be converted + The number of converted bytes in the DestinationBuffer + + + + Frees resources associated with this ACM Stream + + + + + Frees resources associated with this ACM Stream + + + + + Frees resources associated with this ACM Stream + + + + + Returns the Source Buffer. Fill this with data prior to calling convert + + + + + Returns the Destination buffer. This will contain the converted data + after a successful call to Convert + + + + + ACM_STREAMCONVERTF_BLOCKALIGN + + + + + ACM_STREAMCONVERTF_START + + + + + ACM_STREAMCONVERTF_END + + + + + ACMSTREAMHEADER_STATUSF_DONE + + + + + ACMSTREAMHEADER_STATUSF_PREPARED + + + + + ACMSTREAMHEADER_STATUSF_INQUEUE + + + + + Interop structure for ACM stream headers. + ACMSTREAMHEADER + http://msdn.microsoft.com/en-us/library/dd742926%28VS.85%29.aspx + + + + + ACM_STREAMOPENF_QUERY, ACM will be queried to determine whether it supports the given conversion. A conversion stream will not be opened, and no handle will be returned in the phas parameter. + + + + + ACM_STREAMOPENF_ASYNC, Stream conversion should be performed asynchronously. If this flag is specified, the application can use a callback function to be notified when the conversion stream is opened and closed and after each buffer is converted. In addition to using a callback function, an application can examine the fdwStatus member of the ACMSTREAMHEADER structure for the ACMSTREAMHEADER_STATUSF_DONE flag. + + + + + ACM_STREAMOPENF_NONREALTIME, ACM will not consider time constraints when converting the data. By default, the driver will attempt to convert the data in real time. For some formats, specifying this flag might improve the audio quality or other characteristics. + + + + + CALLBACK_TYPEMASK, callback type mask + + + + + CALLBACK_NULL, no callback + + + + + CALLBACK_WINDOW, dwCallback is a HWND + + + + + CALLBACK_TASK, dwCallback is a HTASK + + + + + CALLBACK_FUNCTION, dwCallback is a FARPROC + + + + + CALLBACK_THREAD, thread ID replaces 16 bit task + + + + + CALLBACK_EVENT, dwCallback is an EVENT Handle + + + + + ACM_STREAMSIZEF_SOURCE + + + + + ACM_STREAMSIZEF_DESTINATION + + + + + Summary description for WaveFilter. + + + + + cbStruct + + + + + dwFilterTag + + + + + fdwFilter + + + + + reserved + + + + + Manufacturer codes from mmreg.h + + + + Microsoft Corporation + + + Creative Labs, Inc + + + Media Vision, Inc. + + + Fujitsu Corp. + + + Artisoft, Inc. + + + Turtle Beach, Inc. + + + IBM Corporation + + + Vocaltec LTD. + + + Roland + + + DSP Solutions, Inc. + + + NEC + + + ATI + + + Wang Laboratories, Inc + + + Tandy Corporation + + + Voyetra + + + Antex Electronics Corporation + + + ICL Personal Systems + + + Intel Corporation + + + Advanced Gravis + + + Video Associates Labs, Inc. + + + InterActive Inc + + + Yamaha Corporation of America + + + Everex Systems, Inc + + + Echo Speech Corporation + + + Sierra Semiconductor Corp + + + Computer Aided Technologies + + + APPS Software International + + + DSP Group, Inc + + + microEngineering Labs + + + Computer Friends, Inc. + + + ESS Technology + + + Audio, Inc. + + + Motorola, Inc. + + + Canopus, co., Ltd. + + + Seiko Epson Corporation + + + Truevision + + + Aztech Labs, Inc. + + + Videologic + + + SCALACS + + + Korg Inc. + + + Audio Processing Technology + + + Integrated Circuit Systems, Inc. + + + Iterated Systems, Inc. + + + Metheus + + + Logitech, Inc. + + + Winnov, Inc. + + + NCR Corporation + + + EXAN + + + AST Research Inc. + + + Willow Pond Corporation + + + Sonic Foundry + + + Vitec Multimedia + + + MOSCOM Corporation + + + Silicon Soft, Inc. + + + Supermac + + + Audio Processing Technology + + + Speech Compression + + + Ahead, Inc. + + + Dolby Laboratories + + + OKI + + + AuraVision Corporation + + + Ing C. Olivetti & C., S.p.A. + + + I/O Magic Corporation + + + Matsushita Electric Industrial Co., LTD. + + + Control Resources Limited + + + Xebec Multimedia Solutions Limited + + + New Media Corporation + + + Natural MicroSystems + + + Lyrrus Inc. + + + Compusic + + + OPTi Computers Inc. + + + Adlib Accessories Inc. + + + Compaq Computer Corp. + + + Dialogic Corporation + + + InSoft, Inc. + + + M.P. Technologies, Inc. + + + Weitek + + + Lernout & Hauspie + + + Quanta Computer Inc. + + + Apple Computer, Inc. + + + Digital Equipment Corporation + + + Mark of the Unicorn + + + Workbit Corporation + + + Ositech Communications Inc. + + + miro Computer Products AG + + + Cirrus Logic + + + ISOLUTION B.V. + + + Horizons Technology, Inc + + + Computer Concepts Ltd + + + Voice Technologies Group, Inc. + + + Radius + + + Rockwell International + + + Co. XYZ for testing + + + Opcode Systems + + + Voxware Inc + + + Northern Telecom Limited + + + APICOM + + + Grande Software + + + ADDX + + + Wildcat Canyon Software + + + Rhetorex Inc + + + Brooktree Corporation + + + ENSONIQ Corporation + + + FAST Multimedia AG + + + NVidia Corporation + + + OKSORI Co., Ltd. + + + DiAcoustics, Inc. + + + Gulbransen, Inc. + + + Kay Elemetrics, Inc. + + + Crystal Semiconductor Corporation + + + Splash Studios + + + Quarterdeck Corporation + + + TDK Corporation + + + Digital Audio Labs, Inc. + + + Seer Systems, Inc. + + + PictureTel Corporation + + + AT&T Microelectronics + + + Osprey Technologies, Inc. + + + Mediatrix Peripherals + + + SounDesignS M.C.S. Ltd. + + + A.L. Digital Ltd. + + + Spectrum Signal Processing, Inc. + + + Electronic Courseware Systems, Inc. + + + AMD + + + Core Dynamics + + + CANAM Computers + + + Softsound, Ltd. + + + Norris Communications, Inc. + + + Danka Data Devices + + + EuPhonics + + + Precept Software, Inc. + + + Crystal Net Corporation + + + Chromatic Research, Inc + + + Voice Information Systems, Inc + + + Vienna Systems + + + Connectix Corporation + + + Gadget Labs LLC + + + Frontier Design Group LLC + + + Viona Development GmbH + + + Casio Computer Co., LTD + + + Diamond Multimedia + + + S3 + + + Fraunhofer + + + + Summary description for MmException. + + + + + Creates a new MmException + + The result returned by the Windows API call + The name of the Windows API that failed + + + + Helper function to automatically raise an exception on failure + + The result of the API call + The API function name + + + + Returns the Windows API result + + + + + Windows multimedia error codes from mmsystem.h. + + + + no error, MMSYSERR_NOERROR + + + unspecified error, MMSYSERR_ERROR + + + device ID out of range, MMSYSERR_BADDEVICEID + + + driver failed enable, MMSYSERR_NOTENABLED + + + device already allocated, MMSYSERR_ALLOCATED + + + device handle is invalid, MMSYSERR_INVALHANDLE + + + no device driver present, MMSYSERR_NODRIVER + + + memory allocation error, MMSYSERR_NOMEM + + + function isn't supported, MMSYSERR_NOTSUPPORTED + + + error value out of range, MMSYSERR_BADERRNUM + + + invalid flag passed, MMSYSERR_INVALFLAG + + + invalid parameter passed, MMSYSERR_INVALPARAM + + + handle being used simultaneously on another thread (eg callback),MMSYSERR_HANDLEBUSY + + + specified alias not found, MMSYSERR_INVALIDALIAS + + + bad registry database, MMSYSERR_BADDB + + + registry key not found, MMSYSERR_KEYNOTFOUND + + + registry read error, MMSYSERR_READERROR + + + registry write error, MMSYSERR_WRITEERROR + + + registry delete error, MMSYSERR_DELETEERROR + + + registry value not found, MMSYSERR_VALNOTFOUND + + + driver does not call DriverCallback, MMSYSERR_NODRIVERCB + + + more data to be returned, MMSYSERR_MOREDATA + + + unsupported wave format, WAVERR_BADFORMAT + + + still something playing, WAVERR_STILLPLAYING + + + header not prepared, WAVERR_UNPREPARED + + + device is synchronous, WAVERR_SYNC + + + Conversion not possible (ACMERR_NOTPOSSIBLE) + + + Busy (ACMERR_BUSY) + + + Header Unprepared (ACMERR_UNPREPARED) + + + Cancelled (ACMERR_CANCELED) + + + invalid line (MIXERR_INVALLINE) + + + invalid control (MIXERR_INVALCONTROL) + + + invalid value (MIXERR_INVALVALUE) + + + + WaveHeader interop structure (WAVEHDR) + http://msdn.microsoft.com/en-us/library/dd743837%28VS.85%29.aspx + + + + pointer to locked data buffer (lpData) + + + length of data buffer (dwBufferLength) + + + used for input only (dwBytesRecorded) + + + for client's use (dwUser) + + + assorted flags (dwFlags) + + + loop control counter (dwLoops) + + + PWaveHdr, reserved for driver (lpNext) + + + reserved for driver + + + + Wave Header Flags enumeration + + + + + WHDR_BEGINLOOP + This buffer is the first buffer in a loop. This flag is used only with output buffers. + + + + + WHDR_DONE + Set by the device driver to indicate that it is finished with the buffer and is returning it to the application. + + + + + WHDR_ENDLOOP + This buffer is the last buffer in a loop. This flag is used only with output buffers. + + + + + WHDR_INQUEUE + Set by Windows to indicate that the buffer is queued for playback. + + + + + WHDR_PREPARED + Set by Windows to indicate that the buffer has been prepared with the waveInPrepareHeader or waveOutPrepareHeader function. + + + + + WASAPI Loopback Capture + based on a contribution from "Pygmy" - http://naudio.codeplex.com/discussions/203605 + + + + + Initialises a new instance of the WASAPI capture class + + + + + Initialises a new instance of the WASAPI capture class + + Capture device to use + + + + Gets the default audio loopback capture device + + The default audio loopback capture device + + + + Specify loopback + + + + + Recording wave format + + + + + Allows recording using the Windows waveIn APIs + Events are raised as recorded buffers are made available + + + + + Prepares a Wave input device for recording + + + + + Creates a WaveIn device using the specified window handle for callbacks + + A valid window handle + + + + Prepares a Wave input device for recording + + + + + Retrieves the capabilities of a waveIn device + + Device to test + The WaveIn device capabilities + + + + Called when we get a new buffer of recorded data + + + + + Start recording + + + + + Stop recording + + + + + Dispose pattern + + + + + Microphone Level + + + + + Dispose method + + + + + Indicates recorded data is available + + + + + Indicates that all recorded data has now been received. + + + + + Returns the number of Wave In devices available in the system + + + + + Milliseconds for the buffer. Recommended value is 100ms + + + + + Number of Buffers to use (usually 2 or 3) + + + + + The device number to use + + + + + WaveFormat we are recording in + + + + + WaveInCapabilities structure (based on WAVEINCAPS2 from mmsystem.h) + http://msdn.microsoft.com/en-us/library/ms713726(VS.85).aspx + + + + + wMid + + + + + wPid + + + + + vDriverVersion + + + + + Product Name (szPname) + + + + + Supported formats (bit flags) dwFormats + + + + + Supported channels (1 for mono 2 for stereo) (wChannels) + Seems to be set to -1 on a lot of devices + + + + + wReserved1 + + + + + Checks to see if a given SupportedWaveFormat is supported + + The SupportedWaveFormat + true if supported + + + + Number of channels supported + + + + + The product name + + + + + The device name Guid (if provided) + + + + + The product name Guid (if provided) + + + + + The manufacturer guid (if provided) + + + + + The device name from the registry if supported + + + + + Event Args for WaveInStream event + + + + + Creates new WaveInEventArgs + + + + + Buffer containing recorded data. Note that it might not be completely + full. + + + + + The number of recorded bytes in Buffer. + + + + + MME Wave function interop + + + + + CALLBACK_NULL + No callback + + + + + CALLBACK_FUNCTION + dwCallback is a FARPROC + + + + + CALLBACK_EVENT + dwCallback is an EVENT handle + + + + + CALLBACK_WINDOW + dwCallback is a HWND + + + + + CALLBACK_THREAD + callback is a thread ID + + + + + WIM_OPEN + + + + + WIM_CLOSE + + + + + WIM_DATA + + + + + WOM_CLOSE + + + + + WOM_DONE + + + + + WOM_OPEN + + + + + WaveOutCapabilities structure (based on WAVEOUTCAPS2 from mmsystem.h) + http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_waveoutcaps_str.asp + + + + + wMid + + + + + wPid + + + + + vDriverVersion + + + + + Product Name (szPname) + + + + + Supported formats (bit flags) dwFormats + + + + + Supported channels (1 for mono 2 for stereo) (wChannels) + Seems to be set to -1 on a lot of devices + + + + + wReserved1 + + + + + Optional functionality supported by the device + + + + + Checks to see if a given SupportedWaveFormat is supported + + The SupportedWaveFormat + true if supported + + + + Number of channels supported + + + + + Whether playback control is supported + + + + + The product name + + + + + The device name Guid (if provided) + + + + + The product name Guid (if provided) + + + + + The manufacturer guid (if provided) + + + + + Supported wave formats for WaveOutCapabilities + + + + + 11.025 kHz, Mono, 8-bit + + + + + 11.025 kHz, Stereo, 8-bit + + + + + 11.025 kHz, Mono, 16-bit + + + + + 11.025 kHz, Stereo, 16-bit + + + + + 22.05 kHz, Mono, 8-bit + + + + + 22.05 kHz, Stereo, 8-bit + + + + + 22.05 kHz, Mono, 16-bit + + + + + 22.05 kHz, Stereo, 16-bit + + + + + 44.1 kHz, Mono, 8-bit + + + + + 44.1 kHz, Stereo, 8-bit + + + + + 44.1 kHz, Mono, 16-bit + + + + + 44.1 kHz, Stereo, 16-bit + + + + + 44.1 kHz, Mono, 8-bit + + + + + 44.1 kHz, Stereo, 8-bit + + + + + 44.1 kHz, Mono, 16-bit + + + + + 44.1 kHz, Stereo, 16-bit + + + + + 48 kHz, Mono, 8-bit + + + + + 48 kHz, Stereo, 8-bit + + + + + 48 kHz, Mono, 16-bit + + + + + 48 kHz, Stereo, 16-bit + + + + + 96 kHz, Mono, 8-bit + + + + + 96 kHz, Stereo, 8-bit + + + + + 96 kHz, Mono, 16-bit + + + + + 96 kHz, Stereo, 16-bit + + + + + Flags indicating what features this WaveOut device supports + + + + supports pitch control (WAVECAPS_PITCH) + + + supports playback rate control (WAVECAPS_PLAYBACKRATE) + + + supports volume control (WAVECAPS_VOLUME) + + + supports separate left-right volume control (WAVECAPS_LRVOLUME) + + + (WAVECAPS_SYNC) + + + (WAVECAPS_SAMPLEACCURATE) + + + + Sample provider interface to make WaveChannel32 extensible + Still a bit ugly, hence internal at the moment - and might even make these into + bit depth converting WaveProviders + + + + + A sample provider mixer, allowing inputs to be added and removed + + + + + Creates a new MixingSampleProvider, with no inputs, but a specified WaveFormat + + The WaveFormat of this mixer. All inputs must be in this format + + + + Creates a new MixingSampleProvider, based on the given inputs + + Mixer inputs - must all have the same waveformat, and must + all be of the same WaveFormat. There must be at least one input + + + + Adds a WaveProvider as a Mixer input. + Must be PCM or IEEE float already + + IWaveProvider mixer input + + + + Adds a new mixer input + + Mixer input + + + + Removes a mixer input + + Mixer input to remove + + + + Removes all mixer inputs + + + + + Reads samples from this sample provider + + Sample buffer + Offset into sample buffer + Number of samples required + Number of samples read + + + + When set to true, the Read method always returns the number + of samples requested, even if there are no inputs, or if the + current inputs reach their end. Setting this to true effectively + makes this a never-ending sample provider, so take care if you plan + to write it out to a file. + + + + + The output WaveFormat of this sample provider + + + + + Converts a mono sample provider to stereo, with a customisable pan strategy + + + + + Initialises a new instance of the PanningSampleProvider + + Source sample provider, must be mono + + + + Reads samples from this sample provider + + Sample buffer + Offset into sample buffer + Number of samples desired + Number of samples read + + + + Pan value, must be between -1 (left) and 1 (right) + + + + + The pan strategy currently in use + + + + + The WaveFormat of this sample provider + + + + + Pair of floating point values, representing samples or multipliers + + + + + Left value + + + + + Right value + + + + + Required Interface for a Panning Strategy + + + + + Gets the left and right multipliers for a given pan value + + Pan value from -1 to 1 + Left and right multipliers in a stereo sample pair + + + + Simplistic "balance" control - treating the mono input as if it was stereo + In the centre, both channels full volume. Opposite channel decays linearly + as balance is turned to to one side + + + + + Gets the left and right channel multipliers for this pan value + + Pan value, between -1 and 1 + Left and right multipliers + + + + Square Root Pan, thanks to Yuval Naveh + + + + + Gets the left and right channel multipliers for this pan value + + Pan value, between -1 and 1 + Left and right multipliers + + + + Sinus Pan, thanks to Yuval Naveh + + + + + Gets the left and right channel multipliers for this pan value + + Pan value, between -1 and 1 + Left and right multipliers + + + + Linear Pan + + + + + Gets the left and right channel multipliers for this pan value + + Pan value, between -1 and 1 + Left and right multipliers + + + + GSM 610 + + + + + Represents a Wave file format + + + + format type + + + number of channels + + + sample rate + + + for buffer estimation + + + block size of data + + + number of bits per sample of mono data + + + number of following bytes + + + + Creates a new PCM 44.1Khz stereo 16 bit format + + + + + Creates a new 16 bit wave format with the specified sample + rate and channel count + + Sample Rate + Number of channels + + + + Gets the size of a wave buffer equivalent to the latency in milliseconds. + + The milliseconds. + + + + + Creates a WaveFormat with custom members + + The encoding + Sample Rate + Number of channels + Average Bytes Per Second + Block Align + Bits Per Sample + + + + + Creates an A-law wave format + + Sample Rate + Number of Channels + Wave Format + + + + Creates a Mu-law wave format + + Sample Rate + Number of Channels + Wave Format + + + + Creates a new PCM format with the specified sample rate, bit depth and channels + + + + + Creates a new 32 bit IEEE floating point wave format + + sample rate + number of channels + + + + Helper function to retrieve a WaveFormat structure from a pointer + + WaveFormat structure + + + + + Helper function to marshal WaveFormat to an IntPtr + + WaveFormat + IntPtr to WaveFormat structure (needs to be freed by callee) + + + + Reads in a WaveFormat (with extra data) from a fmt chunk (chunk identifier and + length should already have been read) + + Binary reader + Format chunk length + A WaveFormatExtraData + + + + Reads a new WaveFormat object from a stream + + A binary reader that wraps the stream + + + + Reports this WaveFormat as a string + + String describing the wave format + + + + Compares with another WaveFormat object + + Object to compare to + True if the objects are the same + + + + Provides a Hashcode for this WaveFormat + + A hashcode + + + + Writes this WaveFormat object to a stream + + the output stream + + + + Returns the encoding type used + + + + + Returns the number of channels (1=mono,2=stereo etc) + + + + + Returns the sample rate (samples per second) + + + + + Returns the average number of bytes used per second + + + + + Returns the block alignment + + + + + Returns the number of bits per sample (usually 16 or 32, sometimes 24 or 8) + Can be 0 for some codecs + + + + + Returns the number of extra bytes used by this waveformat. Often 0, + except for compressed formats which store extra data after the WAVEFORMATEX header + + + + + Creates a GSM 610 WaveFormat + For now hardcoded to 13kbps + + + + + Writes this structure to a BinaryWriter + + + + + Samples per block + + + + + IMA/DVI ADPCM Wave Format + Work in progress + + + + + parameterless constructor for Marshalling + + + + + Creates a new IMA / DVI ADPCM Wave Format + + Sample Rate + Number of channels + Bits Per Sample + + + + MP3 WaveFormat, MPEGLAYER3WAVEFORMAT from mmreg.h + + + + + Wave format ID (wID) + + + + + Padding flags (fdwFlags) + + + + + Block Size (nBlockSize) + + + + + Frames per block (nFramesPerBlock) + + + + + Codec Delay (nCodecDelay) + + + + + Creates a new MP3 WaveFormat + + + + + Wave Format Padding Flags + + + + + MPEGLAYER3_FLAG_PADDING_ISO + + + + + MPEGLAYER3_FLAG_PADDING_ON + + + + + MPEGLAYER3_FLAG_PADDING_OFF + + + + + Wave Format ID + + + + MPEGLAYER3_ID_UNKNOWN + + + MPEGLAYER3_ID_MPEG + + + MPEGLAYER3_ID_CONSTANTFRAMESIZE + + + + DSP Group TrueSpeech + + + + + DSP Group TrueSpeech WaveFormat + + + + + Writes this structure to a BinaryWriter + + + + + Microsoft ADPCM + See http://icculus.org/SDL_sound/downloads/external_documentation/wavecomp.htm + + + + + Empty constructor needed for marshalling from a pointer + + + + + Microsoft ADPCM + + Sample Rate + Channels + + + + Serializes this wave format + + Binary writer + + + + String Description of this WaveFormat + + + + + Samples per block + + + + + Number of coefficients + + + + + Coefficients + + + + + Custom marshaller for WaveFormat structures + + + + + Gets the instance of this marshaller + + + + + + + Clean up managed data + + + + + Clean up native data + + + + + + Get native data size + + + + + Marshal managed to native + + + + + Marshal Native to Managed + + + + + Summary description for WaveFormatEncoding. + + + + WAVE_FORMAT_UNKNOWN, Microsoft Corporation + + + WAVE_FORMAT_PCM Microsoft Corporation + + + WAVE_FORMAT_ADPCM Microsoft Corporation + + + WAVE_FORMAT_IEEE_FLOAT Microsoft Corporation + + + WAVE_FORMAT_VSELP Compaq Computer Corp. + + + WAVE_FORMAT_IBM_CVSD IBM Corporation + + + WAVE_FORMAT_ALAW Microsoft Corporation + + + WAVE_FORMAT_MULAW Microsoft Corporation + + + WAVE_FORMAT_DTS Microsoft Corporation + + + WAVE_FORMAT_DRM Microsoft Corporation + + + WAVE_FORMAT_WMAVOICE9 + + + WAVE_FORMAT_OKI_ADPCM OKI + + + WAVE_FORMAT_DVI_ADPCM Intel Corporation + + + WAVE_FORMAT_IMA_ADPCM Intel Corporation + + + WAVE_FORMAT_MEDIASPACE_ADPCM Videologic + + + WAVE_FORMAT_SIERRA_ADPCM Sierra Semiconductor Corp + + + WAVE_FORMAT_G723_ADPCM Antex Electronics Corporation + + + WAVE_FORMAT_DIGISTD DSP Solutions, Inc. + + + WAVE_FORMAT_DIGIFIX DSP Solutions, Inc. + + + WAVE_FORMAT_DIALOGIC_OKI_ADPCM Dialogic Corporation + + + WAVE_FORMAT_MEDIAVISION_ADPCM Media Vision, Inc. + + + WAVE_FORMAT_CU_CODEC Hewlett-Packard Company + + + WAVE_FORMAT_YAMAHA_ADPCM Yamaha Corporation of America + + + WAVE_FORMAT_SONARC Speech Compression + + + WAVE_FORMAT_DSPGROUP_TRUESPEECH DSP Group, Inc + + + WAVE_FORMAT_ECHOSC1 Echo Speech Corporation + + + WAVE_FORMAT_AUDIOFILE_AF36, Virtual Music, Inc. + + + WAVE_FORMAT_APTX Audio Processing Technology + + + WAVE_FORMAT_AUDIOFILE_AF10, Virtual Music, Inc. + + + WAVE_FORMAT_PROSODY_1612, Aculab plc + + + WAVE_FORMAT_LRC, Merging Technologies S.A. + + + WAVE_FORMAT_DOLBY_AC2, Dolby Laboratories + + + WAVE_FORMAT_GSM610, Microsoft Corporation + + + WAVE_FORMAT_MSNAUDIO, Microsoft Corporation + + + WAVE_FORMAT_ANTEX_ADPCME, Antex Electronics Corporation + + + WAVE_FORMAT_CONTROL_RES_VQLPC, Control Resources Limited + + + WAVE_FORMAT_DIGIREAL, DSP Solutions, Inc. + + + WAVE_FORMAT_DIGIADPCM, DSP Solutions, Inc. + + + WAVE_FORMAT_CONTROL_RES_CR10, Control Resources Limited + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + WAVE_FORMAT_MPEG, Microsoft Corporation + + + + + + + + + WAVE_FORMAT_MPEGLAYER3, ISO/MPEG Layer3 Format Tag + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + WAVE_FORMAT_GSM + + + WAVE_FORMAT_G729 + + + WAVE_FORMAT_G723 + + + WAVE_FORMAT_ACELP + + + + WAVE_FORMAT_RAW_AAC1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Windows Media Audio, WAVE_FORMAT_WMAUDIO2, Microsoft Corporation + + + + + Windows Media Audio Professional WAVE_FORMAT_WMAUDIO3, Microsoft Corporation + + + + + Windows Media Audio Lossless, WAVE_FORMAT_WMAUDIO_LOSSLESS + + + + + Windows Media Audio Professional over SPDIF WAVE_FORMAT_WMASPDIF (0x0164) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Advanced Audio Coding (AAC) audio in Audio Data Transport Stream (ADTS) format. + The format block is a WAVEFORMATEX structure with wFormatTag equal to WAVE_FORMAT_MPEG_ADTS_AAC. + + + The WAVEFORMATEX structure specifies the core AAC-LC sample rate and number of channels, + prior to applying spectral band replication (SBR) or parametric stereo (PS) tools, if present. + No additional data is required after the WAVEFORMATEX structure. + + http://msdn.microsoft.com/en-us/library/dd317599%28VS.85%29.aspx + + + + Source wmCodec.h + + + + MPEG-4 audio transport stream with a synchronization layer (LOAS) and a multiplex layer (LATM). + The format block is a WAVEFORMATEX structure with wFormatTag equal to WAVE_FORMAT_MPEG_LOAS. + + + The WAVEFORMATEX structure specifies the core AAC-LC sample rate and number of channels, + prior to applying spectral SBR or PS tools, if present. + No additional data is required after the WAVEFORMATEX structure. + + http://msdn.microsoft.com/en-us/library/dd317599%28VS.85%29.aspx + + + NOKIA_MPEG_ADTS_AAC + Source wmCodec.h + + + NOKIA_MPEG_RAW_AAC + Source wmCodec.h + + + VODAFONE_MPEG_ADTS_AAC + Source wmCodec.h + + + VODAFONE_MPEG_RAW_AAC + Source wmCodec.h + + + + High-Efficiency Advanced Audio Coding (HE-AAC) stream. + The format block is an HEAACWAVEFORMAT structure. + + http://msdn.microsoft.com/en-us/library/dd317599%28VS.85%29.aspx + + + WAVE_FORMAT_DVM + + + WAVE_FORMAT_VORBIS1 "Og" Original stream compatible + + + WAVE_FORMAT_VORBIS2 "Pg" Have independent header + + + WAVE_FORMAT_VORBIS3 "Qg" Have no codebook header + + + WAVE_FORMAT_VORBIS1P "og" Original stream compatible + + + WAVE_FORMAT_VORBIS2P "pg" Have independent headere + + + WAVE_FORMAT_VORBIS3P "qg" Have no codebook header + + + WAVE_FORMAT_EXTENSIBLE + + + + + + + WaveFormatExtensible + http://www.microsoft.com/whdc/device/audio/multichaud.mspx + + + + + Parameterless constructor for marshalling + + + + + Creates a new WaveFormatExtensible for PCM or IEEE + + + + + WaveFormatExtensible for PCM or floating point can be awkward to work with + This creates a regular WaveFormat structure representing the same audio format + + + + + + Serialize + + + + + + String representation + + + + + SubFormat (may be one of AudioMediaSubtypes) + + + + + This class used for marshalling from unmanaged code + + + + + parameterless constructor for marshalling + + + + + Reads this structure from a BinaryReader + + + + + Writes this structure to a BinaryWriter + + + + + Allows the extra data to be read + + + + + The WMA wave format. + May not be much use because WMA codec is a DirectShow DMO not an ACM + + + + + This class writes audio data to a .aif file on disk + + + + + Creates an Aiff file by reading all the data from a WaveProvider + BEWARE: the WaveProvider MUST return 0 from its Read method when it is finished, + or the Aiff File will grow indefinitely. + + The filename to use + The source WaveProvider + + + + AiffFileWriter that actually writes to a stream + + Stream to be written to + Wave format to use + + + + Creates a new AiffFileWriter + + The filename to write to + The Wave Format of the output data + + + + Read is not supported for a AiffFileWriter + + + + + Seek is not supported for a AiffFileWriter + + + + + SetLength is not supported for AiffFileWriter + + + + + + Appends bytes to the AiffFile (assumes they are already in the correct format) + + the buffer containing the wave data + the offset from which to start writing + the number of bytes to write + + + + Writes a single sample to the Aiff file + + the sample to write (assumed floating point with 1.0f as max value) + + + + Writes 32 bit floating point samples to the Aiff file + They will be converted to the appropriate bit depth depending on the WaveFormat of the AIF file + + The buffer containing the floating point samples + The offset from which to start writing + The number of floating point samples to write + + + + Writes 16 bit samples to the Aiff file + + The buffer containing the 16 bit samples + The offset from which to start writing + The number of 16 bit samples to write + + + + Ensures data is written to disk + + + + + Actually performs the close,making sure the header contains the correct data + + True if called from Dispose + + + + Updates the header with file size information + + + + + Finaliser - should only be called if the user forgot to close this AiffFileWriter + + + + + The aiff file name or null if not applicable + + + + + Number of bytes of audio in the data chunk + + + + + WaveFormat of this aiff file + + + + + Returns false: Cannot read from a AiffFileWriter + + + + + Returns true: Can write to a AiffFileWriter + + + + + Returns false: Cannot seek within a AiffFileWriter + + + + + Gets the Position in the AiffFile (i.e. number of bytes written so far) + + + + + Raised when ASIO data has been recorded. + It is important to handle this as quickly as possible as it is in the buffer callback + + + + + Initialises a new instance of AsioAudioAvailableEventArgs + + Pointers to the ASIO buffers for each channel + Pointers to the ASIO buffers for each channel + Number of samples in each buffer + Audio format within each buffer + + + + Converts all the recorded audio into a buffer of 32 bit floating point samples, interleaved by channel + + The samples as 32 bit floating point, interleaved + + + + Gets as interleaved samples, allocating a float array + + The samples as 32 bit floating point values + + + + Pointer to a buffer per input channel + + + + + Pointer to a buffer per output channel + Allows you to write directly to the output buffers + If you do so, set SamplesPerBuffer = true, + and make sure all buffers are written to with valid data + + + + + Set to true if you have written to the output buffers + If so, AsioOut will not read from its source + + + + + Number of samples in each buffer + + + + + Audio format within each buffer + Most commonly this will be one of, Int32LSB, Int16LSB, Int24LSB or Float32LSB + + + + + ASIO Out Player. New implementation using an internal C# binding. + + This implementation is only supporting Short16Bit and Float32Bit formats and is optimized + for 2 outputs channels . + SampleRate is supported only if ASIODriver is supporting it + + This implementation is probably the first ASIODriver binding fully implemented in C#! + + Original Contributor: Mark Heath + New Contributor to C# binding : Alexandre Mutel - email: alexandre_mutel at yahoo.fr + + + + + Represents the interface to a device that can play a WaveFile + + + + + Begin playback + + + + + Stop playback + + + + + Pause Playback + + + + + Initialise playback + + The waveprovider to be played + + + + Current playback state + + + + + The volume 1.0 is full scale + + + + + Indicates that playback has gone into a stopped state due to + reaching the end of the input stream or an error has been encountered during playback + + + + + Initializes a new instance of the class with the first + available ASIO Driver. + + + + + Initializes a new instance of the class with the driver name. + + Name of the device. + + + + Opens an ASIO output device + + Device number (zero based) + + + + Releases unmanaged resources and performs other cleanup operations before the + is reclaimed by garbage collection. + + + + + Dispose + + + + + Gets the names of the installed ASIO Driver. + + an array of driver names + + + + Determines whether ASIO is supported. + + + true if ASIO is supported; otherwise, false. + + + + + Inits the driver from the asio driver name. + + Name of the driver. + + + + Shows the control panel + + + + + Starts playback + + + + + Stops playback + + + + + Pauses playback + + + + + Initialises to play + + Source wave provider + + + + Initialises to play, with optional recording + + Source wave provider - set to null for record only + Number of channels to record + Specify sample rate here if only recording, ignored otherwise + + + + driver buffer update callback to fill the wave buffer. + + The input channels. + The output channels. + + + + Get the input channel name + + channel index (zero based) + channel name + + + + Get the output channel name + + channel index (zero based) + channel name + + + + Playback Stopped + + + + + When recording, fires whenever recorded audio is available + + + + + Gets the latency (in ms) of the playback driver + + + + + Playback State + + + + + Driver Name + + + + + The number of output channels we are currently using for playback + (Must be less than or equal to DriverOutputChannelCount) + + + + + The number of input channels we are currently recording from + (Must be less than or equal to DriverInputChannelCount) + + + + + The maximum number of input channels this ASIO driver supports + + + + + The maximum number of output channels this ASIO driver supports + + + + + By default the first channel on the input WaveProvider is sent to the first ASIO output. + This option sends it to the specified channel number. + Warning: make sure you don't set it higher than the number of available output channels - + the number of source channels. + n.b. Future NAudio may modify this + + + + + Input channel offset (used when recording), allowing you to choose to record from just one + specific input rather than them all + + + + + Sets the volume (1.0 is unity gain) + Not supported for ASIO Out. Set the volume on the input stream instead + + + + + A wave file writer that adds cue support + + + + + This class writes WAV data to a .wav file on disk + + + + + Creates a 16 bit Wave File from an ISampleProvider + BEWARE: the source provider must not return data indefinitely + + The filename to write to + The source sample provider + + + + Creates a Wave file by reading all the data from a WaveProvider + BEWARE: the WaveProvider MUST return 0 from its Read method when it is finished, + or the Wave File will grow indefinitely. + + The filename to use + The source WaveProvider + + + + WaveFileWriter that actually writes to a stream + + Stream to be written to + Wave format to use + + + + Creates a new WaveFileWriter + + The filename to write to + The Wave Format of the output data + + + + Read is not supported for a WaveFileWriter + + + + + Seek is not supported for a WaveFileWriter + + + + + SetLength is not supported for WaveFileWriter + + + + + + Appends bytes to the WaveFile (assumes they are already in the correct format) + + the buffer containing the wave data + the offset from which to start writing + the number of bytes to write + + + + Appends bytes to the WaveFile (assumes they are already in the correct format) + + the buffer containing the wave data + the offset from which to start writing + the number of bytes to write + + + + Writes a single sample to the Wave file + + the sample to write (assumed floating point with 1.0f as max value) + + + + Writes 32 bit floating point samples to the Wave file + They will be converted to the appropriate bit depth depending on the WaveFormat of the WAV file + + The buffer containing the floating point samples + The offset from which to start writing + The number of floating point samples to write + + + + Writes 16 bit samples to the Wave file + + The buffer containing the 16 bit samples + The offset from which to start writing + The number of 16 bit samples to write + + + + Writes 16 bit samples to the Wave file + + The buffer containing the 16 bit samples + The offset from which to start writing + The number of 16 bit samples to write + + + + Ensures data is written to disk + + + + + Actually performs the close,making sure the header contains the correct data + + True if called from Dispose + + + + Updates the header with file size information + + + + + Finaliser - should only be called if the user forgot to close this WaveFileWriter + + + + + The wave file name or null if not applicable + + + + + Number of bytes of audio in the data chunk + + + + + WaveFormat of this wave file + + + + + Returns false: Cannot read from a WaveFileWriter + + + + + Returns true: Can write to a WaveFileWriter + + + + + Returns false: Cannot seek within a WaveFileWriter + + + + + Gets the Position in the WaveFile (i.e. number of bytes written so far) + + + + + Writes a wave file, including a cues chunk + + + + + Adds a cue to the Wave file + + Sample position + Label text + + + + Updates the header, and writes the cues out + + + + + Media Foundation Encoder class allows you to use Media Foundation to encode an IWaveProvider + to any supported encoding format + + + + + Queries the available bitrates for a given encoding output type, sample rate and number of channels + + Audio subtype - a value from the AudioSubtypes class + The sample rate of the PCM to encode + The number of channels of the PCM to encode + An array of available bitrates in average bits per second + + + + Gets all the available media types for a particular + + Audio subtype - a value from the AudioSubtypes class + An array of available media types that can be encoded with this subtype + + + + Helper function to simplify encoding Window Media Audio + Should be supported on Vista and above (not tested) + + Input provider, must be PCM + Output file path, should end with .wma + Desired bitrate. Use GetEncodeBitrates to find the possibilities for your input type + + + + Helper function to simplify encoding to MP3 + By default, will only be available on Windows 8 and above + + Input provider, must be PCM + Output file path, should end with .mp3 + Desired bitrate. Use GetEncodeBitrates to find the possibilities for your input type + + + + Helper function to simplify encoding to AAC + By default, will only be available on Windows 7 and above + + Input provider, must be PCM + Output file path, should end with .mp4 (or .aac on Windows 8) + Desired bitrate. Use GetEncodeBitrates to find the possibilities for your input type + + + + Tries to find the encoding media type with the closest bitrate to that specified + + Audio subtype, a value from AudioSubtypes + Your encoder input format (used to check sample rate and channel count) + Your desired bitrate + The closest media type, or null if none available + + + + Creates a new encoder that encodes to the specified output media type + + Desired output media type + + + + Encodes a file + + Output filename (container type is deduced from the filename) + Input provider (should be PCM, some encoders will also allow IEEE float) + + + + Disposes this instance + + + + + + Disposes this instance + + + + + Finalizer + + + + + Media Type helper class, simplifying working with IMFMediaType + (will probably change in the future, to inherit from an attributes class) + Currently does not release the COM object, so you must do that yourself + + + + + Wraps an existing IMFMediaType object + + The IMFMediaType object + + + + Creates and wraps a new IMFMediaType object + + + + + Creates and wraps a new IMFMediaType object based on a WaveFormat + + WaveFormat + + + + Tries to get a UINT32 value, returning a default value if it doesn't exist + + Attribute key + Default value + Value or default if key doesn't exist + + + + The Sample Rate (valid for audio media types) + + + + + The number of Channels (valid for audio media types) + + + + + The number of bits per sample (n.b. not always valid for compressed audio types) + + + + + The average bytes per second (valid for audio media types) + + + + + The Media Subtype. For audio, is a value from the AudioSubtypes class + + + + + The Major type, e.g. audio or video (from the MediaTypes class) + + + + + Access to the actual IMFMediaType object + Use to pass to MF APIs or Marshal.ReleaseComObject when you are finished with it + + + + + Stopped Event Args + + + + + Initializes a new instance of StoppedEventArgs + + An exception to report (null if no exception) + + + + An exception. Will be null if the playback or record operation stopped + + + + + IWaveBuffer interface use to store wave datas. + Data can be manipulated with arrays (,, + , ) that are pointing to the same memory buffer. + This is a requirement for all subclasses. + + Use the associated Count property based on the type of buffer to get the number of data in the + buffer. + + for the standard implementation using C# unions. + + + + + Gets the byte buffer. + + The byte buffer. + + + + Gets the float buffer. + + The float buffer. + + + + Gets the short buffer. + + The short buffer. + + + + Gets the int buffer. + + The int buffer. + + + + Gets the max size in bytes of the byte buffer.. + + Maximum number of bytes in the buffer. + + + + Gets the byte buffer count. + + The byte buffer count. + + + + Gets the float buffer count. + + The float buffer count. + + + + Gets the short buffer count. + + The short buffer count. + + + + Gets the int buffer count. + + The int buffer count. + + + + Interface for IWavePlayers that can report position + + + + + Position (in terms of bytes played - does not necessarily) + + Position in bytes + + + + Gets a instance indicating the format the hardware is using. + + + + + NativeDirectSoundOut using DirectSound COM interop. + Contact author: Alexandre Mutel - alexandre_mutel at yahoo.fr + Modified by: Graham "Gee" Plumb + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + (40ms seems to work under Vista). + + The latency. + Selected device + + + + Releases unmanaged resources and performs other cleanup operations before the + is reclaimed by garbage collection. + + + + + Begin playback + + + + + Stop playback + + + + + Pause Playback + + + + + Gets the current position in bytes from the wave output device. + (n.b. this is not the same thing as the position within your reader + stream) + + Position in bytes + + + + Initialise playback + + The waveprovider to be played + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Determines whether the SecondaryBuffer is lost. + + + true if [is buffer lost]; otherwise, false. + + + + + Convert ms to bytes size according to WaveFormat + + The ms + number of byttes + + + + Processes the samples in a separate thread. + + + + + Stop playback + + + + + Feeds the SecondaryBuffer with the WaveStream + + number of bytes to feed + + + + Instanciate DirectSound from the DLL + + The GUID. + The direct sound. + The p unk outer. + + + + DirectSound default playback device GUID + + + + + DirectSound default capture device GUID + + + + + DirectSound default device for voice playback + + + + + DirectSound default device for voice capture + + + + + The DirectSoundEnumerate function enumerates the DirectSound drivers installed in the system. + + callback function + User context + + + + Gets the HANDLE of the desktop window. + + HANDLE of the Desktop window + + + + Playback Stopped + + + + + Gets the DirectSound output devices in the system + + + + + Gets the current position from the wave output device. + + + + + Current playback state + + + + + + The volume 1.0 is full scale + + + + + + IDirectSound interface + + + + + IDirectSoundBuffer interface + + + + + IDirectSoundNotify interface + + + + + The DSEnumCallback function is an application-defined callback function that enumerates the DirectSound drivers. + The system calls this function in response to the application's call to the DirectSoundEnumerate or DirectSoundCaptureEnumerate function. + + Address of the GUID that identifies the device being enumerated, or NULL for the primary device. This value can be passed to the DirectSoundCreate8 or DirectSoundCaptureCreate8 function to create a device object for that driver. + Address of a null-terminated string that provides a textual description of the DirectSound device. + Address of a null-terminated string that specifies the module name of the DirectSound driver corresponding to this device. + Address of application-defined data. This is the pointer passed to DirectSoundEnumerate or DirectSoundCaptureEnumerate as the lpContext parameter. + Returns TRUE to continue enumerating drivers, or FALSE to stop. + + + + Class for enumerating DirectSound devices + + + + + The device identifier + + + + + Device description + + + + + Device module name + + + + + Playback State + + + + + Stopped + + + + + Playing + + + + + Paused + + + + + Support for playback using Wasapi + + + + + WASAPI Out using default audio endpoint + + ShareMode - shared or exclusive + Desired latency in milliseconds + + + + WASAPI Out using default audio endpoint + + ShareMode - shared or exclusive + true if sync is done with event. false use sleep. + Desired latency in milliseconds + + + + Creates a new WASAPI Output + + Device to use + + true if sync is done with event. false use sleep. + + + + + Gets the current position in bytes from the wave output device. + (n.b. this is not the same thing as the position within your reader + stream) + + Position in bytes + + + + Begin Playback + + + + + Stop playback and flush buffers + + + + + Stop playback without flushing buffers + + + + + Initialize for playing the specified wave stream + + IWaveProvider to play + + + + Dispose + + + + + Playback Stopped + + + + + Gets a instance indicating the format the hardware is using. + + + + + Playback State + + + + + Volume + + + + + WaveBuffer class use to store wave datas. Data can be manipulated with arrays + (,,, ) that are pointing to the + same memory buffer. Use the associated Count property based on the type of buffer to get the number of + data in the buffer. + Implicit casting is now supported to float[], byte[], int[], short[]. + You must not use Length on returned arrays. + + n.b. FieldOffset is 8 now to allow it to work natively on 64 bit + + + + + Number of Bytes + + + + + Initializes a new instance of the class. + + The number of bytes. The size of the final buffer will be aligned on 4 Bytes (upper bound) + + + + Initializes a new instance of the class binded to a specific byte buffer. + + A byte buffer to bound the WaveBuffer to. + + + + Binds this WaveBuffer instance to a specific byte buffer. + + A byte buffer to bound the WaveBuffer to. + + + + Performs an implicit conversion from to . + + The wave buffer. + The result of the conversion. + + + + Performs an implicit conversion from to . + + The wave buffer. + The result of the conversion. + + + + Performs an implicit conversion from to . + + The wave buffer. + The result of the conversion. + + + + Performs an implicit conversion from to . + + The wave buffer. + The result of the conversion. + + + + Clears the associated buffer. + + + + + Copy this WaveBuffer to a destination buffer up to ByteBufferCount bytes. + + + + + Checks the validity of the count parameters. + + Name of the arg. + The value. + The size of value. + + + + Gets the byte buffer. + + The byte buffer. + + + + Gets the float buffer. + + The float buffer. + + + + Gets the short buffer. + + The short buffer. + + + + Gets the int buffer. + + The int buffer. + + + + Gets the max size in bytes of the byte buffer.. + + Maximum number of bytes in the buffer. + + + + Gets or sets the byte buffer count. + + The byte buffer count. + + + + Gets or sets the float buffer count. + + The float buffer count. + + + + Gets or sets the short buffer count. + + The short buffer count. + + + + Gets or sets the int buffer count. + + The int buffer count. + + + + Wave Callback Info + + + + + Sets up a new WaveCallbackInfo for function callbacks + + + + + Sets up a new WaveCallbackInfo to use a New Window + IMPORTANT: only use this on the GUI thread + + + + + Sets up a new WaveCallbackInfo to use an existing window + IMPORTANT: only use this on the GUI thread + + + + + Callback Strategy + + + + + Window Handle (if applicable) + + + + + Wave Callback Strategy + + + + + Use a function + + + + + Create a new window (should only be done if on GUI thread) + + + + + Use an existing window handle + + + + + Use an event handle + + + + + Represents a wave out device + + + + + Retrieves the capabilities of a waveOut device + + Device to test + The WaveOut device capabilities + + + + Creates a default WaveOut device + Will use window callbacks if called from a GUI thread, otherwise function + callbacks + + + + + Creates a WaveOut device using the specified window handle for callbacks + + A valid window handle + + + + Opens a WaveOut device + + + + + Initialises the WaveOut device + + WaveProvider to play + + + + Start playing the audio from the WaveStream + + + + + Pause the audio + + + + + Resume playing after a pause from the same position + + + + + Stop and reset the WaveOut device + + + + + Gets the current position in bytes from the wave output device. + (n.b. this is not the same thing as the position within your reader + stream - it calls directly into waveOutGetPosition) + + Position in bytes + + + + Closes this WaveOut device + + + + + Closes the WaveOut device and disposes of buffers + + True if called from Dispose + + + + Finalizer. Only called when user forgets to call Dispose + + + + + Indicates playback has stopped automatically + + + + + Returns the number of Wave Out devices available in the system + + + + + Gets or sets the desired latency in milliseconds + Should be set before a call to Init + + + + + Gets or sets the number of buffers used + Should be set before a call to Init + + + + + Gets or sets the device number + Should be set before a call to Init + This must be between 0 and DeviceCount - 1. + + + + + Gets a instance indicating the format the hardware is using. + + + + + Playback State + + + + + Volume for this device 1.0 is full scale + + + + + Alternative WaveOut class, making use of the Event callback + + + + + Opens a WaveOut device + + + + + Initialises the WaveOut device + + WaveProvider to play + + + + Start playing the audio from the WaveStream + + + + + Pause the audio + + + + + Resume playing after a pause from the same position + + + + + Stop and reset the WaveOut device + + + + + Gets the current position in bytes from the wave output device. + (n.b. this is not the same thing as the position within your reader + stream - it calls directly into waveOutGetPosition) + + Position in bytes + + + + Closes this WaveOut device + + + + + Closes the WaveOut device and disposes of buffers + + True if called from Dispose + + + + Finalizer. Only called when user forgets to call Dispose + + + + + Indicates playback has stopped automatically + + + + + Gets or sets the desired latency in milliseconds + Should be set before a call to Init + + + + + Gets or sets the number of buffers used + Should be set before a call to Init + + + + + Gets or sets the device number + Should be set before a call to Init + This must be between 0 and DeviceCount - 1. + + + + + Gets a instance indicating the format the hardware is using. + + + + + Playback State + + + + + Obsolete property + + + + + Simple SampleProvider that passes through audio unchanged and raises + an event every n samples with the maximum sample value from the period + for metering purposes + + + + + Initialises a new instance of MeteringSampleProvider that raises 10 stream volume + events per second + + Source sample provider + + + + Initialises a new instance of MeteringSampleProvider + + source sampler provider + Number of samples between notifications + + + + Reads samples from this Sample Provider + + Sample buffer + Offset into sample buffer + Number of samples required + Number of samples read + + + + Number of Samples per notification + + + + + Raised periodically to inform the user of the max volume + + + + + The WaveFormat of this sample provider + + + + + Event args for aggregated stream volume + + + + + Max sample values array (one for each channel) + + + + + Simple class that raises an event on every sample + + + + + An interface for WaveStreams which can report notification of individual samples + + + + + A sample has been detected + + + + + Initializes a new instance of NotifyingSampleProvider + + Source Sample Provider + + + + Reads samples from this sample provider + + Sample buffer + Offset into sample buffer + Number of samples desired + Number of samples read + + + + WaveFormat + + + + + Sample notifier + + + + + Very simple sample provider supporting adjustable gain + + + + + Initializes a new instance of VolumeSampleProvider + + Source Sample Provider + + + + Reads samples from this sample provider + + Sample buffer + Offset into sample buffer + Number of samples desired + Number of samples read + + + + WaveFormat + + + + + Allows adjusting the volume, 1.0f = full volume + + + + + Helper class for when you need to convert back to an IWaveProvider from + an ISampleProvider. Keeps it as IEEE float + + + + + Initializes a new instance of the WaveProviderFloatToWaveProvider class + + Source wave provider + + + + Reads from this provider + + + + + The waveformat of this WaveProvider (same as the source) + + + + + Provides a buffered store of samples + Read method will return queued samples or fill buffer with zeroes + Now backed by a circular buffer + + + + + Creates a new buffered WaveProvider + + WaveFormat + + + + Adds samples. Takes a copy of buffer, so that buffer can be reused if necessary + + + + + Reads from this WaveProvider + Will always return count bytes, since we will zero-fill the buffer if not enough available + + + + + Discards all audio from the buffer + + + + + Buffer length in bytes + + + + + Buffer duration + + + + + If true, when the buffer is full, start throwing away data + if false, AddSamples will throw an exception when buffer is full + + + + + The number of buffered bytes + + + + + Buffered Duration + + + + + Gets the WaveFormat + + + + + No nonsense mono to stereo provider, no volume adjustment, + just copies input to left and right. + + + + + Initializes a new instance of MonoToStereoSampleProvider + + Source sample provider + + + + Reads samples from this provider + + Sample buffer + Offset into sample buffer + Number of samples required + Number of samples read + + + + WaveFormat of this provider + + + + + The Media Foundation Resampler Transform + + + + + An abstract base class for simplifying working with Media Foundation Transforms + You need to override the method that actually creates and configures the transform + + + + + The Source Provider + + + + + The Output WaveFormat + + + + + Constructs a new MediaFoundationTransform wrapper + Will read one second at a time + + The source provider for input data to the transform + The desired output format + + + + To be implemented by overriding classes. Create the transform object, set up its input and output types, + and configure any custom properties in here + + An object implementing IMFTrasform + + + + Disposes this MediaFoundation transform + + + + + Disposes this Media Foundation Transform + + + + + Destructor + + + + + Reads data out of the source, passing it through the transform + + Output buffer + Offset within buffer to write to + Desired byte count + Number of bytes read + + + + Attempts to read from the transform + Some useful info here: + http://msdn.microsoft.com/en-gb/library/windows/desktop/aa965264%28v=vs.85%29.aspx#process_data + + + + + + Indicate that the source has been repositioned and completely drain out the transforms buffers + + + + + The output WaveFormat of this Media Foundation Transform + + + + + Creates the Media Foundation Resampler, allowing modifying of sample rate, bit depth and channel count + + Source provider, must be PCM + Output format, must also be PCM + + + + Creates a resampler with a specified target output sample rate + + Source provider + Output sample rate + + + + Creates and configures the actual Resampler transform + + A newly created and configured resampler MFT + + + + Disposes this resampler + + + + + Gets or sets the Resampler quality. n.b. set the quality before starting to resample. + 1 is lowest quality (linear interpolation) and 60 is best quality + + + + + WaveProvider that can mix together multiple 32 bit floating point input provider + All channels must have the same number of inputs and same sample rate + n.b. Work in Progress - not tested yet + + + + + Creates a new MixingWaveProvider32 + + + + + Creates a new 32 bit MixingWaveProvider32 + + inputs - must all have the same format. + Thrown if the input streams are not 32 bit floating point, + or if they have different formats to each other + + + + Add a new input to the mixer + + The wave input to add + + + + Remove an input from the mixer + + waveProvider to remove + + + + Reads bytes from this wave stream + + buffer to read into + offset into buffer + number of bytes required + Number of bytes read. + Thrown if an invalid number of bytes requested + + + + Actually performs the mixing + + + + + The number of inputs to this mixer + + + + + + + + + + Allows any number of inputs to be patched to outputs + Uses could include swapping left and right channels, turning mono into stereo, + feeding different input sources to different soundcard outputs etc + + + + + Creates a multiplexing wave provider, allowing re-patching of input channels to different + output channels + + Input wave providers. Must all be of the same format, but can have any number of channels + Desired number of output channels. + + + + persistent temporary buffer to prevent creating work for garbage collector + + + + + Reads data from this WaveProvider + + Buffer to be filled with sample data + Offset to write to within buffer, usually 0 + Number of bytes required + Number of bytes read + + + + Connects a specified input channel to an output channel + + Input Channel index (zero based). Must be less than InputChannelCount + Output Channel index (zero based). Must be less than OutputChannelCount + + + + The WaveFormat of this WaveProvider + + + + + The number of input channels. Note that this is not the same as the number of input wave providers. If you pass in + one stereo and one mono input provider, the number of input channels is three. + + + + + The number of output channels, as specified in the constructor. + + + + + Takes a stereo 16 bit input and turns it mono, allowing you to select left or right channel only or mix them together + + + + + Creates a new mono waveprovider based on a stereo input + + Stereo 16 bit PCM input + + + + Reads bytes from this WaveProvider + + + + + 1.0 to mix the mono source entirely to the left channel + + + + + 1.0 to mix the mono source entirely to the right channel + + + + + Output Wave Format + + + + + Converts from mono to stereo, allowing freedom to route all, some, or none of the incoming signal to left or right channels + + + + + Creates a new stereo waveprovider based on a mono input + + Mono 16 bit PCM input + + + + Reads bytes from this WaveProvider + + + + + 1.0 to copy the mono stream to the left channel without adjusting volume + + + + + 1.0 to copy the mono stream to the right channel without adjusting volume + + + + + Output Wave Format + + + + + Helper class allowing us to modify the volume of a 16 bit stream without converting to IEEE float + + + + + Constructs a new VolumeWaveProvider16 + + Source provider, must be 16 bit PCM + + + + Read bytes from this WaveProvider + + Buffer to read into + Offset within buffer to read to + Bytes desired + Bytes read + + + + Gets or sets volume. + 1.0 is full scale, 0.0 is silence, anything over 1.0 will amplify but potentially clip + + + + + WaveFormat of this WaveProvider + + + + + Converts IEEE float to 16 bit PCM, optionally clipping and adjusting volume along the way + + + + + Creates a new WaveFloatTo16Provider + + the source provider + + + + Reads bytes from this wave stream + + The destination buffer + Offset into the destination buffer + Number of bytes read + Number of bytes read. + + + + + + + + + Volume of this channel. 1.0 = full scale + + + + + Converts 16 bit PCM to IEEE float, optionally adjusting volume along the way + + + + + Creates a new Wave16toFloatProvider + + the source provider + + + + Reads bytes from this wave stream + + The destination buffer + Offset into the destination buffer + Number of bytes read + Number of bytes read. + + + + + + + + + Volume of this channel. 1.0 = full scale + + + + + Buffered WaveProvider taking source data from WaveIn + + + + + Creates a new WaveInProvider + n.b. Should make sure the WaveFormat is set correctly on IWaveIn before calling + + The source of wave data + + + + Reads data from the WaveInProvider + + + + + The WaveFormat + + + + + Base class for creating a 16 bit wave provider + + + + + Initializes a new instance of the WaveProvider16 class + defaulting to 44.1kHz mono + + + + + Initializes a new instance of the WaveProvider16 class with the specified + sample rate and number of channels + + + + + Allows you to specify the sample rate and channels for this WaveProvider + (should be initialised before you pass it to a wave player) + + + + + Implements the Read method of IWaveProvider by delegating to the abstract + Read method taking a short array + + + + + Method to override in derived classes + Supply the requested number of samples into the buffer + + + + + The Wave Format + + + + + Base class for creating a 32 bit floating point wave provider + Can also be used as a base class for an ISampleProvider that can + be plugged straight into anything requiring an IWaveProvider + + + + + Initializes a new instance of the WaveProvider32 class + defaulting to 44.1kHz mono + + + + + Initializes a new instance of the WaveProvider32 class with the specified + sample rate and number of channels + + + + + Allows you to specify the sample rate and channels for this WaveProvider + (should be initialised before you pass it to a wave player) + + + + + Implements the Read method of IWaveProvider by delegating to the abstract + Read method taking a float array + + + + + Method to override in derived classes + Supply the requested number of samples into the buffer + + + + + The Wave Format + + + + + Helper class turning an already 32 bit floating point IWaveProvider + into an ISampleProvider - hopefully not needed for most applications + + + + + Initializes a new instance of the WaveToSampleProvider class + + Source wave provider, must be IEEE float + + + + Reads from this provider + + + + + Utility class to intercept audio from an IWaveProvider and + save it to disk + + + + + Constructs a new WaveRecorder + + The location to write the WAV file to + The Source Wave Provider + + + + Read simply returns what the source returns, but writes to disk along the way + + + + + Closes the WAV file + + + + + The WaveFormat + + + + A read-only stream of AIFF data based on an aiff file + with an associated WaveFormat + originally contributed to NAudio by Giawa + + + + + Base class for all WaveStream classes. Derives from stream. + + + + + Flush does not need to do anything + See + + + + + An alternative way of repositioning. + See + + + + + Sets the length of the WaveStream. Not Supported. + + + + + + Writes to the WaveStream. Not Supported. + + + + + Moves forward or backwards the specified number of seconds in the stream + + Number of seconds to move, can be negative + + + + Whether the WaveStream has non-zero sample data at the current position for the + specified count + + Number of bytes to read + + + + Retrieves the WaveFormat for this stream + + + + + We can read from this stream + + + + + We can seek within this stream + + + + + We can't write to this stream + + + + + The block alignment for this wavestream. Do not modify the Position + to anything that is not a whole multiple of this value + + + + + The current position in the stream in Time format + + + + + Total length in real-time of the stream (may be an estimate for compressed files) + + + + Supports opening a AIF file + The AIF is of similar nastiness to the WAV format. + This supports basic reading of uncompressed PCM AIF files, + with 8, 16, 24 and 32 bit PCM data. + + + + + Creates an Aiff File Reader based on an input stream + + The input stream containing a AIF file including header + + + + Ensures valid AIFF header and then finds data offset. + + The stream, positioned at the start of audio data + The format found + The position of the data chunk + The length of the data chunk + Additional chunks found + + + + Cleans up the resources associated with this AiffFileReader + + + + + Reads bytes from the AIFF File + + + + + + + + + + + + + + + + Number of Samples (if possible to calculate) + + + + + Position in the AIFF file + + + + + + AIFF Chunk + + + + + Chunk Name + + + + + Chunk Length + + + + + Chunk start + + + + + Creates a new AIFF Chunk + + + + + AudioFileReader simplifies opening an audio file in NAudio + Simply pass in the filename, and it will attempt to open the + file and set up a conversion path that turns into PCM IEEE float. + ACM codecs will be used for conversion. + It provides a volume property and implements both WaveStream and + ISampleProvider, making it possibly the only stage in your audio + pipeline necessary for simple playback scenarios + + + + + Initializes a new instance of AudioFileReader + + The file to open + + + + Creates the reader stream, supporting all filetypes in the core NAudio library, + and ensuring we are in PCM format + + File Name + + + + Reads from this wave stream + + Audio buffer + Offset into buffer + Number of bytes required + Number of bytes read + + + + Reads audio from this sample provider + + Sample buffer + Offset into sample buffer + Number of samples required + Number of samples read + + + + Helper to convert source to dest bytes + + + + + Helper to convert dest to source bytes + + + + + Disposes this AudioFileReader + + True if called from Dispose + + + + WaveFormat of this stream + + + + + Length of this stream (in bytes) + + + + + Position of this stream (in bytes) + + + + + Gets or Sets the Volume of this AudioFileReader. 1.0f is full volume + + + + + Helper stream that lets us read from compressed audio files with large block alignment + as though we could read any amount and reposition anywhere + + + + + Creates a new BlockAlignReductionStream + + the input stream + + + + Disposes this WaveStream + + + + + Reads data from this stream + + + + + + + + + Block alignment of this stream + + + + + Wave Format + + + + + Length of this Stream + + + + + Current position within stream + + + + + Holds information on a cue: a labeled position within a Wave file + + + + + Creates a Cue based on a sample position and label + + + + + + + Cue position in samples + + + + + Label of the cue + + + + + Holds a list of cues + + + The specs for reading and writing cues from the cue and list RIFF chunks + are from http://www.sonicspot.com/guide/wavefiles.html and http://www.wotsit.org/ + ------------------------------ + The cues are stored like this: + ------------------------------ + struct CuePoint + { + Int32 dwIdentifier; + Int32 dwPosition; + Int32 fccChunk; + Int32 dwChunkStart; + Int32 dwBlockStart; + Int32 dwSampleOffset; + } + + struct CueChunk + { + Int32 chunkID; + Int32 chunkSize; + Int32 dwCuePoints; + CuePoint[] points; + } + ------------------------------ + Labels look like this: + ------------------------------ + struct ListHeader + { + Int32 listID; /* 'list' */ + Int32 chunkSize; /* includes the Type ID below */ + Int32 typeID; /* 'adtl' */ + } + + struct LabelChunk + { + Int32 chunkID; + Int32 chunkSize; + Int32 dwIdentifier; + Char[] dwText; /* Encoded with extended ASCII */ + } LabelChunk; + + + + + Creates an empty cue list + + + + + Adds an item to the list + + Cue + + + + Creates a cue list from the cue RIFF chunk and the list RIFF chunk + + The data contained in the cue chunk + The data contained in the list chunk + + + + Gets the cues as the concatenated cue and list RIFF chunks. + + RIFF chunks containing the cue data + + + + Checks if the cue and list chunks exist and if so, creates a cue list + + + + + Gets sample positions for the embedded cues + + Array containing the cue positions + + + + Gets labels for the embedded cues + + Array containing the labels + + + + Number of cues + + + + + Accesses the cue at the specified index + + + + + + + A wave file reader supporting cue reading + + + + This class supports the reading of WAV files, + providing a repositionable WaveStream that returns the raw data + contained in the WAV file + + + + Supports opening a WAV file + The WAV file format is a real mess, but we will only + support the basic WAV file format which actually covers the vast + majority of WAV files out there. For more WAV file format information + visit www.wotsit.org. If you have a WAV file that can't be read by + this class, email it to the NAudio project and we will probably + fix this reader to support it + + + + + Creates a Wave File Reader based on an input stream + + The input stream containing a WAV file including header + + + + Gets the data for the specified chunk + + + + + Cleans up the resources associated with this WaveFileReader + + + + + Reads bytes from the Wave File + + + + + + Attempts to read the next sample or group of samples as floating point normalised into the range -1.0f to 1.0f + + An array of samples, 1 for mono, 2 for stereo etc. Null indicates end of file reached + + + + + Attempts to read a sample into a float. n.b. only applicable for uncompressed formats + Will normalise the value read into the range -1.0f to 1.0f if it comes from a PCM encoding + + False if the end of the WAV data chunk was reached + + + + Gets a list of the additional chunks found in this file + + + + + + + + + + This is the length of audio data contained in this WAV file, in bytes + (i.e. the byte length of the data chunk, not the length of the WAV file itself) + + + + + + Number of Samples (if possible to calculate) + This currently does not take into account number of channels, so + divide again by number of channels if you want the number of + audio 'frames' + + + + + Position in the WAV data chunk. + + + + + + Loads a wavefile and supports reading cues + + + + + + Cue List (can be null if cues not present) + + + + + Sample event arguments + + + + + Constructor + + + + + Left sample + + + + + Right sample + + + + + Class for reading any file that Media Foundation can play + Will only work in Windows Vista and above + Automatically converts to PCM + If it is a video file with multiple audio streams, it will pick out the first audio stream + + + + + Creates a new MediaFoundationReader based on the supplied file + + Filename (can also be a URL e.g. http:// mms:// file://) + + + + Creates a new MediaFoundationReader based on the supplied file + + Filename + Advanced settings + + + + Creates the reader (overridable by ) + + + + + Reads from this wave stream + + Buffer to read into + Offset in buffer + Bytes required + Number of bytes read; 0 indicates end of stream + + + + Cleans up after finishing with this reader + + true if called from Dispose + + + + WaveFormat of this stream (n.b. this is after converting to PCM) + + + + + The bytesRequired of this stream in bytes (n.b may not be accurate) + + + + + Current position within this stream + + + + + WaveFormat has changed + + + + + Allows customisation of this reader class + + + + + Sets up the default settings for MediaFoundationReader + + + + + Allows us to request IEEE float output (n.b. no guarantee this will be accepted) + + + + + If true, the reader object created in the constructor is used in Read + Should only be set to true if you are working entirely on an STA thread, or + entirely with MTA threads. + + + + + If true, the reposition does not happen immediately, but waits until the + next call to read to be processed. + + + + + Class for reading from MP3 files + + + + Supports opening a MP3 file + + + Supports opening a MP3 file + MP3 File name + Factory method to build a frame decompressor + + + + Opens MP3 from a stream rather than a file + Will not dispose of this stream itself + + The incoming stream containing MP3 data + + + + Opens MP3 from a stream rather than a file + Will not dispose of this stream itself + + The incoming stream containing MP3 data + Factory method to build a frame decompressor + + + + Creates an ACM MP3 Frame decompressor. This is the default with NAudio + + A WaveFormat object based + + + + + Gets the total length of this file in milliseconds. + + + + + Reads the next mp3 frame + + Next mp3 frame, or null if EOF + + + + Reads the next mp3 frame + + Next mp3 frame, or null if EOF + + + + Reads decompressed PCM data from our MP3 file. + + + + + Disposes this WaveStream + + + + + The MP3 wave format (n.b. NOT the output format of this stream - see the WaveFormat property) + + + + + ID3v2 tag if present + + + + + ID3v1 tag if present + + + + + This is the length in bytes of data available to be read out from the Read method + (i.e. the decompressed MP3 length) + n.b. this may return 0 for files whose length is unknown + + + + + + + + + + + + + + + Xing header if present + + + + + Function that can create an MP3 Frame decompressor + + A WaveFormat object describing the MP3 file format + An MP3 Frame decompressor + + + + Converts an IWaveProvider containing 16 bit PCM to an + ISampleProvider + + + + + Initialises a new instance of Pcm16BitToSampleProvider + + Source wave provider + + + + Reads samples from this sample provider + + Sample buffer + Offset into sample buffer + Samples required + Number of samples read + + + + Converts an IWaveProvider containing 24 bit PCM to an + ISampleProvider + + + + + Initialises a new instance of Pcm24BitToSampleProvider + + Source Wave Provider + + + + Reads floating point samples from this sample provider + + sample buffer + offset within sample buffer to write to + number of samples required + number of samples provided + + + + Converts an IWaveProvider containing 8 bit PCM to an + ISampleProvider + + + + + Initialises a new instance of Pcm8BitToSampleProvider + + Source wave provider + + + + Reads samples from this sample provider + + Sample buffer + Offset into sample buffer + Number of samples to read + Number of samples read + + + + WaveStream that simply passes on data from its source stream + (e.g. a MemoryStream) + + + + + Initialises a new instance of RawSourceWaveStream + + The source stream containing raw audio + The waveformat of the audio in the source stream + + + + Reads data from the stream + + + + + The WaveFormat of this stream + + + + + The length in bytes of this stream (if supported) + + + + + The current position in this stream + + + + + Wave Stream for converting between sample rates + + + + + WaveStream to resample using the DMO Resampler + + Input Stream + Desired Output Format + + + + Reads data from input stream + + buffer + offset into buffer + Bytes required + Number of bytes read + + + + Dispose + + True if disposing (not from finalizer) + + + + Stream Wave Format + + + + + Stream length in bytes + + + + + Stream position in bytes + + + + + Holds information about a RIFF file chunk + + + + + Creates a RiffChunk object + + + + + The chunk identifier + + + + + The chunk identifier converted to a string + + + + + The chunk length + + + + + The stream position this chunk is located at + + + + + A simple compressor + + + + + Create a new simple compressor stream + + Source stream + + + + Determine whether the stream has the required amount of data. + + Number of bytes of data required from the stream. + Flag indicating whether the required amount of data is avialable. + + + + Reads bytes from this stream + + Buffer to read into + Offset in array to read into + Number of bytes to read + Number of bytes read + + + + Disposes this stream + + true if the user called this + + + + Make-up Gain + + + + + Threshold + + + + + Ratio + + + + + Attack time + + + + + Release time + + + + + Turns gain on or off + + + + + Returns the stream length + + + + + Gets or sets the current position in the stream + + + + + Gets the WaveFormat of this stream + + + + + Gets the block alignment for this stream + + + + + WaveStream that converts 32 bit audio back down to 16 bit, clipping if necessary + + + + + Creates a new Wave32To16Stream + + the source stream + + + + Reads bytes from this wave stream + + Destination buffer + Offset into destination buffer + + Number of bytes read. + + + + Conversion to 16 bit and clipping + + + + + Disposes this WaveStream + + + + + Sets the volume for this stream. 1.0f is full scale + + + + + + + + + + Returns the stream length + + + + + Gets or sets the current position in the stream + + + + + + + + + + Clip indicator. Can be reset. + + + + + Represents Channel for the WaveMixerStream + 32 bit output and 16 bit input + It's output is always stereo + The input stream can be panned + + + + + Creates a new WaveChannel32 + + the source stream + stream volume (1 is 0dB) + pan control (-1 to 1) + + + + Creates a WaveChannel32 with default settings + + The source stream + + + + Reads bytes from this wave stream + + The destination buffer + Offset into the destination buffer + Number of bytes read + Number of bytes read. + + + + Determines whether this channel has any data to play + to allow optimisation to not read, but bump position forward + + + + + Disposes this WaveStream + + + + + Raise the sample event (no check for null because it has already been done) + + + + + Gets the block alignment for this WaveStream + + + + + Returns the stream length + + + + + Gets or sets the current position in the stream + + + + + If true, Read always returns the number of bytes requested + + + + + + + + + + Volume of this channel. 1.0 = full scale + + + + + Pan of this channel (from -1 to 1) + + + + + Sample + + + + + Utility class that takes an IWaveProvider input at any bit depth + and exposes it as an ISampleProvider. Can turn mono inputs into stereo, + and allows adjusting of volume + (The eventual successor to WaveChannel32) + This class also serves as an example of how you can link together several simple + Sample Providers to form a more useful class. + + + + + Initialises a new instance of SampleChannel + + Source wave provider, must be PCM or IEEE + + + + Initialises a new instance of SampleChannel + + Source wave provider, must be PCM or IEEE + force mono inputs to become stereo + + + + Reads samples from this sample provider + + Sample buffer + Offset into sample buffer + Number of samples desired + Number of samples read + + + + The WaveFormat of this Sample Provider + + + + + Allows adjusting the volume, 1.0f = full volume + + + + + Raised periodically to inform the user of the max volume + (before the volume meter) + + + + + WaveStream that passes through an ACM Codec + + + + + Creates a stream that can convert to PCM + + The source stream + A PCM stream + + + + Create a new WaveFormat conversion stream + + Desired output format + Source stream + + + + Converts source bytes to destination bytes + + + + + Converts destination bytes to source bytes + + + + + Reads bytes from this stream + + Buffer to read into + Offset in buffer to read into + Number of bytes to read + Number of bytes read + + + + Disposes this stream + + true if the user called this + + + + Returns the stream length + + + + + Gets or sets the current position in the stream + + + + + Gets the WaveFormat of this stream + + + + + A buffer of Wave samples + + + + + creates a new wavebuffer + + WaveIn device to write to + Buffer size in bytes + + + + Place this buffer back to record more audio + + + + + Finalizer for this wave buffer + + + + + Releases resources held by this WaveBuffer + + + + + Releases resources held by this WaveBuffer + + + + + Provides access to the actual record buffer (for reading only) + + + + + Indicates whether the Done flag is set on this buffer + + + + + Indicates whether the InQueue flag is set on this buffer + + + + + Number of bytes recorded + + + + + The buffer size in bytes + + + + + WaveStream that can mix together multiple 32 bit input streams + (Normally used with stereo input channels) + All channels must have the same number of inputs + + + + + Creates a new 32 bit WaveMixerStream + + + + + Creates a new 32 bit WaveMixerStream + + An Array of WaveStreams - must all have the same format. + Use WaveChannel is designed for this purpose. + Automatically stop when all inputs have been read + Thrown if the input streams are not 32 bit floating point, + or if they have different formats to each other + + + + Add a new input to the mixer + + The wave input to add + + + + Remove a WaveStream from the mixer + + waveStream to remove + + + + Reads bytes from this wave stream + + buffer to read into + offset into buffer + number of bytes required + Number of bytes read. + Thrown if an invalid number of bytes requested + + + + Actually performs the mixing + + + + + Disposes this WaveStream + + + + + The number of inputs to this mixer + + + + + Automatically stop when all inputs have been read + + + + + + + + + + Length of this Wave Stream (in bytes) + + + + + + Position within this Wave Stream (in bytes) + + + + + + + + + + + Simply shifts the input stream in time, optionally + clipping its start and end. + (n.b. may include looping in the future) + + + + + Creates a new WaveOffsetStream + + the source stream + the time at which we should start reading from the source stream + amount to trim off the front of the source stream + length of time to play from source stream + + + + Creates a WaveOffsetStream with default settings (no offset or pre-delay, + and whole length of source stream) + + The source stream + + + + Reads bytes from this wave stream + + The destination buffer + Offset into the destination buffer + Number of bytes read + Number of bytes read. + + + + Determines whether this channel has any data to play + to allow optimisation to not read, but bump position forward + + + + + Disposes this WaveStream + + + + + The length of time before which no audio will be played + + + + + An offset into the source stream from which to start playing + + + + + Length of time to read from the source stream + + + + + Gets the block alignment for this WaveStream + + + + + Returns the stream length + + + + + Gets or sets the current position in the stream + + + + + + + + + + A buffer of Wave samples for streaming to a Wave Output device + + + + + creates a new wavebuffer + + WaveOut device to write to + Buffer size in bytes + Stream to provide more data + Lock to protect WaveOut API's from being called on >1 thread + + + + Finalizer for this wave buffer + + + + + Releases resources held by this WaveBuffer + + + + + Releases resources held by this WaveBuffer + + + + this is called by the WAVE callback and should be used to refill the buffer + + + + Whether the header's in queue flag is set + + + + + The buffer size in bytes + + + + + DMO Input Data Buffer Flags + + + + + None + + + + + DMO_INPUT_DATA_BUFFERF_SYNCPOINT + + + + + DMO_INPUT_DATA_BUFFERF_TIME + + + + + DMO_INPUT_DATA_BUFFERF_TIMELENGTH + + + + + http://msdn.microsoft.com/en-us/library/aa929922.aspx + DMO_MEDIA_TYPE + + + + + Gets the structure as a Wave format (if it is one) + + + + + Sets this object up to point to a wave format + + Wave format structure + + + + Major type + + + + + Major type name + + + + + Subtype + + + + + Subtype name + + + + + Fixed size samples + + + + + Sample size + + + + + Format type + + + + + Format type name + + + + + DMO Output Data Buffer + + + + + Creates a new DMO Output Data Buffer structure + + Maximum buffer size + + + + Dispose + + + + + Retrives the data in this buffer + + Buffer to receive data + Offset into buffer + + + + Media Buffer + + + + + Length of data in buffer + + + + + Status Flags + + + + + Timestamp + + + + + Duration + + + + + Is more data available + If true, ProcessOuput should be called again + + + + + DMO Output Data Buffer Flags + + + + + None + + + + + DMO_OUTPUT_DATA_BUFFERF_SYNCPOINT + + + + + DMO_OUTPUT_DATA_BUFFERF_TIME + + + + + DMO_OUTPUT_DATA_BUFFERF_TIMELENGTH + + + + + DMO_OUTPUT_DATA_BUFFERF_INCOMPLETE + + + + + DMO Process Output Flags + + + + + None + + + + + DMO_PROCESS_OUTPUT_DISCARD_WHEN_NO_BUFFER + + + + + defined in mediaobj.h + + + + + From wmcodecsdp.h + Implements: + - IMediaObject + - IMFTransform (Media foundation - we will leave this for now as there is loads of MF stuff) + - IPropertyStore + - IWMResamplerProps + Can resample PCM or IEEE + + + + + DMO Resampler + + + + + Creates a new Resampler based on the DMO Resampler + + + + + Dispose code - experimental at the moment + Was added trying to track down why Resampler crashes NUnit + This code not currently being called by ResamplerDmoStream + + + + + Media Object + + + + diff --git a/packages/NAudio.1.7.1/lib/windows8/NAudio.Win8.XML b/packages/NAudio.1.7.1/lib/windows8/NAudio.Win8.XML new file mode 100644 index 00000000..f9eb34db --- /dev/null +++ b/packages/NAudio.1.7.1/lib/windows8/NAudio.Win8.XML @@ -0,0 +1,12401 @@ + + + + NAudio.Win8 + + + + + a-law decoder + based on code from: + http://hazelware.luggle.com/tutorials/mulawcompression.html + + + + + only 512 bytes required, so just use a lookup + + + + + Converts an a-law encoded byte to a 16 bit linear sample + + a-law encoded byte + Linear sample + + + + A-law encoder + + + + + Encodes a single 16 bit sample to a-law + + 16 bit PCM sample + a-law encoded byte + + + + SpanDSP - a series of DSP components for telephony + + g722_decode.c - The ITU G.722 codec, decode part. + + Written by Steve Underwood <steveu@coppice.org> + + Copyright (C) 2005 Steve Underwood + Ported to C# by Mark Heath 2011 + + Despite my general liking of the GPL, I place my own contributions + to this code in the public domain for the benefit of all mankind - + even the slimy ones who might try to proprietize my work and use it + to my detriment. + + Based in part on a single channel G.722 codec which is: + Copyright (c) CMU 1993 + Computer Science, Speech Group + Chengxiang Lu and Alex Hauptmann + + + + + hard limits to 16 bit samples + + + + + Decodes a buffer of G722 + + Codec state + Output buffer (to contain decompressed PCM samples) + + Number of bytes in input G722 data to decode + Number of samples written into output buffer + + + + Encodes a buffer of G722 + + Codec state + Output buffer (to contain encoded G722) + PCM 16 bit samples to encode + Number of samples in the input buffer to encode + Number of encoded bytes written into output buffer + + + + Stores state to be used between calls to Encode or Decode + + + + + Creates a new instance of G722 Codec State for a + new encode or decode session + + Bitrate (typically 64000) + Special options + + + + ITU Test Mode + TRUE if the operating in the special ITU test mode, with the band split filters disabled. + + + + + TRUE if the G.722 data is packed + + + + + 8kHz Sampling + TRUE if encode from 8k samples/second + + + + + Bits Per Sample + 6 for 48000kbps, 7 for 56000kbps, or 8 for 64000kbps. + + + + + Signal history for the QMF (x) + + + + + Band + + + + + In bit buffer + + + + + Number of bits in InBuffer + + + + + Out bit buffer + + + + + Number of bits in OutBuffer + + + + + Band data for G722 Codec + + + + s + + + sp + + + sz + + + r + + + a + + + ap + + + p + + + d + + + b + + + bp + + + sg + + + nb + + + det + + + + G722 Flags + + + + + None + + + + + Using a G722 sample rate of 8000 + + + + + Packed + + + + + mu-law decoder + based on code from: + http://hazelware.luggle.com/tutorials/mulawcompression.html + + + + + only 512 bytes required, so just use a lookup + + + + + Converts a mu-law encoded byte to a 16 bit linear sample + + mu-law encoded byte + Linear sample + + + + mu-law encoder + based on code from: + http://hazelware.luggle.com/tutorials/mulawcompression.html + + + + + Encodes a single 16 bit sample to mu-law + + 16 bit PCM sample + mu-law encoded byte + + + + Audio Capture Client + + + + + Gets a pointer to the buffer + + Pointer to the buffer + + + + Gets a pointer to the buffer + + Number of frames to read + Buffer flags + Pointer to the buffer + + + + Gets the size of the next packet + + + + + Release buffer + + Number of frames written + + + + Release the COM object + + + + + Windows Vista CoreAudio AudioClient + + + + + Initialize the Audio Client + + Share Mode + Stream Flags + Buffer Duration + Periodicity + Wave Format + Audio Session GUID (can be null) + + + + Determines whether if the specified output format is supported + + The share mode. + The desired format. + + true if [is format supported] [the specified share mode]; otherwise, false. + + + + + Determines if the specified output format is supported in shared mode + + Share Mode + Desired Format + Output The closest match format. + + true if [is format supported] [the specified share mode]; otherwise, false. + + + + + Starts the audio stream + + + + + Stops the audio stream. + + + + + Set the Event Handle for buffer synchro. + + The Wait Handle to setup + + + + Resets the audio stream + Reset is a control method that the client calls to reset a stopped audio stream. + Resetting the stream flushes all pending data and resets the audio clock stream + position to 0. This method fails if it is called on a stream that is not stopped + + + + + Dispose + + + + + Mix Format, + Can be called before initialize + + + + + Gets the buffer size (must initialize first) + + + + + Gets the stream latency (must initialize first) + + + + + Gets the current padding (must initialize first) + + + + + Gets the default device period (can be called before initialize) + + + + + Gets the minimum device period (can be called before initialize) + + + + + Gets the AudioClockClient service + + + + + Gets the AudioRenderClient service + + + + + Gets the AudioCaptureClient service + + + + + Audio Client Buffer Flags + + + + + None + + + + + AUDCLNT_BUFFERFLAGS_DATA_DISCONTINUITY + + + + + AUDCLNT_BUFFERFLAGS_SILENT + + + + + AUDCLNT_BUFFERFLAGS_TIMESTAMP_ERROR + + + + + The AudioClientProperties structure is used to set the parameters that describe the properties of the client's audio stream. + + http://msdn.microsoft.com/en-us/library/windows/desktop/hh968105(v=vs.85).aspx + + + + The size of the buffer for the audio stream. + + + + + Boolean value to indicate whether or not the audio stream is hardware-offloaded + + + + + An enumeration that is used to specify the category of the audio stream. + + + + + A bit-field describing the characteristics of the stream. Supported in Windows 8.1 and later. + + + + + AUDCLNT_SHAREMODE + + + + + AUDCLNT_SHAREMODE_SHARED, + + + + + AUDCLNT_SHAREMODE_EXCLUSIVE + + + + + AUDCLNT_STREAMFLAGS + + + + + None + + + + + AUDCLNT_STREAMFLAGS_CROSSPROCESS + + + + + AUDCLNT_STREAMFLAGS_LOOPBACK + + + + + AUDCLNT_STREAMFLAGS_EVENTCALLBACK + + + + + AUDCLNT_STREAMFLAGS_NOPERSIST + + + + + Defines values that describe the characteristics of an audio stream. + + + + + No stream options. + + + + + The audio stream is a 'raw' stream that bypasses all signal processing except for endpoint specific, always-on processing in the APO, driver, and hardware. + + + + + Audio Clock Client + + + + + Get Position + + + + + Dispose + + + + + Characteristics + + + + + Frequency + + + + + Adjusted Position + + + + + Can Adjust Position + + + + + Audio Endpoint Volume + + + + + Volume Step Up + + + + + Volume Step Down + + + + + Creates a new Audio endpoint volume + + IAudioEndpointVolume COM interface + + + + Dispose + + + + + Finalizer + + + + + On Volume Notification + + + + + Volume Range + + + + + Hardware Support + + + + + Step Information + + + + + Channels + + + + + Master Volume Level + + + + + Master Volume Level Scalar + + + + + Mute + + + + + Audio Endpoint Volume Channel + + + + + Volume Level + + + + + Volume Level Scalar + + + + + Audio Endpoint Volume Channels + + + + + Channel Count + + + + + Indexer - get a specific channel + + + + + Audio Endpoint Volume Notifiaction Delegate + + Audio Volume Notification Data + + + + Audio Endpoint Volume Step Information + + + + + Step + + + + + StepCount + + + + + Audio Endpoint Volume Volume Range + + + + + Minimum Decibels + + + + + Maximum Decibels + + + + + Increment Decibels + + + + + Audio Meter Information + + + + + Peak Values + + + + + Hardware Support + + + + + Master Peak Value + + + + + Audio Meter Information Channels + + + + + Metering Channel Count + + + + + Get Peak value + + Channel index + Peak value + + + + Audio Render Client + + + + + Gets a pointer to the buffer + + Number of frames requested + Pointer to the buffer + + + + Release buffer + + Number of frames written + Buffer flags + + + + Release the COM object + + + + + Specifies the category of an audio stream. + + + + + Other audio stream. + + + + + Media that will only stream when the app is in the foreground. + + + + + Media that can be streamed when the app is in the background. + + + + + Real-time communications, such as VOIP or chat. + + + + + Alert sounds. + + + + + Sound effects. + + + + + Game sound effects. + + + + + Background audio for games. + + + + + Audio Volume Notification Data + + + + + Audio Volume Notification Data + + + + + + + + + Event Context + + + + + Muted + + + + + Master Volume + + + + + Channels + + + + + Channel Volume + + + + + The EDataFlow enumeration defines constants that indicate the direction + in which audio data flows between an audio endpoint device and an application + + + + + Audio rendering stream. + Audio data flows from the application to the audio endpoint device, which renders the stream. + + + + + Audio capture stream. Audio data flows from the audio endpoint device that captures the stream, + to the application + + + + + Audio rendering or capture stream. Audio data can flow either from the application to the audio + endpoint device, or from the audio endpoint device to the application. + + + + + Device State + + + + + DEVICE_STATE_ACTIVE + + + + + DEVICE_STATE_DISABLED + + + + + DEVICE_STATE_NOTPRESENT + + + + + DEVICE_STATE_UNPLUGGED + + + + + DEVICE_STATEMASK_ALL + + + + + Endpoint Hardware Support + + + + + Volume + + + + + Mute + + + + + Meter + + + + + is defined in WTypes.h + + + + + AUDCLNT_E_NOT_INITIALIZED + + + + + AUDCLNT_E_UNSUPPORTED_FORMAT + + + + + AUDCLNT_E_DEVICE_IN_USE + + + + + n.b. WORK IN PROGRESS - this code will probably do nothing but crash at the moment + Defined in AudioClient.h + + + + + The GetBufferSize method retrieves the size (maximum capacity) of the endpoint buffer. + + + + + The GetService method accesses additional services from the audio client object. + + The interface ID for the requested service. + Pointer to a pointer variable into which the method writes the address of an instance of the requested interface. + + + + Defined in AudioClient.h + + + + + Defined in AudioClient.h + + + + + defined in MMDeviceAPI.h + + + + + IMMNotificationClient + + + + + Device State Changed + + + + + Device Added + + + + + Device Removed + + + + + Default Device Changed + + + + + Property Value Changed + + + + + + + is defined in propsys.h + + + + + implements IMMDeviceEnumerator + + + + + MMDevice STGM enumeration + + + + + MM Device + + + + + To string + + + + + Audio Client + + + + + Audio Meter Information + + + + + Audio Endpoint Volume + + + + + Properties + + + + + Friendly name for the endpoint + + + + + Friendly name of device + + + + + Device ID + + + + + Data Flow + + + + + Device State + + + + + Multimedia Device Collection + + + + + Get Enumerator + + Device enumerator + + + + Device count + + + + + Get device by index + + Device index + Device at the specified index + + + + MM Device Enumerator + + + + + Enumerate Audio Endpoints + + Desired DataFlow + State Mask + Device Collection + + + + Get Default Endpoint + + Data Flow + Role + Device + + + + Get device by ID + + Device ID + Device + + + + Creates a new MM Device Enumerator + + + + + PROPERTYKEY is defined in wtypes.h + + + + + Format ID + + + + + Property ID + + + + + + + + + + + Property Keys + + + + + PKEY_DeviceInterface_FriendlyName + + + + + PKEY_AudioEndpoint_FormFactor + + + + + PKEY_AudioEndpoint_ControlPanelPageProvider + + + + + PKEY_AudioEndpoint_Association + + + + + PKEY_AudioEndpoint_PhysicalSpeakers + + + + + PKEY_AudioEndpoint_GUID + + + + + PKEY_AudioEndpoint_Disable_SysFx + + + + + PKEY_AudioEndpoint_FullRangeSpeakers + + + + + PKEY_AudioEndpoint_Supports_EventDriven_Mode + + + + + PKEY_AudioEndpoint_JackSubType + + + + + PKEY_AudioEngine_DeviceFormat + + + + + PKEY_AudioEngine_OEMFormat + + + + + PKEY _Devie_FriendlyName + + + + + Property Store class, only supports reading properties at the moment. + + + + + Contains property guid + + Looks for a specific key + True if found + + + + Gets property key at sepecified index + + Index + Property key + + + + Gets property value at specified index + + Index + Property value + + + + Creates a new property store + + IPropertyStore COM interface + + + + Property Count + + + + + Gets property by index + + Property index + The property + + + + Indexer by guid + + Property Key + Property or null if not found + + + + Property Store Property + + + + + Property Key + + + + + Property Value + + + + + from Propidl.h. + http://msdn.microsoft.com/en-us/library/aa380072(VS.85).aspx + contains a union so we have to do an explicit layout + + + + + Creates a new PropVariant containing a long value + + + + + Helper method to gets blob data + + + + + Interprets a blob as an array of structs + + + + + allows freeing up memory, might turn this into a Dispose method? + + + + + Gets the type of data in this PropVariant + + + + + Property value + + + + + The ERole enumeration defines constants that indicate the role + that the system has assigned to an audio endpoint device + + + + + Games, system notification sounds, and voice commands. + + + + + Music, movies, narration, and live music recording + + + + + Voice communications (talking to another person). + + + + + Windows Media Resampler Props + wmcodecdsp.h + + + + + Range is 1 to 60 + + + + + Specifies the channel matrix. + + + + + BiQuad filter + + + + + Passes a single sample through the filter + + Input sample + Output sample + + + + Set this up as a low pass filter + + Sample Rate + Cut-off Frequency + Bandwidth + + + + Set this up as a peaking EQ + + Sample Rate + Centre Frequency + Bandwidth (Q) + Gain in decibels + + + + Set this as a high pass filter + + + + + Create a low pass filter + + + + + Create a High pass filter + + + + + Create a bandpass filter with constant skirt gain + + + + + Create a bandpass filter with constant peak gain + + + + + Creates a notch filter + + + + + Creaes an all pass filter + + + + + Create a Peaking EQ + + + + + H(s) = A * (s^2 + (sqrt(A)/Q)*s + A)/(A*s^2 + (sqrt(A)/Q)*s + 1) + + + + a "shelf slope" parameter (for shelving EQ only). + When S = 1, the shelf slope is as steep as it can be and remain monotonically + increasing or decreasing gain with frequency. The shelf slope, in dB/octave, + remains proportional to S for all other values for a fixed f0/Fs and dBgain. + Gain in decibels + + + + H(s) = A * (A*s^2 + (sqrt(A)/Q)*s + 1)/(s^2 + (sqrt(A)/Q)*s + A) + + + + + + + + + + Type to represent complex number + + + + + Real Part + + + + + Imaginary Part + + + + + Envelope generator (ADSR) + + + + + Creates and Initializes an Envelope Generator + + + + + Sets the attack curve + + + + + Sets the decay release curve + + + + + Read the next volume multiplier from the envelope generator + + A volume multiplier + + + + Trigger the gate + + If true, enter attack phase, if false enter release phase (unless already idle) + + + + Reset to idle state + + + + + Get the current output level + + + + + Attack Rate (seconds * SamplesPerSecond) + + + + + Decay Rate (seconds * SamplesPerSecond) + + + + + Release Rate (seconds * SamplesPerSecond) + + + + + Sustain Level (1 = 100%) + + + + + Current envelope state + + + + + Envelope State + + + + + Idle + + + + + Attack + + + + + Decay + + + + + Sustain + + + + + Release + + + + + Summary description for FastFourierTransform. + + + + + This computes an in-place complex-to-complex FFT + x and y are the real and imaginary arrays of 2^m points. + + + + + Applies a Hamming Window + + Index into frame + Frame size (e.g. 1024) + Multiplier for Hamming window + + + + Applies a Hann Window + + Index into frame + Frame size (e.g. 1024) + Multiplier for Hann window + + + + Applies a Blackman-Harris Window + + Index into frame + Frame size (e.g. 1024) + Multiplier for Blackmann-Harris window + + + + Summary description for ImpulseResponseConvolution. + + + + + A very simple mono convolution algorithm + + + This will be very slow + + + + + This is actually a downwards normalize for data that will clip + + + + + Channel Mode + + + + + Stereo + + + + + Joint Stereo + + + + + Dual Channel + + + + + Mono + + + + + An ID3v2 Tag + + + + + Reads an ID3v2 tag from a stream + + + + + Creates a new ID3v2 tag from a collection of key-value pairs. + + A collection of key-value pairs containing the tags to include in the ID3v2 tag. + A new ID3v2 tag + + + + Convert the frame size to a byte array. + + The frame body size. + + + + + Creates an ID3v2 frame for the given key-value pair. + + + + + + + + Gets the Id3v2 Header size. The size is encoded so that only 7 bits per byte are actually used. + + + + + + + Creates the Id3v2 tag header and returns is as a byte array. + + The Id3v2 frames that will be included in the file. This is used to calculate the ID3v2 tag size. + + + + + Creates the Id3v2 tag for the given key-value pairs and returns it in the a stream. + + + + + + + Raw data from this tag + + + + + Interface for MP3 frame by frame decoder + + + + + Decompress a single MP3 frame + + Frame to decompress + Output buffer + Offset within output buffer + Bytes written to output buffer + + + + Tell the decoder that we have repositioned + + + + + PCM format that we are converting into + + + + + Represents an MP3 Frame + + + + + Reads an MP3 frame from a stream + + input stream + A valid MP3 frame, or null if none found + + + Reads an MP3Frame from a stream + http://mpgedit.org/mpgedit/mpeg_format/mpeghdr.htm has some good info + also see http://www.codeproject.com/KB/audio-video/mpegaudioinfo.aspx + + A valid MP3 frame, or null if none found + + + + Constructs an MP3 frame + + + + + checks if the four bytes represent a valid header, + if they are, will parse the values into Mp3Frame + + + + + Sample rate of this frame + + + + + Frame length in bytes + + + + + Bit Rate + + + + + Raw frame data (includes header bytes) + + + + + MPEG Version + + + + + MPEG Layer + + + + + Channel Mode + + + + + The number of samples in this frame + + + + + The channel extension bits + + + + + The bitrate index (directly from the header) + + + + + Whether the Copyright bit is set + + + + + Whether a CRC is present + + + + + Not part of the MP3 frame itself - indicates where in the stream we found this header + + + + + MPEG Layer flags + + + + + Reserved + + + + + Layer 3 + + + + + Layer 2 + + + + + Layer 1 + + + + + MPEG Version Flags + + + + + Version 2.5 + + + + + Reserved + + + + + Version 2 + + + + + Version 1 + + + + + Represents a Xing VBR header + + + + + Load Xing Header + + Frame + Xing Header + + + + Sees if a frame contains a Xing header + + + + + Number of frames + + + + + Number of bytes + + + + + VBR Scale property + + + + + The MP3 frame + + + + + Soundfont generator + + + + + + + + + + Gets the generator type + + + + + Generator amount as an unsigned short + + + + + Generator amount as a signed short + + + + + Low byte amount + + + + + High byte amount + + + + + Instrument + + + + + Sample Header + + + + + base class for structures that can read themselves + + + + + Generator types + + + + Start address offset + + + End address offset + + + Start loop address offset + + + End loop address offset + + + Start address coarse offset + + + Modulation LFO to pitch + + + Vibrato LFO to pitch + + + Modulation envelope to pitch + + + Initial filter cutoff frequency + + + Initial filter Q + + + Modulation LFO to filter Cutoff frequency + + + Modulation envelope to filter cutoff frequency + + + End address coarse offset + + + Modulation LFO to volume + + + Unused + + + Chorus effects send + + + Reverb effects send + + + Pan + + + Unused + + + Unused + + + Unused + + + Delay modulation LFO + + + Frequency modulation LFO + + + Delay vibrato LFO + + + Frequency vibrato LFO + + + Delay modulation envelope + + + Attack modulation envelope + + + Hold modulation envelope + + + Decay modulation envelope + + + Sustain modulation envelop + + + Release modulation envelope + + + Key number to modulation envelope hold + + + Key number to modulation envelope decay + + + Delay volume envelope + + + Attack volume envelope + + + Hold volume envelope + + + Decay volume envelope + + + Sustain volume envelope + + + Release volume envelope + + + Key number to volume envelope hold + + + Key number to volume envelope decay + + + Instrument + + + Reserved + + + Key range + + + Velocity range + + + Start loop address coarse offset + + + Key number + + + Velocity + + + Initial attenuation + + + Reserved + + + End loop address coarse offset + + + Coarse tune + + + Fine tune + + + Sample ID + + + Sample modes + + + Reserved + + + Scale tuning + + + Exclusive class + + + Overriding root key + + + Unused + + + Unused + + + + A soundfont info chunk + + + + + + + + + + SoundFont Version + + + + + WaveTable sound engine + + + + + Bank name + + + + + Data ROM + + + + + Creation Date + + + + + Author + + + + + Target Product + + + + + Copyright + + + + + Comments + + + + + Tools + + + + + ROM Version + + + + + SoundFont instrument + + + + + + + + + + instrument name + + + + + Zones + + + + + Instrument Builder + + + + + Transform Types + + + + + Linear + + + + + Modulator + + + + + + + + + + Source Modulation data type + + + + + Destination generator type + + + + + Amount + + + + + Source Modulation Amount Type + + + + + Source Transform Type + + + + + Controller Sources + + + + + No Controller + + + + + Note On Velocity + + + + + Note On Key Number + + + + + Poly Pressure + + + + + Channel Pressure + + + + + Pitch Wheel + + + + + Pitch Wheel Sensitivity + + + + + Source Types + + + + + Linear + + + + + Concave + + + + + Convex + + + + + Switch + + + + + Modulator Type + + + + + + + + + + + A SoundFont Preset + + + + + + + + + + Preset name + + + + + Patch Number + + + + + Bank number + + + + + Zones + + + + + Class to read the SoundFont file presets chunk + + + + + + + + + + The Presets contained in this chunk + + + + + The instruments contained in this chunk + + + + + The sample headers contained in this chunk + + + + + just reads a chunk ID at the current position + + chunk ID + + + + reads a chunk at the current position + + + + + creates a new riffchunk from current position checking that we're not + at the end of this chunk first + + the new chunk + + + + useful for chunks that just contain a string + + chunk as string + + + + A SoundFont Sample Header + + + + + The sample name + + + + + Start offset + + + + + End offset + + + + + Start loop point + + + + + End loop point + + + + + Sample Rate + + + + + Original pitch + + + + + Pitch correction + + + + + Sample Link + + + + + SoundFont Sample Link Type + + + + + + + + + + SoundFont sample modes + + + + + No loop + + + + + Loop Continuously + + + + + Reserved no loop + + + + + Loop and continue + + + + + Sample Link Type + + + + + Mono Sample + + + + + Right Sample + + + + + Left Sample + + + + + Linked Sample + + + + + ROM Mono Sample + + + + + ROM Right Sample + + + + + ROM Left Sample + + + + + ROM Linked Sample + + + + + SoundFont Version Structure + + + + + Major Version + + + + + Minor Version + + + + + Builds a SoundFont version + + + + + Reads a SoundFont Version structure + + + + + Writes a SoundFont Version structure + + + + + Gets the length of this structure + + + + + Represents a SoundFont + + + + + Loads a SoundFont from a stream + + stream + + + + + + + + + The File Info Chunk + + + + + The Presets + + + + + The Instruments + + + + + The Sample Headers + + + + + The Sample Data + + + + + A SoundFont zone + + + + + + + + + + Modulators for this Zone + + + + + Generators for this Zone + + + + + Audio Subtype GUIDs + http://msdn.microsoft.com/en-us/library/windows/desktop/aa372553%28v=vs.85%29.aspx + + + + + Advanced Audio Coding (AAC). + + + + + Not used + + + + + Dolby AC-3 audio over Sony/Philips Digital Interface (S/PDIF). + + + + + Encrypted audio data used with secure audio path. + + + + + Digital Theater Systems (DTS) audio. + + + + + Uncompressed IEEE floating-point audio. + + + + + MPEG Audio Layer-3 (MP3). + + + + + MPEG-1 audio payload. + + + + + Windows Media Audio 9 Voice codec. + + + + + Uncompressed PCM audio. + + + + + Windows Media Audio 9 Professional codec over S/PDIF. + + + + + Windows Media Audio 9 Lossless codec or Windows Media Audio 9.1 codec. + + + + + Windows Media Audio 8 codec, Windows Media Audio 9 codec, or Windows Media Audio 9.1 codec. + + + + + Windows Media Audio 9 Professional codec or Windows Media Audio 9.1 Professional codec. + + + + + Dolby Digital (AC-3). + + + + + MPEG-4 and AAC Audio Types + http://msdn.microsoft.com/en-us/library/windows/desktop/dd317599(v=vs.85).aspx + Reference : wmcodecdsp.h + + + + + Dolby Audio Types + http://msdn.microsoft.com/en-us/library/windows/desktop/dd317599(v=vs.85).aspx + Reference : wmcodecdsp.h + + + + + Dolby Audio Types + http://msdn.microsoft.com/en-us/library/windows/desktop/dd317599(v=vs.85).aspx + Reference : wmcodecdsp.h + + + + + μ-law coding + http://msdn.microsoft.com/en-us/library/windows/desktop/dd390971(v=vs.85).aspx + Reference : Ksmedia.h + + + + + Adaptive delta pulse code modulation (ADPCM) + http://msdn.microsoft.com/en-us/library/windows/desktop/dd390971(v=vs.85).aspx + Reference : Ksmedia.h + + + + + Dolby Digital Plus formatted for HDMI output. + http://msdn.microsoft.com/en-us/library/windows/hardware/ff538392(v=vs.85).aspx + Reference : internet + + + + + MSAudio1 - unknown meaning + Reference : wmcodecdsp.h + + + + + IMA ADPCM ACM Wrapper + + + + + WMSP2 - unknown meaning + Reference: wmsdkidl.h + + + + + IMFActivate, defined in mfobjects.h + + + + + Provides a generic way to store key/value pairs on an object. + http://msdn.microsoft.com/en-gb/library/windows/desktop/ms704598%28v=vs.85%29.aspx + + + + + Retrieves the value associated with a key. + + + + + Retrieves the data type of the value associated with a key. + + + + + Queries whether a stored attribute value equals a specified PROPVARIANT. + + + + + Compares the attributes on this object with the attributes on another object. + + + + + Retrieves a UINT32 value associated with a key. + + + + + Retrieves a UINT64 value associated with a key. + + + + + Retrieves a double value associated with a key. + + + + + Retrieves a GUID value associated with a key. + + + + + Retrieves the length of a string value associated with a key. + + + + + Retrieves a wide-character string associated with a key. + + + + + Retrieves a wide-character string associated with a key. This method allocates the memory for the string. + + + + + Retrieves the length of a byte array associated with a key. + + + + + Retrieves a byte array associated with a key. + + + + + Retrieves a byte array associated with a key. This method allocates the memory for the array. + + + + + Retrieves an interface pointer associated with a key. + + + + + Associates an attribute value with a key. + + + + + Removes a key/value pair from the object's attribute list. + + + + + Removes all key/value pairs from the object's attribute list. + + + + + Associates a UINT32 value with a key. + + + + + Associates a UINT64 value with a key. + + + + + Associates a double value with a key. + + + + + Associates a GUID value with a key. + + + + + Associates a wide-character string with a key. + + + + + Associates a byte array with a key. + + + + + Associates an IUnknown pointer with a key. + + + + + Locks the attribute store so that no other thread can access it. + + + + + Unlocks the attribute store. + + + + + Retrieves the number of attributes that are set on this object. + + + + + Retrieves an attribute at the specified index. + + + + + Copies all of the attributes from this object into another attribute store. + + + + + Retrieves the value associated with a key. + + + + + Retrieves the data type of the value associated with a key. + + + + + Queries whether a stored attribute value equals a specified PROPVARIANT. + + + + + Compares the attributes on this object with the attributes on another object. + + + + + Retrieves a UINT32 value associated with a key. + + + + + Retrieves a UINT64 value associated with a key. + + + + + Retrieves a double value associated with a key. + + + + + Retrieves a GUID value associated with a key. + + + + + Retrieves the length of a string value associated with a key. + + + + + Retrieves a wide-character string associated with a key. + + + + + Retrieves a wide-character string associated with a key. This method allocates the memory for the string. + + + + + Retrieves the length of a byte array associated with a key. + + + + + Retrieves a byte array associated with a key. + + + + + Retrieves a byte array associated with a key. This method allocates the memory for the array. + + + + + Retrieves an interface pointer associated with a key. + + + + + Associates an attribute value with a key. + + + + + Removes a key/value pair from the object's attribute list. + + + + + Removes all key/value pairs from the object's attribute list. + + + + + Associates a UINT32 value with a key. + + + + + Associates a UINT64 value with a key. + + + + + Associates a double value with a key. + + + + + Associates a GUID value with a key. + + + + + Associates a wide-character string with a key. + + + + + Associates a byte array with a key. + + + + + Associates an IUnknown pointer with a key. + + + + + Locks the attribute store so that no other thread can access it. + + + + + Unlocks the attribute store. + + + + + Retrieves the number of attributes that are set on this object. + + + + + Retrieves an attribute at the specified index. + + + + + Copies all of the attributes from this object into another attribute store. + + + + + Creates the object associated with this activation object. + + + + + Shuts down the created object. + + + + + Detaches the created object from the activation object. + + + + + IMFByteStream + http://msdn.microsoft.com/en-gb/library/windows/desktop/ms698720%28v=vs.85%29.aspx + + + + + Retrieves the characteristics of the byte stream. + virtual HRESULT STDMETHODCALLTYPE GetCapabilities(/*[out]*/ __RPC__out DWORD *pdwCapabilities) = 0; + + + + + Retrieves the length of the stream. + virtual HRESULT STDMETHODCALLTYPE GetLength(/*[out]*/ __RPC__out QWORD *pqwLength) = 0; + + + + + Sets the length of the stream. + virtual HRESULT STDMETHODCALLTYPE SetLength(/*[in]*/ QWORD qwLength) = 0; + + + + + Retrieves the current read or write position in the stream. + virtual HRESULT STDMETHODCALLTYPE GetCurrentPosition(/*[out]*/ __RPC__out QWORD *pqwPosition) = 0; + + + + + Sets the current read or write position. + virtual HRESULT STDMETHODCALLTYPE SetCurrentPosition(/*[in]*/ QWORD qwPosition) = 0; + + + + + Queries whether the current position has reached the end of the stream. + virtual HRESULT STDMETHODCALLTYPE IsEndOfStream(/*[out]*/ __RPC__out BOOL *pfEndOfStream) = 0; + + + + + Reads data from the stream. + virtual HRESULT STDMETHODCALLTYPE Read(/*[size_is][out]*/ __RPC__out_ecount_full(cb) BYTE *pb, /*[in]*/ ULONG cb, /*[out]*/ __RPC__out ULONG *pcbRead) = 0; + + + + + Begins an asynchronous read operation from the stream. + virtual /*[local]*/ HRESULT STDMETHODCALLTYPE BeginRead(/*[out]*/ _Out_writes_bytes_(cb) BYTE *pb, /*[in]*/ ULONG cb, /*[in]*/ IMFAsyncCallback *pCallback, /*[in]*/ IUnknown *punkState) = 0; + + + + + Completes an asynchronous read operation. + virtual /*[local]*/ HRESULT STDMETHODCALLTYPE EndRead(/*[in]*/ IMFAsyncResult *pResult, /*[out]*/ _Out_ ULONG *pcbRead) = 0; + + + + + Writes data to the stream. + virtual HRESULT STDMETHODCALLTYPE Write(/*[size_is][in]*/ __RPC__in_ecount_full(cb) const BYTE *pb, /*[in]*/ ULONG cb, /*[out]*/ __RPC__out ULONG *pcbWritten) = 0; + + + + + Begins an asynchronous write operation to the stream. + virtual /*[local]*/ HRESULT STDMETHODCALLTYPE BeginWrite(/*[in]*/ _In_reads_bytes_(cb) const BYTE *pb, /*[in]*/ ULONG cb, /*[in]*/ IMFAsyncCallback *pCallback, /*[in]*/ IUnknown *punkState) = 0; + + + + + Completes an asynchronous write operation. + virtual /*[local]*/ HRESULT STDMETHODCALLTYPE EndWrite(/*[in]*/ IMFAsyncResult *pResult, /*[out]*/ _Out_ ULONG *pcbWritten) = 0; + + + + + Moves the current position in the stream by a specified offset. + virtual HRESULT STDMETHODCALLTYPE Seek(/*[in]*/ MFBYTESTREAM_SEEK_ORIGIN SeekOrigin, /*[in]*/ LONGLONG llSeekOffset, /*[in]*/ DWORD dwSeekFlags, /*[out]*/ __RPC__out QWORD *pqwCurrentPosition) = 0; + + + + + Clears any internal buffers used by the stream. + virtual HRESULT STDMETHODCALLTYPE Flush( void) = 0; + + + + + Closes the stream and releases any resources associated with the stream. + virtual HRESULT STDMETHODCALLTYPE Close( void) = 0; + + + + + Represents a generic collection of IUnknown pointers. + + + + + Retrieves the number of objects in the collection. + + + + + Retrieves an object in the collection. + + + + + Adds an object to the collection. + + + + + Removes an object from the collection. + + + + + Removes an object from the collection. + + + + + Removes all items from the collection. + + + + + IMFMediaBuffer + http://msdn.microsoft.com/en-gb/library/windows/desktop/ms696261%28v=vs.85%29.aspx + + + + + Gives the caller access to the memory in the buffer. + + + + + Unlocks a buffer that was previously locked. + + + + + Retrieves the length of the valid data in the buffer. + + + + + Sets the length of the valid data in the buffer. + + + + + Retrieves the allocated size of the buffer. + + + + + IMFMediaEvent - Represents an event generated by a Media Foundation object. Use this interface to get information about the event. + http://msdn.microsoft.com/en-us/library/windows/desktop/ms702249%28v=vs.85%29.aspx + Mfobjects.h + + + + + Retrieves the value associated with a key. + + + + + Retrieves the data type of the value associated with a key. + + + + + Queries whether a stored attribute value equals a specified PROPVARIANT. + + + + + Compares the attributes on this object with the attributes on another object. + + + + + Retrieves a UINT32 value associated with a key. + + + + + Retrieves a UINT64 value associated with a key. + + + + + Retrieves a double value associated with a key. + + + + + Retrieves a GUID value associated with a key. + + + + + Retrieves the length of a string value associated with a key. + + + + + Retrieves a wide-character string associated with a key. + + + + + Retrieves a wide-character string associated with a key. This method allocates the memory for the string. + + + + + Retrieves the length of a byte array associated with a key. + + + + + Retrieves a byte array associated with a key. + + + + + Retrieves a byte array associated with a key. This method allocates the memory for the array. + + + + + Retrieves an interface pointer associated with a key. + + + + + Associates an attribute value with a key. + + + + + Removes a key/value pair from the object's attribute list. + + + + + Removes all key/value pairs from the object's attribute list. + + + + + Associates a UINT32 value with a key. + + + + + Associates a UINT64 value with a key. + + + + + Associates a double value with a key. + + + + + Associates a GUID value with a key. + + + + + Associates a wide-character string with a key. + + + + + Associates a byte array with a key. + + + + + Associates an IUnknown pointer with a key. + + + + + Locks the attribute store so that no other thread can access it. + + + + + Unlocks the attribute store. + + + + + Retrieves the number of attributes that are set on this object. + + + + + Retrieves an attribute at the specified index. + + + + + Copies all of the attributes from this object into another attribute store. + + + + + Retrieves the event type. + + + virtual HRESULT STDMETHODCALLTYPE GetType( + /* [out] */ __RPC__out MediaEventType *pmet) = 0; + + + + + Retrieves the extended type of the event. + + + virtual HRESULT STDMETHODCALLTYPE GetExtendedType( + /* [out] */ __RPC__out GUID *pguidExtendedType) = 0; + + + + + Retrieves an HRESULT that specifies the event status. + + + virtual HRESULT STDMETHODCALLTYPE GetStatus( + /* [out] */ __RPC__out HRESULT *phrStatus) = 0; + + + + + Retrieves the value associated with the event, if any. + + + virtual HRESULT STDMETHODCALLTYPE GetValue( + /* [out] */ __RPC__out PROPVARIANT *pvValue) = 0; + + + + + Represents a description of a media format. + http://msdn.microsoft.com/en-us/library/windows/desktop/ms704850%28v=vs.85%29.aspx + + + + + Retrieves the value associated with a key. + + + + + Retrieves the data type of the value associated with a key. + + + + + Queries whether a stored attribute value equals a specified PROPVARIANT. + + + + + Compares the attributes on this object with the attributes on another object. + + + + + Retrieves a UINT32 value associated with a key. + + + + + Retrieves a UINT64 value associated with a key. + + + + + Retrieves a double value associated with a key. + + + + + Retrieves a GUID value associated with a key. + + + + + Retrieves the length of a string value associated with a key. + + + + + Retrieves a wide-character string associated with a key. + + + + + Retrieves a wide-character string associated with a key. This method allocates the memory for the string. + + + + + Retrieves the length of a byte array associated with a key. + + + + + Retrieves a byte array associated with a key. + + + + + Retrieves a byte array associated with a key. This method allocates the memory for the array. + + + + + Retrieves an interface pointer associated with a key. + + + + + Associates an attribute value with a key. + + + + + Removes a key/value pair from the object's attribute list. + + + + + Removes all key/value pairs from the object's attribute list. + + + + + Associates a UINT32 value with a key. + + + + + Associates a UINT64 value with a key. + + + + + Associates a double value with a key. + + + + + Associates a GUID value with a key. + + + + + Associates a wide-character string with a key. + + + + + Associates a byte array with a key. + + + + + Associates an IUnknown pointer with a key. + + + + + Locks the attribute store so that no other thread can access it. + + + + + Unlocks the attribute store. + + + + + Retrieves the number of attributes that are set on this object. + + + + + Retrieves an attribute at the specified index. + + + + + Copies all of the attributes from this object into another attribute store. + + + + + Retrieves the major type of the format. + + + + + Queries whether the media type is a compressed format. + + + + + Compares two media types and determines whether they are identical. + + + + + Retrieves an alternative representation of the media type. + + + + + Frees memory that was allocated by the GetRepresentation method. + + + + + Creates an instance of either the sink writer or the source reader. + + + + + Creates an instance of the sink writer or source reader, given a URL. + + + + + Creates an instance of the sink writer or source reader, given an IUnknown pointer. + + + + + CLSID_MFReadWriteClassFactory + + + + + http://msdn.microsoft.com/en-gb/library/windows/desktop/ms702192%28v=vs.85%29.aspx + + + + + Retrieves the value associated with a key. + + + + + Retrieves the data type of the value associated with a key. + + + + + Queries whether a stored attribute value equals a specified PROPVARIANT. + + + + + Compares the attributes on this object with the attributes on another object. + + + + + Retrieves a UINT32 value associated with a key. + + + + + Retrieves a UINT64 value associated with a key. + + + + + Retrieves a double value associated with a key. + + + + + Retrieves a GUID value associated with a key. + + + + + Retrieves the length of a string value associated with a key. + + + + + Retrieves a wide-character string associated with a key. + + + + + Retrieves a wide-character string associated with a key. This method allocates the memory for the string. + + + + + Retrieves the length of a byte array associated with a key. + + + + + Retrieves a byte array associated with a key. + + + + + Retrieves a byte array associated with a key. This method allocates the memory for the array. + + + + + Retrieves an interface pointer associated with a key. + + + + + Associates an attribute value with a key. + + + + + Removes a key/value pair from the object's attribute list. + + + + + Removes all key/value pairs from the object's attribute list. + + + + + Associates a UINT32 value with a key. + + + + + Associates a UINT64 value with a key. + + + + + Associates a double value with a key. + + + + + Associates a GUID value with a key. + + + + + Associates a wide-character string with a key. + + + + + Associates a byte array with a key. + + + + + Associates an IUnknown pointer with a key. + + + + + Locks the attribute store so that no other thread can access it. + + + + + Unlocks the attribute store. + + + + + Retrieves the number of attributes that are set on this object. + + + + + Retrieves an attribute at the specified index. + + + + + Copies all of the attributes from this object into another attribute store. + + + + + Retrieves flags associated with the sample. + + + + + Sets flags associated with the sample. + + + + + Retrieves the presentation time of the sample. + + + + + Sets the presentation time of the sample. + + + + + Retrieves the duration of the sample. + + + + + Sets the duration of the sample. + + + + + Retrieves the number of buffers in the sample. + + + + + Retrieves a buffer from the sample. + + + + + Converts a sample with multiple buffers into a sample with a single buffer. + + + + + Adds a buffer to the end of the list of buffers in the sample. + + + + + Removes a buffer at a specified index from the sample. + + + + + Removes all buffers from the sample. + + + + + Retrieves the total length of the valid data in all of the buffers in the sample. + + + + + Copies the sample data to a buffer. + + + + + Implemented by the Microsoft Media Foundation sink writer object. + + + + + Adds a stream to the sink writer. + + + + + Sets the input format for a stream on the sink writer. + + + + + Initializes the sink writer for writing. + + + + + Delivers a sample to the sink writer. + + + + + Indicates a gap in an input stream. + + + + + Places a marker in the specified stream. + + + + + Notifies the media sink that a stream has reached the end of a segment. + + + + + Flushes one or more streams. + + + + + (Finalize) Completes all writing operations on the sink writer. + + + + + Queries the underlying media sink or encoder for an interface. + + + + + Gets statistics about the performance of the sink writer. + + + + + IMFSourceReader interface + http://msdn.microsoft.com/en-us/library/windows/desktop/dd374655%28v=vs.85%29.aspx + + + + + Queries whether a stream is selected. + + + + + Selects or deselects one or more streams. + + + + + Gets a format that is supported natively by the media source. + + + + + Gets the current media type for a stream. + + + + + Sets the media type for a stream. + + + + + Seeks to a new position in the media source. + + + + + Reads the next sample from the media source. + + + + + Flushes one or more streams. + + + + + Queries the underlying media source or decoder for an interface. + + + + + Gets an attribute from the underlying media source. + + + + + Contains flags that indicate the status of the IMFSourceReader::ReadSample method + http://msdn.microsoft.com/en-us/library/windows/desktop/dd375773(v=vs.85).aspx + + + + + No Error + + + + + An error occurred. If you receive this flag, do not make any further calls to IMFSourceReader methods. + + + + + The source reader reached the end of the stream. + + + + + One or more new streams were created + + + + + The native format has changed for one or more streams. The native format is the format delivered by the media source before any decoders are inserted. + + + + + The current media has type changed for one or more streams. To get the current media type, call the IMFSourceReader::GetCurrentMediaType method. + + + + + There is a gap in the stream. This flag corresponds to an MEStreamTick event from the media source. + + + + + All transforms inserted by the application have been removed for a particular stream. + + + + + IMFTransform, defined in mftransform.h + + + + + Retrieves the minimum and maximum number of input and output streams. + + + virtual HRESULT STDMETHODCALLTYPE GetStreamLimits( + /* [out] */ __RPC__out DWORD *pdwInputMinimum, + /* [out] */ __RPC__out DWORD *pdwInputMaximum, + /* [out] */ __RPC__out DWORD *pdwOutputMinimum, + /* [out] */ __RPC__out DWORD *pdwOutputMaximum) = 0; + + + + + Retrieves the current number of input and output streams on this MFT. + + + virtual HRESULT STDMETHODCALLTYPE GetStreamCount( + /* [out] */ __RPC__out DWORD *pcInputStreams, + /* [out] */ __RPC__out DWORD *pcOutputStreams) = 0; + + + + + Retrieves the stream identifiers for the input and output streams on this MFT. + + + virtual HRESULT STDMETHODCALLTYPE GetStreamIDs( + DWORD dwInputIDArraySize, + /* [size_is][out] */ __RPC__out_ecount_full(dwInputIDArraySize) DWORD *pdwInputIDs, + DWORD dwOutputIDArraySize, + /* [size_is][out] */ __RPC__out_ecount_full(dwOutputIDArraySize) DWORD *pdwOutputIDs) = 0; + + + + + Gets the buffer requirements and other information for an input stream on this Media Foundation transform (MFT). + + + virtual HRESULT STDMETHODCALLTYPE GetInputStreamInfo( + DWORD dwInputStreamID, + /* [out] */ __RPC__out MFT_INPUT_STREAM_INFO *pStreamInfo) = 0; + + + + + Gets the buffer requirements and other information for an output stream on this Media Foundation transform (MFT). + + + virtual HRESULT STDMETHODCALLTYPE GetOutputStreamInfo( + DWORD dwOutputStreamID, + /* [out] */ __RPC__out MFT_OUTPUT_STREAM_INFO *pStreamInfo) = 0; + + + + + Gets the global attribute store for this Media Foundation transform (MFT). + + + virtual HRESULT STDMETHODCALLTYPE GetAttributes( + /* [out] */ __RPC__deref_out_opt IMFAttributes **pAttributes) = 0; + + + + + Retrieves the attribute store for an input stream on this MFT. + + + virtual HRESULT STDMETHODCALLTYPE GetInputStreamAttributes( + DWORD dwInputStreamID, + /* [out] */ __RPC__deref_out_opt IMFAttributes **pAttributes) = 0; + + + + + Retrieves the attribute store for an output stream on this MFT. + + + virtual HRESULT STDMETHODCALLTYPE GetOutputStreamAttributes( + DWORD dwOutputStreamID, + /* [out] */ __RPC__deref_out_opt IMFAttributes **pAttributes) = 0; + + + + + Removes an input stream from this MFT. + + + virtual HRESULT STDMETHODCALLTYPE DeleteInputStream( + DWORD dwStreamID) = 0; + + + + + Adds one or more new input streams to this MFT. + + + virtual HRESULT STDMETHODCALLTYPE AddInputStreams( + DWORD cStreams, + /* [in] */ __RPC__in DWORD *adwStreamIDs) = 0; + + + + + Gets an available media type for an input stream on this Media Foundation transform (MFT). + + + virtual HRESULT STDMETHODCALLTYPE GetInputAvailableType( + DWORD dwInputStreamID, + DWORD dwTypeIndex, + /* [out] */ __RPC__deref_out_opt IMFMediaType **ppType) = 0; + + + + + Retrieves an available media type for an output stream on this MFT. + + + virtual HRESULT STDMETHODCALLTYPE GetOutputAvailableType( + DWORD dwOutputStreamID, + DWORD dwTypeIndex, + /* [out] */ __RPC__deref_out_opt IMFMediaType **ppType) = 0; + + + + + Sets, tests, or clears the media type for an input stream on this Media Foundation transform (MFT). + + + virtual HRESULT STDMETHODCALLTYPE SetInputType( + DWORD dwInputStreamID, + /* [in] */ __RPC__in_opt IMFMediaType *pType, + DWORD dwFlags) = 0; + + + + + Sets, tests, or clears the media type for an output stream on this Media Foundation transform (MFT). + + + virtual HRESULT STDMETHODCALLTYPE SetOutputType( + DWORD dwOutputStreamID, + /* [in] */ __RPC__in_opt IMFMediaType *pType, + DWORD dwFlags) = 0; + + + + + Gets the current media type for an input stream on this Media Foundation transform (MFT). + + + virtual HRESULT STDMETHODCALLTYPE GetInputCurrentType( + DWORD dwInputStreamID, + /* [out] */ __RPC__deref_out_opt IMFMediaType **ppType) = 0; + + + + + Gets the current media type for an output stream on this Media Foundation transform (MFT). + + + virtual HRESULT STDMETHODCALLTYPE GetOutputCurrentType( + DWORD dwOutputStreamID, + /* [out] */ __RPC__deref_out_opt IMFMediaType **ppType) = 0; + + + + + Queries whether an input stream on this Media Foundation transform (MFT) can accept more data. + + + virtual HRESULT STDMETHODCALLTYPE GetInputStatus( + DWORD dwInputStreamID, + /* [out] */ __RPC__out DWORD *pdwFlags) = 0; + + + + + Queries whether the Media Foundation transform (MFT) is ready to produce output data. + + + virtual HRESULT STDMETHODCALLTYPE GetOutputStatus( + /* [out] */ __RPC__out DWORD *pdwFlags) = 0; + + + + + Sets the range of time stamps the client needs for output. + + + virtual HRESULT STDMETHODCALLTYPE SetOutputBounds( + LONGLONG hnsLowerBound, + LONGLONG hnsUpperBound) = 0; + + + + + Sends an event to an input stream on this Media Foundation transform (MFT). + + + virtual HRESULT STDMETHODCALLTYPE ProcessEvent( + DWORD dwInputStreamID, + /* [in] */ __RPC__in_opt IMFMediaEvent *pEvent) = 0; + + + + + Sends a message to the Media Foundation transform (MFT). + + + virtual HRESULT STDMETHODCALLTYPE ProcessMessage( + MFT_MESSAGE_TYPE eMessage, + ULONG_PTR ulParam) = 0; + + + + + Delivers data to an input stream on this Media Foundation transform (MFT). + + + virtual /* [local] */ HRESULT STDMETHODCALLTYPE ProcessInput( + DWORD dwInputStreamID, + IMFSample *pSample, + DWORD dwFlags) = 0; + + + + + Generates output from the current input data. + + + virtual /* [local] */ HRESULT STDMETHODCALLTYPE ProcessOutput( + DWORD dwFlags, + DWORD cOutputBufferCount, + /* [size_is][out][in] */ MFT_OUTPUT_DATA_BUFFER *pOutputSamples, + /* [out] */ DWORD *pdwStatus) = 0; + + + + + See mfobjects.h + + + + + Unknown event type. + + + + + Signals a serious error. + + + + + Custom event type. + + + + + A non-fatal error occurred during streaming. + + + + + Session Unknown + + + + + Raised after the IMFMediaSession::SetTopology method completes asynchronously + + + + + Raised by the Media Session when the IMFMediaSession::ClearTopologies method completes asynchronously. + + + + + Raised when the IMFMediaSession::Start method completes asynchronously. + + + + + Raised when the IMFMediaSession::Pause method completes asynchronously. + + + + + Raised when the IMFMediaSession::Stop method completes asynchronously. + + + + + Raised when the IMFMediaSession::Close method completes asynchronously. + + + + + Raised by the Media Session when it has finished playing the last presentation in the playback queue. + + + + + Raised by the Media Session when the playback rate changes. + + + + + Raised by the Media Session when it completes a scrubbing request. + + + + + Raised by the Media Session when the session capabilities change. + + + + + Raised by the Media Session when the status of a topology changes. + + + + + Raised by the Media Session when a new presentation starts. + + + + + Raised by a media source a new presentation is ready. + + + + + License acquisition is about to begin. + + + + + License acquisition is complete. + + + + + Individualization is about to begin. + + + + + Individualization is complete. + + + + + Signals the progress of a content enabler object. + + + + + A content enabler object's action is complete. + + + + + Raised by a trusted output if an error occurs while enforcing the output policy. + + + + + Contains status information about the enforcement of an output policy. + + + + + A media source started to buffer data. + + + + + A media source stopped buffering data. + + + + + The network source started opening a URL. + + + + + The network source finished opening a URL. + + + + + Raised by a media source at the start of a reconnection attempt. + + + + + Raised by a media source at the end of a reconnection attempt. + + + + + Raised by the enhanced video renderer (EVR) when it receives a user event from the presenter. + + + + + Raised by the Media Session when the format changes on a media sink. + + + + + Source Unknown + + + + + Raised when a media source starts without seeking. + + + + + Raised by a media stream when the source starts without seeking. + + + + + Raised when a media source seeks to a new position. + + + + + Raised by a media stream after a call to IMFMediaSource::Start causes a seek in the stream. + + + + + Raised by a media source when it starts a new stream. + + + + + Raised by a media source when it restarts or seeks a stream that is already active. + + + + + Raised by a media source when the IMFMediaSource::Stop method completes asynchronously. + + + + + Raised by a media stream when the IMFMediaSource::Stop method completes asynchronously. + + + + + Raised by a media source when the IMFMediaSource::Pause method completes asynchronously. + + + + + Raised by a media stream when the IMFMediaSource::Pause method completes asynchronously. + + + + + Raised by a media source when a presentation ends. + + + + + Raised by a media stream when the stream ends. + + + + + Raised when a media stream delivers a new sample. + + + + + Signals that a media stream does not have data available at a specified time. + + + + + Raised by a media stream when it starts or stops thinning the stream. + + + + + Raised by a media stream when the media type of the stream changes. + + + + + Raised by a media source when the playback rate changes. + + + + + Raised by the sequencer source when a segment is completed and is followed by another segment. + + + + + Raised by a media source when the source's characteristics change. + + + + + Raised by a media source to request a new playback rate. + + + + + Raised by a media source when it updates its metadata. + + + + + Raised by the sequencer source when the IMFSequencerSource::UpdateTopology method completes asynchronously. + + + + + Sink Unknown + + + + + Raised by a stream sink when it completes the transition to the running state. + + + + + Raised by a stream sink when it completes the transition to the stopped state. + + + + + Raised by a stream sink when it completes the transition to the paused state. + + + + + Raised by a stream sink when the rate has changed. + + + + + Raised by a stream sink to request a new media sample from the pipeline. + + + + + Raised by a stream sink after the IMFStreamSink::PlaceMarker method is called. + + + + + Raised by a stream sink when the stream has received enough preroll data to begin rendering. + + + + + Raised by a stream sink when it completes a scrubbing request. + + + + + Raised by a stream sink when the sink's media type is no longer valid. + + + + + Raised by the stream sinks of the EVR if the video device changes. + + + + + Provides feedback about playback quality to the quality manager. + + + + + Raised when a media sink becomes invalid. + + + + + The audio session display name changed. + + + + + The volume or mute state of the audio session changed + + + + + The audio device was removed. + + + + + The Windows audio server system was shut down. + + + + + The grouping parameters changed for the audio session. + + + + + The audio session icon changed. + + + + + The default audio format for the audio device changed. + + + + + The audio session was disconnected from a Windows Terminal Services session + + + + + The audio session was preempted by an exclusive-mode connection. + + + + + Trust Unknown + + + + + The output policy for a stream changed. + + + + + Content protection message + + + + + The IMFOutputTrustAuthority::SetPolicy method completed. + + + + + DRM License Backup Completed + + + + + DRM License Backup Progress + + + + + DRM License Restore Completed + + + + + DRM License Restore Progress + + + + + DRM License Acquisition Completed + + + + + DRM Individualization Completed + + + + + DRM Individualization Progress + + + + + DRM Proximity Completed + + + + + DRM License Store Cleaned + + + + + DRM Revocation Download Completed + + + + + Transform Unknown + + + + + Sent by an asynchronous MFT to request a new input sample. + + + + + Sent by an asynchronous MFT when new output data is available from the MFT. + + + + + Sent by an asynchronous Media Foundation transform (MFT) when a drain operation is complete. + + + + + Sent by an asynchronous MFT in response to an MFT_MESSAGE_COMMAND_MARKER message. + + + + + Media Foundation attribute guids + http://msdn.microsoft.com/en-us/library/windows/desktop/ms696989%28v=vs.85%29.aspx + + + + + Specifies whether an MFT performs asynchronous processing. + + + + + Enables the use of an asynchronous MFT. + + + + + Contains flags for an MFT activation object. + + + + + Specifies the category for an MFT. + + + + + Contains the class identifier (CLSID) of an MFT. + + + + + Contains the registered input types for a Media Foundation transform (MFT). + + + + + Contains the registered output types for a Media Foundation transform (MFT). + + + + + Contains the symbolic link for a hardware-based MFT. + + + + + Contains the display name for a hardware-based MFT. + + + + + Contains a pointer to the stream attributes of the connected stream on a hardware-based MFT. + + + + + Specifies whether a hardware-based MFT is connected to another hardware-based MFT. + + + + + Specifies the preferred output format for an encoder. + + + + + Specifies whether an MFT is registered only in the application's process. + + + + + Contains configuration properties for an encoder. + + + + + Specifies whether a hardware device source uses the system time for time stamps. + + + + + Contains an IMFFieldOfUseMFTUnlock pointer, which can be used to unlock the MFT. + + + + + Contains the merit value of a hardware codec. + + + + + Specifies whether a decoder is optimized for transcoding rather than for playback. + + + + + Contains a pointer to the proxy object for the application's presentation descriptor. + + + + + Contains a pointer to the presentation descriptor from the protected media path (PMP). + + + + + Specifies the duration of a presentation, in 100-nanosecond units. + + + + + Specifies the total size of the source file, in bytes. + + + + + Specifies the audio encoding bit rate for the presentation, in bits per second. + + + + + Specifies the video encoding bit rate for the presentation, in bits per second. + + + + + Specifies the MIME type of the content. + + + + + Specifies when a presentation was last modified. + + + + + The identifier of the playlist element in the presentation. + + + + + Contains the preferred RFC 1766 language of the media source. + + + + + The time at which the presentation must begin, relative to the start of the media source. + + + + + Specifies whether the audio streams in the presentation have a variable bit rate. + + + + + Media type Major Type + + + + + Media Type subtype + + + + + Audio block alignment + + + + + Audio average bytes per second + + + + + Audio number of channels + + + + + Audio samples per second + + + + + Audio bits per sample + + + + + Enables the source reader or sink writer to use hardware-based Media Foundation transforms (MFTs). + + + + + Contains additional format data for a media type. + + + + + Specifies for a media type whether each sample is independent of the other samples in the stream. + + + + + Specifies for a media type whether the samples have a fixed size. + + + + + Contains a DirectShow format GUID for a media type. + + + + + Specifies the preferred legacy format structure to use when converting an audio media type. + + + + + Specifies for a media type whether the media data is compressed. + + + + + Approximate data rate of the video stream, in bits per second, for a video media type. + + + + + Specifies the payload type of an Advanced Audio Coding (AAC) stream. + 0 - The stream contains raw_data_block elements only + 1 - Audio Data Transport Stream (ADTS). The stream contains an adts_sequence, as defined by MPEG-2. + 2 - Audio Data Interchange Format (ADIF). The stream contains an adif_sequence, as defined by MPEG-2. + 3 - The stream contains an MPEG-4 audio transport stream with a synchronization layer (LOAS) and a multiplex layer (LATM). + + + + + Specifies the audio profile and level of an Advanced Audio Coding (AAC) stream, as defined by ISO/IEC 14496-3. + + + + + Media Foundation Errors + + + + RANGES + 14000 - 14999 = General Media Foundation errors + 15000 - 15999 = ASF parsing errors + 16000 - 16999 = Media Source errors + 17000 - 17999 = MEDIAFOUNDATION Network Error Events + 18000 - 18999 = MEDIAFOUNDATION WMContainer Error Events + 19000 - 19999 = MEDIAFOUNDATION Media Sink Error Events + 20000 - 20999 = Renderer errors + 21000 - 21999 = Topology Errors + 25000 - 25999 = Timeline Errors + 26000 - 26999 = Unused + 28000 - 28999 = Transform errors + 29000 - 29999 = Content Protection errors + 40000 - 40999 = Clock errors + 41000 - 41999 = MF Quality Management Errors + 42000 - 42999 = MF Transcode API Errors + + + + + MessageId: MF_E_PLATFORM_NOT_INITIALIZED + + MessageText: + + Platform not initialized. Please call MFStartup().%0 + + + + + MessageId: MF_E_BUFFERTOOSMALL + + MessageText: + + The buffer was too small to carry out the requested action.%0 + + + + + MessageId: MF_E_INVALIDREQUEST + + MessageText: + + The request is invalid in the current state.%0 + + + + + MessageId: MF_E_INVALIDSTREAMNUMBER + + MessageText: + + The stream number provided was invalid.%0 + + + + + MessageId: MF_E_INVALIDMEDIATYPE + + MessageText: + + The data specified for the media type is invalid, inconsistent, or not supported by this object.%0 + + + + + MessageId: MF_E_NOTACCEPTING + + MessageText: + + The callee is currently not accepting further input.%0 + + + + + MessageId: MF_E_NOT_INITIALIZED + + MessageText: + + This object needs to be initialized before the requested operation can be carried out.%0 + + + + + MessageId: MF_E_UNSUPPORTED_REPRESENTATION + + MessageText: + + The requested representation is not supported by this object.%0 + + + + + MessageId: MF_E_NO_MORE_TYPES + + MessageText: + + An object ran out of media types to suggest therefore the requested chain of streaming objects cannot be completed.%0 + + + + + MessageId: MF_E_UNSUPPORTED_SERVICE + + MessageText: + + The object does not support the specified service.%0 + + + + + MessageId: MF_E_UNEXPECTED + + MessageText: + + An unexpected error has occurred in the operation requested.%0 + + + + + MessageId: MF_E_INVALIDNAME + + MessageText: + + Invalid name.%0 + + + + + MessageId: MF_E_INVALIDTYPE + + MessageText: + + Invalid type.%0 + + + + + MessageId: MF_E_INVALID_FILE_FORMAT + + MessageText: + + The file does not conform to the relevant file format specification. + + + + + MessageId: MF_E_INVALIDINDEX + + MessageText: + + Invalid index.%0 + + + + + MessageId: MF_E_INVALID_TIMESTAMP + + MessageText: + + An invalid timestamp was given.%0 + + + + + MessageId: MF_E_UNSUPPORTED_SCHEME + + MessageText: + + The scheme of the given URL is unsupported.%0 + + + + + MessageId: MF_E_UNSUPPORTED_BYTESTREAM_TYPE + + MessageText: + + The byte stream type of the given URL is unsupported.%0 + + + + + MessageId: MF_E_UNSUPPORTED_TIME_FORMAT + + MessageText: + + The given time format is unsupported.%0 + + + + + MessageId: MF_E_NO_SAMPLE_TIMESTAMP + + MessageText: + + The Media Sample does not have a timestamp.%0 + + + + + MessageId: MF_E_NO_SAMPLE_DURATION + + MessageText: + + The Media Sample does not have a duration.%0 + + + + + MessageId: MF_E_INVALID_STREAM_DATA + + MessageText: + + The request failed because the data in the stream is corrupt.%0\n. + + + + + MessageId: MF_E_RT_UNAVAILABLE + + MessageText: + + Real time services are not available.%0 + + + + + MessageId: MF_E_UNSUPPORTED_RATE + + MessageText: + + The specified rate is not supported.%0 + + + + + MessageId: MF_E_THINNING_UNSUPPORTED + + MessageText: + + This component does not support stream-thinning.%0 + + + + + MessageId: MF_E_REVERSE_UNSUPPORTED + + MessageText: + + The call failed because no reverse playback rates are available.%0 + + + + + MessageId: MF_E_UNSUPPORTED_RATE_TRANSITION + + MessageText: + + The requested rate transition cannot occur in the current state.%0 + + + + + MessageId: MF_E_RATE_CHANGE_PREEMPTED + + MessageText: + + The requested rate change has been pre-empted and will not occur.%0 + + + + + MessageId: MF_E_NOT_FOUND + + MessageText: + + The specified object or value does not exist.%0 + + + + + MessageId: MF_E_NOT_AVAILABLE + + MessageText: + + The requested value is not available.%0 + + + + + MessageId: MF_E_NO_CLOCK + + MessageText: + + The specified operation requires a clock and no clock is available.%0 + + + + + MessageId: MF_S_MULTIPLE_BEGIN + + MessageText: + + This callback and state had already been passed in to this event generator earlier.%0 + + + + + MessageId: MF_E_MULTIPLE_BEGIN + + MessageText: + + This callback has already been passed in to this event generator.%0 + + + + + MessageId: MF_E_MULTIPLE_SUBSCRIBERS + + MessageText: + + Some component is already listening to events on this event generator.%0 + + + + + MessageId: MF_E_TIMER_ORPHANED + + MessageText: + + This timer was orphaned before its callback time arrived.%0 + + + + + MessageId: MF_E_STATE_TRANSITION_PENDING + + MessageText: + + A state transition is already pending.%0 + + + + + MessageId: MF_E_UNSUPPORTED_STATE_TRANSITION + + MessageText: + + The requested state transition is unsupported.%0 + + + + + MessageId: MF_E_UNRECOVERABLE_ERROR_OCCURRED + + MessageText: + + An unrecoverable error has occurred.%0 + + + + + MessageId: MF_E_SAMPLE_HAS_TOO_MANY_BUFFERS + + MessageText: + + The provided sample has too many buffers.%0 + + + + + MessageId: MF_E_SAMPLE_NOT_WRITABLE + + MessageText: + + The provided sample is not writable.%0 + + + + + MessageId: MF_E_INVALID_KEY + + MessageText: + + The specified key is not valid. + + + + + MessageId: MF_E_BAD_STARTUP_VERSION + + MessageText: + + You are calling MFStartup with the wrong MF_VERSION. Mismatched bits? + + + + + MessageId: MF_E_UNSUPPORTED_CAPTION + + MessageText: + + The caption of the given URL is unsupported.%0 + + + + + MessageId: MF_E_INVALID_POSITION + + MessageText: + + The operation on the current offset is not permitted.%0 + + + + + MessageId: MF_E_ATTRIBUTENOTFOUND + + MessageText: + + The requested attribute was not found.%0 + + + + + MessageId: MF_E_PROPERTY_TYPE_NOT_ALLOWED + + MessageText: + + The specified property type is not allowed in this context.%0 + + + + + MessageId: MF_E_PROPERTY_TYPE_NOT_SUPPORTED + + MessageText: + + The specified property type is not supported.%0 + + + + + MessageId: MF_E_PROPERTY_EMPTY + + MessageText: + + The specified property is empty.%0 + + + + + MessageId: MF_E_PROPERTY_NOT_EMPTY + + MessageText: + + The specified property is not empty.%0 + + + + + MessageId: MF_E_PROPERTY_VECTOR_NOT_ALLOWED + + MessageText: + + The vector property specified is not allowed in this context.%0 + + + + + MessageId: MF_E_PROPERTY_VECTOR_REQUIRED + + MessageText: + + A vector property is required in this context.%0 + + + + + MessageId: MF_E_OPERATION_CANCELLED + + MessageText: + + The operation is cancelled.%0 + + + + + MessageId: MF_E_BYTESTREAM_NOT_SEEKABLE + + MessageText: + + The provided bytestream was expected to be seekable and it is not.%0 + + + + + MessageId: MF_E_DISABLED_IN_SAFEMODE + + MessageText: + + The Media Foundation platform is disabled when the system is running in Safe Mode.%0 + + + + + MessageId: MF_E_CANNOT_PARSE_BYTESTREAM + + MessageText: + + The Media Source could not parse the byte stream.%0 + + + + + MessageId: MF_E_SOURCERESOLVER_MUTUALLY_EXCLUSIVE_FLAGS + + MessageText: + + Mutually exclusive flags have been specified to source resolver. This flag combination is invalid.%0 + + + + + MessageId: MF_E_MEDIAPROC_WRONGSTATE + + MessageText: + + MediaProc is in the wrong state%0 + + + + + MessageId: MF_E_RT_THROUGHPUT_NOT_AVAILABLE + + MessageText: + + Real time I/O service can not provide requested throughput.%0 + + + + + MessageId: MF_E_RT_TOO_MANY_CLASSES + + MessageText: + + The workqueue cannot be registered with more classes.%0 + + + + + MessageId: MF_E_RT_WOULDBLOCK + + MessageText: + + This operation cannot succeed because another thread owns this object.%0 + + + + + MessageId: MF_E_NO_BITPUMP + + MessageText: + + Internal. Bitpump not found.%0 + + + + + MessageId: MF_E_RT_OUTOFMEMORY + + MessageText: + + No more RT memory available.%0 + + + + + MessageId: MF_E_RT_WORKQUEUE_CLASS_NOT_SPECIFIED + + MessageText: + + An MMCSS class has not been set for this work queue.%0 + + + + + MessageId: MF_E_INSUFFICIENT_BUFFER + + MessageText: + + Insufficient memory for response.%0 + + + + + MessageId: MF_E_CANNOT_CREATE_SINK + + MessageText: + + Activate failed to create mediasink. Call OutputNode::GetUINT32(MF_TOPONODE_MAJORTYPE) for more information. %0 + + + + + MessageId: MF_E_BYTESTREAM_UNKNOWN_LENGTH + + MessageText: + + The length of the provided bytestream is unknown.%0 + + + + + MessageId: MF_E_SESSION_PAUSEWHILESTOPPED + + MessageText: + + The media session cannot pause from a stopped state.%0 + + + + + MessageId: MF_S_ACTIVATE_REPLACED + + MessageText: + + The activate could not be created in the remote process for some reason it was replaced with empty one.%0 + + + + + MessageId: MF_E_FORMAT_CHANGE_NOT_SUPPORTED + + MessageText: + + The data specified for the media type is supported, but would require a format change, which is not supported by this object.%0 + + + + + MessageId: MF_E_INVALID_WORKQUEUE + + MessageText: + + The operation failed because an invalid combination of workqueue ID and flags was specified.%0 + + + + + MessageId: MF_E_DRM_UNSUPPORTED + + MessageText: + + No DRM support is available.%0 + + + + + MessageId: MF_E_UNAUTHORIZED + + MessageText: + + This operation is not authorized.%0 + + + + + MessageId: MF_E_OUT_OF_RANGE + + MessageText: + + The value is not in the specified or valid range.%0 + + + + + MessageId: MF_E_INVALID_CODEC_MERIT + + MessageText: + + The registered codec merit is not valid.%0 + + + + + MessageId: MF_E_HW_MFT_FAILED_START_STREAMING + + MessageText: + + Hardware MFT failed to start streaming due to lack of hardware resources.%0 + + + + + MessageId: MF_S_ASF_PARSEINPROGRESS + + MessageText: + + Parsing is still in progress and is not yet complete.%0 + + + + + MessageId: MF_E_ASF_PARSINGINCOMPLETE + + MessageText: + + Not enough data have been parsed to carry out the requested action.%0 + + + + + MessageId: MF_E_ASF_MISSINGDATA + + MessageText: + + There is a gap in the ASF data provided.%0 + + + + + MessageId: MF_E_ASF_INVALIDDATA + + MessageText: + + The data provided are not valid ASF.%0 + + + + + MessageId: MF_E_ASF_OPAQUEPACKET + + MessageText: + + The packet is opaque, so the requested information cannot be returned.%0 + + + + + MessageId: MF_E_ASF_NOINDEX + + MessageText: + + The requested operation failed since there is no appropriate ASF index.%0 + + + + + MessageId: MF_E_ASF_OUTOFRANGE + + MessageText: + + The value supplied is out of range for this operation.%0 + + + + + MessageId: MF_E_ASF_INDEXNOTLOADED + + MessageText: + + The index entry requested needs to be loaded before it can be available.%0 + + + + + MessageId: MF_E_ASF_TOO_MANY_PAYLOADS + + MessageText: + + The packet has reached the maximum number of payloads.%0 + + + + + MessageId: MF_E_ASF_UNSUPPORTED_STREAM_TYPE + + MessageText: + + Stream type is not supported.%0 + + + + + MessageId: MF_E_ASF_DROPPED_PACKET + + MessageText: + + One or more ASF packets were dropped.%0 + + + + + MessageId: MF_E_NO_EVENTS_AVAILABLE + + MessageText: + + There are no events available in the queue.%0 + + + + + MessageId: MF_E_INVALID_STATE_TRANSITION + + MessageText: + + A media source cannot go from the stopped state to the paused state.%0 + + + + + MessageId: MF_E_END_OF_STREAM + + MessageText: + + The media stream cannot process any more samples because there are no more samples in the stream.%0 + + + + + MessageId: MF_E_SHUTDOWN + + MessageText: + + The request is invalid because Shutdown() has been called.%0 + + + + + MessageId: MF_E_MP3_NOTFOUND + + MessageText: + + The MP3 object was not found.%0 + + + + + MessageId: MF_E_MP3_OUTOFDATA + + MessageText: + + The MP3 parser ran out of data before finding the MP3 object.%0 + + + + + MessageId: MF_E_MP3_NOTMP3 + + MessageText: + + The file is not really a MP3 file.%0 + + + + + MessageId: MF_E_MP3_NOTSUPPORTED + + MessageText: + + The MP3 file is not supported.%0 + + + + + MessageId: MF_E_NO_DURATION + + MessageText: + + The Media stream has no duration.%0 + + + + + MessageId: MF_E_INVALID_FORMAT + + MessageText: + + The Media format is recognized but is invalid.%0 + + + + + MessageId: MF_E_PROPERTY_NOT_FOUND + + MessageText: + + The property requested was not found.%0 + + + + + MessageId: MF_E_PROPERTY_READ_ONLY + + MessageText: + + The property is read only.%0 + + + + + MessageId: MF_E_PROPERTY_NOT_ALLOWED + + MessageText: + + The specified property is not allowed in this context.%0 + + + + + MessageId: MF_E_MEDIA_SOURCE_NOT_STARTED + + MessageText: + + The media source is not started.%0 + + + + + MessageId: MF_E_UNSUPPORTED_FORMAT + + MessageText: + + The Media format is recognized but not supported.%0 + + + + + MessageId: MF_E_MP3_BAD_CRC + + MessageText: + + The MPEG frame has bad CRC.%0 + + + + + MessageId: MF_E_NOT_PROTECTED + + MessageText: + + The file is not protected.%0 + + + + + MessageId: MF_E_MEDIA_SOURCE_WRONGSTATE + + MessageText: + + The media source is in the wrong state%0 + + + + + MessageId: MF_E_MEDIA_SOURCE_NO_STREAMS_SELECTED + + MessageText: + + No streams are selected in source presentation descriptor.%0 + + + + + MessageId: MF_E_CANNOT_FIND_KEYFRAME_SAMPLE + + MessageText: + + No key frame sample was found.%0 + + + + + MessageId: MF_E_NETWORK_RESOURCE_FAILURE + + MessageText: + + An attempt to acquire a network resource failed.%0 + + + + + MessageId: MF_E_NET_WRITE + + MessageText: + + Error writing to the network.%0 + + + + + MessageId: MF_E_NET_READ + + MessageText: + + Error reading from the network.%0 + + + + + MessageId: MF_E_NET_REQUIRE_NETWORK + + MessageText: + + Internal. Entry cannot complete operation without network.%0 + + + + + MessageId: MF_E_NET_REQUIRE_ASYNC + + MessageText: + + Internal. Async op is required.%0 + + + + + MessageId: MF_E_NET_BWLEVEL_NOT_SUPPORTED + + MessageText: + + Internal. Bandwidth levels are not supported.%0 + + + + + MessageId: MF_E_NET_STREAMGROUPS_NOT_SUPPORTED + + MessageText: + + Internal. Stream groups are not supported.%0 + + + + + MessageId: MF_E_NET_MANUALSS_NOT_SUPPORTED + + MessageText: + + Manual stream selection is not supported.%0 + + + + + MessageId: MF_E_NET_INVALID_PRESENTATION_DESCRIPTOR + + MessageText: + + Invalid presentation descriptor.%0 + + + + + MessageId: MF_E_NET_CACHESTREAM_NOT_FOUND + + MessageText: + + Cannot find cache stream.%0 + + + + + MessageId: MF_I_MANUAL_PROXY + + MessageText: + + The proxy setting is manual.%0 + + + + duplicate removed + MessageId=17011 Severity=Informational Facility=MEDIAFOUNDATION SymbolicName=MF_E_INVALID_REQUEST + Language=English + The request is invalid in the current state.%0 + . + + MessageId: MF_E_NET_REQUIRE_INPUT + + MessageText: + + Internal. Entry cannot complete operation without input.%0 + + + + + MessageId: MF_E_NET_REDIRECT + + MessageText: + + The client redirected to another server.%0 + + + + + MessageId: MF_E_NET_REDIRECT_TO_PROXY + + MessageText: + + The client is redirected to a proxy server.%0 + + + + + MessageId: MF_E_NET_TOO_MANY_REDIRECTS + + MessageText: + + The client reached maximum redirection limit.%0 + + + + + MessageId: MF_E_NET_TIMEOUT + + MessageText: + + The server, a computer set up to offer multimedia content to other computers, could not handle your request for multimedia content in a timely manner. Please try again later.%0 + + + + + MessageId: MF_E_NET_CLIENT_CLOSE + + MessageText: + + The control socket is closed by the client.%0 + + + + + MessageId: MF_E_NET_BAD_CONTROL_DATA + + MessageText: + + The server received invalid data from the client on the control connection.%0 + + + + + MessageId: MF_E_NET_INCOMPATIBLE_SERVER + + MessageText: + + The server is not a compatible streaming media server.%0 + + + + + MessageId: MF_E_NET_UNSAFE_URL + + MessageText: + + Url.%0 + + + + + MessageId: MF_E_NET_CACHE_NO_DATA + + MessageText: + + Data is not available.%0 + + + + + MessageId: MF_E_NET_EOL + + MessageText: + + End of line.%0 + + + + + MessageId: MF_E_NET_BAD_REQUEST + + MessageText: + + The request could not be understood by the server.%0 + + + + + MessageId: MF_E_NET_INTERNAL_SERVER_ERROR + + MessageText: + + The server encountered an unexpected condition which prevented it from fulfilling the request.%0 + + + + + MessageId: MF_E_NET_SESSION_NOT_FOUND + + MessageText: + + Session not found.%0 + + + + + MessageId: MF_E_NET_NOCONNECTION + + MessageText: + + There is no connection established with the Windows Media server. The operation failed.%0 + + + + + MessageId: MF_E_NET_CONNECTION_FAILURE + + MessageText: + + The network connection has failed.%0 + + + + + MessageId: MF_E_NET_INCOMPATIBLE_PUSHSERVER + + MessageText: + + The Server service that received the HTTP push request is not a compatible version of Windows Media Services (WMS). This error may indicate the push request was received by IIS instead of WMS. Ensure WMS is started and has the HTTP Server control protocol properly enabled and try again.%0 + + + + + MessageId: MF_E_NET_SERVER_ACCESSDENIED + + MessageText: + + The Windows Media server is denying access. The username and/or password might be incorrect.%0 + + + + + MessageId: MF_E_NET_PROXY_ACCESSDENIED + + MessageText: + + The proxy server is denying access. The username and/or password might be incorrect.%0 + + + + + MessageId: MF_E_NET_CANNOTCONNECT + + MessageText: + + Unable to establish a connection to the server.%0 + + + + + MessageId: MF_E_NET_INVALID_PUSH_TEMPLATE + + MessageText: + + The specified push template is invalid.%0 + + + + + MessageId: MF_E_NET_INVALID_PUSH_PUBLISHING_POINT + + MessageText: + + The specified push publishing point is invalid.%0 + + + + + MessageId: MF_E_NET_BUSY + + MessageText: + + The requested resource is in use.%0 + + + + + MessageId: MF_E_NET_RESOURCE_GONE + + MessageText: + + The Publishing Point or file on the Windows Media Server is no longer available.%0 + + + + + MessageId: MF_E_NET_ERROR_FROM_PROXY + + MessageText: + + The proxy experienced an error while attempting to contact the media server.%0 + + + + + MessageId: MF_E_NET_PROXY_TIMEOUT + + MessageText: + + The proxy did not receive a timely response while attempting to contact the media server.%0 + + + + + MessageId: MF_E_NET_SERVER_UNAVAILABLE + + MessageText: + + The server is currently unable to handle the request due to a temporary overloading or maintenance of the server.%0 + + + + + MessageId: MF_E_NET_TOO_MUCH_DATA + + MessageText: + + The encoding process was unable to keep up with the amount of supplied data.%0 + + + + + MessageId: MF_E_NET_SESSION_INVALID + + MessageText: + + Session not found.%0 + + + + + MessageId: MF_E_OFFLINE_MODE + + MessageText: + + The requested URL is not available in offline mode.%0 + + + + + MessageId: MF_E_NET_UDP_BLOCKED + + MessageText: + + A device in the network is blocking UDP traffic.%0 + + + + + MessageId: MF_E_NET_UNSUPPORTED_CONFIGURATION + + MessageText: + + The specified configuration value is not supported.%0 + + + + + MessageId: MF_E_NET_PROTOCOL_DISABLED + + MessageText: + + The networking protocol is disabled.%0 + + + + + MessageId: MF_E_ALREADY_INITIALIZED + + MessageText: + + This object has already been initialized and cannot be re-initialized at this time.%0 + + + + + MessageId: MF_E_BANDWIDTH_OVERRUN + + MessageText: + + The amount of data passed in exceeds the given bitrate and buffer window.%0 + + + + + MessageId: MF_E_LATE_SAMPLE + + MessageText: + + The sample was passed in too late to be correctly processed.%0 + + + + + MessageId: MF_E_FLUSH_NEEDED + + MessageText: + + The requested action cannot be carried out until the object is flushed and the queue is emptied.%0 + + + + + MessageId: MF_E_INVALID_PROFILE + + MessageText: + + The profile is invalid.%0 + + + + + MessageId: MF_E_INDEX_NOT_COMMITTED + + MessageText: + + The index that is being generated needs to be committed before the requested action can be carried out.%0 + + + + + MessageId: MF_E_NO_INDEX + + MessageText: + + The index that is necessary for the requested action is not found.%0 + + + + + MessageId: MF_E_CANNOT_INDEX_IN_PLACE + + MessageText: + + The requested index cannot be added in-place to the specified ASF content.%0 + + + + + MessageId: MF_E_MISSING_ASF_LEAKYBUCKET + + MessageText: + + The ASF leaky bucket parameters must be specified in order to carry out this request.%0 + + + + + MessageId: MF_E_INVALID_ASF_STREAMID + + MessageText: + + The stream id is invalid. The valid range for ASF stream id is from 1 to 127.%0 + + + + + MessageId: MF_E_STREAMSINK_REMOVED + + MessageText: + + The requested Stream Sink has been removed and cannot be used.%0 + + + + + MessageId: MF_E_STREAMSINKS_OUT_OF_SYNC + + MessageText: + + The various Stream Sinks in this Media Sink are too far out of sync for the requested action to take place.%0 + + + + + MessageId: MF_E_STREAMSINKS_FIXED + + MessageText: + + Stream Sinks cannot be added to or removed from this Media Sink because its set of streams is fixed.%0 + + + + + MessageId: MF_E_STREAMSINK_EXISTS + + MessageText: + + The given Stream Sink already exists.%0 + + + + + MessageId: MF_E_SAMPLEALLOCATOR_CANCELED + + MessageText: + + Sample allocations have been canceled.%0 + + + + + MessageId: MF_E_SAMPLEALLOCATOR_EMPTY + + MessageText: + + The sample allocator is currently empty, due to outstanding requests.%0 + + + + + MessageId: MF_E_SINK_ALREADYSTOPPED + + MessageText: + + When we try to sopt a stream sink, it is already stopped %0 + + + + + MessageId: MF_E_ASF_FILESINK_BITRATE_UNKNOWN + + MessageText: + + The ASF file sink could not reserve AVIO because the bitrate is unknown.%0 + + + + + MessageId: MF_E_SINK_NO_STREAMS + + MessageText: + + No streams are selected in sink presentation descriptor.%0 + + + + + MessageId: MF_S_SINK_NOT_FINALIZED + + MessageText: + + The sink has not been finalized before shut down. This may cause sink generate a corrupted content.%0 + + + + + MessageId: MF_E_METADATA_TOO_LONG + + MessageText: + + A metadata item was too long to write to the output container.%0 + + + + + MessageId: MF_E_SINK_NO_SAMPLES_PROCESSED + + MessageText: + + The operation failed because no samples were processed by the sink.%0 + + + + + MessageId: MF_E_VIDEO_REN_NO_PROCAMP_HW + + MessageText: + + There is no available procamp hardware with which to perform color correction.%0 + + + + + MessageId: MF_E_VIDEO_REN_NO_DEINTERLACE_HW + + MessageText: + + There is no available deinterlacing hardware with which to deinterlace the video stream.%0 + + + + + MessageId: MF_E_VIDEO_REN_COPYPROT_FAILED + + MessageText: + + A video stream requires copy protection to be enabled, but there was a failure in attempting to enable copy protection.%0 + + + + + MessageId: MF_E_VIDEO_REN_SURFACE_NOT_SHARED + + MessageText: + + A component is attempting to access a surface for sharing that is not shared.%0 + + + + + MessageId: MF_E_VIDEO_DEVICE_LOCKED + + MessageText: + + A component is attempting to access a shared device that is already locked by another component.%0 + + + + + MessageId: MF_E_NEW_VIDEO_DEVICE + + MessageText: + + The device is no longer available. The handle should be closed and a new one opened.%0 + + + + + MessageId: MF_E_NO_VIDEO_SAMPLE_AVAILABLE + + MessageText: + + A video sample is not currently queued on a stream that is required for mixing.%0 + + + + + MessageId: MF_E_NO_AUDIO_PLAYBACK_DEVICE + + MessageText: + + No audio playback device was found.%0 + + + + + MessageId: MF_E_AUDIO_PLAYBACK_DEVICE_IN_USE + + MessageText: + + The requested audio playback device is currently in use.%0 + + + + + MessageId: MF_E_AUDIO_PLAYBACK_DEVICE_INVALIDATED + + MessageText: + + The audio playback device is no longer present.%0 + + + + + MessageId: MF_E_AUDIO_SERVICE_NOT_RUNNING + + MessageText: + + The audio service is not running.%0 + + + + + MessageId: MF_E_TOPO_INVALID_OPTIONAL_NODE + + MessageText: + + The topology contains an invalid optional node. Possible reasons are incorrect number of outputs and inputs or optional node is at the beginning or end of a segment. %0 + + + + + MessageId: MF_E_TOPO_CANNOT_FIND_DECRYPTOR + + MessageText: + + No suitable transform was found to decrypt the content. %0 + + + + + MessageId: MF_E_TOPO_CODEC_NOT_FOUND + + MessageText: + + No suitable transform was found to encode or decode the content. %0 + + + + + MessageId: MF_E_TOPO_CANNOT_CONNECT + + MessageText: + + Unable to find a way to connect nodes%0 + + + + + MessageId: MF_E_TOPO_UNSUPPORTED + + MessageText: + + Unsupported operations in topoloader%0 + + + + + MessageId: MF_E_TOPO_INVALID_TIME_ATTRIBUTES + + MessageText: + + The topology or its nodes contain incorrectly set time attributes%0 + + + + + MessageId: MF_E_TOPO_LOOPS_IN_TOPOLOGY + + MessageText: + + The topology contains loops, which are unsupported in media foundation topologies%0 + + + + + MessageId: MF_E_TOPO_MISSING_PRESENTATION_DESCRIPTOR + + MessageText: + + A source stream node in the topology does not have a presentation descriptor%0 + + + + + MessageId: MF_E_TOPO_MISSING_STREAM_DESCRIPTOR + + MessageText: + + A source stream node in the topology does not have a stream descriptor%0 + + + + + MessageId: MF_E_TOPO_STREAM_DESCRIPTOR_NOT_SELECTED + + MessageText: + + A stream descriptor was set on a source stream node but it was not selected on the presentation descriptor%0 + + + + + MessageId: MF_E_TOPO_MISSING_SOURCE + + MessageText: + + A source stream node in the topology does not have a source%0 + + + + + MessageId: MF_E_TOPO_SINK_ACTIVATES_UNSUPPORTED + + MessageText: + + The topology loader does not support sink activates on output nodes.%0 + + + + + MessageId: MF_E_SEQUENCER_UNKNOWN_SEGMENT_ID + + MessageText: + + The sequencer cannot find a segment with the given ID.%0\n. + + + + + MessageId: MF_S_SEQUENCER_CONTEXT_CANCELED + + MessageText: + + The context was canceled.%0\n. + + + + + MessageId: MF_E_NO_SOURCE_IN_CACHE + + MessageText: + + Cannot find source in source cache.%0\n. + + + + + MessageId: MF_S_SEQUENCER_SEGMENT_AT_END_OF_STREAM + + MessageText: + + Cannot update topology flags.%0\n. + + + + + MessageId: MF_E_TRANSFORM_TYPE_NOT_SET + + MessageText: + + A valid type has not been set for this stream or a stream that it depends on.%0 + + + + + MessageId: MF_E_TRANSFORM_STREAM_CHANGE + + MessageText: + + A stream change has occurred. Output cannot be produced until the streams have been renegotiated.%0 + + + + + MessageId: MF_E_TRANSFORM_INPUT_REMAINING + + MessageText: + + The transform cannot take the requested action until all of the input data it currently holds is processed or flushed.%0 + + + + + MessageId: MF_E_TRANSFORM_PROFILE_MISSING + + MessageText: + + The transform requires a profile but no profile was supplied or found.%0 + + + + + MessageId: MF_E_TRANSFORM_PROFILE_INVALID_OR_CORRUPT + + MessageText: + + The transform requires a profile but the supplied profile was invalid or corrupt.%0 + + + + + MessageId: MF_E_TRANSFORM_PROFILE_TRUNCATED + + MessageText: + + The transform requires a profile but the supplied profile ended unexpectedly while parsing.%0 + + + + + MessageId: MF_E_TRANSFORM_PROPERTY_PID_NOT_RECOGNIZED + + MessageText: + + The property ID does not match any property supported by the transform.%0 + + + + + MessageId: MF_E_TRANSFORM_PROPERTY_VARIANT_TYPE_WRONG + + MessageText: + + The variant does not have the type expected for this property ID.%0 + + + + + MessageId: MF_E_TRANSFORM_PROPERTY_NOT_WRITEABLE + + MessageText: + + An attempt was made to set the value on a read-only property.%0 + + + + + MessageId: MF_E_TRANSFORM_PROPERTY_ARRAY_VALUE_WRONG_NUM_DIM + + MessageText: + + The array property value has an unexpected number of dimensions.%0 + + + + + MessageId: MF_E_TRANSFORM_PROPERTY_VALUE_SIZE_WRONG + + MessageText: + + The array or blob property value has an unexpected size.%0 + + + + + MessageId: MF_E_TRANSFORM_PROPERTY_VALUE_OUT_OF_RANGE + + MessageText: + + The property value is out of range for this transform.%0 + + + + + MessageId: MF_E_TRANSFORM_PROPERTY_VALUE_INCOMPATIBLE + + MessageText: + + The property value is incompatible with some other property or mediatype set on the transform.%0 + + + + + MessageId: MF_E_TRANSFORM_NOT_POSSIBLE_FOR_CURRENT_OUTPUT_MEDIATYPE + + MessageText: + + The requested operation is not supported for the currently set output mediatype.%0 + + + + + MessageId: MF_E_TRANSFORM_NOT_POSSIBLE_FOR_CURRENT_INPUT_MEDIATYPE + + MessageText: + + The requested operation is not supported for the currently set input mediatype.%0 + + + + + MessageId: MF_E_TRANSFORM_NOT_POSSIBLE_FOR_CURRENT_MEDIATYPE_COMBINATION + + MessageText: + + The requested operation is not supported for the currently set combination of mediatypes.%0 + + + + + MessageId: MF_E_TRANSFORM_CONFLICTS_WITH_OTHER_CURRENTLY_ENABLED_FEATURES + + MessageText: + + The requested feature is not supported in combination with some other currently enabled feature.%0 + + + + + MessageId: MF_E_TRANSFORM_NEED_MORE_INPUT + + MessageText: + + The transform cannot produce output until it gets more input samples.%0 + + + + + MessageId: MF_E_TRANSFORM_NOT_POSSIBLE_FOR_CURRENT_SPKR_CONFIG + + MessageText: + + The requested operation is not supported for the current speaker configuration.%0 + + + + + MessageId: MF_E_TRANSFORM_CANNOT_CHANGE_MEDIATYPE_WHILE_PROCESSING + + MessageText: + + The transform cannot accept mediatype changes in the middle of processing.%0 + + + + + MessageId: MF_S_TRANSFORM_DO_NOT_PROPAGATE_EVENT + + MessageText: + + The caller should not propagate this event to downstream components.%0 + + + + + MessageId: MF_E_UNSUPPORTED_D3D_TYPE + + MessageText: + + The input type is not supported for D3D device.%0 + + + + + MessageId: MF_E_TRANSFORM_ASYNC_LOCKED + + MessageText: + + The caller does not appear to support this transform's asynchronous capabilities.%0 + + + + + MessageId: MF_E_TRANSFORM_CANNOT_INITIALIZE_ACM_DRIVER + + MessageText: + + An audio compression manager driver could not be initialized by the transform.%0 + + + + + MessageId: MF_E_LICENSE_INCORRECT_RIGHTS + + MessageText: + + You are not allowed to open this file. Contact the content provider for further assistance.%0 + + + + + MessageId: MF_E_LICENSE_OUTOFDATE + + MessageText: + + The license for this media file has expired. Get a new license or contact the content provider for further assistance.%0 + + + + + MessageId: MF_E_LICENSE_REQUIRED + + MessageText: + + You need a license to perform the requested operation on this media file.%0 + + + + + MessageId: MF_E_DRM_HARDWARE_INCONSISTENT + + MessageText: + + The licenses for your media files are corrupted. Contact Microsoft product support.%0 + + + + + MessageId: MF_E_NO_CONTENT_PROTECTION_MANAGER + + MessageText: + + The APP needs to provide IMFContentProtectionManager callback to access the protected media file.%0 + + + + + MessageId: MF_E_LICENSE_RESTORE_NO_RIGHTS + + MessageText: + + Client does not have rights to restore licenses.%0 + + + + + MessageId: MF_E_BACKUP_RESTRICTED_LICENSE + + MessageText: + + Licenses are restricted and hence can not be backed up.%0 + + + + + MessageId: MF_E_LICENSE_RESTORE_NEEDS_INDIVIDUALIZATION + + MessageText: + + License restore requires machine to be individualized.%0 + + + + + MessageId: MF_S_PROTECTION_NOT_REQUIRED + + MessageText: + + Protection for stream is not required.%0 + + + + + MessageId: MF_E_COMPONENT_REVOKED + + MessageText: + + Component is revoked.%0 + + + + + MessageId: MF_E_TRUST_DISABLED + + MessageText: + + Trusted functionality is currently disabled on this component.%0 + + + + + MessageId: MF_E_WMDRMOTA_NO_ACTION + + MessageText: + + No Action is set on WMDRM Output Trust Authority.%0 + + + + + MessageId: MF_E_WMDRMOTA_ACTION_ALREADY_SET + + MessageText: + + Action is already set on WMDRM Output Trust Authority.%0 + + + + + MessageId: MF_E_WMDRMOTA_DRM_HEADER_NOT_AVAILABLE + + MessageText: + + DRM Heaader is not available.%0 + + + + + MessageId: MF_E_WMDRMOTA_DRM_ENCRYPTION_SCHEME_NOT_SUPPORTED + + MessageText: + + Current encryption scheme is not supported.%0 + + + + + MessageId: MF_E_WMDRMOTA_ACTION_MISMATCH + + MessageText: + + Action does not match with current configuration.%0 + + + + + MessageId: MF_E_WMDRMOTA_INVALID_POLICY + + MessageText: + + Invalid policy for WMDRM Output Trust Authority.%0 + + + + + MessageId: MF_E_POLICY_UNSUPPORTED + + MessageText: + + The policies that the Input Trust Authority requires to be enforced are unsupported by the outputs.%0 + + + + + MessageId: MF_E_OPL_NOT_SUPPORTED + + MessageText: + + The OPL that the license requires to be enforced are not supported by the Input Trust Authority.%0 + + + + + MessageId: MF_E_TOPOLOGY_VERIFICATION_FAILED + + MessageText: + + The topology could not be successfully verified.%0 + + + + + MessageId: MF_E_SIGNATURE_VERIFICATION_FAILED + + MessageText: + + Signature verification could not be completed successfully for this component.%0 + + + + + MessageId: MF_E_DEBUGGING_NOT_ALLOWED + + MessageText: + + Running this process under a debugger while using protected content is not allowed.%0 + + + + + MessageId: MF_E_CODE_EXPIRED + + MessageText: + + MF component has expired.%0 + + + + + MessageId: MF_E_GRL_VERSION_TOO_LOW + + MessageText: + + The current GRL on the machine does not meet the minimum version requirements.%0 + + + + + MessageId: MF_E_GRL_RENEWAL_NOT_FOUND + + MessageText: + + The current GRL on the machine does not contain any renewal entries for the specified revocation.%0 + + + + + MessageId: MF_E_GRL_EXTENSIBLE_ENTRY_NOT_FOUND + + MessageText: + + The current GRL on the machine does not contain any extensible entries for the specified extension GUID.%0 + + + + + MessageId: MF_E_KERNEL_UNTRUSTED + + MessageText: + + The kernel isn't secure for high security level content.%0 + + + + + MessageId: MF_E_PEAUTH_UNTRUSTED + + MessageText: + + The response from protected environment driver isn't valid.%0 + + + + + MessageId: MF_E_NON_PE_PROCESS + + MessageText: + + A non-PE process tried to talk to PEAuth.%0 + + + + + MessageId: MF_E_REBOOT_REQUIRED + + MessageText: + + We need to reboot the machine.%0 + + + + + MessageId: MF_S_WAIT_FOR_POLICY_SET + + MessageText: + + Protection for this stream is not guaranteed to be enforced until the MEPolicySet event is fired.%0 + + + + + MessageId: MF_S_VIDEO_DISABLED_WITH_UNKNOWN_SOFTWARE_OUTPUT + + MessageText: + + This video stream is disabled because it is being sent to an unknown software output.%0 + + + + + MessageId: MF_E_GRL_INVALID_FORMAT + + MessageText: + + The GRL file is not correctly formed, it may have been corrupted or overwritten.%0 + + + + + MessageId: MF_E_GRL_UNRECOGNIZED_FORMAT + + MessageText: + + The GRL file is in a format newer than those recognized by this GRL Reader.%0 + + + + + MessageId: MF_E_ALL_PROCESS_RESTART_REQUIRED + + MessageText: + + The GRL was reloaded and required all processes that can run protected media to restart.%0 + + + + + MessageId: MF_E_PROCESS_RESTART_REQUIRED + + MessageText: + + The GRL was reloaded and the current process needs to restart.%0 + + + + + MessageId: MF_E_USERMODE_UNTRUSTED + + MessageText: + + The user space is untrusted for protected content play.%0 + + + + + MessageId: MF_E_PEAUTH_SESSION_NOT_STARTED + + MessageText: + + PEAuth communication session hasn't been started.%0 + + + + + MessageId: MF_E_PEAUTH_PUBLICKEY_REVOKED + + MessageText: + + PEAuth's public key is revoked.%0 + + + + + MessageId: MF_E_GRL_ABSENT + + MessageText: + + The GRL is absent.%0 + + + + + MessageId: MF_S_PE_TRUSTED + + MessageText: + + The Protected Environment is trusted.%0 + + + + + MessageId: MF_E_PE_UNTRUSTED + + MessageText: + + The Protected Environment is untrusted.%0 + + + + + MessageId: MF_E_PEAUTH_NOT_STARTED + + MessageText: + + The Protected Environment Authorization service (PEAUTH) has not been started.%0 + + + + + MessageId: MF_E_INCOMPATIBLE_SAMPLE_PROTECTION + + MessageText: + + The sample protection algorithms supported by components are not compatible.%0 + + + + + MessageId: MF_E_PE_SESSIONS_MAXED + + MessageText: + + No more protected environment sessions can be supported.%0 + + + + + MessageId: MF_E_HIGH_SECURITY_LEVEL_CONTENT_NOT_ALLOWED + + MessageText: + + WMDRM ITA does not allow protected content with high security level for this release.%0 + + + + + MessageId: MF_E_TEST_SIGNED_COMPONENTS_NOT_ALLOWED + + MessageText: + + WMDRM ITA cannot allow the requested action for the content as one or more components is not properly signed.%0 + + + + + MessageId: MF_E_ITA_UNSUPPORTED_ACTION + + MessageText: + + WMDRM ITA does not support the requested action.%0 + + + + + MessageId: MF_E_ITA_ERROR_PARSING_SAP_PARAMETERS + + MessageText: + + WMDRM ITA encountered an error in parsing the Secure Audio Path parameters.%0 + + + + + MessageId: MF_E_POLICY_MGR_ACTION_OUTOFBOUNDS + + MessageText: + + The Policy Manager action passed in is invalid.%0 + + + + + MessageId: MF_E_BAD_OPL_STRUCTURE_FORMAT + + MessageText: + + The structure specifying Output Protection Level is not the correct format.%0 + + + + + MessageId: MF_E_ITA_UNRECOGNIZED_ANALOG_VIDEO_PROTECTION_GUID + + MessageText: + + WMDRM ITA does not recognize the Explicite Analog Video Output Protection guid specified in the license.%0 + + + + + MessageId: MF_E_NO_PMP_HOST + + MessageText: + + IMFPMPHost object not available.%0 + + + + + MessageId: MF_E_ITA_OPL_DATA_NOT_INITIALIZED + + MessageText: + + WMDRM ITA could not initialize the Output Protection Level data.%0 + + + + + MessageId: MF_E_ITA_UNRECOGNIZED_ANALOG_VIDEO_OUTPUT + + MessageText: + + WMDRM ITA does not recognize the Analog Video Output specified by the OTA.%0 + + + + + MessageId: MF_E_ITA_UNRECOGNIZED_DIGITAL_VIDEO_OUTPUT + + MessageText: + + WMDRM ITA does not recognize the Digital Video Output specified by the OTA.%0 + + + + + MessageId: MF_E_CLOCK_INVALID_CONTINUITY_KEY + + MessageText: + + The continuity key supplied is not currently valid.%0 + + + + + MessageId: MF_E_CLOCK_NO_TIME_SOURCE + + MessageText: + + No Presentation Time Source has been specified.%0 + + + + + MessageId: MF_E_CLOCK_STATE_ALREADY_SET + + MessageText: + + The clock is already in the requested state.%0 + + + + + MessageId: MF_E_CLOCK_NOT_SIMPLE + + MessageText: + + The clock has too many advanced features to carry out the request.%0 + + + + + MessageId: MF_S_CLOCK_STOPPED + + MessageText: + + Timer::SetTimer returns this success code if called happened while timer is stopped. Timer is not going to be dispatched until clock is running%0 + + + + + MessageId: MF_E_NO_MORE_DROP_MODES + + MessageText: + + The component does not support any more drop modes.%0 + + + + + MessageId: MF_E_NO_MORE_QUALITY_LEVELS + + MessageText: + + The component does not support any more quality levels.%0 + + + + + MessageId: MF_E_DROPTIME_NOT_SUPPORTED + + MessageText: + + The component does not support drop time functionality.%0 + + + + + MessageId: MF_E_QUALITYKNOB_WAIT_LONGER + + MessageText: + + Quality Manager needs to wait longer before bumping the Quality Level up.%0 + + + + + MessageId: MF_E_QM_INVALIDSTATE + + MessageText: + + Quality Manager is in an invalid state. Quality Management is off at this moment.%0 + + + + + MessageId: MF_E_TRANSCODE_NO_CONTAINERTYPE + + MessageText: + + No transcode output container type is specified.%0 + + + + + MessageId: MF_E_TRANSCODE_PROFILE_NO_MATCHING_STREAMS + + MessageText: + + The profile does not have a media type configuration for any selected source streams.%0 + + + + + MessageId: MF_E_TRANSCODE_NO_MATCHING_ENCODER + + MessageText: + + Cannot find an encoder MFT that accepts the user preferred output type.%0 + + + + + MessageId: MF_E_ALLOCATOR_NOT_INITIALIZED + + MessageText: + + Memory allocator is not initialized.%0 + + + + + MessageId: MF_E_ALLOCATOR_NOT_COMMITED + + MessageText: + + Memory allocator is not committed yet.%0 + + + + + MessageId: MF_E_ALLOCATOR_ALREADY_COMMITED + + MessageText: + + Memory allocator has already been committed.%0 + + + + + MessageId: MF_E_STREAM_ERROR + + MessageText: + + An error occurred in media stream.%0 + + + + + MessageId: MF_E_INVALID_STREAM_STATE + + MessageText: + + Stream is not in a state to handle the request.%0 + + + + + MessageId: MF_E_HW_STREAM_NOT_CONNECTED + + MessageText: + + Hardware stream is not connected yet.%0 + + + + + Main interface for using Media Foundation with NAudio + + + + + initializes MediaFoundation - only needs to be called once per process + + + + + Enumerate the installed MediaFoundation transforms in the specified category + + A category from MediaFoundationTransformCategories + + + + + uninitializes MediaFoundation + + + + + Creates a Media type + + + + + Creates a media type from a WaveFormat + + + + + Creates a memory buffer of the specified size + + Memory buffer size in bytes + The memory buffer + + + + Creates a sample object + + The sample object + + + + Creates a new attributes store + + Initial size + The attributes store + + + + Creates a media foundation byte stream based on a stream object + (usable with WinRT streams) + + The input stream + A media foundation byte stream + + + + Creates a source reader based on a byte stream + + The byte stream + A media foundation source reader + + + + Interop definitions for MediaFoundation + thanks to Lucian Wischik for the initial work on many of these definitions (also various interfaces) + n.b. the goal is to make as much of this internal as possible, and provide + better .NET APIs using the MediaFoundationApi class instead + + + + + All streams + + + + + First audio stream + + + + + First video stream + + + + + Media source + + + + + Media Foundation SDK Version + + + + + Media Foundation API Version + + + + + Media Foundation Version + + + + + Initializes Microsoft Media Foundation. + + + + + Shuts down the Microsoft Media Foundation platform + + + + + Creates an empty media type. + + + + + Initializes a media type from a WAVEFORMATEX structure. + + + + + Converts a Media Foundation audio media type to a WAVEFORMATEX structure. + + TODO: try making second parameter out WaveFormatExtraData + + + + Creates the source reader from a URL. + + + + + Creates the source reader from a byte stream. + + + + + Creates the sink writer from a URL or byte stream. + + + + + Creates a Microsoft Media Foundation byte stream that wraps an IRandomAccessStream object. + + + + + Gets a list of Microsoft Media Foundation transforms (MFTs) that match specified search criteria. + + + + + Creates an empty media sample. + + + + + Allocates system memory and creates a media buffer to manage it. + + + + + Creates an empty attribute store. + + + + + Gets a list of output formats from an audio encoder. + + + + + An abstract base class for simplifying working with Media Foundation Transforms + You need to override the method that actually creates and configures the transform + + + + + Generic interface for all WaveProviders. + + + + + Fill the specified buffer with wave data. + + The buffer to fill of wave data. + Offset into buffer + The number of bytes to read + the number of bytes written to the buffer. + + + + Gets the WaveFormat of this WaveProvider. + + The wave format. + + + + The Source Provider + + + + + The Output WaveFormat + + + + + Constructs a new MediaFoundationTransform wrapper + Will read one second at a time + + The source provider for input data to the transform + The desired output format + + + + To be implemented by overriding classes. Create the transform object, set up its input and output types, + and configure any custom properties in here + + An object implementing IMFTrasform + + + + Disposes this MediaFoundation transform + + + + + Disposes this Media Foundation Transform + + + + + Destructor + + + + + Reads data out of the source, passing it through the transform + + Output buffer + Offset within buffer to write to + Desired byte count + Number of bytes read + + + + Attempts to read from the transform + Some useful info here: + http://msdn.microsoft.com/en-gb/library/windows/desktop/aa965264%28v=vs.85%29.aspx#process_data + + + + + + Indicate that the source has been repositioned and completely drain out the transforms buffers + + + + + The output WaveFormat of this Media Foundation Transform + + + + + Media Foundation Transform Categories + + + + + MFT_CATEGORY_VIDEO_DECODER + + + + + MFT_CATEGORY_VIDEO_ENCODER + + + + + MFT_CATEGORY_VIDEO_EFFECT + + + + + MFT_CATEGORY_MULTIPLEXER + + + + + MFT_CATEGORY_DEMULTIPLEXER + + + + + MFT_CATEGORY_AUDIO_DECODER + + + + + MFT_CATEGORY_AUDIO_ENCODER + + + + + MFT_CATEGORY_AUDIO_EFFECT + + + + + MFT_CATEGORY_VIDEO_PROCESSOR + + + + + MFT_CATEGORY_OTHER + + + + + Media Type helper class, simplifying working with IMFMediaType + (will probably change in the future, to inherit from an attributes class) + Currently does not release the COM object, so you must do that yourself + + + + + Wraps an existing IMFMediaType object + + The IMFMediaType object + + + + Creates and wraps a new IMFMediaType object + + + + + Creates and wraps a new IMFMediaType object based on a WaveFormat + + WaveFormat + + + + Tries to get a UINT32 value, returning a default value if it doesn't exist + + Attribute key + Default value + Value or default if key doesn't exist + + + + The Sample Rate (valid for audio media types) + + + + + The number of Channels (valid for audio media types) + + + + + The number of bits per sample (n.b. not always valid for compressed audio types) + + + + + The average bytes per second (valid for audio media types) + + + + + The Media Subtype. For audio, is a value from the AudioSubtypes class + + + + + The Major type, e.g. audio or video (from the MediaTypes class) + + + + + Access to the actual IMFMediaType object + Use to pass to MF APIs or Marshal.ReleaseComObject when you are finished with it + + + + + Major Media Types + http://msdn.microsoft.com/en-us/library/windows/desktop/aa367377%28v=vs.85%29.aspx + + + + + Default + + + + + Audio + + + + + Video + + + + + Protected Media + + + + + Synchronized Accessible Media Interchange (SAMI) captions. + + + + + Script stream + + + + + Still image stream. + + + + + HTML stream. + + + + + Binary stream. + + + + + A stream that contains data files. + + + + + Contains information about an input stream on a Media Foundation transform (MFT) + + + + + Maximum amount of time between an input sample and the corresponding output sample, in 100-nanosecond units. + + + + + Bitwise OR of zero or more flags from the _MFT_INPUT_STREAM_INFO_FLAGS enumeration. + + + + + The minimum size of each input buffer, in bytes. + + + + + Maximum amount of input data, in bytes, that the MFT holds to perform lookahead. + + + + + The memory alignment required for input buffers. If the MFT does not require a specific alignment, the value is zero. + + + + + Defines messages for a Media Foundation transform (MFT). + + + + + Requests the MFT to flush all stored data. + + + + + Requests the MFT to drain any stored data. + + + + + Sets or clears the Direct3D Device Manager for DirectX Video Accereration (DXVA). + + + + + Drop samples - requires Windows 7 + + + + + Command Tick - requires Windows 8 + + + + + Notifies the MFT that streaming is about to begin. + + + + + Notifies the MFT that streaming is about to end. + + + + + Notifies the MFT that an input stream has ended. + + + + + Notifies the MFT that the first sample is about to be processed. + + + + + Marks a point in the stream. This message applies only to asynchronous MFTs. Requires Windows 7 + + + + + Contains information about an output buffer for a Media Foundation transform. + + + + + Output stream identifier. + + + + + Pointer to the IMFSample interface. + + + + + Before calling ProcessOutput, set this member to zero. + + + + + Before calling ProcessOutput, set this member to NULL. + + + + + Contains information about an output stream on a Media Foundation transform (MFT). + + + + + Bitwise OR of zero or more flags from the _MFT_OUTPUT_STREAM_INFO_FLAGS enumeration. + + + + + Minimum size of each output buffer, in bytes. + + + + + The memory alignment required for output buffers. + + + + + Contains media type information for registering a Media Foundation transform (MFT). + + + + + The major media type. + + + + + The Media Subtype + + + + + Contains statistics about the performance of the sink writer. + + + + + The size of the structure, in bytes. + + + + + The time stamp of the most recent sample given to the sink writer. + + + + + The time stamp of the most recent sample to be encoded. + + + + + The time stamp of the most recent sample given to the media sink. + + + + + The time stamp of the most recent stream tick. + + + + + The system time of the most recent sample request from the media sink. + + + + + The number of samples received. + + + + + The number of samples encoded. + + + + + The number of samples given to the media sink. + + + + + The number of stream ticks received. + + + + + The amount of data, in bytes, currently waiting to be processed. + + + + + The total amount of data, in bytes, that has been sent to the media sink. + + + + + The number of pending sample requests. + + + + + The average rate, in media samples per 100-nanoseconds, at which the application sent samples to the sink writer. + + + + + The average rate, in media samples per 100-nanoseconds, at which the sink writer sent samples to the encoder + + + + + The average rate, in media samples per 100-nanoseconds, at which the sink writer sent samples to the media sink. + + + + + Contains flags for registering and enumeration Media Foundation transforms (MFTs). + + + + + None + + + + + The MFT performs synchronous data processing in software. + + + + + The MFT performs asynchronous data processing in software. + + + + + The MFT performs hardware-based data processing, using either the AVStream driver or a GPU-based proxy MFT. + + + + + The MFT that must be unlocked by the application before use. + + + + + For enumeration, include MFTs that were registered in the caller's process. + + + + + The MFT is optimized for transcoding rather than playback. + + + + + For enumeration, sort and filter the results. + + + + + Bitwise OR of all the flags, excluding MFT_ENUM_FLAG_SORTANDFILTER. + + + + + Indicates the status of an input stream on a Media Foundation transform (MFT). + + + + + None + + + + + The input stream can receive more data at this time. + + + + + Describes an input stream on a Media Foundation transform (MFT). + + + + + No flags set + + + + + Each media sample (IMFSample interface) of input data must contain complete, unbroken units of data. + + + + + Each media sample that the client provides as input must contain exactly one unit of data, as defined for the MFT_INPUT_STREAM_WHOLE_SAMPLES flag. + + + + + All input samples must be the same size. + + + + + MTF Input Stream Holds buffers + + + + + The MFT does not hold input samples after the IMFTransform::ProcessInput method returns. + + + + + This input stream can be removed by calling IMFTransform::DeleteInputStream. + + + + + This input stream is optional. + + + + + The MFT can perform in-place processing. + + + + + Defines flags for the IMFTransform::ProcessOutput method. + + + + + None + + + + + The MFT can still generate output from this stream without receiving any more input. + + + + + The format has changed on this output stream, or there is a new preferred format for this stream. + + + + + The MFT has removed this output stream. + + + + + There is no sample ready for this stream. + + + + + Indicates whether a Media Foundation transform (MFT) can produce output data. + + + + + None + + + + + There is a sample available for at least one output stream. + + + + + Describes an output stream on a Media Foundation transform (MFT). + + + + + No flags set + + + + + Each media sample (IMFSample interface) of output data from the MFT contains complete, unbroken units of data. + + + + + Each output sample contains exactly one unit of data, as defined for the MFT_OUTPUT_STREAM_WHOLE_SAMPLES flag. + + + + + All output samples are the same size. + + + + + The MFT can discard the output data from this output stream, if requested by the client. + + + + + This output stream is optional. + + + + + The MFT provides the output samples for this stream, either by allocating them internally or by operating directly on the input samples. + + + + + The MFT can either provide output samples for this stream or it can use samples that the client allocates. + + + + + The MFT does not require the client to process the output for this stream. + + + + + The MFT might remove this output stream during streaming. + + + + + Defines flags for processing output samples in a Media Foundation transform (MFT). + + + + + None + + + + + Do not produce output for streams in which the pSample member of the MFT_OUTPUT_DATA_BUFFER structure is NULL. + + + + + Regenerates the last output sample. + + + + + Process Output Status flags + + + + + None + + + + + The Media Foundation transform (MFT) has created one or more new output streams. + + + + + Defines flags for the setting or testing the media type on a Media Foundation transform (MFT). + + + + + None + + + + + Test the proposed media type, but do not set it. + + + + + Helper methods for working with audio buffers + + + + + Ensures the buffer is big enough + + + + + + + + Ensures the buffer is big enough + + + + + + + + these will become extension methods once we move to .NET 3.5 + + + + + Checks if the buffer passed in is entirely full of nulls + + + + + Converts to a string containing the buffer described in hex + + + + + Decodes the buffer using the specified encoding, stopping at the first null + + + + + Concatenates the given arrays into a single array. + + The arrays to concatenate + The concatenated resulting array. + + + + An encoding for use with file types that have one byte per character + + + + + The one and only instance of this class + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A very basic circular buffer implementation + + + + + Create a new circular buffer + + Max buffer size in bytes + + + + Write data to the buffer + + Data to write + Offset into data + Number of bytes to write + number of bytes written + + + + Read from the buffer + + Buffer to read into + Offset into read buffer + Bytes to read + Number of bytes actually read + + + + Resets the buffer + + + + + Advances the buffer, discarding bytes + + Bytes to advance + + + + Maximum length of this circular buffer + + + + + Number of bytes currently stored in the circular buffer + + + + + A util class for conversions + + + + + linear to dB conversion + + linear value + decibel value + + + + dB to linear conversion + + decibel value + linear value + + + + Allows us to add descriptions to interop members + + + + + Field description + + + + + String representation + + + + + + The description + + + + + Helper to get descriptions + + + + + Describes the Guid by looking for a FieldDescription attribute on the specified class + + + + + HResult + + + + + S_OK + + + + + S_FALSE + + + + + E_INVALIDARG (from winerror.h) + + + + + MAKE_HRESULT macro + + + + + Helper to deal with the fact that in Win Store apps, + the HResult property name has changed + + COM Exception + The HResult + + + + Methods for converting between IEEE 80-bit extended double precision + and standard C# double precision. + + + + + Converts a C# double precision number to an 80-bit + IEEE extended double precision number (occupying 10 bytes). + + The double precision number to convert to IEEE extended. + An array of 10 bytes containing the IEEE extended number. + + + + Converts an IEEE 80-bit extended precision number to a + C# double precision number. + + The 80-bit IEEE extended number (as an array of 10 bytes). + A C# double precision number that is a close representation of the IEEE extended number. + + + + Pass-through stream that ignores Dispose + Useful for dealing with MemoryStreams that you want to re-use + + + + + Creates a new IgnoreDisposeStream + + The source stream + + + + Flushes the underlying stream + + + + + Reads from the underlying stream + + + + + Seeks on the underlying stream + + + + + Sets the length of the underlying stream + + + + + Writes to the underlying stream + + + + + Dispose - by default (IgnoreDispose = true) will do nothing, + leaving the underlying stream undisposed + + + + + The source stream all other methods fall through to + + + + + If true the Dispose will be ignored, if false, will pass through to the SourceStream + Set to true by default + + + + + Can Read + + + + + Can Seek + + + + + Can write to the underlying stream + + + + + Gets the length of the underlying stream + + + + + Gets or sets the position of the underlying stream + + + + + In-place and stable implementation of MergeSort + + + + + MergeSort a list of comparable items + + + + + MergeSort a list + + + + + General purpose native methods for internal NAudio use + + + + + Event Args for WaveInStream event + + + + + Creates new WaveInEventArgs + + + + + Buffer containing recorded data. Note that it might not be completely + full. + + + + + The number of recorded bytes in Buffer. + + + + + Sample provider interface to make WaveChannel32 extensible + Still a bit ugly, hence internal at the moment - and might even make these into + bit depth converting WaveProviders + + + + + Sample Provider to allow fading in and out + + + + + Like IWaveProvider, but makes it much simpler to put together a 32 bit floating + point mixing engine + + + + + Fill the specified buffer with 32 bit floating point samples + + The buffer to fill with samples. + Offset into buffer + The number of samples to read + the number of samples written to the buffer. + + + + Gets the WaveFormat of this Sample Provider. + + The wave format. + + + + Creates a new FadeInOutSampleProvider + + The source stream with the audio to be faded in or out + If true, we start faded out + + + + Requests that a fade-in begins (will start on the next call to Read) + + Duration of fade in milliseconds + + + + Requests that a fade-out begins (will start on the next call to Read) + + Duration of fade in milliseconds + + + + Reads samples from this sample provider + + Buffer to read into + Offset within buffer to write to + Number of samples desired + Number of samples read + + + + WaveFormat of this SampleProvider + + + + + Simple SampleProvider that passes through audio unchanged and raises + an event every n samples with the maximum sample value from the period + for metering purposes + + + + + Initialises a new instance of MeteringSampleProvider that raises 10 stream volume + events per second + + Source sample provider + + + + Initialises a new instance of MeteringSampleProvider + + source sampler provider + Number of samples between notifications + + + + Reads samples from this Sample Provider + + Sample buffer + Offset into sample buffer + Number of samples required + Number of samples read + + + + Number of Samples per notification + + + + + Raised periodically to inform the user of the max volume + + + + + The WaveFormat of this sample provider + + + + + Event args for aggregated stream volume + + + + + Max sample values array (one for each channel) + + + + + A sample provider mixer, allowing inputs to be added and removed + + + + + Creates a new MixingSampleProvider, with no inputs, but a specified WaveFormat + + The WaveFormat of this mixer. All inputs must be in this format + + + + Creates a new MixingSampleProvider, based on the given inputs + + Mixer inputs - must all have the same waveformat, and must + all be of the same WaveFormat. There must be at least one input + + + + Adds a WaveProvider as a Mixer input. + Must be PCM or IEEE float already + + IWaveProvider mixer input + + + + Adds a new mixer input + + Mixer input + + + + Removes a mixer input + + Mixer input to remove + + + + Removes all mixer inputs + + + + + Reads samples from this sample provider + + Sample buffer + Offset into sample buffer + Number of samples required + Number of samples read + + + + When set to true, the Read method always returns the number + of samples requested, even if there are no inputs, or if the + current inputs reach their end. Setting this to true effectively + makes this a never-ending sample provider, so take care if you plan + to write it out to a file. + + + + + The output WaveFormat of this sample provider + + + + + No nonsense mono to stereo provider, no volume adjustment, + just copies input to left and right. + + + + + Initializes a new instance of MonoToStereoSampleProvider + + Source sample provider + + + + Reads samples from this provider + + Sample buffer + Offset into sample buffer + Number of samples required + Number of samples read + + + + WaveFormat of this provider + + + + + Allows any number of inputs to be patched to outputs + Uses could include swapping left and right channels, turning mono into stereo, + feeding different input sources to different soundcard outputs etc + + + + + Creates a multiplexing sample provider, allowing re-patching of input channels to different + output channels + + Input sample providers. Must all be of the same sample rate, but can have any number of channels + Desired number of output channels. + + + + persistent temporary buffer to prevent creating work for garbage collector + + + + + Reads samples from this sample provider + + Buffer to be filled with sample data + Offset into buffer to start writing to, usually 0 + Number of samples required + Number of samples read + + + + Connects a specified input channel to an output channel + + Input Channel index (zero based). Must be less than InputChannelCount + Output Channel index (zero based). Must be less than OutputChannelCount + + + + The output WaveFormat for this SampleProvider + + + + + The number of input channels. Note that this is not the same as the number of input wave providers. If you pass in + one stereo and one mono input provider, the number of input channels is three. + + + + + The number of output channels, as specified in the constructor. + + + + + Simple class that raises an event on every sample + + + + + An interface for WaveStreams which can report notification of individual samples + + + + + A sample has been detected + + + + + Initializes a new instance of NotifyingSampleProvider + + Source Sample Provider + + + + Reads samples from this sample provider + + Sample buffer + Offset into sample buffer + Number of samples desired + Number of samples read + + + + WaveFormat + + + + + Sample notifier + + + + + Allows you to: + 1. insert a pre-delay of silence before the source begins + 2. skip over a certain amount of the beginning of the source + 3. only play a set amount from the source + 4. insert silence at the end after the source is complete + + + + + Creates a new instance of offsetSampleProvider + + The Source Sample Provider to read from + + + + Reads from this sample provider + + Sample buffer + Offset within sample buffer to read to + Number of samples required + Number of samples read + + + + Number of samples of silence to insert before playing source + + + + + Amount of silence to insert before playing + + + + + Number of samples in source to discard + + + + + Amount of audio to skip over from the source before beginning playback + + + + + Number of samples to read from source (if 0, then read it all) + + + + + Amount of audio to take from the source (TimeSpan.Zero means play to end) + + + + + Number of samples of silence to insert after playing source + + + + + Amount of silence to insert after playing source + + + + + The WaveFormat of this SampleProvider + + + + + Converts a mono sample provider to stereo, with a customisable pan strategy + + + + + Initialises a new instance of the PanningSampleProvider + + Source sample provider, must be mono + + + + Reads samples from this sample provider + + Sample buffer + Offset into sample buffer + Number of samples desired + Number of samples read + + + + Pan value, must be between -1 (left) and 1 (right) + + + + + The pan strategy currently in use + + + + + The WaveFormat of this sample provider + + + + + Pair of floating point values, representing samples or multipliers + + + + + Left value + + + + + Right value + + + + + Required Interface for a Panning Strategy + + + + + Gets the left and right multipliers for a given pan value + + Pan value from -1 to 1 + Left and right multipliers in a stereo sample pair + + + + Simplistic "balance" control - treating the mono input as if it was stereo + In the centre, both channels full volume. Opposite channel decays linearly + as balance is turned to to one side + + + + + Gets the left and right channel multipliers for this pan value + + Pan value, between -1 and 1 + Left and right multipliers + + + + Square Root Pan, thanks to Yuval Naveh + + + + + Gets the left and right channel multipliers for this pan value + + Pan value, between -1 and 1 + Left and right multipliers + + + + Sinus Pan, thanks to Yuval Naveh + + + + + Gets the left and right channel multipliers for this pan value + + Pan value, between -1 and 1 + Left and right multipliers + + + + Linear Pan + + + + + Gets the left and right channel multipliers for this pan value + + Pan value, between -1 and 1 + Left and right multipliers + + + + Converts an IWaveProvider containing 16 bit PCM to an + ISampleProvider + + + + + Helper base class for classes converting to ISampleProvider + + + + + Source Wave Provider + + + + + Source buffer (to avoid constantly creating small buffers during playback) + + + + + Initialises a new instance of SampleProviderConverterBase + + Source Wave provider + + + + Reads samples from the source wave provider + + Sample buffer + Offset into sample buffer + Number of samples required + Number of samples read + + + + Ensure the source buffer exists and is big enough + + Bytes required + + + + Wave format of this wave provider + + + + + Initialises a new instance of Pcm16BitToSampleProvider + + Source wave provider + + + + Reads samples from this sample provider + + Sample buffer + Offset into sample buffer + Samples required + Number of samples read + + + + Converts an IWaveProvider containing 24 bit PCM to an + ISampleProvider + + + + + Initialises a new instance of Pcm24BitToSampleProvider + + Source Wave Provider + + + + Reads floating point samples from this sample provider + + sample buffer + offset within sample buffer to write to + number of samples required + number of samples provided + + + + Converts an IWaveProvider containing 32 bit PCM to an + ISampleProvider + + + + + Initialises a new instance of Pcm32BitToSampleProvider + + Source Wave Provider + + + + Reads floating point samples from this sample provider + + sample buffer + offset within sample buffer to write to + number of samples required + number of samples provided + + + + Converts an IWaveProvider containing 8 bit PCM to an + ISampleProvider + + + + + Initialises a new instance of Pcm8BitToSampleProvider + + Source wave provider + + + + Reads samples from this sample provider + + Sample buffer + Offset into sample buffer + Number of samples to read + Number of samples read + + + + Utility class that takes an IWaveProvider input at any bit depth + and exposes it as an ISampleProvider. Can turn mono inputs into stereo, + and allows adjusting of volume + (The eventual successor to WaveChannel32) + This class also serves as an example of how you can link together several simple + Sample Providers to form a more useful class. + + + + + Initialises a new instance of SampleChannel + + Source wave provider, must be PCM or IEEE + + + + Initialises a new instance of SampleChannel + + Source wave provider, must be PCM or IEEE + force mono inputs to become stereo + + + + Reads samples from this sample provider + + Sample buffer + Offset into sample buffer + Number of samples desired + Number of samples read + + + + The WaveFormat of this Sample Provider + + + + + Allows adjusting the volume, 1.0f = full volume + + + + + Raised periodically to inform the user of the max volume + (before the volume meter) + + + + + Utility class for converting to SampleProvider + + + + + Helper function to go from IWaveProvider to a SampleProvider + Must already be PCM or IEEE float + + The WaveProvider to convert + A sample provider + + + + Helper class for when you need to convert back to an IWaveProvider from + an ISampleProvider. Keeps it as IEEE float + + + + + Initializes a new instance of the WaveProviderFloatToWaveProvider class + + Source wave provider + + + + Reads from this provider + + + + + The waveformat of this WaveProvider (same as the source) + + + + + Converts a sample provider to 16 bit PCM, optionally clipping and adjusting volume along the way + + + + + Creates a new SampleToWaveProvider16 + + the source provider + + + + Reads bytes from this wave stream + + The destination buffer + Offset into the destination buffer + Number of bytes read + Number of bytes read. + + + + + + + + + Volume of this channel. 1.0 = full scale + + + + + Signal Generator + Sin, Square, Triangle, SawTooth, White Noise, Pink Noise, Sweep. + + + Posibility to change ISampleProvider + Example : + --------- + WaveOut _waveOutGene = new WaveOut(); + WaveGenerator wg = new SignalGenerator(); + wg.Type = ... + wg.Frequency = ... + wg ... + _waveOutGene.Init(wg); + _waveOutGene.Play(); + + + + + Initializes a new instance for the Generator (Default :: 44.1Khz, 2 channels, Sinus, Frequency = 440, Gain = 1) + + + + + Initializes a new instance for the Generator (UserDef SampleRate & Channels) + + Desired sample rate + Number of channels + + + + Reads from this provider. + + + + + Private :: Random for WhiteNoise & Pink Noise (Value form -1 to 1) + + Random value from -1 to +1 + + + + The waveformat of this WaveProvider (same as the source) + + + + + Frequency for the Generator. (20.0 - 20000.0 Hz) + Sin, Square, Triangle, SawTooth, Sweep (Start Frequency). + + + + + Return Log of Frequency Start (Read only) + + + + + End Frequency for the Sweep Generator. (Start Frequency in Frequency) + + + + + Return Log of Frequency End (Read only) + + + + + Gain for the Generator. (0.0 to 1.0) + + + + + Channel PhaseReverse + + + + + Type of Generator. + + + + + Length Seconds for the Sweep Generator. + + + + + Signal Generator type + + + + + Pink noise + + + + + White noise + + + + + Sweep + + + + + Sine wave + + + + + Square wave + + + + + Triangle Wave + + + + + Sawtooth wave + + + + + Very simple sample provider supporting adjustable gain + + + + + Initializes a new instance of VolumeSampleProvider + + Source Sample Provider + + + + Reads samples from this sample provider + + Sample buffer + Offset into sample buffer + Number of samples desired + Number of samples read + + + + WaveFormat + + + + + Allows adjusting the volume, 1.0f = full volume + + + + + Helper class turning an already 32 bit floating point IWaveProvider + into an ISampleProvider - hopefully not needed for most applications + + + + + Initializes a new instance of the WaveToSampleProvider class + + Source wave provider, must be IEEE float + + + + Reads from this provider + + + + + Helper class turning an already 64 bit floating point IWaveProvider + into an ISampleProvider - hopefully not needed for most applications + + + + + Initializes a new instance of the WaveToSampleProvider class + + Source wave provider, must be IEEE float + + + + Reads from this provider + + + + + Useful extension methods to make switching between WaveAndSampleProvider easier + + + + + Converts a WaveProvider into a SampleProvider (only works for PCM) + + WaveProvider to convert + + + + + Allows sending a SampleProvider directly to an IWavePlayer without needing to convert + back to an IWaveProvider + + The WavePlayer + + + + + + Microsoft ADPCM + See http://icculus.org/SDL_sound/downloads/external_documentation/wavecomp.htm + + + + + Represents a Wave file format + + + + format type + + + number of channels + + + sample rate + + + for buffer estimation + + + block size of data + + + number of bits per sample of mono data + + + number of following bytes + + + + Creates a new PCM 44.1Khz stereo 16 bit format + + + + + Creates a new 16 bit wave format with the specified sample + rate and channel count + + Sample Rate + Number of channels + + + + Gets the size of a wave buffer equivalent to the latency in milliseconds. + + The milliseconds. + + + + + Creates a WaveFormat with custom members + + The encoding + Sample Rate + Number of channels + Average Bytes Per Second + Block Align + Bits Per Sample + + + + + Creates an A-law wave format + + Sample Rate + Number of Channels + Wave Format + + + + Creates a Mu-law wave format + + Sample Rate + Number of Channels + Wave Format + + + + Creates a new PCM format with the specified sample rate, bit depth and channels + + + + + Creates a new 32 bit IEEE floating point wave format + + sample rate + number of channels + + + + Helper function to retrieve a WaveFormat structure from a pointer + + WaveFormat structure + + + + + Helper function to marshal WaveFormat to an IntPtr + + WaveFormat + IntPtr to WaveFormat structure (needs to be freed by callee) + + + + Reads in a WaveFormat (with extra data) from a fmt chunk (chunk identifier and + length should already have been read) + + Binary reader + Format chunk length + A WaveFormatExtraData + + + + Reads a new WaveFormat object from a stream + + A binary reader that wraps the stream + + + + Reports this WaveFormat as a string + + String describing the wave format + + + + Compares with another WaveFormat object + + Object to compare to + True if the objects are the same + + + + Provides a Hashcode for this WaveFormat + + A hashcode + + + + Writes this WaveFormat object to a stream + + the output stream + + + + Returns the encoding type used + + + + + Returns the number of channels (1=mono,2=stereo etc) + + + + + Returns the sample rate (samples per second) + + + + + Returns the average number of bytes used per second + + + + + Returns the block alignment + + + + + Returns the number of bits per sample (usually 16 or 32, sometimes 24 or 8) + Can be 0 for some codecs + + + + + Returns the number of extra bytes used by this waveformat. Often 0, + except for compressed formats which store extra data after the WAVEFORMATEX header + + + + + Empty constructor needed for marshalling from a pointer + + + + + Microsoft ADPCM + + Sample Rate + Channels + + + + Serializes this wave format + + Binary writer + + + + String Description of this WaveFormat + + + + + Samples per block + + + + + Number of coefficients + + + + + Coefficients + + + + + GSM 610 + + + + + Creates a GSM 610 WaveFormat + For now hardcoded to 13kbps + + + + + Writes this structure to a BinaryWriter + + + + + Samples per block + + + + + IMA/DVI ADPCM Wave Format + Work in progress + + + + + parameterless constructor for Marshalling + + + + + Creates a new IMA / DVI ADPCM Wave Format + + Sample Rate + Number of channels + Bits Per Sample + + + + MP3 WaveFormat, MPEGLAYER3WAVEFORMAT from mmreg.h + + + + + Wave format ID (wID) + + + + + Padding flags (fdwFlags) + + + + + Block Size (nBlockSize) + + + + + Frames per block (nFramesPerBlock) + + + + + Codec Delay (nCodecDelay) + + + + + Creates a new MP3 WaveFormat + + + + + Wave Format Padding Flags + + + + + MPEGLAYER3_FLAG_PADDING_ISO + + + + + MPEGLAYER3_FLAG_PADDING_ON + + + + + MPEGLAYER3_FLAG_PADDING_OFF + + + + + Wave Format ID + + + + MPEGLAYER3_ID_UNKNOWN + + + MPEGLAYER3_ID_MPEG + + + MPEGLAYER3_ID_CONSTANTFRAMESIZE + + + + DSP Group TrueSpeech + + + + + DSP Group TrueSpeech WaveFormat + + + + + Writes this structure to a BinaryWriter + + + + + Summary description for WaveFormatEncoding. + + + + WAVE_FORMAT_UNKNOWN, Microsoft Corporation + + + WAVE_FORMAT_PCM Microsoft Corporation + + + WAVE_FORMAT_ADPCM Microsoft Corporation + + + WAVE_FORMAT_IEEE_FLOAT Microsoft Corporation + + + WAVE_FORMAT_VSELP Compaq Computer Corp. + + + WAVE_FORMAT_IBM_CVSD IBM Corporation + + + WAVE_FORMAT_ALAW Microsoft Corporation + + + WAVE_FORMAT_MULAW Microsoft Corporation + + + WAVE_FORMAT_DTS Microsoft Corporation + + + WAVE_FORMAT_DRM Microsoft Corporation + + + WAVE_FORMAT_WMAVOICE9 + + + WAVE_FORMAT_OKI_ADPCM OKI + + + WAVE_FORMAT_DVI_ADPCM Intel Corporation + + + WAVE_FORMAT_IMA_ADPCM Intel Corporation + + + WAVE_FORMAT_MEDIASPACE_ADPCM Videologic + + + WAVE_FORMAT_SIERRA_ADPCM Sierra Semiconductor Corp + + + WAVE_FORMAT_G723_ADPCM Antex Electronics Corporation + + + WAVE_FORMAT_DIGISTD DSP Solutions, Inc. + + + WAVE_FORMAT_DIGIFIX DSP Solutions, Inc. + + + WAVE_FORMAT_DIALOGIC_OKI_ADPCM Dialogic Corporation + + + WAVE_FORMAT_MEDIAVISION_ADPCM Media Vision, Inc. + + + WAVE_FORMAT_CU_CODEC Hewlett-Packard Company + + + WAVE_FORMAT_YAMAHA_ADPCM Yamaha Corporation of America + + + WAVE_FORMAT_SONARC Speech Compression + + + WAVE_FORMAT_DSPGROUP_TRUESPEECH DSP Group, Inc + + + WAVE_FORMAT_ECHOSC1 Echo Speech Corporation + + + WAVE_FORMAT_AUDIOFILE_AF36, Virtual Music, Inc. + + + WAVE_FORMAT_APTX Audio Processing Technology + + + WAVE_FORMAT_AUDIOFILE_AF10, Virtual Music, Inc. + + + WAVE_FORMAT_PROSODY_1612, Aculab plc + + + WAVE_FORMAT_LRC, Merging Technologies S.A. + + + WAVE_FORMAT_DOLBY_AC2, Dolby Laboratories + + + WAVE_FORMAT_GSM610, Microsoft Corporation + + + WAVE_FORMAT_MSNAUDIO, Microsoft Corporation + + + WAVE_FORMAT_ANTEX_ADPCME, Antex Electronics Corporation + + + WAVE_FORMAT_CONTROL_RES_VQLPC, Control Resources Limited + + + WAVE_FORMAT_DIGIREAL, DSP Solutions, Inc. + + + WAVE_FORMAT_DIGIADPCM, DSP Solutions, Inc. + + + WAVE_FORMAT_CONTROL_RES_CR10, Control Resources Limited + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + WAVE_FORMAT_MPEG, Microsoft Corporation + + + + + + + + + WAVE_FORMAT_MPEGLAYER3, ISO/MPEG Layer3 Format Tag + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + WAVE_FORMAT_GSM + + + WAVE_FORMAT_G729 + + + WAVE_FORMAT_G723 + + + WAVE_FORMAT_ACELP + + + + WAVE_FORMAT_RAW_AAC1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Windows Media Audio, WAVE_FORMAT_WMAUDIO2, Microsoft Corporation + + + + + Windows Media Audio Professional WAVE_FORMAT_WMAUDIO3, Microsoft Corporation + + + + + Windows Media Audio Lossless, WAVE_FORMAT_WMAUDIO_LOSSLESS + + + + + Windows Media Audio Professional over SPDIF WAVE_FORMAT_WMASPDIF (0x0164) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Advanced Audio Coding (AAC) audio in Audio Data Transport Stream (ADTS) format. + The format block is a WAVEFORMATEX structure with wFormatTag equal to WAVE_FORMAT_MPEG_ADTS_AAC. + + + The WAVEFORMATEX structure specifies the core AAC-LC sample rate and number of channels, + prior to applying spectral band replication (SBR) or parametric stereo (PS) tools, if present. + No additional data is required after the WAVEFORMATEX structure. + + http://msdn.microsoft.com/en-us/library/dd317599%28VS.85%29.aspx + + + + Source wmCodec.h + + + + MPEG-4 audio transport stream with a synchronization layer (LOAS) and a multiplex layer (LATM). + The format block is a WAVEFORMATEX structure with wFormatTag equal to WAVE_FORMAT_MPEG_LOAS. + + + The WAVEFORMATEX structure specifies the core AAC-LC sample rate and number of channels, + prior to applying spectral SBR or PS tools, if present. + No additional data is required after the WAVEFORMATEX structure. + + http://msdn.microsoft.com/en-us/library/dd317599%28VS.85%29.aspx + + + NOKIA_MPEG_ADTS_AAC + Source wmCodec.h + + + NOKIA_MPEG_RAW_AAC + Source wmCodec.h + + + VODAFONE_MPEG_ADTS_AAC + Source wmCodec.h + + + VODAFONE_MPEG_RAW_AAC + Source wmCodec.h + + + + High-Efficiency Advanced Audio Coding (HE-AAC) stream. + The format block is an HEAACWAVEFORMAT structure. + + http://msdn.microsoft.com/en-us/library/dd317599%28VS.85%29.aspx + + + WAVE_FORMAT_DVM + + + WAVE_FORMAT_VORBIS1 "Og" Original stream compatible + + + WAVE_FORMAT_VORBIS2 "Pg" Have independent header + + + WAVE_FORMAT_VORBIS3 "Qg" Have no codebook header + + + WAVE_FORMAT_VORBIS1P "og" Original stream compatible + + + WAVE_FORMAT_VORBIS2P "pg" Have independent headere + + + WAVE_FORMAT_VORBIS3P "qg" Have no codebook header + + + WAVE_FORMAT_EXTENSIBLE + + + + + + + WaveFormatExtensible + http://www.microsoft.com/whdc/device/audio/multichaud.mspx + + + + + Parameterless constructor for marshalling + + + + + Creates a new WaveFormatExtensible for PCM or IEEE + + + + + WaveFormatExtensible for PCM or floating point can be awkward to work with + This creates a regular WaveFormat structure representing the same audio format + + + + + + Serialize + + + + + + String representation + + + + + SubFormat (may be one of AudioMediaSubtypes) + + + + + This class used for marshalling from unmanaged code + + + + + parameterless constructor for marshalling + + + + + Reads this structure from a BinaryReader + + + + + Writes this structure to a BinaryWriter + + + + + Allows the extra data to be read + + + + + The WMA wave format. + May not be much use because WMA codec is a DirectShow DMO not an ACM + + + + + Generic interface for wave recording + + + + + Start Recording + + + + + Stop Recording + + + + + Recording WaveFormat + + + + + Indicates recorded data is available + + + + + Indicates that all recorded data has now been received. + + + + + IWaveBuffer interface use to store wave datas. + Data can be manipulated with arrays (,, + , ) that are pointing to the same memory buffer. + This is a requirement for all subclasses. + + Use the associated Count property based on the type of buffer to get the number of data in the + buffer. + + for the standard implementation using C# unions. + + + + + Gets the byte buffer. + + The byte buffer. + + + + Gets the float buffer. + + The float buffer. + + + + Gets the short buffer. + + The short buffer. + + + + Gets the int buffer. + + The int buffer. + + + + Gets the max size in bytes of the byte buffer.. + + Maximum number of bytes in the buffer. + + + + Gets the byte buffer count. + + The byte buffer count. + + + + Gets the float buffer count. + + The float buffer count. + + + + Gets the short buffer count. + + The short buffer count. + + + + Gets the int buffer count. + + The int buffer count. + + + + Media Foundation Encoder class allows you to use Media Foundation to encode an IWaveProvider + to any supported encoding format + + + + + Queries the available bitrates for a given encoding output type, sample rate and number of channels + + Audio subtype - a value from the AudioSubtypes class + The sample rate of the PCM to encode + The number of channels of the PCM to encode + An array of available bitrates in average bits per second + + + + Gets all the available media types for a particular + + Audio subtype - a value from the AudioSubtypes class + An array of available media types that can be encoded with this subtype + + + + Helper function to simplify encoding Window Media Audio + Should be supported on Vista and above (not tested) + + Input provider, must be PCM + Output file path, should end with .wma + Desired bitrate. Use GetEncodeBitrates to find the possibilities for your input type + + + + Helper function to simplify encoding to MP3 + By default, will only be available on Windows 8 and above + + Input provider, must be PCM + Output file path, should end with .mp3 + Desired bitrate. Use GetEncodeBitrates to find the possibilities for your input type + + + + Helper function to simplify encoding to AAC + By default, will only be available on Windows 7 and above + + Input provider, must be PCM + Output file path, should end with .mp4 (or .aac on Windows 8) + Desired bitrate. Use GetEncodeBitrates to find the possibilities for your input type + + + + Tries to find the encoding media type with the closest bitrate to that specified + + Audio subtype, a value from AudioSubtypes + Your encoder input format (used to check sample rate and channel count) + Your desired bitrate + The closest media type, or null if none available + + + + Creates a new encoder that encodes to the specified output media type + + Desired output media type + + + + Encodes a file + + Output filename (container type is deduced from the filename) + Input provider (should be PCM, some encoders will also allow IEEE float) + + + + Disposes this instance + + + + + + Disposes this instance + + + + + Finalizer + + + + + Playback State + + + + + Stopped + + + + + Playing + + + + + Paused + + + + + Stopped Event Args + + + + + Initializes a new instance of StoppedEventArgs + + An exception to report (null if no exception) + + + + An exception. Will be null if the playback or record operation stopped + + + + + WaveBuffer class use to store wave datas. Data can be manipulated with arrays + (,,, ) that are pointing to the + same memory buffer. Use the associated Count property based on the type of buffer to get the number of + data in the buffer. + Implicit casting is now supported to float[], byte[], int[], short[]. + You must not use Length on returned arrays. + + n.b. FieldOffset is 8 now to allow it to work natively on 64 bit + + + + + Number of Bytes + + + + + Initializes a new instance of the class. + + The number of bytes. The size of the final buffer will be aligned on 4 Bytes (upper bound) + + + + Initializes a new instance of the class binded to a specific byte buffer. + + A byte buffer to bound the WaveBuffer to. + + + + Binds this WaveBuffer instance to a specific byte buffer. + + A byte buffer to bound the WaveBuffer to. + + + + Performs an implicit conversion from to . + + The wave buffer. + The result of the conversion. + + + + Performs an implicit conversion from to . + + The wave buffer. + The result of the conversion. + + + + Performs an implicit conversion from to . + + The wave buffer. + The result of the conversion. + + + + Performs an implicit conversion from to . + + The wave buffer. + The result of the conversion. + + + + Clears the associated buffer. + + + + + Copy this WaveBuffer to a destination buffer up to ByteBufferCount bytes. + + + + + Checks the validity of the count parameters. + + Name of the arg. + The value. + The size of value. + + + + Gets the byte buffer. + + The byte buffer. + + + + Gets the float buffer. + + The float buffer. + + + + Gets the short buffer. + + The short buffer. + + + + Gets the int buffer. + + The int buffer. + + + + Gets the max size in bytes of the byte buffer.. + + Maximum number of bytes in the buffer. + + + + Gets or sets the byte buffer count. + + The byte buffer count. + + + + Gets or sets the float buffer count. + + The float buffer count. + + + + Gets or sets the short buffer count. + + The short buffer count. + + + + Gets or sets the int buffer count. + + The int buffer count. + + + + Provides a buffered store of samples + Read method will return queued samples or fill buffer with zeroes + Now backed by a circular buffer + + + + + Creates a new buffered WaveProvider + + WaveFormat + + + + Adds samples. Takes a copy of buffer, so that buffer can be reused if necessary + + + + + Reads from this WaveProvider + Will always return count bytes, since we will zero-fill the buffer if not enough available + + + + + Discards all audio from the buffer + + + + + Buffer length in bytes + + + + + Buffer duration + + + + + If true, when the buffer is full, start throwing away data + if false, AddSamples will throw an exception when buffer is full + + + + + The number of buffered bytes + + + + + Buffered Duration + + + + + Gets the WaveFormat + + + + + The Media Foundation Resampler Transform + + + + + Creates the Media Foundation Resampler, allowing modifying of sample rate, bit depth and channel count + + Source provider, must be PCM + Output format, must also be PCM + + + + Creates a resampler with a specified target output sample rate + + Source provider + Output sample rate + + + + Creates and configures the actual Resampler transform + + A newly created and configured resampler MFT + + + + Disposes this resampler + + + + + Gets or sets the Resampler quality. n.b. set the quality before starting to resample. + 1 is lowest quality (linear interpolation) and 60 is best quality + + + + + Converts from mono to stereo, allowing freedom to route all, some, or none of the incoming signal to left or right channels + + + + + Creates a new stereo waveprovider based on a mono input + + Mono 16 bit PCM input + + + + Reads bytes from this WaveProvider + + + + + 1.0 to copy the mono stream to the left channel without adjusting volume + + + + + 1.0 to copy the mono stream to the right channel without adjusting volume + + + + + Output Wave Format + + + + + Allows any number of inputs to be patched to outputs + Uses could include swapping left and right channels, turning mono into stereo, + feeding different input sources to different soundcard outputs etc + + + + + Creates a multiplexing wave provider, allowing re-patching of input channels to different + output channels + + Input wave providers. Must all be of the same format, but can have any number of channels + Desired number of output channels. + + + + persistent temporary buffer to prevent creating work for garbage collector + + + + + Reads data from this WaveProvider + + Buffer to be filled with sample data + Offset to write to within buffer, usually 0 + Number of bytes required + Number of bytes read + + + + Connects a specified input channel to an output channel + + Input Channel index (zero based). Must be less than InputChannelCount + Output Channel index (zero based). Must be less than OutputChannelCount + + + + The WaveFormat of this WaveProvider + + + + + The number of input channels. Note that this is not the same as the number of input wave providers. If you pass in + one stereo and one mono input provider, the number of input channels is three. + + + + + The number of output channels, as specified in the constructor. + + + + + Takes a stereo 16 bit input and turns it mono, allowing you to select left or right channel only or mix them together + + + + + Creates a new mono waveprovider based on a stereo input + + Stereo 16 bit PCM input + + + + Reads bytes from this WaveProvider + + + + + 1.0 to mix the mono source entirely to the left channel + + + + + 1.0 to mix the mono source entirely to the right channel + + + + + Output Wave Format + + + + + Helper class allowing us to modify the volume of a 16 bit stream without converting to IEEE float + + + + + Constructs a new VolumeWaveProvider16 + + Source provider, must be 16 bit PCM + + + + Read bytes from this WaveProvider + + Buffer to read into + Offset within buffer to read to + Bytes desired + Bytes read + + + + Gets or sets volume. + 1.0 is full scale, 0.0 is silence, anything over 1.0 will amplify but potentially clip + + + + + WaveFormat of this WaveProvider + + + + + Converts 16 bit PCM to IEEE float, optionally adjusting volume along the way + + + + + Creates a new Wave16toFloatProvider + + the source provider + + + + Reads bytes from this wave stream + + The destination buffer + Offset into the destination buffer + Number of bytes read + Number of bytes read. + + + + + + + + + Volume of this channel. 1.0 = full scale + + + + + Converts IEEE float to 16 bit PCM, optionally clipping and adjusting volume along the way + + + + + Creates a new WaveFloatTo16Provider + + the source provider + + + + Reads bytes from this wave stream + + The destination buffer + Offset into the destination buffer + Number of bytes read + Number of bytes read. + + + + + + + + + Volume of this channel. 1.0 = full scale + + + + + Buffered WaveProvider taking source data from WaveIn + + + + + Creates a new WaveInProvider + n.b. Should make sure the WaveFormat is set correctly on IWaveIn before calling + + The source of wave data + + + + Reads data from the WaveInProvider + + + + + The WaveFormat + + + + + Base class for creating a 16 bit wave provider + + + + + Initializes a new instance of the WaveProvider16 class + defaulting to 44.1kHz mono + + + + + Initializes a new instance of the WaveProvider16 class with the specified + sample rate and number of channels + + + + + Allows you to specify the sample rate and channels for this WaveProvider + (should be initialised before you pass it to a wave player) + + + + + Implements the Read method of IWaveProvider by delegating to the abstract + Read method taking a short array + + + + + Method to override in derived classes + Supply the requested number of samples into the buffer + + + + + The Wave Format + + + + + Base class for creating a 32 bit floating point wave provider + Can also be used as a base class for an ISampleProvider that can + be plugged straight into anything requiring an IWaveProvider + + + + + Initializes a new instance of the WaveProvider32 class + defaulting to 44.1kHz mono + + + + + Initializes a new instance of the WaveProvider32 class with the specified + sample rate and number of channels + + + + + Allows you to specify the sample rate and channels for this WaveProvider + (should be initialised before you pass it to a wave player) + + + + + Implements the Read method of IWaveProvider by delegating to the abstract + Read method taking a float array + + + + + Method to override in derived classes + Supply the requested number of samples into the buffer + + + + + The Wave Format + + + + + Helper stream that lets us read from compressed audio files with large block alignment + as though we could read any amount and reposition anywhere + + + + + Base class for all WaveStream classes. Derives from stream. + + + + + Flush does not need to do anything + See + + + + + An alternative way of repositioning. + See + + + + + Sets the length of the WaveStream. Not Supported. + + + + + + Writes to the WaveStream. Not Supported. + + + + + Moves forward or backwards the specified number of seconds in the stream + + Number of seconds to move, can be negative + + + + Whether the WaveStream has non-zero sample data at the current position for the + specified count + + Number of bytes to read + + + + Retrieves the WaveFormat for this stream + + + + + We can read from this stream + + + + + We can seek within this stream + + + + + We can't write to this stream + + + + + The block alignment for this wavestream. Do not modify the Position + to anything that is not a whole multiple of this value + + + + + The current position in the stream in Time format + + + + + Total length in real-time of the stream (may be an estimate for compressed files) + + + + + Creates a new BlockAlignReductionStream + + the input stream + + + + Disposes this WaveStream + + + + + Reads data from this stream + + + + + + + + + Block alignment of this stream + + + + + Wave Format + + + + + Length of this Stream + + + + + Current position within stream + + + + + Sample event arguments + + + + + Constructor + + + + + Left sample + + + + + Right sample + + + + + Class for reading any file that Media Foundation can play + Will only work in Windows Vista and above + Automatically converts to PCM + If it is a video file with multiple audio streams, it will pick out the first audio stream + + + + + Creates a new MediaFoundationReader based on the supplied file + + Filename (can also be a URL e.g. http:// mms:// file://) + + + + Creates a new MediaFoundationReader based on the supplied file + + Filename + Advanced settings + + + + Creates the reader (overridable by ) + + + + + Reads from this wave stream + + Buffer to read into + Offset in buffer + Bytes required + Number of bytes read; 0 indicates end of stream + + + + Cleans up after finishing with this reader + + true if called from Dispose + + + + WaveFormat of this stream (n.b. this is after converting to PCM) + + + + + The bytesRequired of this stream in bytes (n.b may not be accurate) + + + + + Current position within this stream + + + + + WaveFormat has changed + + + + + Allows customisation of this reader class + + + + + Sets up the default settings for MediaFoundationReader + + + + + Allows us to request IEEE float output (n.b. no guarantee this will be accepted) + + + + + If true, the reader object created in the constructor is used in Read + Should only be set to true if you are working entirely on an STA thread, or + entirely with MTA threads. + + + + + If true, the reposition does not happen immediately, but waits until the + next call to read to be processed. + + + + + WaveStream that simply passes on data from its source stream + (e.g. a MemoryStream) + + + + + Initialises a new instance of RawSourceWaveStream + + The source stream containing raw audio + The waveformat of the audio in the source stream + + + + Reads data from the stream + + + + + The WaveFormat of this stream + + + + + The length in bytes of this stream (if supported) + + + + + The current position in this stream + + + + + A simple compressor + + + + + Create a new simple compressor stream + + Source stream + + + + Determine whether the stream has the required amount of data. + + Number of bytes of data required from the stream. + Flag indicating whether the required amount of data is avialable. + + + + Reads bytes from this stream + + Buffer to read into + Offset in array to read into + Number of bytes to read + Number of bytes read + + + + Disposes this stream + + true if the user called this + + + + Make-up Gain + + + + + Threshold + + + + + Ratio + + + + + Attack time + + + + + Release time + + + + + Turns gain on or off + + + + + Returns the stream length + + + + + Gets or sets the current position in the stream + + + + + Gets the WaveFormat of this stream + + + + + Gets the block alignment for this stream + + + + + Represents Channel for the WaveMixerStream + 32 bit output and 16 bit input + It's output is always stereo + The input stream can be panned + + + + + Creates a new WaveChannel32 + + the source stream + stream volume (1 is 0dB) + pan control (-1 to 1) + + + + Creates a WaveChannel32 with default settings + + The source stream + + + + Reads bytes from this wave stream + + The destination buffer + Offset into the destination buffer + Number of bytes read + Number of bytes read. + + + + Determines whether this channel has any data to play + to allow optimisation to not read, but bump position forward + + + + + Disposes this WaveStream + + + + + Raise the sample event (no check for null because it has already been done) + + + + + Gets the block alignment for this WaveStream + + + + + Returns the stream length + + + + + Gets or sets the current position in the stream + + + + + If true, Read always returns the number of bytes requested + + + + + + + + + + Volume of this channel. 1.0 = full scale + + + + + Pan of this channel (from -1 to 1) + + + + + Sample + + + + + Simply shifts the input stream in time, optionally + clipping its start and end. + (n.b. may include looping in the future) + + + + + Creates a new WaveOffsetStream + + the source stream + the time at which we should start reading from the source stream + amount to trim off the front of the source stream + length of time to play from source stream + + + + Creates a WaveOffsetStream with default settings (no offset or pre-delay, + and whole length of source stream) + + The source stream + + + + Reads bytes from this wave stream + + The destination buffer + Offset into the destination buffer + Number of bytes read + Number of bytes read. + + + + Determines whether this channel has any data to play + to allow optimisation to not read, but bump position forward + + + + + Disposes this WaveStream + + + + + The length of time before which no audio will be played + + + + + An offset into the source stream from which to start playing + + + + + Length of time to read from the source stream + + + + + Gets the block alignment for this WaveStream + + + + + Returns the stream length + + + + + Gets or sets the current position in the stream + + + + + + + + + + Audio Capture using Wasapi + See http://msdn.microsoft.com/en-us/library/dd370800%28VS.85%29.aspx + + + + + Initialises a new instance of the WASAPI capture class + + + + + Initialises a new instance of the WASAPI capture class + + Capture device to use + + + + Way of enumerating all the audio capture devices available on the system + + + + + + Gets the default audio capture device + + The default audio capture device + + + + To allow overrides to specify different flags (e.g. loopback) + + + + + Start Recording + + + + + Stop Recording + + + + + Dispose + + + + + Indicates recorded data is available + + + + + Indicates that all recorded data has now been received. + + + + + Recording wave format + + + + + Represents the interface to a device that can play audio + + + + + Begin playback + + + + + Stop playback + + + + + Pause Playback + + + + + Initialise playback + + The waveprovider to be played + + + + Current playback state + + + + + Indicates that playback has gone into a stopped state due to + reaching the end of the input stream or an error has been encountered during playback + + + + + WASAPI Out for Windows RT + + + + + WASAPI Out using default audio endpoint + + ShareMode - shared or exclusive + Desired latency in milliseconds + + + + Creates a new WASAPI Output + + Device to use + + + + + + Properties of the client's audio stream. + Set before calling init + + + + + Sets the parameters that describe the properties of the client's audio stream. + + Boolean value to indicate whether or not the audio stream is hardware-offloaded. + An enumeration that is used to specify the category of the audio stream. + A bit-field describing the characteristics of the stream. Supported in Windows 8.1 and later. + + + + Begin Playback + + + + + Stop playback and flush buffers + + + + + Stop playback without flushing buffers + + + + + Initialize for playing the specified wave stream + + IWaveProvider to play + + + + Dispose + + + + + Playback Stopped + + + + + Playback State + + + + + Come useful native methods for Windows 8 support + + + + + Enables Windows Store apps to access preexisting Component Object Model (COM) interfaces in the WASAPI family. + + A device interface ID for an audio device. This is normally retrieved from a DeviceInformation object or one of the methods of the MediaDevice class. + The IID of a COM interface in the WASAPI family, such as IAudioClient. + Interface-specific activation parameters. For more information, see the pActivationParams parameter in IMMDevice::Activate. + + + + + + The GetBufferSize method retrieves the size (maximum capacity) of the endpoint buffer. + + + + + The GetService method accesses additional services from the audio client object. + + The interface ID for the requested service. + Pointer to a pointer variable into which the method writes the address of an instance of the requested interface. + + + diff --git a/packages/NAudio.1.7.1/license.txt b/packages/NAudio.1.7.1/license.txt new file mode 100644 index 00000000..622a544b --- /dev/null +++ b/packages/NAudio.1.7.1/license.txt @@ -0,0 +1,31 @@ +Microsoft Public License (Ms-PL) + +This license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software. + +1. Definitions + +The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning here as under U.S. copyright law. + +A "contribution" is the original software, or any additions or changes to the software. + +A "contributor" is any person that distributes its contribution under this license. + +"Licensed patents" are a contributor's patent claims that read directly on its contribution. + +2. Grant of Rights + +(A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create. + +(B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software. + +3. Conditions and Limitations + +(A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. + +(B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically. + +(C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software. + +(D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license. + +(E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement. \ No newline at end of file diff --git a/packages/NAudio.1.7.1/readme.txt b/packages/NAudio.1.7.1/readme.txt new file mode 100644 index 00000000..be1856a1 --- /dev/null +++ b/packages/NAudio.1.7.1/readme.txt @@ -0,0 +1,72 @@ +NAudio is an open source .NET audio library written by Mark Heath (mark.heath@gmail.com) +For more information, visit http://naudio.codeplex.com + +THANKS +====== +The following list includes some of the people who have contributed in various ways to NAudio, such as code contributions, +bug fixes, documentation, helping out on the forums and even donations. I haven't finished compiling this list yet, so +if your name should be on it but isn't please let me know and I will include it. Also, some people I only know by their forum +id, so if you want me to put your full name here, please also get in touch. + +in alphabetical order: +Alexandre Mutel +Alexander Binkert +AmandaTarafaMas +balistof +biermeester +borman11 +bradb +Brandon Hansen (kg6ypi) +csechet +ChunkWare Music Software +CKing +DaMacc +eejake52 +Florian Rosmann (filoe) +Giawa +Hfuy +Iain McCowan +Idael Cardaso +ioctlLR +Jamie Michael Ewins +jannera +jbaker8935 +jcameron23 +jonahoffmann +jontdelorme +Justin Frankel +K24A3 +Kassoul +kevinxxx +Lustild +Lucian Wischik (ljw1004) +ManuN +MeelMarcel +Michael Feld +Michael J +Michael Lehenbauer +Nigel Redmon +Nikolaos Georgiou +Owen Skriloff +owoudenb +painmailer +PPavan +Pygmy +Ray Molenkamp +Robert Bristow-Johnson +Scott Fleischman +Sirish Bajpai +sporn +Steve Underwood +Ted Murphy +Tiny Simple Tools +Tobias Fleming +Tony Cabello +Tony Sistemas +TuneBlade +topher3683 +Vladimir Rokovanov +Ville Koskinen +Wyatt Rice +Yuval Naveh +Zsb diff --git a/packages/NVorbis.0.8.3.0/COPYING b/packages/NVorbis.0.8.3.0/COPYING new file mode 100644 index 00000000..a4ff109f --- /dev/null +++ b/packages/NVorbis.0.8.3.0/COPYING @@ -0,0 +1,20 @@ +Copyright (c) 2012 Andrew Ward, Ms-PL + +Microsoft Public License (Ms-PL) + +This license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software. + +Definitions +The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning here as under U.S. copyright law. +A "contribution" is the original software, or any additions or changes to the software. +A "contributor" is any person that distributes its contribution under this license. +"Licensed patents" are a contributor's patent claims that read directly on its contribution. +Grant of Rights +(A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create. +(B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software. +Conditions and Limitations +(A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. +(B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically. +(C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software. +(D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license. +(E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees, or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement. diff --git a/packages/NVorbis.0.8.3.0/NVorbis.0.8.3.0.nupkg b/packages/NVorbis.0.8.3.0/NVorbis.0.8.3.0.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..38a8f0d198df2fccf5d21950d6149e3615fb52b6 GIT binary patch literal 42909 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 managed Xiph.org Foundation Ogg Vorbis decoder + - BugFix: Don't set the end of stream flag until the last packet of the page + en-US + ogg vorbis xiph audio c# sound .NET + + + + + \ No newline at end of file diff --git a/packages/NVorbis.0.8.3.0/README b/packages/NVorbis.0.8.3.0/README new file mode 100644 index 00000000..29430693 --- /dev/null +++ b/packages/NVorbis.0.8.3.0/README @@ -0,0 +1,120 @@ +NVorbis +------- + +NVorbis is a .Net library for decoding Xiph.org Vorbis files. It is purely +managed code, and should run correctly in partial-trust environments. + +This implementation is based on the Vorbis specification found on xiph.org. +The MDCT and Huffman codeword generator were borrowed from public domain +implementations at http://nothings.org/stb_vorbis/. + +Currently the only container supported is Xiph.org Ogg. Matroska and RTP +are planned. + +To use: + +- Create an instance of NVorbis.VorbisReader (pass the Ogg Vorbis filename in) +- Use these properties to gather data about the logical stream: + - Channels + - SampleRate + - TotalTime - A TimeSpan indicating the total length of the audio data + - DecodedTime - A TimeSpan indicating the last returned sample's timestamp + - NominalBitrate, UpperBitrate, and LowerBitrate + - These are the encoder's reported bitrates + - Vendor - The encoder's vendor string + - Comments - An array of comments in the file (usually tags) +- Call "int ReadSamples(float[], int, int)" to retrieve the next batch of + samples. It will return 0 when the logical Vorbis stream is done. + + +- For NAudio support: + - Reference NVorbis.NAudioSupport.dll + - Create an instance of NVorbis.NAudioSupport.VorbisWaveReader + - VorbisWaveReader implements NAudio.Wave.WaveStream. + +History +------- +0.1 - 08/03/2012 + * Initial Release +0.2 - 08/07/2012 + * Swapped out LGPL code for public domain implementations + * Relicensed under Ms-PL + * Added NAudio support project + * Added test files & app + * Performance improvements +0.3 - 08/08/2012 + * Fixed Page / Packet decode (packets overlapping 2 pages) + * Fixed "no energy" packet handling + * Fixed packet reader not merging when unsolicited packets are added + * Added .gitignore + * Added initial multi-stream support + * Added statistics (see VorbisReader.Stats) +0.4 - 08/14/2012 + * Refactoring to clean up code and make room for later improvements + * Changed lapping algorithm to be simpler + * Switched to higher-performance clipping algorithm + * Some cleanup +0.4.1 - 09/11/2012 + * Fixed a couple Ogg container bugs + * Optimized memory allocations for better performance / memory usage +0.5 - 09/20/2012 + * Added seeking support + * Changed OggPacketReader to use a doubly-linked list for the packet queue / history + * Changed OggPacketReader.GetTotalPageCount() to count pages directly instead of making .AddPacket(...) keep a list + * Fixed a few bugs (mostly race conditions in multi-threaded playback scenarios) + * Added multi-stream support to VorbisWaveReader + * Added several info properties to VorbisWaveReader +0.5.5 - 11/15/2012 + * Added OpenTK support + * Added makefiles for Mono + * Added constructor to NAudioSupport for already opened Stream instances + * Made Ogg container logic thread-safe + * Cleanup & Optimization +0.6.0 - 06/27/2013 + * Remove ACache from project + * Make clipping optional (default: on) + * Set clipping to clamp at +/-.99999994 instead of +/-1 as a courtesy to those not outputing float samples + * Performance improvements for RingBuffer + * Performance improvements in ThreadSafeStream +0.7.0 - 07/15/2013 + * Rewrite Ogg Reader buffering logic to vastly improve memory usage + * Reorganize to more easily support other container types / work with other Ogg stream decoders + * Exposed Ogg reading types + * Performance improvements + * Bugfix: Don't throw on Vorbis streams that only have a single mode +0.7.1 - 07/18/2013 + * Removed use of generics & lambda from Huffman decoder + * Reduced computation by only processing samples that are required for output + * Bugfix: Seeking now works again + * Bugfix: OpenTKSupport.OggStream now only queues as many source buffers as it filled +0.7.2 - 07/22/2013 + * Bugfix: Floor 0 implementation is now correct + * Bugfix: Residue 0 & 1 implementation is now correct + * Bugfix: Seeking back less than the current buffer size no longer corrupts the read buffer +0.7.3 - 08/02/2013 + * Bugfix: Fix residue 1 +0.7.4 - 09/16/2013 + * Bugfix: Some stereo files with sound on only one channel decoded noise on the silent channel. +0.8.0test1 - 09/16/2013 + * Rebuilt container reading infrastructure so it is properly decoupled from the decoder + * Added unit tests for the packet reader, Ogg container reader +0.8.0 - 01/16/2014 + * Minor bugfixing to test1 + * Replaces 0.7.4 as recommended release +0.8.1 - 02/24/2014 + * Bugfix: Threading issues in Ogg reader + * Rewrite StreamReadBuffer (again) for simplicity and correctness + * Add "saved buffer" concept to StreamReadBuffer for multi-threaded performance + * Reduce Ogg reader memory usage + * Add locking for multi-threading support in Ogg reader + * Remove exception-based logic where possible for better performance +0.8.2 - 03/19/2014 + * BugFix: Don't try to copy StreamReadBuffer data when offset is bigger than source + * Add parameter change event to packet provider interface + * Refactored decoder setup so parameter change can be handled + * Rewrote packet peek / get logic for simplicity + * Refactored locking in OggPacketReader / OggContainerReader + * Improved Ogg end of stream handling + * Changed container seek API to use packets instead of indexes to reduce linked list traversals +0.8.3 - 04/29/2014 + * BugFix: Don't set the end of stream flag until the last packet of the page diff --git a/packages/NVorbis.0.8.3.0/lib/NVorbis.XML b/packages/NVorbis.0.8.3.0/lib/NVorbis.XML new file mode 100644 index 00000000..731b4ac2 --- /dev/null +++ b/packages/NVorbis.0.8.3.0/lib/NVorbis.XML @@ -0,0 +1,672 @@ + + + + NVorbis + + + + + Provides an implementation for basic Ogg files. + + + + + Provides a interface for a Vorbis logical stream container. + + + + + Initializes the container and finds the first stream. + + True if a valid logical stream is found, otherwise False. + + + + Finds the next new stream in the container. + + True if a new stream was found, otherwise False. + is False. + + + + Retrieves the total number of pages in the container. + + The total number of pages. + is False. + + + + Gets the list of stream serials found in the container so far. + + + + + Gets whether the container supports seeking. + + + + + Gets the number of bits in the container that are not associated with a logical stream. + + + + + Gets the number of pages that have been read in the container. + + + + + Event raised when a new logical stream is found in the container. + + + + + Creates a new instance with the specified file. + + The full path to the file. + + + + Creates a new instance with the specified stream. Optionally sets to close the stream when disposed. + + The stream to read. + True to close the stream when is called, otherwise False. + + + + Initializes the container and finds the first stream. + + True if a valid logical stream is found, otherwise False. + + + + Disposes this instance. + + + + + Gets the instance for the specified stream serial. + + The stream serial to look for. + An instance. + The specified stream serial was not found. + + + + Finds the next new stream in the container. + + True if a new stream was found, otherwise False. + is False. + + + + Retrieves the total number of pages in the container. + + The total number of pages. + is False. + + + + Gets the list of stream serials found in the container so far. + + + + + Event raised when a new logical stream is found in the container. + + + + + Gets the number of pages that have been read in the container. + + + + + Gets whether the container supports seeking. + + + + + Gets the number of bits in the container that are not associated with a logical stream. + + + + + A thread-safe, read-only, buffering stream wrapper. + + + + + Gets the counters for latency and bitrate calculations, as well as overall bit counts + + + + + Gets the calculated bit rate of audio stream data for the everything decoded so far + + + + + Gets the calculated bit rate for the last ~1 second of audio + + + + + Gets the calculated latency per page + + + + + Gets the calculated latency per packet + + + + + Gets the calculated latency per second of output + + + + + Gets the number of bits read that do not contribute to the output audio + + + + + Gets the number of bits read that contribute to the output audio + + + + + Gets the number of pages read so far in the current stream + + + + + Gets the total number of pages in the current stream + + + + + Gets whether the stream has been clipped since the last reset + + + + + Provides packets on-demand for the Vorbis stream decoder. + + + + + Retrieves the total number of pages (or frames) this stream uses. + + The page count. + is False. + + + + Retrieves the next packet in the stream. + + The next packet in the stream or null if no more packets. + + + + Retrieves the next packet in the stream but does not advance to the following packet. + + The next packet in the stream or null if no more packets. + + + + Retrieves the packet specified from the stream. + + The index of the packet to retrieve. + The specified packet. + is less than 0 or past the end of the stream. + is False. + + + + Retrieves the total number of granules in this Vorbis stream. + + The number of samples + is False. + + + + Finds the packet index to the granule position specified in the current stream. + + The granule position to seek to. + A callback method that takes the current and previous packets and returns the number of granules in the current packet. + The index of the packet that includes the specified granule position or -1 if none found. + is less than 0 or is after the last granule. + + + + Sets the next packet to be returned, applying a pre-roll as necessary. + + The packet to key from. + The number of packets to return before the indicated packet. + + + + Gets the serial number associated with this stream. + + + + + Gets whether seeking is supported on this stream. + + + + + Gets the number of bits of overhead in this stream's container. + + + + + Occurs when the stream is about to change parameters. + + + + + A single data packet from a logical Vorbis stream. + + + + + Gets the value of the specified flag. + + + + + Sets the value of the specified flag. + + + + + Creates a new instance with the specified length. + + The length of the packet. + + + + Reads the next byte of the packet. + + The next byte if available, otherwise -1. + + + + Indicates that the packet has been read and its data is no longer needed. + + + + + Attempts to read the specified number of bits from the packet, but may return fewer. Does not advance the position counter. + + The number of bits to attempt to read. + The number of bits actually read. + The value of the bits read. + is not between 0 and 64. + + + + Advances the position counter by the specified number of bits. + + The number of bits to advance. + + + + Resets the bit reader. + + + + + Reads the specified number of bits from the packet and advances the position counter. + + The number of bits to read. + The value of the bits read. + The number of bits specified is not between 0 and 64. + + + + Reads the next byte from the packet. Does not advance the position counter. + + The byte read from the packet. + + + + Reads the next byte from the packet and advances the position counter. + + The byte read from the packet. + + + + Reads the specified number of bytes from the packet and advances the position counter. + + The number of bytes to read. + A byte array holding the data read. + + + + Reads the specified number of bytes from the packet into the buffer specified and advances the position counter. + + The buffer to read into. + The index into the buffer to start placing the read data. + The number of bytes to read. + The number of bytes read. + is less than 0 or + is past the end of . + + + + Reads the next bit from the packet and advances the position counter. + + The value of the bit read. + + + + Retrieves the next 16 bits from the packet as a and advances the position counter. + + The value of the next 16 bits. + + + + Retrieves the next 32 bits from the packet as a and advances the position counter. + + The value of the next 32 bits. + + + + Retrieves the next 64 bits from the packet as a and advances the position counter. + + The value of the next 64 bits. + + + + Retrieves the next 16 bits from the packet as a and advances the position counter. + + The value of the next 16 bits. + + + + Retrieves the next 32 bits from the packet as a and advances the position counter. + + The value of the next 32 bits. + + + + Retrieves the next 64 bits from the packet as a and advances the position counter. + + The value of the next 64 bits. + + + + Advances the position counter by the specified number of bytes. + + The number of bytes to advance. + + + + Gets whether the packet was found after a stream resync. + + + + + Gets the position of the last granule in the packet. + + + + + Gets the position of the last granule in the page the packet is in. + + + + + Gets the length of the packet. + + + + + Gets whether the packet is the last one in the logical stream. + + + + + Gets the number of bits read from the packet. + + + + + Gets the number of granules in the packet. If null, the packet has not been decoded yet. + + + + + Defines flags to apply to the current packet + + + + + Packet is first since reader had to resync with stream. + + + + + Packet is the last in the logical stream. + + + + + Packet does not have all its data available. + + + + + Packet has a granule count defined. + + + + + Flag for use by inheritors. + + + + + Flag for use by inheritors. + + + + + Flag for use by inheritors. + + + + + Flag for use by inheritors. + + + + + Reads decoded samples from the current logical stream + + The buffer to write the samples to + The offset into the buffer to write the samples to + The number of samples to write + The number of samples written + + + + Clears the parameter change flag so further samples can be requested. + + + + + Searches for the next stream in a concatenated file + + True if a new stream was found, otherwise false. + + + + Switches to an alternate logical stream. + + The logical stream index to switch to + True if the properties of the logical stream differ from those of the one previously being decoded. Otherwise, False. + + + + Gets the number of channels in the current selected Vorbis stream + + + + + Gets the sample rate of the current selected Vorbis stream + + + + + Gets the encoder's upper bitrate of the current selected Vorbis stream + + + + + Gets the encoder's nominal bitrate of the current selected Vorbis stream + + + + + Gets the encoder's lower bitrate of the current selected Vorbis stream + + + + + Gets the encoder's vendor string for the current selected Vorbis stream + + + + + Gets the comments in the current selected Vorbis stream + + + + + Gets whether the previous short sample count was due to a parameter change in the stream. + + + + + Gets the number of bits read that are related to framing and transport alone + + + + + Gets or sets whether to automatically apply clipping to samples returned by . + + + + + Gets stats from each decoder stream available + + + + + Gets the currently-selected stream's index + + + + + Returns the number of logical streams found so far in the physical container + + + + + Gets or Sets the current timestamp of the decoder. Is the timestamp before the next sample to be decoded + + + + + Gets or Sets the current position of the next sample to be decoded. + + + + + Gets the total length of the current logical stream + + + + + Event data for when a new logical stream is found in a container. + + + + + Creates a new instance of with the specified . + + An instance. + + + + Gets new the instance. + + + + + Gets or sets whether to ignore the logical stream associated with the packet provider. + + + + + Reads the number of bytes specified into the buffer given, starting with the offset indicated. + + The offset into the stream to start reading. + The buffer to read to. + The index into the buffer to start writing to. + The number of bytes to read. + The number of bytes read. + + + + Tells the buffer that it no longer needs to maintain any bytes before the indicated offset. + + The offset to discard through. + + + + Gets or Sets whether to limit reads to the smallest size possible. + + + + + Gets or Sets the maximum size of the buffer. This is not a hard limit. + + + + + Gets the offset of the start of the buffered data. Reads to offsets before this are likely to require a seek. + + + + + Gets the number of bytes currently buffered. + + + + + Gets the number of bytes the buffer can hold. + + + + + Event data for when a logical stream has a parameter change. + + + + + Creates a new instance of . + + The first packet after the parameter change. + + + + Gets the first packet after the parameter change. This would typically be the parameters packet. + + + +

3p1$b3*lw(C$cwqbb~6)R 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 literal 0 HcmV?d00001 diff --git a/packages/NVorbis.0.8.3.0/NVorbis.0.8.3.0.nuspec b/packages/NVorbis.0.8.3.0/NVorbis.0.8.3.0.nuspec new file mode 100644 index 00000000..8b76fcca --- /dev/null +++ b/packages/NVorbis.0.8.3.0/NVorbis.0.8.3.0.nuspec @@ -0,0 +1,20 @@ + + + + NVorbis + 0.8.3.0 + Andrew Ward + Andrew Ward + http://nvorbis.codeplex.com/license + http://nvorbis.codeplex.com/ + false + A fully managed implementation of a Xiph.org Foundation Ogg Vorbis decoder. +