Click here to Skip to main content
Click here to Skip to main content
 
Add your own
alternative version

Multidevice ASIO output plugin for WinAMP

, 13 Feb 2009 CDDL
A tiny WinAMP output DLL that uses a C++ replacement of the official ASIO SDK that supports multiple ASIO devices.
// initterm.cpp

// based on:
// LIBCTINY - Matt Pietrek 2001
// MSDN Magazine, January 2001

// 08/12/06 (mv)

#include <windows.h>
#include "libct.h"

#pragma section(".CRT$XCA", read, write)
#pragma data_seg(".CRT$XCA")		// start of ctor section
_PVFV __xc_a[] = {0};

#pragma section(".CRT$XCZ", read, write)
#pragma data_seg(".CRT$XCZ")		// end of ctor section
_PVFV __xc_z[] = {0};

#pragma data_seg()
#pragma comment(linker, "/merge:.CRT=.rdata")

BEGIN_EXTERN_C

void _initterm(_PVFV *pfbegin, _PVFV *pfend)
{
	// walk the table of function pointers from the bottom up, until
	// the end is encountered.  Do not skip the first entry.  The initial
	// value of pfbegin points to the first valid entry.  Do not try to
	// execute what pfend points to.  Only entries before pfend are valid.
	while (pfbegin < pfend)
	{
		if (*pfbegin != 0)
			(**pfbegin)();
		++pfbegin;
	}
}


static _PVFV   atexitlist[ 64 ];
static _PVFV * pCur_atexit_entry( atexitlist - 1 );

int atexit(_PVFV func)
{
    // (todo) use the interlocked family of functions to make this code thread
    //        safe.
	if ( ++pCur_atexit_entry < ( atexitlist + sizeof( atexitlist ) ) )
    {
        *pCur_atexit_entry = func; 
		return 0;
    }
	return -1;
}

void _doexit()
{
	if ( pCur_atexit_entry >= atexitlist )
		_initterm( atexitlist, pCur_atexit_entry + 1 );
}

void exit(int code)
{
	_doexit();
	ExitProcess(code);
}

int _purecall()
{
	ExitProcess((UINT)-1);
}

END_EXTERN_C

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Common Development and Distribution License (CDDL)

Share

About the Author

Domagoj Šarić
Software Developer Little Endian Ltd.
Croatia Croatia
No Biography provided

| Advertise | Privacy | Terms of Use | Mobile
Web01 | 2.8.141030.1 | Last Updated 13 Feb 2009
Article Copyright 2009 by Domagoj Šarić
Everything else Copyright © CodeProject, 1999-2014
Layout: fixed | fluid