Yet Another (WA)SAPI Output Plugin for Winamp (YASAPI)

Copyright © 2015-2016 by Peter Belkner (http://home.snafu.de/pbelkner/)

"Yet Another (WA)SAPI Output Plugin for Winamp YASAPI" (out_yasapi) is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

"Yet Another (WA)SAPI Output Plugin for Winamp YASAPI" (out_yasapi) is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with "Yet Another (WA)SAPI Output Plugin for Winamp YASAPI" (out_yasapi). If not, see  <http://www.gnu.org/licenses/>.

The "Yet Another (WA)SAPI Output Plugin for Winamp" (YASAPI) utilizes the "Windows Audio Session API" (WASAPI). WASAPI's exclusive mode for rendering audio is a native way on Windows to render audio undisturbed, similar to Steinberg's "Audio Stream Input/Output" (ASIO). The YASAPI output plugin may serve as a replacement for any other Winamp output plugin.

PLEASE NOTE THAT THIS PROJECT IS AN EXPERIMENTAL RATHER THEN AN INDUSTRIAL STRENGTH EFFORT. THIS PROJECT IS NOT FOR YOU. IT IS FOR ME IN ORDER TO LEARN SOMETHING. IF THERE IS SOMETHING ALONG THE WAY I CAN DO FOR YOU THAT'S FINE.

Home:   http://out-yasapi.sourceforge.net/
Project:   http://sourceforge.net/projects/out-yasapi/
Download:   http://sourceforge.net/projects/out-yasapi/files/out-yasapi/
Winamp Forum:   http://forums.winamp.com/showthread.php?t=380396 (discontinued)
 
Input Plugin:   http://in-ffsox.sourceforge.net/
Loudness Normalization:   http://bs1770gain.sourceforge.net/
    http://r128gain.sourceforge.net/

Content

  1. History
  2. Introduction
  3. Implementation
  4. Configuration
  5. Debug
  6. Compiling YASAPI from Source
  7. Message silently disappearing from the Winamp forums
  8. Some Additional Notes on Darren Owen ("DrO")

1. History

2016-11-10   To all you great people out there in the US: Thank you for electing Donald Trump!
2016-08-11   Just recently it came to my attention that an individual calling himself "DrO" advertises a silly and buggy clone of this plug-in with just a few lines of code errornous changed (out of about 20.000 and his name added to the About box) he advertises under the name of "Not So YASAPI Output Plug-in". Be careful and get not mixed up! The original YASAPI plug-in indeed comes from this site and sourceforge (as usual)! Luckily and thanks to the GPL3 the "author" of this silly clone had to leave the original copyright notice and the reference to this site intact!
2016-08-06 1.7.25
  • Parameterized the configure script that it may be useful for others as well (cf. the new section Compiling YASAPI from Source below). It now supportes the "./configure && make" cycle well known from UNIX/LINUX systems.
  • Fixed the error introduced with the prior version that YASAPI does not play in pull mode (as reported to the WA forum).
2016-07-30 1.7.24
  • Updated my build machine from Vista to Windows 7 (good bye Vista users).
  • Hence the new version is build using MSVC 11 / Windows SDK v7.1A (instead of the respective MSVC 10 / Windows SDK v7.0A under Vista.)
  • Dropped the SSE2 versions because by using MSVC 11 they make no sense any longer.
  • As usual, some code clean-up.
2016-07-03 1.7.18
  • Some final code clean-up before moving on.
  • Development ist stalled again.
2016-06-30 1.7.17
  • Added the following personal statement to the About dialog and to the projects home page at http://out-yasapi.sourceforge.net/:
  • PLEASE NOTE THAT THIS PROJECT IS AN EXPERIMENTAL RATHER THEN AN INDUSTRIAL STRENGTH EFFORT. THIS PROJECT IS NOT FOR YOU. IT IS FOR ME IN ORDER TO LEARN SOMETHING. IF THERE IS SOMETHING ALONG THE WAY I CAN DO FOR YOU THAT'S FINE.
2016-06-30 1.7.15 Fixed several bugs regarding the implementation of the device specific option Extend to 24 Bit. This option is apperently not equivalent to Winamp -> Options -> Preferences -> Playback -> Playback -> Allow 24bit because the latter reduces bit deps to 16 bit if un-checked otherwise to 24 bit. Bit depth is never extended to 24 bit. YASAPI extends bit depth to 24 bit those enabling playback on devices which does support 24 bit WASAPI playback but not 16 bit WASAPI playback.
2016-06-27 1.7.10 Added a device specific option in order to define whether YASAPI should promote 8/16 bit input to 24 bit. This is not really necessary because the same effect can be achieved by enabeling Winamp -> Options -> Preferences -> Playback -> Playback -> Allow 24bit but is provided on user request
2016-06-23 1.7.4
  • Factored out a framework for simialr plug-ins.
  • Connect to the device before continue playing after flush when in underflow.
2016-06-21 1.7.1 Improved migrating the plug-in from an un-plugged default device to the new default device when playing.
2016-06-20 1.7.0 (Limited) support for un-plugging the default device (as configured via System control) when playing.
2016-06-19 1.6.14
  • Disconnect on pause and undeflow when option Disconnect is choosen.
  • Removed timer for disconnecting gapless sessions because it is not needed any longer.
  • Fixed crashing of the configuration dialog in case the device selected in the previous session has meanwhile become invalid.
2016-06-14 1.6.11 Fixed combining pause with flush (skip).
2016-06-13 1.6.9
  • For gapless mode it is configurable after which time interval the connection should be released when in idle state.
  • Reworked the tracing facilities of the debug version.
2016-06-12 1.6.8 For the debug version it may be configured that the trace is written to a file in the AppData/Winamp/Plugin directory rather then dispalying it in a console.
2016-06-12 1.6.7 In gapless mode, when a playlist ends the device is not released. It is waiting for the next track to start. This situation is un-distinguishable from an ordinary underflow situation and hence playback ends in an undeflow state. This may cause trouble when in such a situation the user decides to change the output plugin (via configuration). This new version applys to exact this situation: If in case the user changes the output plugin and this plugin is found in an underflow state this plugin is closed (and hence the device released).
2016-06-12 1.6.6 Fixes regrding gapless playback.
2016-06-12 1.6.5
  • Stopping player when Winamp closes and not already stopped (needed for gapless mode).
  • Guarding against locking zero sized device buffers.
  • Reworked About dialog.
2016-05-29 1.6.4 Added a common option in order to define whether 4, 6, or 8 channels should be interpreted as qadrophnic (3.1), 5.1, or 7.1 (disabled) or sorround (3.1 sorround), 5.1 sorround, or 7.1 sorround (enabled), respectively.
2016-05-26 1.6.3
  • Fixed AUDCLNT_E_BUFFER_SIZE_ERROR appearing in eclusive/pull mode.
  • Fixed a potential forever-loop which may have appeared at the end of a track.
  • Fixed crashing as client of the WinampMatrixMixer output plugin.
2016-05-22 1.6.0
  • Gapless playback.
  • A common option for switching on/off gapless playback (disabled by default).
  • A device option for choosing whether the time offset for gapless playback is maintained as a 64-bit integer value (representing the playback position) or as a 64-bit floating point value (representing the quotient taken from the playback position and a frequency). For a deeper understanding regarding position and frequency values you may refer to the documentation of the IAudioClock::GetPosition() and IAudioClock::GetFrequency() methods. We feel that as long as a constant frequency value can be assumed choosing the time offset as beeing maintained as a 64-bit integer value is preferable.
  • A debug version for SSE2.
2016-05-17 1.5.4 Solved the dead-lock caused by saving the configuration.
2016-05-17 1.5.1-
1.5.3
Improved dealing with draining the ring buffer and end of track (eot).
2016-05-16 1.5.0
  • The Default Device is listed in the respective configuration dialog's drop down box as an option to choose.
  • In case the Default Device is choosen from the drop down box (and saved),
    • the configuration is saved for the physical device which was configured at the time (configuration time) as Default Device from Window's System Control when the configuration was loaded to the dialog,
    • each time a new track starts, the physical device configured at this time (play time) as Default Device from Window's System Control is used to play the track (please note that this device may differ from the one configured at configuration time).
Please note that this is a complete re-write. Everything was thrown into peaces, something into larger building blocks and something into dust. The larger building blocks, which greatly remained intakt, could be re-used. The dust had to be thrown away and substituted by a new development. Please be careful in using this new version, thoroughly test it and re-configure it, if needed.
2016-04-09 1.0.7 In order to have YASAPI in a well defined state from the very first beginning, reset the IAudioClient interface at start-up.
2016-01-13 1.0.6
  • Detect end of track by respective "isplaying" request.
  • Fixed bug regarding synchronization of Share Mode and Strategy options.
2016-01-09 1.0.0
2016-01-03 0.16.0
  • Guarded against writing when paused.
  • Stopping audio client when underflow.
  • From the configuration dialog, dropped the device list page in favour of a combobox on top of the dialog.
  • Slightly adapted default values.
2015-12-21 0.15.0 Brought back, as an option, a call to IAudioClient::IsFormatSupported which is disabled by default.
2015-12-10 0.14.1 Increased default ring buffer size to 2.5.
2015-12-08 0.14.0
  • Introduced an (by default enabled) option "Write Block" that in case the plugin's "write" method delivers more data than actually could be written to the ring buffer it should block and wait until enough data are consumed from it rather then returning immediately.
  • For automatic mode, removed restrictions for switching from exclusive to shared mode.
2015-12-06 0.12.0 Fixed interplay with the "NotSo Fatso" input plugin.
2015-12-04 0.11.0
  • Reorganized the configuration dialog:
    • Focused again on the most important two (per device) parameters "Mode" (share/exclusive) and "Strategy" (push/pull).
    • Duplicated those two parameters from the "Device Options" page to the dialog's top-region.
    • Moved the former top-region parameters to a new "General" tab-control page.
    • Added a "Store" button with similar functionality as the "OK" button except that it doesn't close the dialog.
  • Fixed several bugs.
2015-11-29 0.10.0
  • Reorganized configuration of device period.
  • Added progess bars to the configuration dialog in order to visualize the load of the ring and the shared buffers.
  • Added an option for dis-/enabling the visualization.
  • Added an (experimental) function for balancing the shared buffer.
  • Added some more tracing to the debug version.
  • Split the verbose debugging into verbose level 1 ond and level 2 (even more verbose).
2015-11-23 0.9.1
  • Added an option for configuring whether calculation of the buffer sizes should be based on the default or on the minimum device period as proposed by WASAPI. Made default device period the default. So long the calculation was silently based on the minimum device period.
  • Added tooltips to the configuration dialog's controls.
2015-11-22 0.9.0
  • Complete re-write based on a new architecture. The basic idea is to serialize all requests and dispatch them into just one worker thread. In particular the serialization takes into account asynchronous requests resulting from the WASAPI device.
  • Round up ("ceil") the size of the ring buffer to the next multiple of Winamp's packet size (576 samples).
  • Special treatment of double buffering, i.e. pull in exclusive mode.
  • Additional options to configure the debug version.
Note:  You should re-configure at least the buffer sizes. As a rule of thumb all buffer sizes should be 1.0 except the ring buffer's size which should be just a small amount greater then 1.0.
2015-11-02 0.8.3
  • Improved thread synchronization during start-up.
  • Fixed a bug regarding recovery from error AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED of the IAudioClient::Initialize() method.
2015-10-31 0.8.2
2015-10-30 0.8.1 New share mode "automatic" which is similar to exclusive except that it falls back to shared in case exclusive fails.
2015-10-29 0.8.0
2015-10-26 0.7.1
  • Automatic re-sampling in shared mode seems to work now.
  • Added an "Exit Winamp" option to the error message dialog box.
2015-10-26 0.7.0
  • Support for multiple devices.
  • Configuration options per device.
  • Various fixes.
Note: Prior configuration for the default device may be lost. Please re-configure.
2015-10-03 0.6.1 Corrected a silly bug in testing for share mode.
2015-10-03 0.6.0 Add AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM flag when in shared mode (doesn't have any effect on Vista).
2015-02-14 0.5.0
  • Utilization of the IAudioClock interface instead of the GetTickCount() or the timeGetTime() functions for reporting the elapsed time to Winamp.
  • Option for controlling whether "written time" should be calculated.
2015-01-30 0.4.0
  • Option for treating mono as stero (default switched on).
  • New default options for buffer configuration.
  • Some fixes.
2015-01-25 0.3.0
  • Support for pull strategy.
  • Support for volume control.
2015-01-24 0.2.1
  • Component Object Model (COM) error messages are displayed with the file and the line number where they occur.
  • Compiled with shared "MSVCR110.DLL" (instead of static as before).
2015-01-24 0.2.0
  • Improved configuration for buffer sizes.
  • Provided a SSE2 version.
  • Compiled with the C compiler from "Visual Studio 10 Express" (instead of "Visual Studio 9 Express" as before).
2015-01-23 0.1.0 Initial release.

2. Introduction

According to Microsoft:

The Core Audio APIs were introduced in Windows Vista. This is a new set of user-mode audio components provides client applications with improved audio capabilities. These capabilities include the following:

https://msdn.microsoft.com/en-us/library/windows/desktop/dd370784%28v=vs.85%29.aspx

Of special interest is that there is an exclusive mode for rendering audio, i.e. there is a mode where an application has exclusive access to the audio device without being disturbed by third parties.

The aim of the YASAPI plugin is to make the WASAPI exclusive mode for audio rendering available to the users of Winamp.

The name of the plugin was choosen because there are already at least two WASAPI output plugins for Winamp:

3. Implementation

There are two sides the YASAPI plugin has to take into account:

The implementation on the WASAPI side follows along the lines of an example provided by Microsoft. The startegy shown in this example is not only applicable for shared mode streams but also for exclusive mode ones, i.e. not the share mode should be emphasized but what is known as the push model. There is also an example demonstrating the pull model in conjunction with the exclusive mode. In that sence there are four strategies:

The YASAPI plugin implements the first two strategies, i.e. the ones based on the push model.

The push model, in principle, works as follows:

  1. Query the size of the buffer shared with the audio device.
  2. Fill in completety the buffer shared with the audio device.
  3. Start playing.
  4. Loop until the track is played:
    1. Sleep half of the time corresponding to the size of the buffer shared with the audio device.
    2. Into the buffer shared with the audio device, fill in the gap which was growing free by playing during sleep.
  5. Sleep until the possibly remaining filled rest of the buffer shared with the audio device was played.
  6. Stop playing.

But the YASAPI plugin not only has to take into account the WASAPI side (the loop consisting of sleeping and writing to the audio device) but also the Winamp side because Winamp provides the audio samples which should be played in an completely unpredictable way.

The YASAPI plugin decouples the two sides by means of a ring or circular buffer. That way,

According to step 2 of the push model sketched above, it shoud become clear that the ring buffer should be at least as large (or larger) as the buffer the plugin's WASAPI component shares with the audio device.

4. Configuration

The YASAPI plugin comes with a configuration dialog which is described in the following. The dialog's top region presents the two most important parameters "Mode" (exclusive or share) and "Strategy" (push or pull)

Below those two parameters you find a tab-control consisting of four pages,

The tab-control's first page looks as follows:

It let's you configure

On the next page there are the following per device options:

On the final page you can configure the following per device buffer sizes:

From the above sketch of the push model it shold be clear that the following relation holds (which is enforced by the configuration dialog):

minimum size of the buffer shared with the device (provided by WASAPI) <= size of buffer shared with the device <= number of samples in the ring buffer before start playing <= size of ring buffer
As a rule of thumb all buffer sizes should be 1.0 except the ring buffer's size which should be just a small amount greater then 1.0.

Please note that no option takes effect before hitting the OK button.

5. Debug

In case something went wrong you may be interested in some more information. In order to utilize this there is a debug version of the plugin (distinguished by a lower case "d" at the and of the name, i.e. out_yasapid.dll) available from the download site.

Do the following:

  1. Close Winamp.
  2. Copy "out_yasapi-debug.dll" to Winamp's "Plugin" folder.
  3. Start Winamp.
  4. A console window should pop up tracing the initialiazation of the debug YASAPI plugin.
  5. From Winamps's preferences dialog choose "out_yasapi-debug.dll" as output plugin.
  6. When playing tracks in Winamp, the debug YASAPI plugin traces initialization and cleanup of each track.
  7. When shutting down Winamp, the cleanup of the YASAPI debug plugin is traced.
  8. After closing Winamp, the console window remains visible for another 5 s before vanishing.

The debug console.

You can get rid of the debug console by choosing the respective "Console" option from the debug YASAPI plugin's configuration dialog:

The following debug options can be configured:

5. Compiling YASAPI from Source

5.1 Prerequisits

A big "thank you" goes out

The following prerequisites are needed in order to build YASAPI from the sources:

5.1 The Build Proceudure

After having installed the prerequites you can build YASAPI. In MSys2 proceed as follows:

  1. By means of wget, download the source code from Sourceforge https://sourceforge.net/projects/out-yasapi/files/out-yasapi/1.7.25/out_yasapi-1.7.25-src.tar.gz/download and save it as out_yasapi-1.7.25-src.tar.gz (option -O to wget):
    $ wget -O out_yasapi-1.7.25-src.tar.gz 'https://sourceforge.net/projects/out-yasapi/files/out-yasapi/1.7.25/out_yasapi-1.7.25-src.tar.gz/download'
    --2016-08-06 11:08:31--  https://sourceforge.net/projects/out-yasapi/files/out-yasapi/1.7.25/out_yasapi-1.7.25-src.tar.gz/download
    Resolving sourceforge.net (sourceforge.net)... 216.34.181.60
    Connecting to sourceforge.net (sourceforge.net)|216.34.181.60|:443... connected.
    HTTP request sent, awaiting response... 302 Found
    Location: http://downloads.sourceforge.net/project/out-yasapi/out-yasapi/1.7.25/out_yasapi-1.7.25-src.tar.gz?r=&ts=1470474523&use_mirror=vorboss [following]
    --2016-08-06 11:08:32--  http://downloads.sourceforge.net/project/out-yasapi/out-yasapi/1.7.25/out_yasapi-1.7.25-src.tar.gz?r=&ts=1470474523&use_mirror=vorboss
    Resolving downloads.sourceforge.net (downloads.sourceforge.net)... 216.34.181.59
    Connecting to downloads.sourceforge.net (downloads.sourceforge.net)|216.34.181.59|:80... connected.
    HTTP request sent, awaiting response... 302 Found
    Location: http://vorboss.dl.sourceforge.net/project/out-yasapi/out-yasapi/1.7.25/out_yasapi-1.7.25-src.tar.gz [following]
    --2016-08-06 11:08:32--  http://vorboss.dl.sourceforge.net/project/out-yasapi/out-yasapi/1.7.25/out_yasapi-1.7.25-src.tar.gz
    Resolving vorboss.dl.sourceforge.net (vorboss.dl.sourceforge.net)... 5.10.152.194
    Connecting to vorboss.dl.sourceforge.net (vorboss.dl.sourceforge.net)|5.10.152.194|:80... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 309772 (303K) [application/x-gzip]
    Saving to: 'out_yasapi-1.7.25-src.tar.gz'
    
    out_yasapi-1.7.25-src.tar.gz  100%[=================================================>] 302.51K  1.10MB/s    in 0.3s
    
    2016-08-06 11:08:33 (1.10 MB/s) - 'out_yasapi-1.7.25-src.tar.gz' saved [309772/309772]
    
  2. By means of tar, extract the gzipped TAR archive:
    $ tar xfv out_yasapi-1.7.25-src.tar.gz
    out_yasapi-1.7.25/COPYING
    out_yasapi-1.7.25/bits
    out_yasapi-1.7.25/configure
    out_yasapi-1.7.25/Makefile
    out_yasapi-1.7.25/out_yasapi/
    out_yasapi-1.7.25/out_yasapi/configure
    out_yasapi-1.7.25/out_yasapi/COPYING
    out_yasapi-1.7.25/out_yasapi/doc/
    out_yasapi-1.7.25/out_yasapi/doc/css/
    out_yasapi-1.7.25/out_yasapi/doc/css/styles.css
    out_yasapi-1.7.25/out_yasapi/doc/images/
    out_yasapi-1.7.25/out_yasapi/doc/images/config-1.jpg
    out_yasapi-1.7.25/out_yasapi/doc/images/config-2.jpg
    out_yasapi-1.7.25/out_yasapi/doc/images/config-3.jpg
    out_yasapi-1.7.25/out_yasapi/doc/images/config-debug.jpg
    out_yasapi-1.7.25/out_yasapi/doc/images/debug.jpg
    out_yasapi-1.7.25/out_yasapi/doc/index.html
    out_yasapi-1.7.25/out_yasapi/guid.cpp
    out_yasapi-1.7.25/out_yasapi/Makefile
    out_yasapi-1.7.25/out_yasapi/model.c
    out_yasapi-1.7.25/out_yasapi/out_yasapi.c
    out_yasapi-1.7.25/out_yasapi/out_yasapi.nsi
    out_yasapi-1.7.25/out_yasapi/rc/
    out_yasapi-1.7.25/out_yasapi/rc/manifest.xml
    out_yasapi-1.7.25/out_yasapi/rc/resources.h
    out_yasapi-1.7.25/out_yasapi/rc/resources.rc
    out_yasapi-1.7.25/out_yasapi/version.mak
    out_yasapi-1.7.25/out_yasapi/yasapi.h
    out_yasapi-1.7.25/out_yasapi/yasapi_about.c
    out_yasapi-1.7.25/out_yasapi/yasapi_config.c
    out_yasapi-1.7.25/out_yasapi/yasapi_connect.c
    out_yasapi-1.7.25/out_yasapi/yasapi_control_list.c
    out_yasapi-1.7.25/out_yasapi/yasapi_device.c
    out_yasapi-1.7.25/out_yasapi/yasapi_disconnect.c
    out_yasapi-1.7.25/out_yasapi/yasapi_guid.c
    out_yasapi-1.7.25/out_yasapi/yasapi_guid.h
    out_yasapi-1.7.25/out_yasapi/yasapi_kill.c
    out_yasapi-1.7.25/out_yasapi/yasapi_notify.c
    out_yasapi-1.7.25/out_yasapi/yasapi_options_common.c
    out_yasapi-1.7.25/out_yasapi/yasapi_options_device.c
    out_yasapi-1.7.25/out_yasapi/yasapi_player.c
    out_yasapi-1.7.25/out_yasapi/yasapi_ring.c
    out_yasapi-1.7.25/out_yasapi/yasapi_strategy.c
    out_yasapi-1.7.25/out_yasapi/yasapi_time.c
    out_yasapi-1.7.25/out_yasapi/yasapi_util.c
    out_yasapi-1.7.25/libya/
    out_yasapi-1.7.25/libya/configure
    out_yasapi-1.7.25/libya/COPYING
    out_yasapi-1.7.25/libya/COPYING.LESSER
    out_yasapi-1.7.25/libya/Makefile
    out_yasapi-1.7.25/libya/rules.mak
    out_yasapi-1.7.25/libya/str2wcscpy.c
    out_yasapi-1.7.25/libya/wc2cscpy.c
    out_yasapi-1.7.25/libya/wc2csdup.c
    out_yasapi-1.7.25/libya/wchar2char.c
    out_yasapi-1.7.25/libya/wcs2strcpy.c
    out_yasapi-1.7.25/libya/wcs2strdup.c
    out_yasapi-1.7.25/libya/ya.h
    out_yasapi-1.7.25/libya/ya_control.c
    out_yasapi-1.7.25/libya/ya_debug.c
    out_yasapi-1.7.25/libya/ya_dump.c
    out_yasapi-1.7.25/libya/ya_player.c
    out_yasapi-1.7.25/libya/ya_player_stub.c
    out_yasapi-1.7.25/libya/ya_property.c
    out_yasapi-1.7.25/libya/ya_queue.c
    out_yasapi-1.7.25/libya/ya_queue_read.c
    out_yasapi-1.7.25/libya/ya_queue_write.c
    out_yasapi-1.7.25/libya/ya_result.c
    out_yasapi-1.7.25/libya/ya_store.c
    out_yasapi-1.7.25/libya/ya_trace.c
    out_yasapi-1.7.25/libya/ya_util.c
    out_yasapi-1.7.25/libya/ya_wfxx.c
    
  3. change into the directory out_yasapi-1.7.25 created by tar:
    $ cd out_yasapi-1.7.25
    
  4. By maens of the configure script, configure how YASAPI should be build:
     
    1. In order to get an overview on the build options, call the configure script with the --help option:
      $ ./configure --help
      usage: ./configure <options>
      
      options (selection):
        --help: display this message
        '--with-msvs=<path to ms visual studio installation>'
            default: "C:/Program Files (x86)/Microsoft Visual Studio 12.0"
        '--with-mssdk=<path to ms windows sdk installation>'
            default: "C:/Program Files (x86)/Microsoft SDKs/Windows/v7.1A"
        '--with-wasdk=<path to winamp sdk installation>'
            default: "C:/Program Files (x86)/Winamp SDK"
        '--with-nsis=<path to nsis installation>'
            default: "C:/Program Files (x86)/NSIS"
        CPPFLAGS=<CPPFLAGS> flags passed to the C pre-processor
            (and the resource compiler)
            default: "-D_USING_V110_SDK71_"
        CFLAGS=<CFLAGS> flags passed to the C compiler
            default: "-MT -WX -O2"
      
    2. configure the build process using the default options and a prefix relative to the current directory (option --prefix to configure):
      $ ./configure "--prefix=$(PWD)"
      
    3. If you want e.g. to overwrite where the MS Windows SDK is located on your machine, enter a command along the lines of the following (in the path, use forward slashs):
      $ ./configure "--prefix=$(PWD)" "--with-mssdk=C:/Program Files (x86)/Microsoft SDKs/Windows/v7.1A"
      
  5. By means of the make utility, build the application as configured:
    $ make
    CONFIGURE
    CONFIGURE
    MAKE    all
    make[1]: Entering directory '/d/MSys2/home/libya/X/out_yasapi-1.7.25/build/libya'
    CL      ya_player_stub.obj
    LIB     libya.lib(ya_player_stub.obj)
    CL      ya_player.obj
    LIB     libya.lib(ya_player.obj)
    CL      ya_control.obj
    LIB     libya.lib(ya_control.obj)
    CL      ya_queue.obj
    LIB     libya.lib(ya_queue.obj)
    CL      ya_queue_write.obj
    LIB     libya.lib(ya_queue_write.obj)
    CL      ya_queue_read.obj
    LIB     libya.lib(ya_queue_read.obj)
    CL      ya_store.obj
    LIB     libya.lib(ya_store.obj)
    CL      ya_result.obj
    LIB     libya.lib(ya_result.obj)
    CL      ya_property.obj
    LIB     libya.lib(ya_property.obj)
    CL      ya_wfxx.obj
    LIB     libya.lib(ya_wfxx.obj)
    CL      str2wcscpy.obj
    LIB     libya.lib(str2wcscpy.obj)
    CL      wcs2strcpy.obj
    LIB     libya.lib(wcs2strcpy.obj)
    CL      wcs2strdup.obj
    LIB     libya.lib(wcs2strdup.obj)
    CL      ya_util.obj
    LIB     libya.lib(ya_util.obj)
    CL      ya_trace.obj
    LIB     libya.lib(ya_trace.obj)
    CL      ya_dump.obj
    LIB     libya.lib(ya_dump.obj)
    CL      ya_debug.obj
    LIB     libya.lib(ya_debug.obj)
    CL      ya_player_stub-debug.obj
    LIB     libya-debug.lib(ya_player_stub-debug.obj)
    CL      ya_player-debug.obj
    LIB     libya-debug.lib(ya_player-debug.obj)
    CL      ya_control-debug.obj
    LIB     libya-debug.lib(ya_control-debug.obj)
    CL      ya_queue-debug.obj
    LIB     libya-debug.lib(ya_queue-debug.obj)
    CL      ya_queue_write-debug.obj
    LIB     libya-debug.lib(ya_queue_write-debug.obj)
    CL      ya_queue_read-debug.obj
    LIB     libya-debug.lib(ya_queue_read-debug.obj)
    CL      ya_store-debug.obj
    LIB     libya-debug.lib(ya_store-debug.obj)
    CL      ya_result-debug.obj
    LIB     libya-debug.lib(ya_result-debug.obj)
    CL      ya_property-debug.obj
    LIB     libya-debug.lib(ya_property-debug.obj)
    CL      ya_wfxx-debug.obj
    LIB     libya-debug.lib(ya_wfxx-debug.obj)
    CL      str2wcscpy-debug.obj
    LIB     libya-debug.lib(str2wcscpy-debug.obj)
    CL      wcs2strcpy-debug.obj
    LIB     libya-debug.lib(wcs2strcpy-debug.obj)
    CL      wcs2strdup-debug.obj
    LIB     libya-debug.lib(wcs2strdup-debug.obj)
    CL      ya_util-debug.obj
    LIB     libya-debug.lib(ya_util-debug.obj)
    CL      ya_trace-debug.obj
    LIB     libya-debug.lib(ya_trace-debug.obj)
    CL      ya_dump-debug.obj
    LIB     libya-debug.lib(ya_dump-debug.obj)
    CL      ya_debug-debug.obj
    LIB     libya-debug.lib(ya_debug-debug.obj)
    rm ya_property.obj str2wcscpy-debug.obj str2wcscpy.obj ya_store-debug.obj wcs2strcpy-debug.obj ya_player_stub-debug.obj ya_store.obj wcs2strdup.obj ya_player_stub.obj ya_debug-debug.obj ya_dump-debug.obj ya_debug.obj ya_queue_write-debug.obj ya_util-debug.obj ya_queue.obj ya_wfxx-debug.obj ya_queue_read-debug.obj ya_result-debug.obj ya_queue_write.obj wcs2strcpy.obj ya_util.obj ya_wfxx.obj wcs2strdup-debug.obj ya_control-debug.obj ya_queue_read.obj ya_player-debug.obj ya_control.obj ya_trace-debug.obj ya_player.obj ya_result.obj ya_trace.obj ya_queue-debug.obj ya_dump.obj ya_property-debug.obj
    make[1]: Leaving directory '/d/MSys2/home/libya/X/out_yasapi-1.7.25/build/libya'
    MAKE    install
    make[1]: Entering directory '/d/MSys2/home/libya/X/out_yasapi-1.7.25/build/libya'
    mkdir -p /usr/local/lib
    cp libya.lib /usr/local/lib/libya.lib
    mkdir -p /usr/local/lib
    cp libya-debug.lib /usr/local/lib/libya-debug.lib
    make[1]: Leaving directory '/d/MSys2/home/libya/X/out_yasapi-1.7.25/build/libya'
    MAKE    all
    cp /d/MSys2/home/libya/X/out_yasapi-1.7.25/out_yasapi/rc/resources.h resources.h
    CL      out_yasapi.obj
    SED     resources.rc
    cp /d/MSys2/home/libya/X/out_yasapi-1.7.25/out_yasapi/rc/manifest.xml manifest.xml
    RC      resources.res
    CL      yasapi_about.obj
    LIB     libyasapi.lib(yasapi_about.obj)
    CL      yasapi_config.obj
    LIB     libyasapi.lib(yasapi_config.obj)
    CL      yasapi_control_list.obj
    LIB     libyasapi.lib(yasapi_control_list.obj)
    CL      yasapi_notify.obj
    LIB     libyasapi.lib(yasapi_notify.obj)
    CL      yasapi_player.obj
    LIB     libyasapi.lib(yasapi_player.obj)
    CL      yasapi_connect.obj
    LIB     libyasapi.lib(yasapi_connect.obj)
    CL      yasapi_device.obj
    LIB     libyasapi.lib(yasapi_device.obj)
    CL      yasapi_disconnect.obj
    LIB     libyasapi.lib(yasapi_disconnect.obj)
    CL      yasapi_strategy.obj
    LIB     libyasapi.lib(yasapi_strategy.obj)
    CL      yasapi_kill.obj
    LIB     libyasapi.lib(yasapi_kill.obj)
    CL      yasapi_time.obj
    LIB     libyasapi.lib(yasapi_time.obj)
    CL      yasapi_options_device.obj
    LIB     libyasapi.lib(yasapi_options_device.obj)
    CL      yasapi_options_common.obj
    LIB     libyasapi.lib(yasapi_options_common.obj)
    CL      yasapi_ring.obj
    LIB     libyasapi.lib(yasapi_ring.obj)
    CL      yasapi_util.obj
    LIB     libyasapi.lib(yasapi_util.obj)
    CL      yasapi_guid.obj
    LIB     libyasapi.lib(yasapi_guid.obj)
    LINK    out_yasapi.dll
    CL      out_yasapi-debug.obj
    CL      yasapi_about-debug.obj
    LIB     libyasapi-debug.lib(yasapi_about-debug.obj)
    CL      yasapi_config-debug.obj
    LIB     libyasapi-debug.lib(yasapi_config-debug.obj)
    CL      yasapi_control_list-debug.obj
    LIB     libyasapi-debug.lib(yasapi_control_list-debug.obj)
    CL      yasapi_notify-debug.obj
    LIB     libyasapi-debug.lib(yasapi_notify-debug.obj)
    CL      yasapi_player-debug.obj
    LIB     libyasapi-debug.lib(yasapi_player-debug.obj)
    CL      yasapi_connect-debug.obj
    LIB     libyasapi-debug.lib(yasapi_connect-debug.obj)
    CL      yasapi_device-debug.obj
    LIB     libyasapi-debug.lib(yasapi_device-debug.obj)
    CL      yasapi_disconnect-debug.obj
    LIB     libyasapi-debug.lib(yasapi_disconnect-debug.obj)
    CL      yasapi_strategy-debug.obj
    LIB     libyasapi-debug.lib(yasapi_strategy-debug.obj)
    CL      yasapi_kill-debug.obj
    LIB     libyasapi-debug.lib(yasapi_kill-debug.obj)
    CL      yasapi_time-debug.obj
    LIB     libyasapi-debug.lib(yasapi_time-debug.obj)
    CL      yasapi_options_device-debug.obj
    LIB     libyasapi-debug.lib(yasapi_options_device-debug.obj)
    CL      yasapi_options_common-debug.obj
    LIB     libyasapi-debug.lib(yasapi_options_common-debug.obj)
    CL      yasapi_ring-debug.obj
    LIB     libyasapi-debug.lib(yasapi_ring-debug.obj)
    CL      yasapi_util-debug.obj
    LIB     libyasapi-debug.lib(yasapi_util-debug.obj)
    CL      yasapi_guid-debug.obj
    LIB     libyasapi-debug.lib(yasapi_guid-debug.obj)
    LINK    out_yasapi-debug.dll
    CL      guid.obj
    LINK    guid.exe
    CL      model.obj
    LINK    model.exe
    rm yasapi_notify-debug.obj yasapi_guid.obj yasapi_notify.obj yasapi_options_common-debug.obj yasapi_connect-debug.obj yasapi_control_list-debug.obj yasapi_options_common.obj yasapi_options_device-debug.obj yasapi_strategy.obj yasapi_kill.obj yasapi_connect.obj yasapi_control_list.obj yasapi_options_device.obj yasapi_config-debug.obj yasapi_util-debug.obj yasapi_kill-debug.obj yasapi_config.obj yasapi_device-debug.obj yasapi_about-debug.obj yasapi_util.obj yasapi_time-debug.obj yasapi_device.obj yasapi_about.obj yasapi_disconnect-debug.obj yasapi_player-debug.obj yasapi_time.obj yasapi_disconnect.obj yasapi_player.obj yasapi_strategy-debug.obj yasapi_ring-debug.obj yasapi_ring.obj yasapi_guid-debug.obj
    MAKE    all
    make[1]: Nothing to be done for 'all'.
    SED     out_yasapi.nsi
    
  6. Finally, the plug-ins can be found at their build locations:
    $ find ./ -name "*.dll"
    ./build/out_yasapi/out_yasapi-debug.dll
    ./build/out_yasapi/out_yasapi.dll
    

6. Message silently disappearing from the Winamp forums

The following message posted by me to the top-level (sticky) thread Winamp News in forum the Winamp Discussion forum silently isappeared without any comment:

Dear DJ Egg,

I'm not certain whether you are the right person to address my reqest.. I'm not even certain about who rules this forum. My impression is that you are the only one "official" left (i.e. one with a contract to the owners of Winamp). All the rest including this forum's moderators seem to be volunteers.

As you may have noticed, since some time I have a conflict with some of the former contractors of Winamp, "DrO", regarding the question of intellectual property. As it turns out, this former contractor, "DrO", disrespects intellectual property. He advertises a product he calls "Not So YASAPI Output Plug-in v1.0 Beta" which is a close to 100% clone of YASAPI cf. here for details)

As it turns out that at the blog of "DrO" some of his fanboys comment we know by their nicknames are frequent posters of this forum, among them some Pawel:

Could you please investigate whether this Pawel is identical to this forum's moderator with the same nickname and in case it turns out to be true fire him from his job as a moderator?

Thank you in advance and best regards,

Peter

7. Some Additional Notes on Darren Owen ("DrO")

On his blog Darren Owen ("DrO") claims:

The YASAPI plug-in is released under a license which allows for anyone to take the code and do with it as they please as long as any code codes (be that new or based on the existing source) is also provided.
That's of course true. And I'm the last one to have ever told something different. But if doing so, changing just a few lines of code out of about 20.000 just in order to rectify putting his name on the product I consider a clear case of plagiarism:

For further details refer to the Winamp forum.

The further explanations by Darren Owen ("DrO") are simply laughable:

So I'm now in a position where if I were to make my own WASAPI output plug-in, I'm almost certain he'd claim I was just plagiarising his work even if it was written from scratch as I've said that I'd already had a look at the available source code for his plug-in.

Darren, it's not your WASAPI plug-in, it's mine. Even with that little changes you've made you've perfectly demonstrated that you don't have the slightest idea on how this (my) plug-in is supposed to work and you've managed introducing a major bug into the configuration.