tag:blogger.com,1999:blog-78630284044242178172024-03-13T19:21:59.116-07:00Lake of Soft LabsLatest news and events from Lake of Soft Labs.lakeofcodehttp://www.blogger.com/profile/10666425420454133475noreply@blogger.comBlogger19125tag:blogger.com,1999:blog-7863028404424217817.post-59099866487852494012018-04-04T15:17:00.000-07:002018-04-04T15:17:05.546-07:00VC Public full sources releaseToday full sources of VC components were released under Apache 2.0 license.<br />
<br />
<a href="https://github.com/lakeofsoft/vcp">https://github.com/lakeofsoft/vcp</a><br />
<br />
That should be done long time ago.<br />
<br />
Also, this would probably be a last post on blogger, please visit our new page:<br />
<br />
<a href="http://lakeofsoft.github.io/">http://lakeofsoft.github.io/</a><br />
<br />
Happy coding!lakeofcodehttp://www.blogger.com/profile/10666425420454133475noreply@blogger.com1tag:blogger.com,1999:blog-7863028404424217817.post-76287831988443655532016-01-26T18:50:00.002-08:002016-01-26T18:55:17.337-08:00Whoa, that was fast! [Rust]<span style="font-size: small;">Browsing through Rust tutorial book's chapter <a href="https://doc.rust-lang.org/book/rust-inside-other-languages.html">Rust Inside Other Languages</a> I was wandering, why the sample is running kind of slow (in non-release compilation): running a ten times slower than equivalent Delphi source.
</span><br />
<span style="font-size: small;"><br /></span>
<span style="font-size: small;">Lets take a look at disassembled code for this fragment:
</span><br />
<span style="font-size: small;"><br /></span>
<span style="background-color: #fff2cc; font-size: small;"><span style="font-family: "verdana" , sans-serif;"> for _ in 0..5_000_000 {</span></span>
<br />
<span style="font-size: small;"><br /></span>
<span style="font-size: small;">If you know that Rust's <span style="font-family: "courier new" , "courier" , monospace;">for</span> is actually a syntax sugar for iterators, the result should no be so surprising:</span><br />
<span style="background-color: #d0e0e3; font-size: small;"><br /></span>
<br />
<pre><span style="background-color: #d0e0e3; font-size: small;"> mov dword ptr [rbp - 128], 0 // starting value
mov dword ptr [rbp - 124], 5000000 // ending value
mov rdi, qword ptr [rbp - 128]
call IntoIterator_into_iter
....
mov qword ptr [rbp - 264], rdi // iterator
</span></pre>
<span style="font-size: small;"><br /></span>
<span style="font-size: small;">Later <span style="font-family: "courier new" , "courier" , monospace;">Iterator::next()</span> method will be called in a loop, returning Some(_) (actual value is ignored) or None, when iterator is done:</span><br />
<span style="font-size: small;"><br /></span>
<br />
<pre><span style="font-size: small;"><span style="background-color: #d0e0e3;"> mov rdi, qword ptr [rbp - 264] // iterator
call Iterator_next
mov qword ptr [rbp - 152], rax // Option<self::item>
mov qword ptr [rbp - 160], rax //
mov ecx, dword ptr [rbp - 160]
sub ecx, 1
...
je loop_body
jmp break
</self::item></span></span></pre>
<span style="font-size: small;"><span style="background-color: #d0e0e3;"></span></span><br />
<span style="font-size: small;"><br /></span>
<span style="font-size: small;">The call to <span style="font-family: "courier new" , "courier" , monospace;">Iterator::next()</span> is costly, it is far from as simple as "<span style="font-family: "courier new" , "courier" , monospace;">inc eax</span>", that is why sample is running so slow.
</span><br />
<span style="font-size: small;"><br /></span>
<span style="font-size: small;">One interesting note is what happening when you compile with <span style="font-family: "courier new" , "courier" , monospace;">--release</span> switch. Lets take a look at our iterator loop:
</span><br />
<span style="font-size: small;"><br /></span>
<br />
<pre><span style="font-size: small;"><span style="background-color: #d0e0e3;"> mov rax, 004C4B400000001h // hex 4C4B40 is 5000000 in decimal
mov [rsi], rax
</span></span></pre>
<span style="font-size: small;"><br /></span>
<span style="font-size: small;">Well, apparently compiler has outsmarted the programmer.
</span><br />
<span style="font-size: small;"><br /></span>
<br />
<blockquote>
<span style="font-size: small;">Whoa, that was fast!</span></blockquote>
lakeofcodehttp://www.blogger.com/profile/10666425420454133475noreply@blogger.com0tag:blogger.com,1999:blog-7863028404424217817.post-13864043998408582402012-04-27T05:47:00.000-07:002012-04-27T05:47:39.534-07:00ASIO InterfaceThere are several audio engines available under Windows.<br />
<br />
<a href="http://msdn.microsoft.com/en-us/library/dd757715%28v=vs.85%29.aspx">Waveform Audio</a> (MME) — the old one, still provides simple and clean API, working anywhere from Windows 3.0 to Windows 7 and even Windows CE.<br />
<br />
<a href="http://msdn.microsoft.com/en-us/library/dd375454%28v=vs.85%29.aspx">DirectShow</a> (DirectSound) — powerful architecture with hardware integration.<br />
<br />
<a href="http://msdn.microsoft.com/en-us/library/dd370802%28v=vs.85%29.aspx">Core Audio</a> — new audio interface introduced in Windows Vista.<br />
<br />
<a href="https://en.wikipedia.org/wiki/Audio_Stream_Input/Output">ASIO</a> — driver protocol specified by <a href="https://en.wikipedia.org/wiki/Steinberg" title="Steinberg">Steinberg.</a> Its main purpose it to achieve minimal possible latency, which is important for professional applications. Many hardware manufacturers provide ASIO drivers for their products. And if they don't, there is <a href="http://www.asio4all.com/">ASIO4ALL</a>.<br />
<br />
ASIO API is based on COM technology, and <a href="http://www.rossbencina.com/code/iasio-thiscall-resolver">according to</a> Ross Bencina was unfortunately declared with thiscall calling convention.Not many compilers support it, and for Delphi you have no other option, but to use built-in assembler:<br />
<br />
<blockquote class="tr_bq">
<span style="font-family: "Courier New",Courier,monospace;">// -- --</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">function unaAsioDriver.controlPanel(): ASIOError;</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">begin</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">{$IFDEF CPU64 }</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> result := f_asio.controlPanel();</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">{$ELSE }</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> asm</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> mov eax, [self]</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> mov ecx, [eax][f_asio]</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> mov eax, [ecx]</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> call dword ptr [eax + cofs_controlPanel]</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> //</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> mov result, eax</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> end;</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">{$ENDIF CPU64 }</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">end;</span></blockquote>
where cofs_controlPanel is a displacement for ControlPanel entry point in IASIO interface. Fortunately x64 target uses one standard convention.<br />
<br />
ASIO is based on I/O buffers and callbacks. When buffers are filled with recorded audio, a BufferSwitch callback is called, so you have a chance to read fresh data and provide ASIO with new data for playback there. Here is the prototype:<br />
<br />
<blockquote class="tr_bq" style="font-family: "Courier New",Courier,monospace;">
procedure(index: long; processNow: ASIOBool); cdecl;</blockquote>
index specifies buffer index being reported.<br />
<br />
There is no way to get IASIO driver instance in callback, so if you open two or more devices at once, you will need two or more different callbacks.<br />
<br />
There are plenty of audio sample formats defined in ASIO, so you have to deal with all kind of conversion from one format to another (16 to 24, MSB to LSB and so on).<br />
<br />
Samples are organized into buffers, and buffers belong to channels. Each channel could be input or output. That makes it easy to access any sample in any channel at any time (bearing in mind original sample format).<br />
<br />
Overall, despite some drawbacks mentioned above, ASIO is a simple and efficient way to record and playback multi-channel audio with a minimal latency.lakeofcodehttp://www.blogger.com/profile/10666425420454133475noreply@blogger.com0tag:blogger.com,1999:blog-7863028404424217817.post-47086758348045953712012-02-22T05:13:00.002-08:002012-02-22T05:13:19.415-08:00RTSP and STUN<a href="https://tools.ietf.org/html/rfc2326">RTSP </a>is old but still good. Flexible HTTP-like request/response model makes it easy to create custom applications based on it.<br />
<br />
There is one drawback though, which I found impossible to overcome with standard means. When client sends a SETUP request, it should provide transport options via Transport header:<br />
<br />
<pre class="newpage" style="font-family: "Courier New",Courier,monospace;">Transport: RTP/AVP;unicast;client_port=4588-4589</pre>
<br />
The problem is, client may not know its ports. That is because NAT may change the ports when packets are passing through it back and forth.<br />
<br />
OK, that is why <a href="https://tools.ietf.org/html/rfc5389">STUN</a> was defined and should be used, right? But even with STUN it could be impossible. First, STUN server should be running on the same host where RTP will source will be located. Second, STUN server should be running on the same port as RTP source! Again, that is because NAT may change ports. Even when you send a packet from the same socket to the same host, but to different port, source port may change.<br />
<br />
Here is what happening:<br />
<br />
1) Client binds two sockets to local ports, say 25004 and 25005, and sends two packet to STUN host at port 3478. NAT changes the original client ports to something else, say 35004 and 35005. And those ports are reported back to client by STUN server.<br />
<br />
2) Client sends SETUP request to RTSP server, saying it will use ports 35004 and 35005 for RTP/RTCP:<br />
<br />
<pre class="newpage" style="font-family: "Courier New",Courier,monospace;">Transport: RTP/AVP;unicast;client_port=35004-35005</pre>
<br />
3) RTSP server setups an RTP source and starts streaming to client host at ports 35004-35005. Client receives RTP/RTCP packets, so far so good.<br />
<br />
4) Now its time for client to send RTCP Receiver Report packet to RTP source, so it will not timeout the client. Client sends a packet from local port 25005 to remote port 5005, in hope NAT will change the source port to 35005, same as it did for STUN packet. But some NATs may be paranoid enough to change the source port to something else, when destination port is different (even though destination host is the same). I have no idea why they do that, but I saw it happen some times.<br />
<br />
5) RTCP at source host will receive RR packet from client host, but from an unexpected port (not from 35005). Because there are no bindings between RTSP session and RTP source, it could be impossible for it to map a packet from unexpected port with existing session. And that will lead to removing the client from destinations.<br />
<br />
So, unless you are running STUN and RTCP at the same port, there is a possibility for client to be timed out even if it sends RR packets.<br />
<br />
What we use is simple (but non-standard!) additional field in Transport header:<br />
<br />
<pre class="newpage" style="font-family: "Courier New",Courier,monospace;">Transport: RTP/AVP;unicast;<span style="color: red;">SSRC=1276485;</span>client_port=35004-35005</pre>
<br />
Client reports its SSRC when establishing a session, so RTP source may be presented with strong binding between RTSP session and RTP destination. Now, even when receiving an RR packet from unexpected port, it can map it to existing session by SSRC included in the packet.<br />
<br />
If this field in not provided, source RTCP will simply assume the port provided by client in SETUP request will not change.<br />
<br />
Some NATs may modify original SETUP request, if they recognize the RTSP protocol, which simply adds another level of confusion. Disable STUN functionality in client if your router is one of those.<br />
<br />
Our <a href="http://lakeofsoft.com/vc/a_rtspmultitrans.html">new RTSP sample</a> is running at our new development host avoxum.com at port 1500 and is ready to serve local files or re-broadcast remore stream. There is no sound card there, so live recording will not work.lakeofcodehttp://www.blogger.com/profile/10666425420454133475noreply@blogger.com1tag:blogger.com,1999:blog-7863028404424217817.post-57948257953362996532012-01-11T04:41:00.000-08:002012-01-11T04:43:25.361-08:00RegEx libraryAs a part of SIP NAPTR lookup you may need to do a regex replacement.<br />
<br />
Since Delphi up to 2010 does not include regex library, there was no other way but to write our own:<br />
<br />
<a href="http://lakeofsoft.com/regex/">http://lakeofsoft.com/regex/</a><br />
<br />
It was fun creating it, and I hope it would be fun using it.<br />
Any comments and suggestions are welcome.lakeofcodehttp://www.blogger.com/profile/10666425420454133475noreply@blogger.com1tag:blogger.com,1999:blog-7863028404424217817.post-52664539496586592592011-12-14T05:36:00.000-08:002011-12-14T05:36:01.168-08:00VCX December Beta<p><a href="http://lakeofsoft.com/vcx/beta.html">VCX Beta</a> version was released, it brings x64 binaries and new <a href="http://lakeofsoft.com/codec/">built-in codecs</a>.
<p>I recommend trying <a href="http://lakeofsoft.com/vcx/download.html">VCX Beta Demo</a> x64 first, it has two samples compiled in VS 2008 C# for x64 CPU.
<p>The major issue with x64 version is that it cannot be hosted in 32-bit IDE, such as VS 2008/2010.
<p>There are two options:
<ul>
<li>create VCX controls in run-time, as in our IPReceiver64/IPTransmitter64 samples, located in vs2008/c#/_x64/ folder</li>
<li>host x86 VCX library in IDE, but compile for x64 CPU. This requires having <a href="http://lakeofsoft.com/vcx/doc/gen_install.html">both x86 and x64 versions</a> installed</li>
</ul>
<p>In either case, x64 should be working same as x86 version, except for external codec libraries, such as CELT and Speex. Only MP3 encoding/decoding is currently supported in x64 version, with help of lame_enc.dll and libmpg123-0.dll libraries. All <a href="http://lakeofsoft.com/codec/">built-in codecs</a> should be working fine in x64.
<p>Unfortunately x64 release has a bit different registration module, so you will need a separate serial for it. If you already have a license for x86/ANSI version, please <a href="http://lakeofsoft.com/vcx/doc/gen_support.html">contact us</a> for a free x64 license.lakeofcodehttp://www.blogger.com/profile/10666425420454133475noreply@blogger.com0tag:blogger.com,1999:blog-7863028404424217817.post-28281218181002472292011-10-30T15:51:00.000-07:002011-10-30T15:51:28.823-07:00to x64 or not to x64With new release of RAD Studio (XE2) Embarcadero opens a few more horizons for long forgotten Delphi developers. Now they can finally compile "Hello, World!" as x64 binary (only 6 years passed since first AMD64 chip, why so hasty?) and even target the OS X.<br />
<br />
The switch to x64 does not come easy, though. The size of Integer and Cardinal is still 4 bytes, so if you get used to write the code like <code>Cardinal(@val)</code>, in hope that Cardinal will follow native CPU expansion (as it was when Integer got expanded from 16 to 32 bits from Delphi 1 to Delphi 2), you fail.<br />
<br />
How should you code instead? Pick one: <code>UIntPtr(@val)</code> or <code>NativeUInt(@val)</code>. Huh? Who are these guys, you ask? Ask Delphi 2010 Help instead, it has a whole pile of information about them (2 random pages in total, actually).<br />
<br />
For VC another challenge was to find the x64 version of codec libraries we are supporting. So far the Lame and mpg123 libraries are fine with x64, SpeeX and CELT would be fine hopefully soon.<br />
<br />
I was having a great fun with new MPEG-TS demuxer code, hope you will find it fun to use.<br />
<br />
The reason the FFT bands component was expanded is a new FFT code I have created for another project, which will hopefully find its place among LoS products soon. The code is pretty fast, so I decided to rebuild the bands display as well. If you find the dB scale rather confusing, I'm sorry, was doing my best.<br />
<br />
As a part of Demos testing have compiled ANSI version of them (using Delphi 7) and was pretty surprised that most of them works fine under Windows 98.<br />
<br />
No OS X news, haven't unpacked my MacBook Air yet (actually, haven't bought it yet). <br />
<br />
More news to come, have fun coding with new <a href="http://lakeofsoft.com/vc/dev.html">RC of VC</a>!lakeofcodehttp://www.blogger.com/profile/10666425420454133475noreply@blogger.com0tag:blogger.com,1999:blog-7863028404424217817.post-8725298152359143272011-04-24T12:15:00.000-07:002011-04-24T12:17:32.807-07:00VCX maintenance releaseToday we have released new version of VCX library.<br />
<br />
It accumulates the <a href="http://lakeofsoft.com/vc/dev.html">updates from VC components</a> made during last 8 months.<br />
<br />
The library was recompiled and tested, samples were left almost the same as before, we will be working on new features in next releases. <a href="http://lakeofsoft.com/vcx/beta.html">Beta page</a> will got updated soon.<br />
<br />
VS 2010 should run samples from VS 2008 without issues, if you find any, please let us know.<br />
<br />
If your license for free updates is still valid, simply download the setup application from the URL provided in your registration email and use same name/serial.<br />
<br />
If your license has expired you are welcome to <a href="http://lakeofsoft.com/vcx/download.html">download Demo version</a> and see if you need the update. You can order another year of free updates with 50% discount of regular price. Contact us for coupon codes.<br />
<br />
As a reminder, we have RTP radio streaming working 24/7 at this URI:<br />
<br />
rtp://lakeofsoft.dyndns-server.com:5006/<br />
<br />
Currently streaming with <a href="http://www.celt-codec.org/">CELT codec</a>. Try ipReceiver sample to tune in.<br />
<br />
Wish you a pleasant development with our library.<br />
Oleksandr Shamraylakeofcodehttp://www.blogger.com/profile/10666425420454133475noreply@blogger.com0tag:blogger.com,1999:blog-7863028404424217817.post-10764625444916360022011-04-14T17:13:00.000-07:002011-04-14T17:14:52.566-07:00VC 2.5.2011.04New release of VC components is ready to be <a href="http://lakeofsoft.com/vc/dev.html">downloaded</a> and installed.<br />
<br />
Includes many bug fixes we were working on last months, and couple of new features.<br />
<br />
RTP Transmitter and Receiver when communicating over multicast session could have TTL specified via SDP.<br />
<br />
New playback code would hopefully provide better quality of audio, with less clicks and other artifacts.<br />
<br />
New RTP features, like round-trip time measurement between participants and periodic "pings" over RTP port will help with connection problem diagnostic.<br />
<br />
RTP Conference Server now allows one user to participate in several rooms at the same time. New userStrictlyInOneRoom property is responsible for this. User can now also join another room without disconnecting from Server.<br />
<br />
As usual, any upcoming fixes will be listed in <a href="http://lakeofsoft.com/vc/dev.html">developers section</a>, make sure you are using the latest release.lakeofcodehttp://www.blogger.com/profile/10666425420454133475noreply@blogger.com0tag:blogger.com,1999:blog-7863028404424217817.post-64638998474020125002011-01-19T17:55:00.001-08:002011-01-19T18:10:34.207-08:00VC 2.5.2011.01 update is readyNow with better RTCP integration between RTP Conference Clients and Server, it has many vital communication problems fixed.<br /><br />The streaming logic of IPReceiver and IPTransmitter was switched. IPTransmitter is more like a server now, and IPReceiver is more like a client. Good news is that IPTransmitter can dynamically stream to many receivers, maintaining timeouts and other stuff. And IPReceiver now makes NAT holes when started, so it could communicate with IPTransmitter from behind the firewall without additional configuration.<br /><br />And if you need "old style" streaming of IPReceiver and IPTransmitter, there is a new sample: <a href="http://lakeofsoft.com/vc/a_ipstreaming.html#push">IPStreamPusher</a>. Pretty simple for now, probably be extended later with more features.<br /><br />And we are glad to announce another public service from Lake of Soft. This time it is a Ukrainian radio, re-broadcast with our vcIPTransmitter sample 24/7. Point your IPReceivers to rtp://lakeofsoft.dyndns-server.com:5006 and enjoy the fun.lakeofcodehttp://www.blogger.com/profile/10666425420454133475noreply@blogger.com0tag:blogger.com,1999:blog-7863028404424217817.post-73733253222662023572010-12-30T23:09:00.000-08:002010-12-30T23:14:21.124-08:00VC 2.5.2010.12New release of VC components is ready.<br />Now with full RTCP support, Git repository, Freeware version and new IP streaming components.<br /><br />P.S. 31 Dec 2010. That was close.lakeofcodehttp://www.blogger.com/profile/10666425420454133475noreply@blogger.com0tag:blogger.com,1999:blog-7863028404424217817.post-73469394634676647072010-12-01T19:10:00.000-08:002010-12-01T19:17:15.761-08:00Lakeofsoft on FacebookOur <a href="http://www.facebook.com/pages/Lake-of-Soft/114255061960355">page</a> on Facebook: see what we are working on those long winter nights.lakeofcodehttp://www.blogger.com/profile/10666425420454133475noreply@blogger.com0tag:blogger.com,1999:blog-7863028404424217817.post-21434498865413335482010-07-19T09:12:00.001-07:002010-07-19T09:20:16.718-07:00VCX Library 3.0.2010.07 releasedNew release of VCX library is now available for download.<br /><br />Includes samples and documentation for new components:<br /><br />http://lakeofsoft.com/vcx/doc/gen_history.html<br /><br />If you have a latest Beta key, it should be working with this release as well.<br /><br />For Vista/7 installation issues, please read <a href="http://lakeofsoft.com/vcx/deploy.html#vista">new instructions</a>.<br /><br />New simple <a href="http://lakeofsoft.com/vcx/doc/gs_provcons.html">linking schema</a> also worth to be mentioned.<br /><br />Thank you for reading our blog, stay tuned for more upcoming updates.lakeofcodehttp://www.blogger.com/profile/10666425420454133475noreply@blogger.com0tag:blogger.com,1999:blog-7863028404424217817.post-72097192548102043292010-06-26T06:46:00.000-07:002010-06-26T07:13:26.920-07:00VCX Library 3.0.2010.06 Beta releasedNew beta release of VCX library is now available for download:<br /><br /><a href="http://lakeofsoft.com/vcx/beta.html">http://lakeofsoft.com/vcx/beta.html</a><br /><br />It includes new IPTransmitter/IPReceiver/RTPConfServer and RTPConfClient components.<br /><br />License mode was changed, so if you already have a license, please contact us for update. All licenses for new release will be update free of charge.<br /><br />We are updating the documentation now, after that that beta version will became a new release.lakeofcodehttp://www.blogger.com/profile/10666425420454133475noreply@blogger.com0tag:blogger.com,1999:blog-7863028404424217817.post-84664053714314456082010-03-27T08:24:00.000-07:002010-03-27T09:37:24.768-07:00VC 2.5.2010.03 is hereWe are glad to announce a long-awaited update for our VC components, with the following new major features:<br /><br />- new RAW/RTP streaming components: <a href="http://lakeofsoft.com/vc/doc/VCDoc/unaIPStreaming/TunaIPReceiver.html">TunaIPReceiver</a> and <a href="http://lakeofsoft.com/vc/doc/VCDoc/unaIPStreaming/TunaIPTransmitter.html">TunaIPTransmitter</a>. Two <a href="http://lakeofsoft.com/vc/a_ipstreaming.html">new samples</a> show how to use them for streaming.<br /><br />- new RTP-based conference server and client components: <a href="http://lakeofsoft.com/vc/doc/VCDoc/unaConfRTPserver/TunaConfRTPserver.html">TunaConfRTPserver</a> and <a href="http://lakeofsoft.com/vc/doc/VCDoc/unaConfRTPclient/TunaConfRTPclient.html">TunaConfRTPclient</a>. New <a href="http://lakeofsoft.com/vc/a_rtpconf.html">RTP conference samples</a> introduce conference system designed for large number of participants.<br /><br />Read more in-depth details of update in our <a href="http://kauko.deru.net/pipermail/losnews_lakeofsoft.com/2010-March.txt">newsletter</a>.lakeofcodehttp://www.blogger.com/profile/10666425420454133475noreply@blogger.com0tag:blogger.com,1999:blog-7863028404424217817.post-13655893772774809702010-01-11T08:47:00.000-08:002010-01-11T12:35:57.409-08:00Public sourcesAs the number of Object Pascal wrappers we have for well-know libraries grows, we decided to release them for public domain in hope they would be useful for many developers.<br /><br />Right now you can download the <a href="http://www.monkeysaudio.com/developers.html">Monkey Audio library</a> API wrapper with some samples included (like apeAnalyze, apeCompress and apeDecompress). Just follow the <a href="http://lospublic.svn.sourceforge.net/viewvc/lospublic/audio/ape/">audio\ape</a> folder of our <a href="http://lospublic.svn.sourceforge.net/viewvc/lospublic/">SVN repository</a>. If you do not use SVN, you can download a <a href="http://lospublic.svn.sourceforge.net/viewvc/lospublic.tar.gz?view=tar">tarball </a>with all the sources required.<br /><br />Visit our project home page to stay tuned with further public releases:<br /><a href="http://sourceforge.net/projects/lospublic/develop">http://sourceforge.net/projects/lospublic/</a>lakeofcodehttp://www.blogger.com/profile/10666425420454133475noreply@blogger.com2tag:blogger.com,1999:blog-7863028404424217817.post-16737623980245695742009-06-16T09:10:00.000-07:002009-06-16T09:31:20.289-07:00MP3 decodingCurrent version of VC components has 3 ways to decode (decompress) MPEG audio:<br /><br />a) use ACM MP3 codec included with Windows. Most likely it comes with Media Player or some other codec pack. Usually this codec is limited to 64 kbps streams;<br /><br />b) use <a href="http://un4seen.com/">BASS library</a>, which has good decoder but is not free for commercial usage. It also tent to change its API with every release, which makes it hard to maintain from Delphi code. Currently supported version is 2.3;<br /><br />c) use old mpglib.dll which is not only hard to find, but is no longer updated and does not always work as expected.<br /><br />Every option has some drawbacks, so after short surfing a better solution was found:<br /><br />d) <a href="http://www.mpg123.org/">mpg123</a> — MPEG audio decoder library, which is licensed under LGPL 2.1. It works just perfectly and is updated frequently.<br /><br />Upcoming release of VC Components will include some samples showing this library in work, meanwhile you can download it and use <span style="font-style: italic;">unaLibmpg123Decoder </span>class from <span style="font-weight: bold;">unaMpgLibAPI.pas</span> unit to decode MPEG audio. Class is well documented in sources (I hope).lakeofcodehttp://www.blogger.com/profile/10666425420454133475noreply@blogger.com0tag:blogger.com,1999:blog-7863028404424217817.post-49443408664151631302009-06-12T08:53:00.000-07:002009-06-16T06:50:36.502-07:00VC 2.5.2009.06 releaseNew release of VC Components 2.5.2009.06 was uploaded today.<br />Now compatible with Delphi 2009 and has many bugfixes and improvements.<br /><br />Conference server is now working in new streaming mode, called Client-side mixing (CSM) by default. Check the unaConfDef.inc file, there you can define how to compile the server:<br /><br />Defining the CONFS_DISABLE_CODECS symbol makes server understand PCM streams only. It is also required to be defined if server is to be compiled in CSM mode.<br /><br />When CONFS_CSM symbol is defined, server will work in CSM mode.<br /><br />If both CONFS_DISABLE_CODECS and CONFS_CSM are not defined, server will be working in Server-side mixing mode (default for previous releases).<br /><br />More details about new release will be published soon.<br /><br />Stay tuned.lakeofcodehttp://www.blogger.com/profile/10666425420454133475noreply@blogger.com0tag:blogger.com,1999:blog-7863028404424217817.post-64055158675355420202009-05-05T02:17:00.000-07:002009-06-12T08:53:39.338-07:00Get startedHi,<br /><br />here we will be posting latest news and development progress from Lake of Soft.<br /><br />Lakelakeofcodehttp://www.blogger.com/profile/10666425420454133475noreply@blogger.com1