From 47f805cd0a20d50f94d99d4532bc21b6b51d2bb4 Mon Sep 17 00:00:00 2001 From: Packit Date: Sep 14 2020 10:22:25 +0000 Subject: lame-3.100 base --- diff --git a/ACM/ACM.cpp b/ACM/ACM.cpp new file mode 100644 index 0000000..2af2c40 --- /dev/null +++ b/ACM/ACM.cpp @@ -0,0 +1,1405 @@ +/** + * + * Lame ACM wrapper, encode/decode MP3 based RIFF/AVI files in MS Windows + * + * Copyright (c) 2002 Steve Lhomme + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +/*! + \author Steve Lhomme + \version \$Id: ACM.cpp,v 1.20 2007/05/17 22:25:40 robert Exp $ +*/ + +#if !defined(STRICT) +#define STRICT +#endif // STRICT + +#include + +#include +#include +#include + +#include +#include +#include + +#include + +#include + +#include "adebug.h" +#include "resource.h" +#include "ACMStream.h" + +#ifdef ENABLE_DECODING +#include "DecodeStream.h" +#endif // ENABLE_DECODING + +#include "ACM.h" + +#ifndef IDC_HAND +#define IDC_HAND MAKEINTRESOURCE(32649) +#endif // IDC_HAND + +char ACM::VersionString[120]; + +const char ACM_VERSION[] = "0.9.2"; + +#ifdef WIN32 +// +// 32-bit versions +// +#if (WINVER >= 0x0400) + #define VERSION_ACM_DRIVER MAKE_ACM_VERSION(4, 0, 0) +#else +#define VERSION_ACM_DRIVER MAKE_ACM_VERSION(3, 51, 0) +#endif +#define VERSION_MSACM MAKE_ACM_VERSION(3, 50, 0) + +#else +// +// 16-bit versions +// +#define VERSION_ACM_DRIVER MAKE_ACM_VERSION(1, 0, 0) +#define VERSION_MSACM MAKE_ACM_VERSION(2, 1, 0) + +#endif + +#define PERSONAL_FORMAT WAVE_FORMAT_MPEGLAYER3 +#define SIZE_FORMAT_STRUCT sizeof(MPEGLAYER3WAVEFORMAT) +//#define SIZE_FORMAT_STRUCT 0 + +//static const char channel_mode[][13] = {"mono","stereo","joint stereo","dual channel"}; +static const char channel_mode[][13] = {"mono","stereo"}; +static const unsigned int mpeg1_freq[] = {48000,44100,32000}; +static const unsigned int mpeg2_freq[] = {24000,22050,16000,12000,11025,8000}; +static const unsigned int mpeg1_bitrate[] = {320, 256, 224, 192, 160, 128, 112, 96, 80, 64, 56, 48, 40, 32}; +static const unsigned int mpeg2_bitrate[] = {160, 144, 128, 112, 96, 80, 64, 56, 48, 40, 32, 24, 16, 8}; + +#define SIZE_CHANNEL_MODE (sizeof(channel_mode) / (sizeof(char) * 13)) +#define SIZE_FREQ_MPEG1 (sizeof(mpeg1_freq) / sizeof(unsigned int)) +#define SIZE_FREQ_MPEG2 (sizeof(mpeg2_freq) / sizeof(unsigned int)) +#define SIZE_BITRATE_MPEG1 (sizeof(mpeg1_bitrate) / sizeof(unsigned int)) +#define SIZE_BITRATE_MPEG2 (sizeof(mpeg2_bitrate) / sizeof(unsigned int)) + +static const int FORMAT_TAG_MAX_NB = 2; // PCM and PERSONAL (mandatory to have at least PCM and your format) +static const int FILTER_TAG_MAX_NB = 0; // this is a codec, not a filter + +// number of supported PCM formats +static const int FORMAT_MAX_NB_PCM = + 2 * // number of PCM channel mode (stereo/mono) + (SIZE_FREQ_MPEG1 + // number of MPEG 1 sampling freq + SIZE_FREQ_MPEG2); // number of MPEG 2 sampling freq + +////////////////////////////////////////////////////////////////////// +// +////////////////////////////////////////////////////////////////////// +bool bitrate_item::operator<(const bitrate_item & other_bitrate) const +{ + return (other_bitrate.frequency < frequency || + (other_bitrate.frequency == frequency && + (other_bitrate.bitrate < bitrate || + (other_bitrate.bitrate == bitrate && + (other_bitrate.channels < channels))))); +} + +////////////////////////////////////////////////////////////////////// +// Configuration Dialog +////////////////////////////////////////////////////////////////////// +/* +static CALLBACK ConfigProc( + HWND hwndDlg, // handle to dialog box +UINT uMsg, // message +WPARAM wParam, // first message parameter +LPARAM lParam // second message parameter +) +{ + BOOL bResult; + + switch (uMsg) { + case WM_COMMAND: + UINT command; + command = GET_WM_COMMAND_ID(wParam, lParam); + if (IDOK == command) + { + EndDialog(hwndDlg, (IDOK == command)); + } else if (IDCANCEL == command) + { + EndDialog(hwndDlg, (IDOK == command)); + } + bResult = FALSE; + break; + default: + bResult = FALSE; // will be treated by DefWindowProc +} + return bResult; +} + + +inline DWORD ACM::Configure(HWND hParentWindow, LPDRVCONFIGINFO pConfig) +{ + my_debug.OutPut(DEBUG_LEVEL_FUNC_START, "ACM : Configure (Parent Window = 0x%08X)",hParentWindow); + + DialogBoxParam( my_hModule, MAKEINTRESOURCE(IDD_CONFIG), hParentWindow, ::ConfigProc , (LPARAM)this); + + return DRVCNF_OK; // Can also return + // DRVCNF_CANCEL + // and DRVCNF_RESTART +} +*/ +////////////////////////////////////////////////////////////////////// +// About Dialog +////////////////////////////////////////////////////////////////////// + +static BOOL CALLBACK AboutProc( + HWND hwndDlg, // handle to dialog box +UINT uMsg, // message +WPARAM wParam, // first message parameter +LPARAM lParam // second message parameter +) +{ + static HBRUSH hBrushStatic = NULL; +// static LOGFONT lf; // structure for font information +// static HFONT hfnt; + static HCURSOR hcOverCursor = NULL; + BOOL bResult; + + switch (uMsg) { + case WM_INITDIALOG: + char tmp[150]; + wsprintf(tmp,"LAME MP3 codec v%s", ACM::GetVersionString()); + ::SetWindowText(GetDlgItem( hwndDlg, IDC_STATIC_ABOUT_TITLE), tmp); + +/* + ::GetObject(::GetStockObject(DEFAULT_GUI_FONT), sizeof(LOGFONT), &lf); + lf.lfUnderline = TRUE; + + hfnt = ::CreateFontIndirect(&lf); + + ::SendMessage(::GetDlgItem(hwndDlg,IDC_STATIC_ABOUT_URL), WM_SETFONT, (WPARAM) hfnt, TRUE); +* / + hBrushStatic = ::CreateSolidBrush(::GetSysColor (COLOR_BTNFACE)); +*/ hcOverCursor = ::LoadCursor(NULL,(LPCTSTR)IDC_HAND); + if (hcOverCursor == NULL) + hcOverCursor = ::LoadCursor(NULL,(LPCTSTR)IDC_CROSS); + + bResult = TRUE; + break; +/* + case WM_CTLCOLORSTATIC: + /// \todo only if there are URLs + if ((HWND)lParam == ::GetDlgItem(hwndDlg,IDC_STATIC_ABOUT_URL)) + { + ::SetTextColor((HDC)wParam, ::GetSysColor (COLOR_HIGHLIGHT)); + ::SetBkColor((HDC)wParam, ::GetSysColor (COLOR_BTNFACE)); + + return (LRESULT) hBrushStatic; + } + else + return (LRESULT) NULL; +*/ + case WM_MOUSEMOVE: + { + POINT pnt; + ::GetCursorPos(&pnt); + + RECT rect; + ::GetWindowRect( ::GetDlgItem(hwndDlg,IDC_STATIC_ABOUT_URL), &rect); + + if ( ::PtInRect(&rect,pnt) ) + { + ::SetCursor(hcOverCursor); + } + + + } + break; + + case WM_LBUTTONUP: + { + POINT pnt; + ::GetCursorPos(&pnt); + + RECT rect; + ::GetWindowRect( ::GetDlgItem(hwndDlg,IDC_STATIC_ABOUT_URL), &rect); + + TCHAR Url[200]; + bool bUrl = false; + if (::PtInRect(&rect,pnt)) + { + wsprintf(Url,get_lame_url()); + bUrl = true; + } + + if (bUrl) + { + LPSTR tmpStr; + HRESULT hresult = ::TranslateURL(Url, TRANSLATEURL_FL_GUESS_PROTOCOL|TRANSLATEURL_FL_GUESS_PROTOCOL, &tmpStr); + if (hresult == S_OK) + ::ShellExecute(hwndDlg,"open",tmpStr,NULL,"",SW_SHOWMAXIMIZED ); + else if (hresult == S_FALSE) + ::ShellExecute(hwndDlg,"open",Url,NULL,"",SW_SHOWMAXIMIZED ); + } + + } + break; + + case WM_COMMAND: + UINT command; + command = GET_WM_COMMAND_ID(wParam, lParam); + if (IDOK == command) + { + EndDialog(hwndDlg, TRUE); + } + bResult = FALSE; + break; + + case IDC_STATIC_ABOUT_URL: + break; + default: + bResult = FALSE; // will be treated by DefWindowProc +} + return bResult; +} + +inline DWORD ACM::About(HWND hParentWindow) +{ + my_debug.OutPut(DEBUG_LEVEL_FUNC_START, "ACM : About (Parent Window = 0x%08X)",hParentWindow); + + DialogBoxParam( my_hModule, MAKEINTRESOURCE(IDD_ABOUT), hParentWindow, ::AboutProc , (LPARAM)this); + + return DRVCNF_OK; // Can also return +// DRVCNF_CANCEL +// and DRVCNF_RESTART +} + + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +ACM::ACM( HMODULE hModule ) + :my_hModule(hModule), + my_hIcon(NULL), + my_debug(ADbg(DEBUG_LEVEL_CREATION)), + my_EncodingProperties(hModule) +{ + my_EncodingProperties.ParamsRestore(); + + /// \todo get the debug level from the registry + unsigned char DebugFileName[512]; + + char tmp[128]; + wsprintf(tmp,"LAMEacm 0x%08X",this); + my_debug.setPrefix(tmp); /// \todo get it from the registry + my_debug.setIncludeTime(true); /// \todo get it from the registry + + // Check in the registry if we have to Output Debug information + DebugFileName[0] = '\0'; + + HKEY OssKey; + if (RegOpenKeyEx( HKEY_LOCAL_MACHINE, "SOFTWARE\\MUKOLI", 0, KEY_READ , &OssKey ) == ERROR_SUCCESS) { + DWORD DataType; + DWORD DebugFileNameSize = 512; + if (RegQueryValueEx( OssKey, "DebugFile", NULL, &DataType, DebugFileName, &DebugFileNameSize ) == ERROR_SUCCESS) { + if (DataType == REG_SZ) { + my_debug.setUseFile(true); + my_debug.setDebugFile((char *)DebugFileName); + my_debug.OutPut("Debug file is %s",(char *)DebugFileName); + } + } + } + wsprintf(VersionString,"%s - %s", ACM_VERSION, get_lame_version() ); + BuildBitrateTable(); + + my_debug.OutPut(DEBUG_LEVEL_FUNC_START, "New ACM Creation (0x%08X)",this); +} + +ACM::~ACM() +{ +// not used, it's done automatically when closing the driver if (my_hIcon != NULL) +// CloseHandle(my_hIcon); + + bitrate_table.clear(); + + my_debug.OutPut(DEBUG_LEVEL_FUNC_START, "ACM Deleted (0x%08X)",this); +} + +////////////////////////////////////////////////////////////////////// +// Main message handler +////////////////////////////////////////////////////////////////////// + +LONG ACM::DriverProcedure(const HDRVR hdrvr, const UINT msg, LONG lParam1, LONG lParam2) +{ + DWORD dwRes = 0L; + +//my_debug.OutPut(DEBUG_LEVEL_MSG, "message 0x%08X for ThisACM 0x%08X", msg, this); + +switch (msg) { + case DRV_INSTALL: + my_debug.OutPut(DEBUG_LEVEL_MSG, "DRV_INSTALL"); + // Sent when the driver is installed. + dwRes = DRVCNF_OK; // Can also return + break; // DRVCNF_CANCEL + // and DRV_RESTART + + case DRV_REMOVE: + // Sent when the driver is removed. + my_debug.OutPut(DEBUG_LEVEL_MSG, "DRV_REMOVE"); + dwRes = 1L; // return value ignored + break; + + case DRV_QUERYCONFIGURE: + my_debug.OutPut(DEBUG_LEVEL_MSG, "DRV_QUERYCONFIGURE"); + // Sent to determine if the driver can be + // configured. + dwRes = 1L; // Zero indicates configuration + break; // NOT supported + + case DRV_CONFIGURE: + my_debug.OutPut(DEBUG_LEVEL_MSG, "DRV_CONFIGURE"); + // Sent to display the configuration + // dialog box for the driver. +// dwRes = Configure( (HWND) lParam1, (LPDRVCONFIGINFO) lParam2 ); + if (my_EncodingProperties.Config(my_hModule, (HWND) lParam1)) + { + dwRes = DRVCNF_OK; // Can also return + // DRVCNF_CANCEL + // and DRVCNF_RESTART + } else { + dwRes = DRVCNF_CANCEL; + } + break; + + /************************************** + // ACM additional messages + ***************************************/ + + case ACMDM_DRIVER_ABOUT: + my_debug.OutPut(DEBUG_LEVEL_MSG, "ACMDM_DRIVER_ABOUT"); + + dwRes = About( (HWND) lParam1 ); + + break; + + case ACMDM_DRIVER_DETAILS: // acmDriverDetails + // Fill-in general informations about the driver/codec + my_debug.OutPut(DEBUG_LEVEL_MSG, "ACMDM_DRIVER_DETAILS"); + + dwRes = OnDriverDetails(hdrvr, (LPACMDRIVERDETAILS) lParam1); + + break; + + case ACMDM_FORMATTAG_DETAILS: // acmFormatTagDetails + my_debug.OutPut(DEBUG_LEVEL_MSG, "ACMDM_FORMATTAG_DETAILS"); + + dwRes = OnFormatTagDetails((LPACMFORMATTAGDETAILS) lParam1, lParam2); + + break; + + case ACMDM_FORMAT_DETAILS: // acmFormatDetails + my_debug.OutPut(DEBUG_LEVEL_MSG, "ACMDM_FORMAT_DETAILS"); + + dwRes = OnFormatDetails((LPACMFORMATDETAILS) lParam1, lParam2); + + break; + + case ACMDM_FORMAT_SUGGEST: // acmFormatSuggest + // Sent to determine if the driver can be + // configured. + my_debug.OutPut(DEBUG_LEVEL_MSG, "ACMDM_FORMAT_SUGGEST"); + dwRes = OnFormatSuggest((LPACMDRVFORMATSUGGEST) lParam1); + break; + + /************************************** + // ACM stream messages + ***************************************/ + + case ACMDM_STREAM_OPEN: + // Sent to determine if the driver can be + // configured. + my_debug.OutPut(DEBUG_LEVEL_MSG, "ACMDM_STREAM_OPEN"); + dwRes = OnStreamOpen((LPACMDRVSTREAMINSTANCE) lParam1); + break; + + case ACMDM_STREAM_SIZE: + // returns a recommended size for a source + // or destination buffer on an ACM stream + my_debug.OutPut(DEBUG_LEVEL_MSG, "ACMDM_STREAM_SIZE"); + dwRes = OnStreamSize((LPACMDRVSTREAMINSTANCE)lParam1, (LPACMDRVSTREAMSIZE)lParam2); + break; + + case ACMDM_STREAM_PREPARE: + // prepares an ACMSTREAMHEADER structure for + // an ACM stream conversion + my_debug.OutPut(DEBUG_LEVEL_MSG, "ACMDM_STREAM_PREPARE"); + dwRes = OnStreamPrepareHeader((LPACMDRVSTREAMINSTANCE)lParam1, (LPACMSTREAMHEADER) lParam2); + break; + + case ACMDM_STREAM_UNPREPARE: + // cleans up the preparation performed by + // the ACMDM_STREAM_PREPARE message for an ACM stream + my_debug.OutPut(DEBUG_LEVEL_MSG, "ACMDM_STREAM_UNPREPARE"); + dwRes = OnStreamUnPrepareHeader((LPACMDRVSTREAMINSTANCE)lParam1, (LPACMSTREAMHEADER) lParam2); + break; + + case ACMDM_STREAM_CONVERT: + // perform a conversion on the specified conversion stream + my_debug.OutPut(DEBUG_LEVEL_MSG, "ACMDM_STREAM_CONVERT"); + dwRes = OnStreamConvert((LPACMDRVSTREAMINSTANCE)lParam1, (LPACMDRVSTREAMHEADER) lParam2); + + break; + + case ACMDM_STREAM_CLOSE: + // closes an ACM conversion stream + my_debug.OutPut(DEBUG_LEVEL_MSG, "ACMDM_STREAM_CLOSE"); + dwRes = OnStreamClose((LPACMDRVSTREAMINSTANCE)lParam1); + break; + + /************************************** + // Unknown message + ***************************************/ + + default: + // Process any other messages. + my_debug.OutPut(DEBUG_LEVEL_MSG, "ACM::DriverProc unknown message (0x%08X), lParam1 = 0x%08X, lParam2 = 0x%08X", msg, lParam1, lParam2); + return DefDriverProc ((DWORD)this, hdrvr, msg, lParam1, lParam2); + } + + return dwRes; +} + +////////////////////////////////////////////////////////////////////// +// Special message handlers +////////////////////////////////////////////////////////////////////// +/*! + Retreive the config details of this ACM driver + The index represent the specified format + + \param a_FormatDetails will be filled with all the corresponding data +*/ +inline DWORD ACM::OnFormatDetails(LPACMFORMATDETAILS a_FormatDetails, const LPARAM a_Query) +{ + DWORD Result = ACMERR_NOTPOSSIBLE; + + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "ACM_FORMATDETAILS a_Query = 0x%08X",a_Query); + switch (a_Query & ACM_FORMATDETAILSF_QUERYMASK) { + + // Fill-in the informations corresponding to the FormatDetails->dwFormatTagIndex + case ACM_FORMATDETAILSF_INDEX : + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "enter ACM_FORMATDETAILSF_INDEX for index 0x%04X:%03d",a_FormatDetails->dwFormatTag,a_FormatDetails->dwFormatIndex); + if (a_FormatDetails->dwFormatTag == PERSONAL_FORMAT) { + if (a_FormatDetails->dwFormatIndex < GetNumberEncodingFormats()) { + LPWAVEFORMATEX WaveExt; + WaveExt = a_FormatDetails->pwfx; + + WaveExt->wFormatTag = PERSONAL_FORMAT; + + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "format in : channels %d, sample rate %d", WaveExt->nChannels, WaveExt->nSamplesPerSec); + GetMP3FormatForIndex(a_FormatDetails->dwFormatIndex, *WaveExt, a_FormatDetails->szFormat); + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "format out : channels %d, sample rate %d", WaveExt->nChannels, WaveExt->nSamplesPerSec); + Result = MMSYSERR_NOERROR; + } + else + { + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "ACM_FORMATDETAILSF_INDEX unknown index 0x%04X:%03d",a_FormatDetails->dwFormatTag,a_FormatDetails->dwFormatIndex); + } + } + else if (a_FormatDetails->dwFormatTag == WAVE_FORMAT_PCM) { + if (a_FormatDetails->dwFormatIndex < FORMAT_MAX_NB_PCM) { + LPWAVEFORMATEX WaveExt; + WaveExt = a_FormatDetails->pwfx; + + WaveExt->wFormatTag = WAVE_FORMAT_PCM; + + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "format in : channels %d, sample rate %d", WaveExt->nChannels, WaveExt->nSamplesPerSec); + GetPCMFormatForIndex(a_FormatDetails->dwFormatIndex, *WaveExt, a_FormatDetails->szFormat); + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "format out : channels %d, sample rate %d", WaveExt->nChannels, WaveExt->nSamplesPerSec); + Result = MMSYSERR_NOERROR; + } + else + { + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "ACM_FORMATDETAILSF_INDEX unknown index 0x%04X:%03d",a_FormatDetails->dwFormatTag,a_FormatDetails->dwFormatIndex); + } + } + else + { + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "Unknown a_FormatDetails->dwFormatTag = 0x%08X",a_FormatDetails->dwFormatTag); + } + + case ACM_FORMATDETAILSF_FORMAT : + /// \todo we may output the corresponding strong (only for personal format) + LPWAVEFORMATEX WaveExt; + WaveExt = a_FormatDetails->pwfx; + + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "enter ACM_FORMATDETAILSF_FORMAT : 0x%04X:%03d, format in : channels %d, sample rate %d",a_FormatDetails->dwFormatTag,a_FormatDetails->dwFormatIndex, WaveExt->nChannels, WaveExt->nSamplesPerSec); + + Result = MMSYSERR_NOERROR; + break; + + default: + Result = ACMERR_NOTPOSSIBLE; + break; + } + + a_FormatDetails->fdwSupport = ACMDRIVERDETAILS_SUPPORTF_CODEC; + + return Result; +} + +/*! + Retreive the details of each known format by this ACM driver + The index represent the specified format (0 = MP3 / 1 = PCM) + + \param a_FormatTagDetails will be filled with all the corresponding data +*/ +inline DWORD ACM::OnFormatTagDetails(LPACMFORMATTAGDETAILS a_FormatTagDetails, const LPARAM a_Query) +{ + DWORD Result; + DWORD the_format = WAVE_FORMAT_UNKNOWN; // the format to give details + + if (a_FormatTagDetails->cbStruct >= sizeof(*a_FormatTagDetails)) { + + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "ACMDM_FORMATTAG_DETAILS, a_Query = 0x%08X",a_Query); + switch(a_Query & ACM_FORMATTAGDETAILSF_QUERYMASK) { + + case ACM_FORMATTAGDETAILSF_INDEX: + // Fill-in the informations corresponding to the a_FormatDetails->dwFormatTagIndex + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "get ACM_FORMATTAGDETAILSF_INDEX for index %03d",a_FormatTagDetails->dwFormatTagIndex); + + if (a_FormatTagDetails->dwFormatTagIndex < FORMAT_TAG_MAX_NB) { + switch (a_FormatTagDetails->dwFormatTagIndex) + { + case 0: + the_format = PERSONAL_FORMAT; + break; + default : + the_format = WAVE_FORMAT_PCM; + break; + } + } + else + { + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "ACM_FORMATTAGDETAILSF_INDEX for unsupported index %03d",a_FormatTagDetails->dwFormatTagIndex); + Result = ACMERR_NOTPOSSIBLE; + } + break; + + case ACM_FORMATTAGDETAILSF_FORMATTAG: + // Fill-in the informations corresponding to the a_FormatDetails->dwFormatTagIndex and hdrvr given + switch (a_FormatTagDetails->dwFormatTag) + { + case WAVE_FORMAT_PCM: + the_format = WAVE_FORMAT_PCM; + break; + case PERSONAL_FORMAT: + the_format = PERSONAL_FORMAT; + break; + default: + return (ACMERR_NOTPOSSIBLE); + } + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "get ACM_FORMATTAGDETAILSF_FORMATTAG for index 0x%02X, cStandardFormats = %d",a_FormatTagDetails->dwFormatTagIndex,a_FormatTagDetails->cStandardFormats); + break; + case ACM_FORMATTAGDETAILSF_LARGESTSIZE: + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "ACM_FORMATTAGDETAILSF_LARGESTSIZE not used"); + Result = 0L; + break; + default: + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "OnFormatTagDetails Unknown Format tag query"); + Result = MMSYSERR_NOTSUPPORTED; + break; + } + + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "OnFormatTagDetails the_format = 0x%08X",the_format); + switch(the_format) + { + case WAVE_FORMAT_PCM: + a_FormatTagDetails->dwFormatTag = WAVE_FORMAT_PCM; + a_FormatTagDetails->dwFormatTagIndex = 0; + a_FormatTagDetails->cbFormatSize = sizeof(PCMWAVEFORMAT); + /// \note 0 may mean we don't know how to decode + a_FormatTagDetails->fdwSupport = ACMDRIVERDETAILS_SUPPORTF_CODEC; + a_FormatTagDetails->cStandardFormats = FORMAT_MAX_NB_PCM; + // should be filled by Windows a_FormatTagDetails->szFormatTag[0] = '\0'; + Result = MMSYSERR_NOERROR; + break; + case PERSONAL_FORMAT: + a_FormatTagDetails->dwFormatTag = PERSONAL_FORMAT; + a_FormatTagDetails->dwFormatTagIndex = 1; + a_FormatTagDetails->cbFormatSize = SIZE_FORMAT_STRUCT; + a_FormatTagDetails->fdwSupport = ACMDRIVERDETAILS_SUPPORTF_CODEC; + a_FormatTagDetails->cStandardFormats = GetNumberEncodingFormats(); + lstrcpyW( a_FormatTagDetails->szFormatTag, L"Lame MP3" ); + Result = MMSYSERR_NOERROR; + break; + default: + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "OnFormatTagDetails Unknown format 0x%08X",the_format); + return (ACMERR_NOTPOSSIBLE); + } + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "OnFormatTagDetails %d possibilities for format 0x%08X",a_FormatTagDetails->cStandardFormats,the_format); + } + else + { + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "a_FormatTagDetails->cbStruct < sizeof(*a_FormatDetails)"); + Result = ACMERR_NOTPOSSIBLE; + } + + return Result; +} + +/*! + Retreive the global details of this ACM driver + + \param a_DriverDetail will be filled with all the corresponding data +*/ +inline DWORD ACM::OnDriverDetails(const HDRVR hdrvr, LPACMDRIVERDETAILS a_DriverDetail) +{ + if (my_hIcon == NULL) + my_hIcon = LoadIcon(GetDriverModuleHandle(hdrvr), MAKEINTRESOURCE(IDI_ICON)); + a_DriverDetail->hicon = my_hIcon; + + a_DriverDetail->fccType = ACMDRIVERDETAILS_FCCTYPE_AUDIOCODEC; + a_DriverDetail->fccComp = ACMDRIVERDETAILS_FCCCOMP_UNDEFINED; + + /// \note this is an explicit hack of the FhG values + /// \note later it could be a new value when the decoding is done + a_DriverDetail->wMid = MM_FRAUNHOFER_IIS; + a_DriverDetail->wPid = MM_FHGIIS_MPEGLAYER3; + + a_DriverDetail->vdwACM = VERSION_MSACM; + a_DriverDetail->vdwDriver = VERSION_ACM_DRIVER; + a_DriverDetail->fdwSupport = ACMDRIVERDETAILS_SUPPORTF_CODEC; + a_DriverDetail->cFormatTags = FORMAT_TAG_MAX_NB; // 2 : MP3 and PCM +// a_DriverDetail->cFormatTags = 1; // 2 : MP3 and PCM + a_DriverDetail->cFilterTags = FILTER_TAG_MAX_NB; + + lstrcpyW( a_DriverDetail->szShortName, L"LAME MP3" ); + char tmpStr[128]; + wsprintf(tmpStr, "LAME MP3 Codec v%s", GetVersionString()); + int u = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, tmpStr, -1, a_DriverDetail->szLongName, 0); + MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, tmpStr, -1, a_DriverDetail->szLongName, u); + lstrcpyW( a_DriverDetail->szCopyright, L"2002 Steve Lhomme" ); + lstrcpyW( a_DriverDetail->szLicensing, L"LGPL (see gnu.org)" ); + /// \todo update this part when the code changes + lstrcpyW( a_DriverDetail->szFeatures , L"only CBR implementation" ); + + return MMSYSERR_NOERROR; // Can also return DRVCNF_CANCEL +} + +/*! + Suggest an output format for the specified input format + + \param a_FormatSuggest will be filled with all the corresponding data +*/ +inline DWORD ACM::OnFormatSuggest(LPACMDRVFORMATSUGGEST a_FormatSuggest) +{ + DWORD Result = MMSYSERR_NOTSUPPORTED; + DWORD fdwSuggest = (ACM_FORMATSUGGESTF_TYPEMASK & a_FormatSuggest->fdwSuggest); + +my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "Suggest %s%s%s%s (0x%08X)", + (fdwSuggest & ACM_FORMATSUGGESTF_NCHANNELS) ? "channels, ":"", + (fdwSuggest & ACM_FORMATSUGGESTF_NSAMPLESPERSEC) ? "samples/sec, ":"", + (fdwSuggest & ACM_FORMATSUGGESTF_WBITSPERSAMPLE) ? "bits/sample, ":"", + (fdwSuggest & ACM_FORMATSUGGESTF_WFORMATTAG) ? "format, ":"", + fdwSuggest); + +my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "Suggest for source format = 0x%04X, channels = %d, Samples/s = %d, AvgB/s = %d, BlockAlign = %d, b/sample = %d", + a_FormatSuggest->pwfxSrc->wFormatTag, + a_FormatSuggest->pwfxSrc->nChannels, + a_FormatSuggest->pwfxSrc->nSamplesPerSec, + a_FormatSuggest->pwfxSrc->nAvgBytesPerSec, + a_FormatSuggest->pwfxSrc->nBlockAlign, + a_FormatSuggest->pwfxSrc->wBitsPerSample); + +my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "Suggested destination format = 0x%04X, channels = %d, Samples/s = %d, AvgB/s = %d, BlockAlign = %d, b/sample = %d", + a_FormatSuggest->pwfxDst->wFormatTag, + a_FormatSuggest->pwfxDst->nChannels, + a_FormatSuggest->pwfxDst->nSamplesPerSec, + a_FormatSuggest->pwfxDst->nAvgBytesPerSec, + a_FormatSuggest->pwfxDst->nBlockAlign, + a_FormatSuggest->pwfxDst->wBitsPerSample); + + switch (a_FormatSuggest->pwfxSrc->wFormatTag) + { + case WAVE_FORMAT_PCM: + /// \todo handle here the decoding ? + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "Suggest for PCM source"); + // + // if the destination format tag is restricted, verify that + // it is within our capabilities... + // + // this driver is able to decode to PCM + // + if (ACM_FORMATSUGGESTF_WFORMATTAG & fdwSuggest) + { + if (PERSONAL_FORMAT != a_FormatSuggest->pwfxDst->wFormatTag) + return (ACMERR_NOTPOSSIBLE); + } + else + { + a_FormatSuggest->pwfxDst->wFormatTag = PERSONAL_FORMAT; + } + + +my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "Suggest succeed A"); + // + // if the destination channel count is restricted, verify that + // it is within our capabilities... + // + // this driver is not able to change the number of channels + // + if (ACM_FORMATSUGGESTF_NCHANNELS & fdwSuggest) + { + if (a_FormatSuggest->pwfxSrc->nChannels != a_FormatSuggest->pwfxDst->nChannels) + return (ACMERR_NOTPOSSIBLE); + } + else + { + a_FormatSuggest->pwfxDst->nChannels = a_FormatSuggest->pwfxSrc->nChannels; + } + + if (a_FormatSuggest->pwfxSrc->nChannels != 1 && a_FormatSuggest->pwfxSrc->nChannels != 2) + return MMSYSERR_INVALPARAM; + + +my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "Suggest succeed B"); + // + // if the destination samples per second is restricted, verify + // that it is within our capabilities... + // + // this driver is not able to change the sample rate + // + if (ACM_FORMATSUGGESTF_NSAMPLESPERSEC & fdwSuggest) + { + if (a_FormatSuggest->pwfxSrc->nSamplesPerSec != a_FormatSuggest->pwfxDst->nSamplesPerSec) + return (ACMERR_NOTPOSSIBLE); + } + else + { + a_FormatSuggest->pwfxDst->nSamplesPerSec = a_FormatSuggest->pwfxSrc->nSamplesPerSec; + } + + +my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "Suggest succeed C"); + // + // if the destination bits per sample is restricted, verify + // that it is within our capabilities... + // + // We prefer decoding to 16-bit PCM. + // + if (ACM_FORMATSUGGESTF_WBITSPERSAMPLE & fdwSuggest) + { + if ( (16 != a_FormatSuggest->pwfxDst->wBitsPerSample) && (8 != a_FormatSuggest->pwfxDst->wBitsPerSample) ) + return (ACMERR_NOTPOSSIBLE); + } + else + { + a_FormatSuggest->pwfxDst->wBitsPerSample = 16; + } + + // a_FormatSuggest->pwfxDst->nBlockAlign = FORMAT_BLOCK_ALIGN; + a_FormatSuggest->pwfxDst->nBlockAlign = a_FormatSuggest->pwfxDst->nChannels * a_FormatSuggest->pwfxDst->wBitsPerSample / 8; + + a_FormatSuggest->pwfxDst->nAvgBytesPerSec = a_FormatSuggest->pwfxDst->nChannels * 64000 / 8; + + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "Suggest succeed"); + Result = MMSYSERR_NOERROR; + + + break; + case PERSONAL_FORMAT: + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "Suggest for PERSONAL source"); + // + // if the destination format tag is restricted, verify that + // it is within our capabilities... + // + // this driver is able to decode to PCM + // + if (ACM_FORMATSUGGESTF_WFORMATTAG & fdwSuggest) + { + if (WAVE_FORMAT_PCM != a_FormatSuggest->pwfxDst->wFormatTag) + return (ACMERR_NOTPOSSIBLE); + } + else + { + a_FormatSuggest->pwfxDst->wFormatTag = WAVE_FORMAT_PCM; + } + + + // + // if the destination channel count is restricted, verify that + // it is within our capabilities... + // + // this driver is not able to change the number of channels + // + if (ACM_FORMATSUGGESTF_NCHANNELS & fdwSuggest) + { + if (a_FormatSuggest->pwfxSrc->nChannels != a_FormatSuggest->pwfxDst->nChannels) + return (ACMERR_NOTPOSSIBLE); + } + else + { + a_FormatSuggest->pwfxDst->nChannels = a_FormatSuggest->pwfxSrc->nChannels; + } + + + // + // if the destination samples per second is restricted, verify + // that it is within our capabilities... + // + // this driver is not able to change the sample rate + // + if (ACM_FORMATSUGGESTF_NSAMPLESPERSEC & fdwSuggest) + { + if (a_FormatSuggest->pwfxSrc->nSamplesPerSec != a_FormatSuggest->pwfxDst->nSamplesPerSec) + return (ACMERR_NOTPOSSIBLE); + } + else + { + a_FormatSuggest->pwfxDst->nSamplesPerSec = a_FormatSuggest->pwfxSrc->nSamplesPerSec; + } + + + // + // if the destination bits per sample is restricted, verify + // that it is within our capabilities... + // + // We prefer decoding to 16-bit PCM. + // + if (ACM_FORMATSUGGESTF_WBITSPERSAMPLE & fdwSuggest) + { + if ( (16 != a_FormatSuggest->pwfxDst->wBitsPerSample) && (8 != a_FormatSuggest->pwfxDst->wBitsPerSample) ) + return (ACMERR_NOTPOSSIBLE); + } + else + { + a_FormatSuggest->pwfxDst->wBitsPerSample = 16; + } + + // a_FormatSuggest->pwfxDst->nBlockAlign = FORMAT_BLOCK_ALIGN; + a_FormatSuggest->pwfxDst->nBlockAlign = a_FormatSuggest->pwfxDst->nChannels * a_FormatSuggest->pwfxDst->wBitsPerSample / 8; + + /// \todo this value must be a correct one ! + a_FormatSuggest->pwfxDst->nAvgBytesPerSec = a_FormatSuggest->pwfxDst->nSamplesPerSec * a_FormatSuggest->pwfxDst->nChannels * a_FormatSuggest->pwfxDst->wBitsPerSample / 8; + + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "Suggest succeed"); + Result = MMSYSERR_NOERROR; + + + break; + } + + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "Suggested destination format = 0x%04X, channels = %d, Samples/s = %d, AvgB/s = %d, BlockAlign = %d, b/sample = %d", + a_FormatSuggest->pwfxDst->wFormatTag, + a_FormatSuggest->pwfxDst->nChannels, + a_FormatSuggest->pwfxDst->nSamplesPerSec, + a_FormatSuggest->pwfxDst->nAvgBytesPerSec, + a_FormatSuggest->pwfxDst->nBlockAlign, + a_FormatSuggest->pwfxDst->wBitsPerSample); + + return Result; +} + +/*! + Create a stream instance for decoding/encoding + + \param a_StreamInstance contain information about the stream desired +*/ +inline DWORD ACM::OnStreamOpen(LPACMDRVSTREAMINSTANCE a_StreamInstance) +{ + DWORD Result = ACMERR_NOTPOSSIBLE; + + // + // the most important condition to check before doing anything else + // is that this ACM driver can actually perform the conversion we are + // being opened for. this check should fail as quickly as possible + // if the conversion is not possible by this driver. + // + // it is VERY important to fail quickly so the ACM can attempt to + // find a driver that is suitable for the conversion. also note that + // the ACM may call this driver several times with slightly different + // format specifications before giving up. + // + // this driver first verifies that the source and destination formats + // are acceptable... + // + switch (a_StreamInstance->pwfxSrc->wFormatTag) + { + case WAVE_FORMAT_PCM: + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "Open stream for PCM source (%05d samples %d channels %d bits/sample)",a_StreamInstance->pwfxSrc->nSamplesPerSec,a_StreamInstance->pwfxSrc->nChannels,a_StreamInstance->pwfxSrc->wBitsPerSample); + if (a_StreamInstance->pwfxDst->wFormatTag == PERSONAL_FORMAT) + { + unsigned int OutputFrequency; + + /// \todo Smart mode + if (my_EncodingProperties.GetSmartOutputMode()) + OutputFrequency = ACMStream::GetOutputSampleRate(a_StreamInstance->pwfxSrc->nSamplesPerSec,a_StreamInstance->pwfxDst->nAvgBytesPerSec,a_StreamInstance->pwfxDst->nChannels); + else + OutputFrequency = a_StreamInstance->pwfxSrc->nSamplesPerSec; + + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "Open stream for PERSONAL output (%05d samples %d channels %d bits/sample %d kbps)",a_StreamInstance->pwfxDst->nSamplesPerSec,a_StreamInstance->pwfxDst->nChannels,a_StreamInstance->pwfxDst->wBitsPerSample,8 * a_StreamInstance->pwfxDst->nAvgBytesPerSec); + + /// \todo add the possibility to have channel resampling (mono to stereo / stereo to mono) + /// \todo support resampling ? + /// \todo only do the test on OutputFrequency in "Smart Output" mode + if (a_StreamInstance->pwfxDst->nSamplesPerSec != OutputFrequency || +// a_StreamInstance->pwfxSrc->nSamplesPerSec != a_StreamInstance->pwfxDst->nSamplesPerSec || + a_StreamInstance->pwfxSrc->nChannels != a_StreamInstance->pwfxDst->nChannels || + a_StreamInstance->pwfxSrc->wBitsPerSample != 16) + { + Result = ACMERR_NOTPOSSIBLE; + } else { + if ((a_StreamInstance->fdwOpen & ACM_STREAMOPENF_QUERY) == 0) + { + ACMStream * the_stream = ACMStream::Create(); + a_StreamInstance->dwInstance = (DWORD) the_stream; + + if (the_stream != NULL) + { + MPEGLAYER3WAVEFORMAT * casted = (MPEGLAYER3WAVEFORMAT *) a_StreamInstance->pwfxDst; + vbr_mode a_mode = (casted->fdwFlags-2 == 0)?vbr_abr:vbr_off; + if (the_stream->init(a_StreamInstance->pwfxDst->nSamplesPerSec, + OutputFrequency, + a_StreamInstance->pwfxDst->nChannels, + a_StreamInstance->pwfxDst->nAvgBytesPerSec, + a_mode)) + Result = MMSYSERR_NOERROR; + else + ACMStream::Erase( the_stream ); + } + } + else + { + Result = MMSYSERR_NOERROR; + } + } + } + break; + case PERSONAL_FORMAT: + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "Open stream for PERSONAL source (%05d samples %d channels %d bits/sample %d kbps)",a_StreamInstance->pwfxSrc->nSamplesPerSec,a_StreamInstance->pwfxSrc->nChannels,a_StreamInstance->pwfxSrc->wBitsPerSample,8 * a_StreamInstance->pwfxSrc->nAvgBytesPerSec); + if (a_StreamInstance->pwfxDst->wFormatTag == WAVE_FORMAT_PCM) + { +#ifdef ENABLE_DECODING + if ((a_StreamInstance->fdwOpen & ACM_STREAMOPENF_QUERY) == 0) + { + /// \todo create the decoding stream + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "Open stream for PCM output (%05d samples %d channels %d bits/sample %d B/s)",a_StreamInstance->pwfxDst->nSamplesPerSec,a_StreamInstance->pwfxDst->nChannels,a_StreamInstance->pwfxDst->wBitsPerSample,a_StreamInstance->pwfxDst->nAvgBytesPerSec); + + DecodeStream * the_stream = DecodeStream::Create(); + a_StreamInstance->dwInstance = (DWORD) the_stream; + + if (the_stream != NULL) + { + if (the_stream->init(a_StreamInstance->pwfxDst->nSamplesPerSec, + a_StreamInstance->pwfxDst->nChannels, + a_StreamInstance->pwfxDst->nAvgBytesPerSec, + a_StreamInstance->pwfxSrc->nAvgBytesPerSec)) + Result = MMSYSERR_NOERROR; + else + DecodeStream::Erase( the_stream ); + } + } + else + { + /// \todo decoding verification + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "Open stream is valid"); + Result = MMSYSERR_NOERROR; + } +#endif // ENABLE_DECODING + } + break; + } + + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "Open stream Result = %d",Result); + return Result; +} + +inline DWORD ACM::OnStreamSize(LPACMDRVSTREAMINSTANCE a_StreamInstance, LPACMDRVSTREAMSIZE the_StreamSize) +{ + DWORD Result = ACMERR_NOTPOSSIBLE; + + switch (ACM_STREAMSIZEF_QUERYMASK & the_StreamSize->fdwSize) + { + case ACM_STREAMSIZEF_DESTINATION: + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "Get source buffer size for destination size = %d",the_StreamSize->cbDstLength); + break; + case ACM_STREAMSIZEF_SOURCE: + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "Get destination buffer size for source size = %d",the_StreamSize->cbSrcLength); + if (WAVE_FORMAT_PCM == a_StreamInstance->pwfxSrc->wFormatTag && + PERSONAL_FORMAT == a_StreamInstance->pwfxDst->wFormatTag) + { + ACMStream * the_stream = (ACMStream *) a_StreamInstance->dwInstance; + if (the_stream != NULL) + { + the_StreamSize->cbDstLength = the_stream->GetOutputSizeForInput(the_StreamSize->cbSrcLength); + Result = MMSYSERR_NOERROR; + } + } + else if (PERSONAL_FORMAT == a_StreamInstance->pwfxSrc->wFormatTag && + WAVE_FORMAT_PCM== a_StreamInstance->pwfxDst->wFormatTag) + { +#ifdef ENABLE_DECODING + DecodeStream * the_stream = (DecodeStream *) a_StreamInstance->dwInstance; + if (the_stream != NULL) + { + the_StreamSize->cbDstLength = the_stream->GetOutputSizeForInput(the_StreamSize->cbSrcLength); + Result = MMSYSERR_NOERROR; + } +#endif // ENABLE_DECODING + } + break; + default: + Result = MMSYSERR_INVALFLAG; + break; + } + + return Result; +} + +inline DWORD ACM::OnStreamClose(LPACMDRVSTREAMINSTANCE a_StreamInstance) +{ + DWORD Result = ACMERR_NOTPOSSIBLE; + + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "OnStreamClose the stream 0x%X",a_StreamInstance->dwInstance); + if (WAVE_FORMAT_PCM == a_StreamInstance->pwfxSrc->wFormatTag && + PERSONAL_FORMAT == a_StreamInstance->pwfxDst->wFormatTag) + { + ACMStream::Erase( (ACMStream *) a_StreamInstance->dwInstance ); + } + else if (PERSONAL_FORMAT == a_StreamInstance->pwfxSrc->wFormatTag && + WAVE_FORMAT_PCM== a_StreamInstance->pwfxDst->wFormatTag) + { +#ifdef ENABLE_DECODING + DecodeStream::Erase( (DecodeStream *) a_StreamInstance->dwInstance ); +#endif // ENABLE_DECODING + } + + // nothing to do yet + Result = MMSYSERR_NOERROR; + + return Result; +} + +inline DWORD ACM::OnStreamPrepareHeader(LPACMDRVSTREAMINSTANCE a_StreamInstance, LPACMSTREAMHEADER a_StreamHeader) +{ + DWORD Result = ACMERR_NOTPOSSIBLE; + + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, " prepare : Src : %d (0x%08X) / %d - Dst : %d (0x%08X) / %d" + , a_StreamHeader->cbSrcLength + , a_StreamHeader->pbSrc + , a_StreamHeader->cbSrcLengthUsed + , a_StreamHeader->cbDstLength + , a_StreamHeader->pbDst + , a_StreamHeader->cbDstLengthUsed + ); + + if (WAVE_FORMAT_PCM == a_StreamInstance->pwfxSrc->wFormatTag && + PERSONAL_FORMAT == a_StreamInstance->pwfxDst->wFormatTag) + { + ACMStream * the_stream = (ACMStream *)a_StreamInstance->dwInstance; + + if (the_stream->open(my_EncodingProperties)) + Result = MMSYSERR_NOERROR; + } + else if (PERSONAL_FORMAT == a_StreamInstance->pwfxSrc->wFormatTag && + WAVE_FORMAT_PCM == a_StreamInstance->pwfxDst->wFormatTag) + { +#ifdef ENABLE_DECODING + DecodeStream * the_stream = (DecodeStream *)a_StreamInstance->dwInstance; + + if (the_stream->open()) + Result = MMSYSERR_NOERROR; +#endif // ENABLE_DECODING + } + + return Result; +} + +inline DWORD ACM::OnStreamUnPrepareHeader(LPACMDRVSTREAMINSTANCE a_StreamInstance, LPACMSTREAMHEADER a_StreamHeader) +{ + DWORD Result = ACMERR_NOTPOSSIBLE; + + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "unprepare : Src : %d / %d - Dst : %d / %d" + , a_StreamHeader->cbSrcLength + , a_StreamHeader->cbSrcLengthUsed + , a_StreamHeader->cbDstLength + , a_StreamHeader->cbDstLengthUsed + ); + if (WAVE_FORMAT_PCM == a_StreamInstance->pwfxSrc->wFormatTag && + PERSONAL_FORMAT == a_StreamInstance->pwfxDst->wFormatTag) + { + ACMStream * the_stream = (ACMStream *)a_StreamInstance->dwInstance; + DWORD OutputSize = a_StreamHeader->cbDstLength; + + if (the_stream->close(a_StreamHeader->pbDst, &OutputSize) && (OutputSize <= a_StreamHeader->cbDstLength)) + { + a_StreamHeader->cbDstLengthUsed = OutputSize; + Result = MMSYSERR_NOERROR; + } + } + else if (PERSONAL_FORMAT == a_StreamInstance->pwfxSrc->wFormatTag && + WAVE_FORMAT_PCM== a_StreamInstance->pwfxDst->wFormatTag) + { +#ifdef ENABLE_DECODING + DecodeStream * the_stream = (DecodeStream *)a_StreamInstance->dwInstance; + DWORD OutputSize = a_StreamHeader->cbDstLength; + + if (the_stream->close(a_StreamHeader->pbDst, &OutputSize) && (OutputSize <= a_StreamHeader->cbDstLength)) + { + a_StreamHeader->cbDstLengthUsed = OutputSize; + Result = MMSYSERR_NOERROR; + } +#endif // ENABLE_DECODING + } + + return Result; +} + +inline DWORD ACM::OnStreamConvert(LPACMDRVSTREAMINSTANCE a_StreamInstance, LPACMDRVSTREAMHEADER a_StreamHeader) +{ + DWORD Result = ACMERR_NOTPOSSIBLE; + + if (WAVE_FORMAT_PCM == a_StreamInstance->pwfxSrc->wFormatTag && + PERSONAL_FORMAT == a_StreamInstance->pwfxDst->wFormatTag) + { + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "OnStreamConvert SRC = PCM (encode)"); + + ACMStream * the_stream = (ACMStream *) a_StreamInstance->dwInstance; + if (the_stream != NULL) + { + if (the_stream->ConvertBuffer( a_StreamHeader )) + Result = MMSYSERR_NOERROR; + } + } + else if (PERSONAL_FORMAT == a_StreamInstance->pwfxSrc->wFormatTag && + WAVE_FORMAT_PCM == a_StreamInstance->pwfxDst->wFormatTag) + { + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "OnStreamConvert SRC = MP3 (decode)"); + +#ifdef ENABLE_DECODING + DecodeStream * the_stream = (DecodeStream *) a_StreamInstance->dwInstance; + if (the_stream != NULL) + { + if (the_stream->ConvertBuffer( a_StreamHeader )) + Result = MMSYSERR_NOERROR; + } +#endif // ENABLE_DECODING + } + else + my_debug.OutPut(DEBUG_LEVEL_FUNC_CODE, "OnStreamConvert unsupported conversion"); + + return Result; +} + + +void ACM::GetMP3FormatForIndex(const DWORD the_Index, WAVEFORMATEX & the_Format, unsigned short the_String[ACMFORMATDETAILS_FORMAT_CHARS]) const +{ + int Block_size; + char temp[ACMFORMATDETAILS_FORMAT_CHARS]; + + + if (the_Index < bitrate_table.size()) + { + // the_Format.wBitsPerSample = 16; + the_Format.wBitsPerSample = 0; + + /// \todo handle more channel modes (mono, stereo, joint-stereo, dual-channel) + // the_Format.nChannels = SIZE_CHANNEL_MODE - int(the_Index % SIZE_CHANNEL_MODE); + + the_Format.nBlockAlign = 1; + + the_Format.nSamplesPerSec = bitrate_table[the_Index].frequency; + the_Format.nAvgBytesPerSec = bitrate_table[the_Index].bitrate * 1000 / 8; + if (bitrate_table[the_Index].frequency >= mpeg1_freq[SIZE_FREQ_MPEG1-1]) + Block_size = 1152; + else + Block_size = 576; + + the_Format.nChannels = bitrate_table[the_Index].channels; + + the_Format.cbSize = sizeof(MPEGLAYER3WAVEFORMAT) - sizeof(WAVEFORMATEX); + MPEGLAYER3WAVEFORMAT * tmpFormat = (MPEGLAYER3WAVEFORMAT *) &the_Format; + tmpFormat->wID = 1; + // this is the only way I found to know if we do CBR or ABR + tmpFormat->fdwFlags = 2 + ((bitrate_table[the_Index].mode == vbr_abr)?0:2); + tmpFormat->nBlockSize = Block_size * the_Format.nAvgBytesPerSec / the_Format.nSamplesPerSec; + tmpFormat->nFramesPerBlock = 1; + tmpFormat->nCodecDelay = 0; // 0x0571 on FHG + + /// \todo : generate the string with the appropriate stereo mode + if (bitrate_table[the_Index].mode == vbr_abr) + wsprintfA( temp, "%d Hz, %d kbps ABR, %s", the_Format.nSamplesPerSec, the_Format.nAvgBytesPerSec * 8 / 1000, (the_Format.nChannels == 1)?"Mono":"Stereo"); + else + wsprintfA( temp, "%d Hz, %d kbps CBR, %s", the_Format.nSamplesPerSec, the_Format.nAvgBytesPerSec * 8 / 1000, (the_Format.nChannels == 1)?"Mono":"Stereo"); + + MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, temp, -1, the_String, ACMFORMATDETAILS_FORMAT_CHARS); + } + } + +void ACM::GetPCMFormatForIndex(const DWORD the_Index, WAVEFORMATEX & the_Format, unsigned short the_String[ACMFORMATDETAILS_FORMAT_CHARS]) const +{ + the_Format.nChannels = SIZE_CHANNEL_MODE - int(the_Index % SIZE_CHANNEL_MODE); + the_Format.wBitsPerSample = 16; + the_Format.nBlockAlign = the_Format.nChannels * the_Format.wBitsPerSample / 8; + + + DWORD a_Channel_Independent = the_Index / SIZE_CHANNEL_MODE; + + // first MPEG1 frequencies + if (a_Channel_Independent < SIZE_FREQ_MPEG1) + { + the_Format.nSamplesPerSec = mpeg1_freq[a_Channel_Independent]; + } + else + { + a_Channel_Independent -= SIZE_FREQ_MPEG1; + the_Format.nSamplesPerSec = mpeg2_freq[a_Channel_Independent]; + } + + the_Format.nAvgBytesPerSec = the_Format.nSamplesPerSec * the_Format.nChannels * the_Format.wBitsPerSample / 8; +} + +DWORD ACM::GetNumberEncodingFormats() const +{ + return bitrate_table.size(); +} + +bool ACM::IsSmartOutput(const int frequency, const int bitrate, const int channels) const +{ + double compression_ratio = double(frequency * 2 * channels) / double(bitrate * 100); + +//my_debug.OutPut(DEBUG_LEVEL_FUNC_DEBUG, "compression_ratio %f, freq %d, bitrate %d, channels %d", compression_ratio, frequency, bitrate, channels); + + if(my_EncodingProperties.GetSmartOutputMode()) + return (compression_ratio <= my_EncodingProperties.GetSmartRatio()); + else return true; +} + +void ACM::BuildBitrateTable() +{ + my_debug.OutPut("entering BuildBitrateTable"); + + // fill the table + unsigned int channel,bitrate,freq; + + bitrate_table.clear(); + + // CBR bitrates + for (channel = 0;channel < SIZE_CHANNEL_MODE;channel++) + { + // MPEG I + for (freq = 0;freq < SIZE_FREQ_MPEG1;freq++) + { + for (bitrate = 0;bitrate < SIZE_BITRATE_MPEG1;bitrate++) + { + + if (!my_EncodingProperties.GetSmartOutputMode() || IsSmartOutput(mpeg1_freq[freq], mpeg1_bitrate[bitrate], channel+1)) + { + bitrate_item bitrate_table_tmp; + + bitrate_table_tmp.frequency = mpeg1_freq[freq]; + bitrate_table_tmp.bitrate = mpeg1_bitrate[bitrate]; + bitrate_table_tmp.channels = channel+1; + bitrate_table_tmp.mode = vbr_off; + bitrate_table.push_back(bitrate_table_tmp); + } + } + } + // MPEG II / II.5 + for (freq = 0;freq < SIZE_FREQ_MPEG2;freq++) + { + for (bitrate = 0;bitrate < SIZE_BITRATE_MPEG2;bitrate++) + { + if (!my_EncodingProperties.GetSmartOutputMode() || IsSmartOutput(mpeg2_freq[freq], mpeg2_bitrate[bitrate], channel+1)) + { + bitrate_item bitrate_table_tmp; + + bitrate_table_tmp.frequency = mpeg2_freq[freq]; + bitrate_table_tmp.bitrate = mpeg2_bitrate[bitrate]; + bitrate_table_tmp.channels = channel+1; + bitrate_table_tmp.mode = vbr_abr; + bitrate_table.push_back(bitrate_table_tmp); + } + } + } + } + + if (my_EncodingProperties.GetAbrOutputMode()) + // ABR bitrates + { + for (channel = 0;channel < SIZE_CHANNEL_MODE;channel++) + { + // MPEG I + for (freq = 0;freq < SIZE_FREQ_MPEG1;freq++) + { + for (bitrate = my_EncodingProperties.GetAbrBitrateMax(); + bitrate >= my_EncodingProperties.GetAbrBitrateMin(); + bitrate -= my_EncodingProperties.GetAbrBitrateStep()) + { + if (bitrate >= mpeg1_bitrate[SIZE_BITRATE_MPEG1-1] && (!my_EncodingProperties.GetSmartOutputMode() || IsSmartOutput(mpeg1_freq[freq], bitrate, channel+1))) + { + bitrate_item bitrate_table_tmp; + + bitrate_table_tmp.frequency = mpeg1_freq[freq]; + bitrate_table_tmp.bitrate = bitrate; + bitrate_table_tmp.channels = channel+1; + bitrate_table_tmp.mode = vbr_abr; + bitrate_table.push_back(bitrate_table_tmp); + } + } + } + // MPEG II / II.5 + for (freq = 0;freq < SIZE_FREQ_MPEG2;freq++) + { + for (bitrate = my_EncodingProperties.GetAbrBitrateMax(); + bitrate >= my_EncodingProperties.GetAbrBitrateMin(); + bitrate -= my_EncodingProperties.GetAbrBitrateStep()) + { + if (bitrate >= mpeg2_bitrate[SIZE_BITRATE_MPEG2-1] && (!my_EncodingProperties.GetSmartOutputMode() || IsSmartOutput(mpeg2_freq[freq], bitrate, channel+1))) + { + bitrate_item bitrate_table_tmp; + + bitrate_table_tmp.frequency = mpeg2_freq[freq]; + bitrate_table_tmp.bitrate = bitrate; + bitrate_table_tmp.channels = channel+1; + bitrate_table_tmp.mode = vbr_abr; + bitrate_table.push_back(bitrate_table_tmp); + } + } + } + } + } + + // sorting by frequency/bitrate/channel + std::sort(bitrate_table.begin(), bitrate_table.end()); + +/* { + // display test + int i=0; + for (i=0; i + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +/*! + \author Steve Lhomme + \version \$Id: ACM.h,v 1.8 2006/12/25 21:37:34 robert Exp $ +*/ + +#if !defined(_ACM_H__INCLUDED_) +#define _ACM_H__INCLUDED_ + +#if _MSC_VER >= 1000 +#pragma once +#endif // _MSC_VER >= 1000 + +#include + +#include +#include +#include +#include +#include + + +#include "ADbg/ADbg.h" + +class AEncodeProperties; + +typedef enum vbr_mode_e vbr_mode; + +class bitrate_item { + public: + unsigned int frequency; + unsigned int bitrate; + unsigned int channels; + vbr_mode mode; + + bool operator<(const bitrate_item & bitrate) const; +}; + +class ACM +{ +public: + ACM( HMODULE hModule ); + virtual ~ACM(); + + LONG DriverProcedure(const HDRVR hdrvr, const UINT msg, LONG lParam1, LONG lParam2); + + static const char * GetVersionString(void) {return VersionString;} + +protected: +// inline DWORD Configure( HWND hParentWindow, LPDRVCONFIGINFO pConfig ); + inline DWORD About( HWND hParentWindow ); + + inline DWORD OnDriverDetails(const HDRVR hdrvr, LPACMDRIVERDETAILS a_DriverDetail); + inline DWORD OnFormatTagDetails(LPACMFORMATTAGDETAILS a_FormatTagDetails, const LPARAM a_Query); + inline DWORD OnFormatDetails(LPACMFORMATDETAILS a_FormatDetails, const LPARAM a_Query); + inline DWORD OnFormatSuggest(LPACMDRVFORMATSUGGEST a_FormatSuggest); + inline DWORD OnStreamOpen(LPACMDRVSTREAMINSTANCE a_StreamInstance); + inline DWORD OnStreamClose(LPACMDRVSTREAMINSTANCE a_StreamInstance); + inline DWORD OnStreamSize(LPACMDRVSTREAMINSTANCE a_StreamInstance, LPACMDRVSTREAMSIZE the_StreamSize); + inline DWORD OnStreamPrepareHeader(LPACMDRVSTREAMINSTANCE a_StreamInstance, LPACMSTREAMHEADER a_StreamHeader); + inline DWORD OnStreamUnPrepareHeader(LPACMDRVSTREAMINSTANCE a_StreamInstance, LPACMSTREAMHEADER a_StreamHeader); + inline DWORD OnStreamConvert(LPACMDRVSTREAMINSTANCE a_StreamInstance, LPACMDRVSTREAMHEADER a_StreamHeader); + + void GetMP3FormatForIndex(const DWORD the_Index, WAVEFORMATEX & the_Format, unsigned short the_String[ACMFORMATDETAILS_FORMAT_CHARS]) const; + void GetPCMFormatForIndex(const DWORD the_Index, WAVEFORMATEX & the_Format, unsigned short the_String[ACMFORMATDETAILS_FORMAT_CHARS]) const; + DWORD GetNumberEncodingFormats() const; + bool IsSmartOutput(const int frequency, const int bitrate, const int channels) const; + void BuildBitrateTable(); + + HMODULE my_hModule; + HICON my_hIcon; + ADbg my_debug; + AEncodeProperties my_EncodingProperties; + std::vector bitrate_table; + + static char VersionString[120]; +}; + +#endif // !defined(_ACM_H__INCLUDED_) + diff --git a/ACM/ACMStream.cpp b/ACM/ACMStream.cpp new file mode 100644 index 0000000..fbf1e84 --- /dev/null +++ b/ACM/ACMStream.cpp @@ -0,0 +1,397 @@ +/** + * + * Lame ACM wrapper, encode/decode MP3 based RIFF/AVI files in MS Windows + * + * Copyright (c) 2002 Steve Lhomme + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +/*! + \author Steve Lhomme + \version \$Id: ACMStream.cpp,v 1.12 2007/12/26 22:04:08 robert Exp $ +*/ + +#if !defined(STRICT) +#define STRICT +#endif // STRICT + +#include +#include + +#include "adebug.h" + +#include "ACMStream.h" + +#include + +// static methods + +ACMStream * ACMStream::Create() +{ + ACMStream * Result; + + Result = new ACMStream; + + return Result; +} + +const bool ACMStream::Erase(const ACMStream * a_ACMStream) +{ + delete a_ACMStream; + return true; +} + +// class methods + +ACMStream::ACMStream() : + m_WorkingBufferUseSize(0), + gfp(NULL) +{ + /// \todo get the debug level from the registry +my_debug = new ADbg(DEBUG_LEVEL_CREATION); + if (my_debug != NULL) { + unsigned char DebugFileName[512]; + + my_debug->setPrefix("LAMEstream"); /// \todo get it from the registry +my_debug->setIncludeTime(true); /// \todo get it from the registry + +// Check in the registry if we have to Output Debug information +DebugFileName[0] = '\0'; + + HKEY OssKey; + if (RegOpenKeyEx( HKEY_LOCAL_MACHINE, "SOFTWARE\\MUKOLI", 0, KEY_READ , &OssKey ) == ERROR_SUCCESS) { + DWORD DataType; + DWORD DebugFileNameSize = 512; + if (RegQueryValueEx( OssKey, "DebugFile", NULL, &DataType, DebugFileName, &DebugFileNameSize ) == ERROR_SUCCESS) { + if (DataType == REG_SZ) { + my_debug->setUseFile(true); + my_debug->setDebugFile((char *)DebugFileName); + my_debug->OutPut("Debug file is %s",(char *)DebugFileName); + } + } + } + my_debug->OutPut(DEBUG_LEVEL_FUNC_START, "ACMStream Creation (0X%08X)",this); + } + else { + ADbg debug; + debug.OutPut("ACMStream::ACMACMStream : Impossible to create my_debug"); + } + +} + +ACMStream::~ACMStream() +{ + // release memory - encoding is finished + if (gfp) lame_close( gfp ); + + if (my_debug != NULL) + { + my_debug->OutPut(DEBUG_LEVEL_FUNC_START, "ACMStream Deletion (0X%08X)",this); + delete my_debug; + } +} + +bool ACMStream::init(const int nSamplesPerSec, const int nOutputSamplesPerSec, const int nChannels, const int nAvgBytesPerSec, const vbr_mode mode) +{ + bool bResult = false; + + my_SamplesPerSec = nSamplesPerSec; + my_OutBytesPerSec = nOutputSamplesPerSec; + my_Channels = nChannels; + my_AvgBytesPerSec = nAvgBytesPerSec; + my_VBRMode = mode; + + bResult = true; + + return bResult; + +} + +bool ACMStream::open(const AEncodeProperties & the_Properties) +{ + bool bResult = false; + + // Init the MP3 Stream + // Init the global flags structure + gfp = lame_init(); + + // Set input sample frequency + lame_set_in_samplerate( gfp, my_SamplesPerSec ); + + // Set output sample frequency + lame_set_out_samplerate( gfp, my_OutBytesPerSec ); + + lame_set_num_channels( gfp, my_Channels ); + if (my_Channels == 1) + lame_set_mode( gfp, MONO ); + else + lame_set_mode( gfp, (MPEG_mode_e)the_Properties.GetChannelModeValue()) ; /// \todo Get the mode from the default configuration + +// lame_set_VBR( gfp, vbr_off ); /// \note VBR not supported for the moment + lame_set_VBR( gfp, my_VBRMode ); /// \note VBR not supported for the moment + + if (my_VBRMode == vbr_abr) + { + lame_set_VBR_q( gfp, 1 ); + + lame_set_VBR_mean_bitrate_kbps( gfp, (my_AvgBytesPerSec * 8 + 500) / 1000 ); + + if (24000 > lame_get_in_samplerate( gfp )) + { + // For MPEG-II + lame_set_VBR_min_bitrate_kbps( gfp, 8); + + lame_set_VBR_max_bitrate_kbps( gfp, 160); + } + else + { + // For MPEG-I + lame_set_VBR_min_bitrate_kbps( gfp, 32); + + lame_set_VBR_max_bitrate_kbps( gfp, 320); + } + } + + // Set bitrate + lame_set_brate( gfp, my_AvgBytesPerSec * 8 / 1000 ); + + /// \todo Get the mode from the default configuration + // Set copyright flag? + lame_set_copyright( gfp, the_Properties.GetCopyrightMode()?1:0 ); + // Do we have to tag it as non original + lame_set_original( gfp, the_Properties.GetOriginalMode()?1:0 ); + // Add CRC? + lame_set_error_protection( gfp, the_Properties.GetCRCMode()?1:0 ); + // Set private bit? + lame_set_extension( gfp, the_Properties.GetPrivateMode()?1:0 ); + // INFO tag support not possible in ACM - it requires rewinding + // output stream to the beginning after encoding is finished. + lame_set_bWriteVbrTag( gfp, 0 ); + + if (0 == lame_init_params( gfp )) + { + //LAME encoding call will accept any number of samples. + if ( 0 == lame_get_version( gfp ) ) + { + // For MPEG-II, only 576 samples per frame per channel + my_SamplesPerBlock = 576 * lame_get_num_channels( gfp ); + } + else + { + // For MPEG-I, 1152 samples per frame per channel + my_SamplesPerBlock = 1152 * lame_get_num_channels( gfp ); + } + } + + my_debug->OutPut(DEBUG_LEVEL_FUNC_DEBUG, "version =%d",lame_get_version( gfp ) ); + my_debug->OutPut(DEBUG_LEVEL_FUNC_DEBUG, "Layer =3"); + switch ( lame_get_mode( gfp ) ) + { + case STEREO: my_debug->OutPut(DEBUG_LEVEL_FUNC_DEBUG, "mode =Stereo" ); break; + case JOINT_STEREO: my_debug->OutPut(DEBUG_LEVEL_FUNC_DEBUG, "mode =Joint-Stereo" ); break; + case DUAL_CHANNEL: my_debug->OutPut(DEBUG_LEVEL_FUNC_DEBUG, "mode =Forced Stereo" ); break; + case MONO: my_debug->OutPut(DEBUG_LEVEL_FUNC_DEBUG, "mode =Mono" ); break; + case NOT_SET: /* FALLTROUGH */ + default: my_debug->OutPut(DEBUG_LEVEL_FUNC_DEBUG, "mode =Error (unknown)" ); break; + } + + my_debug->OutPut(DEBUG_LEVEL_FUNC_DEBUG, "sampling frequency =%.1f kHz", lame_get_in_samplerate( gfp ) /1000.0 ); + my_debug->OutPut(DEBUG_LEVEL_FUNC_DEBUG, "bitrate =%d kbps", lame_get_brate( gfp ) ); + my_debug->OutPut(DEBUG_LEVEL_FUNC_DEBUG, "Vbr Min bitrate =%d kbps", lame_get_VBR_min_bitrate_kbps( gfp ) ); + my_debug->OutPut(DEBUG_LEVEL_FUNC_DEBUG, "Vbr Max bitrate =%d kbps", lame_get_VBR_max_bitrate_kbps( gfp ) ); + my_debug->OutPut(DEBUG_LEVEL_FUNC_DEBUG, "Quality Setting =%d", lame_get_quality( gfp ) ); + + my_debug->OutPut(DEBUG_LEVEL_FUNC_DEBUG, "Low pass frequency =%d", lame_get_lowpassfreq( gfp ) ); + my_debug->OutPut(DEBUG_LEVEL_FUNC_DEBUG, "Low pass width =%d", lame_get_lowpasswidth( gfp ) ); + + my_debug->OutPut(DEBUG_LEVEL_FUNC_DEBUG, "High pass frequency =%d", lame_get_highpassfreq( gfp ) ); + my_debug->OutPut(DEBUG_LEVEL_FUNC_DEBUG, "High pass width =%d", lame_get_highpasswidth( gfp ) ); + + my_debug->OutPut(DEBUG_LEVEL_FUNC_DEBUG, "No Short Blocks =%d", lame_get_no_short_blocks( gfp ) ); + + my_debug->OutPut(DEBUG_LEVEL_FUNC_DEBUG, "de-emphasis =%d", lame_get_emphasis( gfp ) ); + my_debug->OutPut(DEBUG_LEVEL_FUNC_DEBUG, "private flag =%d", lame_get_extension( gfp ) ); + + my_debug->OutPut(DEBUG_LEVEL_FUNC_DEBUG, "copyright flag =%d", lame_get_copyright( gfp ) ); + my_debug->OutPut(DEBUG_LEVEL_FUNC_DEBUG, "original flag =%d", lame_get_original( gfp ) ); + my_debug->OutPut(DEBUG_LEVEL_FUNC_DEBUG, "CRC =%s", lame_get_error_protection( gfp ) ? "on" : "off" ); + my_debug->OutPut(DEBUG_LEVEL_FUNC_DEBUG, "Fast mode =%s", ( lame_get_quality( gfp ) )? "enabled" : "disabled" ); + my_debug->OutPut(DEBUG_LEVEL_FUNC_DEBUG, "Force mid/side stereo =%s", ( lame_get_force_ms( gfp ) )?"enabled":"disabled" ); + my_debug->OutPut(DEBUG_LEVEL_FUNC_DEBUG, "Disable Resorvoir =%d", lame_get_disable_reservoir( gfp ) ); + my_debug->OutPut(DEBUG_LEVEL_FUNC_DEBUG, "VBR =%s, VBR_q =%d, VBR method =", + ( lame_get_VBR( gfp ) !=vbr_off ) ? "enabled": "disabled", + lame_get_VBR_q( gfp ) ); + + switch ( lame_get_VBR( gfp ) ) + { + case vbr_off: my_debug->OutPut(DEBUG_LEVEL_FUNC_DEBUG, "vbr_off" ); break; + case vbr_mt : my_debug->OutPut(DEBUG_LEVEL_FUNC_DEBUG, "vbr_mt" ); break; + case vbr_rh : my_debug->OutPut(DEBUG_LEVEL_FUNC_DEBUG, "vbr_rh" ); break; + case vbr_mtrh: my_debug->OutPut(DEBUG_LEVEL_FUNC_DEBUG, "vbr_mtrh" ); break; + case vbr_abr: + my_debug->OutPut(DEBUG_LEVEL_FUNC_DEBUG, "vbr_abr (average bitrate %d kbps)", lame_get_VBR_mean_bitrate_kbps( gfp ) ); + break; + default: + my_debug->OutPut(DEBUG_LEVEL_FUNC_DEBUG, "error, unknown VBR setting"); + break; + } + + my_debug->OutPut(DEBUG_LEVEL_FUNC_DEBUG, "Write VBR Header =%s\n", ( lame_get_bWriteVbrTag( gfp ) ) ?"Yes":"No"); + +#ifdef FROM_DLL +beConfig.format.LHV1.dwReSampleRate = my_OutBytesPerSec; // force the user resampling +#endif // FROM_DLL + + bResult = true; + + return bResult; +} + +bool ACMStream::close(LPBYTE pOutputBuffer, DWORD *pOutputSize) +{ + +bool bResult = false; + + int nOutputSamples = 0; + + nOutputSamples = lame_encode_flush( gfp, pOutputBuffer, 0 ); + + if ( nOutputSamples < 0 ) + { + // BUFFER_TOO_SMALL +*pOutputSize = 0; + } + else +{ + *pOutputSize = nOutputSamples; + + bResult = true; + } + + // lame will be closed in destructor + //lame_close( gfp ); + + return bResult; +} + +DWORD ACMStream::GetOutputSizeForInput(const DWORD the_SrcLength) const +{ +/* double OutputInputRatio; + + if (my_VBRMode == vbr_off) + OutputInputRatio = double(my_AvgBytesPerSec) / double(my_OutBytesPerSec * 2); + else // reserve the space for 320 kbps + OutputInputRatio = 40000.0 / double(my_OutBytesPerSec * 2); + + OutputInputRatio *= 1.15; // allow 15% more*/ + + DWORD Result; + +// Result = DWORD(double(the_SrcLength) * OutputInputRatio); + Result = DWORD(1.25*the_SrcLength + 7200); + +my_debug->OutPut(DEBUG_LEVEL_FUNC_CODE, "Result = %d",Result); + + return Result; +} + +bool ACMStream::ConvertBuffer(LPACMDRVSTREAMHEADER a_StreamHeader) +{ + bool result; + +if (my_debug != NULL) +{ +my_debug->OutPut(DEBUG_LEVEL_FUNC_DEBUG, "enter ACMStream::ConvertBuffer"); +} + + DWORD InSize = a_StreamHeader->cbSrcLength / 2, OutSize = a_StreamHeader->cbDstLength; // 2 for 8<->16 bits + +// Encode it +int dwSamples; + int nOutputSamples = 0; + + dwSamples = InSize / lame_get_num_channels( gfp ); + + if ( 1 == lame_get_num_channels( gfp ) ) + { + nOutputSamples = lame_encode_buffer(gfp,(PSHORT)a_StreamHeader->pbSrc,(PSHORT)a_StreamHeader->pbSrc,dwSamples,a_StreamHeader->pbDst,a_StreamHeader->cbDstLength); + } + else + { + nOutputSamples = lame_encode_buffer_interleaved(gfp,(PSHORT)a_StreamHeader->pbSrc,dwSamples,a_StreamHeader->pbDst,a_StreamHeader->cbDstLength); + } + + a_StreamHeader->cbSrcLengthUsed = a_StreamHeader->cbSrcLength; + a_StreamHeader->cbDstLengthUsed = nOutputSamples; + + result = a_StreamHeader->cbDstLengthUsed <= a_StreamHeader->cbDstLength; + + my_debug->OutPut(DEBUG_LEVEL_FUNC_CODE, "UsedSize = %d / EncodedSize = %d, result = %d (%d <= %d)", InSize, OutSize, result, a_StreamHeader->cbDstLengthUsed, a_StreamHeader->cbDstLength); + +if (my_debug != NULL) +{ +my_debug->OutPut(DEBUG_LEVEL_FUNC_DEBUG, "ACMStream::ConvertBuffer result = %d (0x%02X 0x%02X)",result,a_StreamHeader->pbDst[0],a_StreamHeader->pbDst[1]); +} + + return result; +} + +/* map frequency to a valid MP3 sample frequency + * + * Robert Hegemann 2000-07-01 + */ +static int +map2MP3Frequency(int freq) +{ + if (freq <= 8000) + return 8000; + if (freq <= 11025) + return 11025; + if (freq <= 12000) + return 12000; + if (freq <= 16000) + return 16000; + if (freq <= 22050) + return 22050; + if (freq <= 24000) + return 24000; + if (freq <= 32000) + return 32000; + if (freq <= 44100) + return 44100; + + return 48000; +} + + +unsigned int ACMStream::GetOutputSampleRate(int samples_per_sec, int bitrate, int channels) +{ + if (bitrate==0) + bitrate = (64000*channels)/8; + + /// \todo pass through the same LAME routine + unsigned int OutputFrequency; + double compression_ratio = double(samples_per_sec * 16 * channels / (bitrate * 8)); + if (compression_ratio > 13.) + OutputFrequency = map2MP3Frequency( (10. * bitrate * 8) / (16 * channels)); + else + OutputFrequency = map2MP3Frequency( 0.97 * samples_per_sec ); + + return OutputFrequency; + +} + diff --git a/ACM/ACMStream.h b/ACM/ACMStream.h new file mode 100644 index 0000000..9cba528 --- /dev/null +++ b/ACM/ACMStream.h @@ -0,0 +1,85 @@ +/** + * + * Lame ACM wrapper, encode/decode MP3 based RIFF/AVI files in MS Windows + * + * Copyright (c) 2002 Steve Lhomme + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +/*! + \author Steve Lhomme + \version \$Id: ACMStream.h,v 1.5 2006/12/25 21:37:34 robert Exp $ +*/ + +#if !defined(_ACMSTREAM_H__INCLUDED_) +#define _ACMSTREAM_H__INCLUDED_ + +#if _MSC_VER >= 1000 +#pragma once +#endif // _MSC_VER >= 1000 + +#include +#include +#include + +#include "ADbg/ADbg.h" + +#include "AEncodeProperties.h" + + +typedef enum vbr_mode_e vbr_mode; +typedef struct lame_global_struct lame_global_flags; + + +class ACMStream +{ +public: + ACMStream( ); + virtual ~ACMStream( ); + + static ACMStream * Create(); + static const bool Erase(const ACMStream * a_ACMStream); + + bool init(const int nSamplesPerSec, const int nOutputSamplesPerSec, const int nChannels, const int nAvgBytesPerSec, const vbr_mode mode); + bool open(const AEncodeProperties & the_Properties); + bool close(LPBYTE pOutputBuffer, DWORD *pOutputSize); + + DWORD GetOutputSizeForInput(const DWORD the_SrcLength) const; + bool ConvertBuffer(LPACMDRVSTREAMHEADER a_StreamHeader); + + static unsigned int GetOutputSampleRate(int samples_per_sec, int bitrate, int channels); + +protected: + lame_global_flags * gfp; + + ADbg * my_debug; + int my_SamplesPerSec; + int my_Channels; + int my_AvgBytesPerSec; + int my_OutBytesPerSec; + vbr_mode my_VBRMode; + DWORD my_SamplesPerBlock; + +unsigned int m_WorkingBufferUseSize; + char m_WorkingBuffer[2304*2]; // should be at least twice my_SamplesPerBlock + +inline int GetBytesPerBlock(DWORD bytes_per_sec, DWORD samples_per_sec, int BlockAlign) const; + +}; + +#endif // !defined(_ACMSTREAM_H__INCLUDED_) + diff --git a/ACM/ADbg/ADbg.cpp b/ACM/ADbg/ADbg.cpp new file mode 100644 index 0000000..80dc92f --- /dev/null +++ b/ACM/ADbg/ADbg.cpp @@ -0,0 +1,181 @@ +/************************************************************************ +Project : C++ debugging class +File version : 0.4 + +BSD License post 1999 : + +Copyright (c) 2001, Steve Lhomme +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +- Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution. + +- The name of the author may not be used to endorse or promote products derived +from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +************************************************************************/ + +#include +#include +#include + +#include "ADbg.h" + +#if !defined(NDEBUG) + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +ADbg::ADbg(int level) +:my_level(level) +,my_time_included(false) +,my_use_file(false) +,my_debug_output(true) +,hFile(NULL) +{ + prefix[0] = '\0'; + OutPut(-1,"ADbg Creation at debug level = %d (0x%08X)",my_level,this); +} + +ADbg::~ADbg() +{ + unsetDebugFile(); + OutPut(-1,"ADbg Deletion (0x%08X)",this); +} + +inline int ADbg::_OutPut(const char * format,va_list params) const +{ + int result; + + char tst[1000]; + char myformat[256]; + + if (my_time_included) { + SYSTEMTIME time; + GetSystemTime(&time); + if (prefix[0] == '\0') + wsprintf(myformat,"%04d/%02d/%02d %02d:%02d:%02d.%03d UTC : %s\r\n", + time.wYear, + time.wMonth, + time.wDay, + time.wHour, + time.wMinute, + time.wSecond, + time.wMilliseconds, + format); + else + wsprintf(myformat,"%04d/%02d/%02d %02d:%02d:%02d.%03d UTC : %s - %s\r\n", + time.wYear, + time.wMonth, + time.wDay, + time.wHour, + time.wMinute, + time.wSecond, + time.wMilliseconds, + prefix, + format); + } else { + if (prefix[0] == '\0') + wsprintf( myformat, "%s\r\n", format); + else + wsprintf( myformat, "%s - %s\r\n", prefix, format); + } + + result = vsprintf(tst,myformat,params); + + if (my_debug_output) + OutputDebugString(tst); + + if (my_use_file && (hFile != NULL)) { + SetFilePointer( hFile, 0, 0, FILE_END ); + DWORD written; + WriteFile( hFile, tst, lstrlen(tst), &written, NULL ); + } + + return result; +} + +int ADbg::OutPut(int forLevel, const char * format,...) const +{ + int result=0; + + if (forLevel >= my_level) { + va_list tstlist; + int result; + + va_start(tstlist, format); + + result = _OutPut(format,tstlist); + + } + + return result; +} + +int ADbg::OutPut(const char * format,...) const +{ + va_list tstlist; + + va_start(tstlist, format); + + return _OutPut(format,tstlist); +} + +bool ADbg::setDebugFile(const char * NewFilename) { + bool result; + result = unsetDebugFile(); + + if (result) { + result = false; + + hFile = CreateFile(NewFilename, GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); + + if (hFile != INVALID_HANDLE_VALUE) { + SetFilePointer( hFile, 0, 0, FILE_END ); + + result = true; + + OutPut(-1,"Debug file Opening succeeded"); + + } + else + OutPut(-1,"Debug file %s Opening failed",NewFilename); + } + + return result; +} + +bool ADbg::unsetDebugFile() { + bool result = (hFile == NULL); + + if (hFile != NULL) { + result = (CloseHandle(hFile) != 0); + + if (result) { + OutPut(-1,"Debug file Closing succeeded"); + hFile = NULL; + } + } + + return result; +} + +#endif // !defined(NDEBUG) diff --git a/ACM/ADbg/ADbg.h b/ACM/ADbg/ADbg.h new file mode 100644 index 0000000..9cb40b8 --- /dev/null +++ b/ACM/ADbg/ADbg.h @@ -0,0 +1,133 @@ +/************************************************************************ +Project : C++ debugging class +File version : 0.4 + +BSD License post 1999 : + +Copyright (c) 2001, Steve Lhomme +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +- Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution. + +- The name of the author may not be used to endorse or promote products derived +from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +************************************************************************/ + +#if !defined(_DBG_H__INCLUDED_) +#define _DBG_H__INCLUDED_ + +#include + +static const int MAX_PREFIX_LENGTH = 128; + +#if !defined(NDEBUG) +// define the working debugging class + +class ADbg +{ +public: + ADbg(int level = 0); + virtual ~ADbg(); + + /// \todo make an inline function to test the level first and the process + int OutPut(int level, const char * format,...) const; + + int OutPut(const char * format,...) const; + + inline int setLevel(const int level) { + return my_level = level; + } + + inline bool setIncludeTime(const bool included = true) { + return my_time_included = included; + } + + bool setDebugFile(const char * NewFilename); + bool unsetDebugFile(); + + inline bool setUseFile(const bool usefile = true) { + return my_use_file = usefile; + } + + inline const char * setPrefix(const char * string) { + return strncpy(prefix, string, MAX_PREFIX_LENGTH); + } + +private: + int my_level; + bool my_time_included; + bool my_use_file; + bool my_debug_output; + + int _OutPut(const char * format,va_list params) const; + + char prefix[MAX_PREFIX_LENGTH]; + + HANDLE hFile; +}; + +#else // !defined(NDEBUG) + +// define a class that does nothing (no output) + +class ADbg +{ +public: + ADbg(int level = 0){} + virtual ~ADbg() {} + + inline int OutPut(int level, const char * format,...) const { + return 0; + } + + inline int OutPut(const char * format,...) const { + return 0; + } + + inline int setLevel(const int level) { + return level; + } + + inline bool setIncludeTime(const bool included = true) { + return true; + } + + inline bool setDebugFile(const char * NewFilename) { + return true; + } + + inline bool unsetDebugFile() { + return true; + } + + inline bool setUseFile(const bool usefile = true) { + return true; + } + + inline const char * setPrefix(const char * string) { + return string; + } +}; + +#endif // !defined(NDEBUG) + +#endif // !defined(_DBG_H__INCLUDED_) diff --git a/ACM/ADbg/Makefile.am b/ACM/ADbg/Makefile.am new file mode 100644 index 0000000..0b66039 --- /dev/null +++ b/ACM/ADbg/Makefile.am @@ -0,0 +1,8 @@ +## $Id: Makefile.am,v 1.3 2008/11/09 13:50:16 aleidinger Exp $ + +include $(top_srcdir)/Makefile.am.global + +EXTRA_DIST = \ + ADbg.cpp \ + ADbg.h + diff --git a/ACM/ADbg/Makefile.in b/ACM/ADbg/Makefile.in new file mode 100644 index 0000000..d57d93e --- /dev/null +++ b/ACM/ADbg/Makefile.in @@ -0,0 +1,474 @@ +# Makefile.in generated by automake 1.15.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2017 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# global section for every Makefile.am +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = ACM/ADbg +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.global +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_DEFS = @CONFIG_DEFS@ +CONFIG_MATH_LIB = @CONFIG_MATH_LIB@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CPUCCODE = @CPUCCODE@ +CPUTYPE = @CPUTYPE@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FRONTEND_CFLAGS = @FRONTEND_CFLAGS@ +FRONTEND_LDADD = @FRONTEND_LDADD@ +FRONTEND_LDFLAGS = @FRONTEND_LDFLAGS@ +GREP = @GREP@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_CONFIG = @GTK_CONFIG@ +GTK_LIBS = @GTK_LIBS@ +INCLUDES = @INCLUDES@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDADD = @LDADD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_MAJOR_VERSION = @LIB_MAJOR_VERSION@ +LIB_MINOR_VERSION = @LIB_MINOR_VERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEDEP = @MAKEDEP@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NASM = @NASM@ +NASM_FORMAT = @NASM_FORMAT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM_F = @RM_F@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_FRONTEND = @WITH_FRONTEND@ +WITH_MP3RTP = @WITH_MP3RTP@ +WITH_MP3X = @WITH_MP3X@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = 1.15 foreign +EXTRA_DIST = \ + ADbg.cpp \ + ADbg.h + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.global $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign ACM/ADbg/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign ACM/ADbg/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/Makefile.am.global $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# end global section + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/ACM/AEncodeProperties.cpp b/ACM/AEncodeProperties.cpp new file mode 100644 index 0000000..2430369 --- /dev/null +++ b/ACM/AEncodeProperties.cpp @@ -0,0 +1,2027 @@ +/** + * + * Lame ACM wrapper, encode/decode MP3 based RIFF/AVI files in MS Windows + * + * Copyright (c) 2002 Steve Lhomme + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +/*! + \author Steve Lhomme + \version \$Id: AEncodeProperties.cpp,v 1.9 2006/12/25 21:37:34 robert Exp $ +*/ + +#if !defined(STRICT) +#define STRICT +#endif // !defined(STRICT) + +#include +#include +#include +#include + +#ifdef _MSC_VER +// no problem with unknown pragmas +#pragma warning(disable: 4068) +#endif + +#include "resource.h" +#include +#include "adebug.h" +#include "AEncodeProperties.h" +#include "ACM.h" +//#include "AParameters/AParameters.h" + +#ifndef TTS_BALLOON +#define TTS_BALLOON 0x40 +#endif // TTS_BALLOON + +const unsigned int AEncodeProperties::the_Bitrates[18] = {320, 256, 224, 192, 160, 144, 128, 112, 96, 80, 64, 56, 48, 40, 32, 24, 16, 8 }; +const unsigned int AEncodeProperties::the_MPEG1_Bitrates[14] = {320, 256, 224, 192, 160, 128, 112, 96, 80, 64, 56, 48, 40, 32 }; +const unsigned int AEncodeProperties::the_MPEG2_Bitrates[14] = {160, 144, 128, 112, 96, 80, 64, 56, 48, 40, 32, 24, 16, 8}; +const unsigned int AEncodeProperties::the_ChannelModes[3] = { STEREO, JOINT_STEREO, DUAL_CHANNEL }; +//const char AEncodeProperties::the_Presets[][13] = {"None", "CD", "Studio", "Hi-Fi", "Phone", "Voice", "Radio", "Tape", "FM", "AM", "SW"}; +//const LAME_QUALTIY_PRESET AEncodeProperties::the_Presets[] = {LQP_NOPRESET, LQP_R3MIX_QUALITY, LQP_NORMAL_QUALITY, LQP_LOW_QUALITY, LQP_HIGH_QUALITY, LQP_VERYHIGH_QUALITY, LQP_VOICE_QUALITY, LQP_PHONE, LQP_SW, LQP_AM, LQP_FM, LQP_VOICE, LQP_RADIO, LQP_TAPE, LQP_HIFI, LQP_CD, LQP_STUDIO}; +//const unsigned int AEncodeProperties::the_SamplingFreqs[9] = { 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000 }; + +ToolTipItem AEncodeProperties::Tooltips[13]={ + { IDC_CHECK_ENC_ABR, "Allow encoding with an average bitrate\r\ninstead of a constant one.\r\n\r\nIt can improve the quality for the same bitrate." }, + { IDC_CHECK_COPYRIGHT, "Mark the encoded data as copyrighted." }, + { IDC_CHECK_CHECKSUM, "Put a checksum in the encoded data.\r\n\r\nThis can make the file less sensitive to data loss." }, + { IDC_CHECK_ORIGINAL, "Mark the encoded data as an original file." }, + { IDC_CHECK_PRIVATE, "Mark the encoded data as private." }, + { IDC_COMBO_ENC_STEREO, "Select the type of stereo mode used for encoding:\r\n\r\n- Stereo : the usual one\r\n- Joint-Stereo : mix both channel to achieve better compression\r\n- Dual Channel : treat both channel as separate" }, + { IDC_STATIC_DECODING, "Decoding not supported for the moment by the codec." }, + { IDC_CHECK_ENC_SMART, "Disable bitrate when there is too much compression.\r\n(default 1:15 ratio)" }, + { IDC_STATIC_CONFIG_VERSION, "Version of this codec.\r\n\r\nvX.X.X is the version of the codec interface.\r\nX.XX is the version of the encoding engine." }, + { IDC_SLIDER_AVERAGE_MIN, "Select the minimum Average Bitrate allowed." }, + { IDC_SLIDER_AVERAGE_MAX, "Select the maximum Average Bitrate allowed." }, + { IDC_SLIDER_AVERAGE_STEP, "Select the step of Average Bitrate between the min and max.\r\n\r\nA step of 5 between 152 and 165 means you have :\r\n165, 160 and 155" }, + { IDC_SLIDER_AVERAGE_SAMPLE, "Check the resulting values of the (min,max,step) combination.\r\n\r\nUse the keyboard to navigate (right -> left)." }, +}; +//int AEncodeProperties::tst = 0; + +/* +#pragma argsused +static UINT CALLBACK DLLFindCallback( + HWND hdlg, // handle to child dialog box + UINT uiMsg, // message identifier + WPARAM wParam, // message parameter + LPARAM lParam // message parameter + ) +{ + UINT result = 0; + + switch (uiMsg) + { + case WM_NOTIFY: + OFNOTIFY * info = (OFNOTIFY *)lParam; + if (info->hdr.code == CDN_FILEOK) + { + result = 1; // by default we don't accept the file + + // Check if the selected file is a valid DLL with all the required functions + ALameDLL * tstFile = new ALameDLL; + if (tstFile != NULL) + { + if (tstFile->Load(info->lpOFN->lpstrFile)) + { + result = 0; + } + + delete tstFile; + } + + if (result == 1) + { + TCHAR output[250]; + ::LoadString(AOut::GetInstance(),IDS_STRING_DLL_UNRECOGNIZED,output,250); + AOut::MyMessageBox( output, MB_OK|MB_ICONEXCLAMATION, hdlg); + SetWindowLong(hdlg, DWL_MSGRESULT , -100); + } + } + } + + return result; +} + +#pragma argsused +static int CALLBACK BrowseFolderCallbackroc( + HWND hwnd, + UINT uMsg, + LPARAM lParam, + LPARAM lpData + ) +{ + AEncodeProperties * the_prop; + the_prop = (AEncodeProperties *) lpData; + + + if (uMsg == BFFM_INITIALIZED) + { +// char FolderName[MAX_PATH]; +// SHGetPathFromIDList((LPITEMIDLIST) lParam,FolderName); +//ADbg tst; +//tst.OutPut("init folder to %s ",the_prop->GetOutputDirectory()); +// CreateFile(); + ::SendMessage(hwnd, BFFM_SETSELECTION, (WPARAM)TRUE, (LPARAM)the_prop->GetOutputDirectory()); + }/* else if (uMsg == BFFM_SELCHANGED) + { + // verify that the folder is writable +// ::SendMessage(hwnd, BFFM_ENABLEOK, 0, (LPARAM)0); // disable + char FolderName[MAX_PATH]; + SHGetPathFromIDList((LPITEMIDLIST) lParam, FolderName); + +// if (CreateFile(FolderName,STANDARD_RIGHTS_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL) == INVALID_HANDLE_VALUE) + if ((GetFileAttributes(FolderName) & FILE_ATTRIBUTE_DIRECTORY) != 0) + ::SendMessage(hwnd, BFFM_ENABLEOK, 0, (LPARAM)1); // enable + else + ::SendMessage(hwnd, BFFM_ENABLEOK, 0, (LPARAM)0); // disable +//ADbg tst; +//tst.OutPut("change folder to %s ",FolderName); + }* / + + return 0; +} +*/ +#pragma argsused +static BOOL CALLBACK ConfigProc( + HWND hwndDlg, // handle to dialog box + UINT uMsg, // message + WPARAM wParam, // first message parameter + LPARAM lParam // second message parameter + ) +{ + BOOL bResult; + AEncodeProperties * the_prop; + the_prop = (AEncodeProperties *) GetProp(hwndDlg, "AEncodeProperties-Config"); + + switch (uMsg) { + case WM_COMMAND: + if (the_prop != NULL) + { + bResult = the_prop->HandleDialogCommand( hwndDlg, wParam, lParam); + } + break; + case WM_INITDIALOG: + assert(the_prop == NULL); + + the_prop = (AEncodeProperties *) lParam; + the_prop->my_debug.OutPut("there hwnd = 0x%08X",hwndDlg); + + assert(the_prop != NULL); + + SetProp(hwndDlg, "AEncodeProperties-Config", the_prop); + + the_prop->InitConfigDlg(hwndDlg); + + bResult = TRUE; + break; + + case WM_HSCROLL: + // check if it's the ABR sliders + if ((HWND)lParam == GetDlgItem(hwndDlg,IDC_SLIDER_AVERAGE_MIN)) + { + the_prop->UpdateDlgFromSlides(hwndDlg); + } + else if ((HWND)lParam == GetDlgItem(hwndDlg,IDC_SLIDER_AVERAGE_MAX)) + { + the_prop->UpdateDlgFromSlides(hwndDlg); + } + else if ((HWND)lParam == GetDlgItem(hwndDlg,IDC_SLIDER_AVERAGE_STEP)) + { + the_prop->UpdateDlgFromSlides(hwndDlg); + } + else if ((HWND)lParam == GetDlgItem(hwndDlg,IDC_SLIDER_AVERAGE_SAMPLE)) + { + the_prop->UpdateDlgFromSlides(hwndDlg); + } + break; + + case WM_NOTIFY: + if (TTN_GETDISPINFO == ((LPNMHDR)lParam)->code) { + NMTTDISPINFO *lphdr = (NMTTDISPINFO *)lParam; + UINT id = (lphdr->uFlags & TTF_IDISHWND) ? GetWindowLong((HWND)lphdr->hdr.idFrom, GWL_ID) : lphdr->hdr.idFrom; + + *lphdr->lpszText = 0; + + SendMessage(lphdr->hdr.hwndFrom, TTM_SETMAXTIPWIDTH, 0, 5000); + + for(int i=0; ilpszText = const_cast(AEncodeProperties::Tooltips[i].tip); + } + + return TRUE; + } + break; + + default: + bResult = FALSE; // will be treated by DefWindowProc + } + return bResult; +} + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// +/** + \class AEncodeProperties +*/ + + +const char * AEncodeProperties::GetChannelModeString(int a_channelID) const +{ + assert(a_channelID < sizeof(the_ChannelModes)); + + switch (a_channelID) { + case 0: + return "Stereo"; + case 1: + return "Joint-stereo"; + case 2: + return "Dual Channel"; + default: + assert(a_channelID); + return NULL; + } +} + +const int AEncodeProperties::GetBitrateString(char * string, int string_size, int a_bitrateID) const +{ + assert(a_bitrateID < sizeof(the_Bitrates)); + assert(string != NULL); + + if (string_size >= 4) + return wsprintf(string,"%d",the_Bitrates[a_bitrateID]); + else + return -1; +} + +const unsigned int AEncodeProperties::GetChannelModeValue() const +{ + assert(nChannelIndex < sizeof(the_ChannelModes)); + + return the_ChannelModes[nChannelIndex]; +} + +const unsigned int AEncodeProperties::GetBitrateValue() const +{ + assert(nMinBitrateIndex < sizeof(the_Bitrates)); + + return the_Bitrates[nMinBitrateIndex]; +} + +inline const int AEncodeProperties::GetBitrateValueMPEG2(DWORD & bitrate) const +{ + int i; + + for (i=0;i=0;i--) + { + if (the_MPEG1_Bitrates[i] == the_Bitrates[nMinBitrateIndex]) + { + bitrate = the_MPEG1_Bitrates[i]; + return 0; + } + else if (the_MPEG1_Bitrates[i] > the_Bitrates[nMinBitrateIndex]) + { + bitrate = the_MPEG1_Bitrates[i]; + return 1; + } + } + + bitrate = 32; + return 1; +} +/* +const int AEncodeProperties::GetBitrateValue(DWORD & bitrate, const DWORD MPEG_Version) const +{ + assert((MPEG_Version == MPEG1) || (MPEG_Version == MPEG2)); + assert(nMinBitrateIndex < sizeof(the_Bitrates)); + + if (MPEG_Version == MPEG2) + return GetBitrateValueMPEG2(bitrate); + else + return GetBitrateValueMPEG1(bitrate); +} +/* +const char * AEncodeProperties::GetPresetModeString(const int a_presetID) const +{ + assert(a_presetID < sizeof(the_Presets)); + + switch (a_presetID) { + case 1: + return "r3mix"; + case 2: + return "Normal"; + case 3: + return "Low"; + case 4: + return "High"; + case 5: + return "Very High"; + case 6: + return "Voice"; + case 7: + return "Phone"; + case 8: + return "SW"; + case 9: + return "AM"; + case 10: + return "FM"; + case 11: + return "Voice"; + case 12: + return "Radio"; + case 13: + return "Tape"; + case 14: + return "Hi-Fi"; + case 15: + return "CD"; + case 16: + return "Studio"; + default: + return "None"; + } +} + +const LAME_QUALTIY_PRESET AEncodeProperties::GetPresetModeValue() const +{ + assert(nPresetIndex < sizeof(the_Presets)); + + return the_Presets[nPresetIndex]; +} +*/ +bool AEncodeProperties::Config(const HINSTANCE Hinstance, const HWND HwndParent) +{ + //WM_INITDIALOG ? + + // remember the instance to retreive strings +// hDllInstance = Hinstance; + + my_debug.OutPut("here"); + int ret = ::DialogBoxParam(Hinstance, MAKEINTRESOURCE(IDD_CONFIG), HwndParent, ::ConfigProc, (LPARAM) this); +/* if (ret == -1) + { + LPVOID lpMsgBuf; + FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language + (LPTSTR) &lpMsgBuf, + 0, + NULL + ); + // Process any inserts in lpMsgBuf. + // ... + // Display the string. + AOut::MyMessageBox( (LPCTSTR)lpMsgBuf, MB_OK | MB_ICONINFORMATION ); + // Free the buffer. + LocalFree( lpMsgBuf ); + return false; + } +*/ + return true; +} + +bool AEncodeProperties::InitConfigDlg(HWND HwndDlg) +{ + // get all the required strings +// TCHAR Version[5]; +// LoadString(hDllInstance, IDS_STRING_VERSION, Version, 5); + + int i; + + // Add required channel modes + SendMessage(GetDlgItem( HwndDlg, IDC_COMBO_ENC_STEREO), CB_RESETCONTENT , NULL, NULL); + for (i=0;i 320) + AverageBitrate = 320; +*/ + return true; +} +/* +VBRMETHOD AEncodeProperties::GetVBRValue(DWORD & MaxBitrate, int & Quality, DWORD & AbrBitrate, BOOL & VBRHeader, const DWORD MPEG_Version) const +{ + assert((MPEG_Version == MPEG1) || (MPEG_Version == MPEG2)); + assert(nMaxBitrateIndex < sizeof(the_Bitrates)); + + if (mBRmode == BR_VBR) + { + MaxBitrate = the_Bitrates[nMaxBitrateIndex]; + + if (MPEG_Version == MPEG1) + MaxBitrate = MaxBitrate>the_MPEG1_Bitrates[sizeof(the_MPEG1_Bitrates)/sizeof(unsigned int)-1]?MaxBitrate:the_MPEG1_Bitrates[sizeof(the_MPEG1_Bitrates)/sizeof(unsigned int)-1]; + else + MaxBitrate = MaxBitratethe_MPEG1_Bitrates[sizeof(the_MPEG1_Bitrates)/sizeof(unsigned int)-1]?MaxBitrate:the_MPEG1_Bitrates[sizeof(the_MPEG1_Bitrates)/sizeof(unsigned int)-1]; + else + MaxBitrate = MaxBitrateFirstChildElement("encodings"); + + std::string CurrentConfig = ""; + + if (CurrentNode->Attribute("default") != NULL) + { + CurrentConfig = *CurrentNode->Attribute("default"); + } + +/* // output parameters + TiXmlElement* iterateElmt = node->FirstChildElement("DLL"); + if (iterateElmt != NULL) + { + const std::string * tmpname = iterateElmt->Attribute("location"); + if (tmpname != NULL) + { + DllLocation = *tmpname; + } + } +*/ + GetValuesFromKey(CurrentConfig, *CurrentNode); + } + else + { + /** + \todo save the data in the file ! + */ + } +} + +void AEncodeProperties::ParamsSave() +{ +/* + + + save the current parameters in the corresponding subkey + + + + + HKEY OssKey; + + if (RegCreateKeyEx ( HKEY_LOCAL_MACHINE, "SOFTWARE\\MUKOLI\\out_lame", 0, "", REG_OPTION_NON_VOLATILE, KEY_WRITE , NULL, &OssKey, NULL ) == ERROR_SUCCESS) { + + if (RegSetValueEx(OssKey, "DLL Location", 0, REG_EXPAND_SZ, (CONST BYTE *)DllLocation, strlen(DllLocation)+1 ) != ERROR_SUCCESS) + return; + + RegCloseKey(OssKey); + } +*/ +} +/* +void AEncodeProperties::DisplayVbrOptions(const HWND hDialog, const BRMode the_mode) +{ + bool bVBR = false; + bool bABR = false; + + switch ( the_mode ) + { + case BR_CBR: + ::CheckRadioButton(hDialog, IDC_RADIO_BITRATE_CBR, IDC_RADIO_BITRATE_ABR, IDC_RADIO_BITRATE_CBR); + break; + case BR_VBR: + ::CheckRadioButton(hDialog, IDC_RADIO_BITRATE_CBR, IDC_RADIO_BITRATE_ABR, IDC_RADIO_BITRATE_VBR); + bVBR = true; + break; + case BR_ABR: + ::CheckRadioButton(hDialog, IDC_RADIO_BITRATE_CBR, IDC_RADIO_BITRATE_ABR, IDC_RADIO_BITRATE_ABR); + bABR = true; + break; + + } + + if(bVBR|bABR) + { + ::SetWindowText(::GetDlgItem(hDialog,IDC_STATIC_MINBITRATE), "Min Bitrate"); + } + else + { + ::SetWindowText(::GetDlgItem(hDialog,IDC_STATIC_MINBITRATE), "Bitrate"); + } + + ::EnableWindow(::GetDlgItem( hDialog, IDC_CHECK_XINGVBR), bVBR|bABR); + + ::EnableWindow(::GetDlgItem( hDialog, IDC_COMBO_MAXBITRATE), bVBR|bABR); + + ::EnableWindow(::GetDlgItem( hDialog, IDC_STATIC_MAXBITRATE), bVBR|bABR); + + ::EnableWindow(::GetDlgItem( hDialog, IDC_SLIDER_QUALITY), bVBR); + + ::EnableWindow(::GetDlgItem( hDialog, IDC_CONFIG_QUALITY), bVBR); + + ::EnableWindow(::GetDlgItem( hDialog, IDC_STATIC_VBRQUALITY), bVBR); + + ::EnableWindow(::GetDlgItem( hDialog, IDC_STATIC_VBRQUALITY_LOW), bVBR); + + ::EnableWindow(::GetDlgItem( hDialog, IDC_STATIC_VBRQUALITY_HIGH), bVBR); + + ::EnableWindow(::GetDlgItem( hDialog, IDC_STATIC_ABR), bABR); + + ::EnableWindow(::GetDlgItem( hDialog, IDC_EDIT_AVERAGE), bABR); +} +*/ +AEncodeProperties::AEncodeProperties(HMODULE hModule) + :my_debug(ADbg(DEBUG_LEVEL_CREATION)), + my_hModule(hModule) +{ + std::string path = ""; +// HMODULE htmp = LoadLibrary("out_lame.dll"); + if (hModule != NULL) + { + char output[MAX_PATH]; + ::GetModuleFileName(hModule, output, MAX_PATH); +// ::FreeLibrary(htmp); + + path = output; + } + my_store_location = path.substr(0,path.find_last_of('\\')+1); + my_store_location += "lame_acm.xml"; + + my_debug.OutPut("store path = %s",my_store_location.c_str()); +//#ifdef OLD +// ::OutputDebugString(my_store_location.c_str()); + + // make sure the XML file is present + HANDLE hFile = ::CreateFile(my_store_location.c_str(), 0, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_ARCHIVE, NULL ); + ::CloseHandle(hFile); +//#endif // OLD + my_debug.OutPut("AEncodeProperties creation completed (0x%08X)",this); +} + +// Save the values to the right XML saved config +void AEncodeProperties::SaveValuesToStringKey(const std::string & config_name) +{ + // get the current data in the file to keep them + if (my_stored_data.LoadFile(my_store_location)) + { + // check if the Node corresponding to the config_name already exist. + TiXmlNode* node = my_stored_data.FirstChild("lame_acm"); + + if (node != NULL) + { + TiXmlElement* ConfigNode = node->FirstChildElement("encodings"); + + if (ConfigNode != NULL) + { + // look all the tags + TiXmlElement* tmpNode = ConfigNode->FirstChildElement("config"); + while (tmpNode != NULL) + { + const std::string * tmpname = tmpNode->Attribute("name"); + if (tmpname->compare(config_name) == 0) + { + break; + } + tmpNode = tmpNode->NextSiblingElement("config"); + } + + if (tmpNode == NULL) + { + // Create the node + tmpNode = new TiXmlElement("config"); + tmpNode->SetAttribute("name",config_name); + + // save data in the node + SaveValuesToElement(tmpNode); + + ConfigNode->InsertEndChild(*tmpNode); + } + else + { + // save data in the node + SaveValuesToElement(tmpNode); + } + + + // and save the file + my_stored_data.SaveFile(my_store_location); + } + } + } +} + +void AEncodeProperties::GetValuesFromKey(const std::string & config_name, const TiXmlNode & parentNode) +{ + TiXmlElement* tmpElt; + TiXmlElement* iterateElmt; + + // find the config that correspond to CurrentConfig + iterateElmt = parentNode.FirstChildElement("config"); + while (iterateElmt != NULL) + { + const std::string * tmpname = iterateElmt->Attribute("name"); + if ((tmpname != NULL) && (tmpname->compare(config_name) == 0)) + { + break; + } + iterateElmt = iterateElmt->NextSiblingElement("config"); + } + + if (iterateElmt != NULL) + { + // get all the parameters saved in this Element + const std::string * tmpname; + + // Smart output parameter + tmpElt = iterateElmt->FirstChildElement("Smart"); + if (tmpElt != NULL) + { + tmpname = tmpElt->Attribute("use"); + if (tmpname != NULL) + bSmartOutput = (tmpname->compare("true") == 0); + + tmpname = tmpElt->Attribute("ratio"); + if (tmpname != NULL) + SmartRatioMax = atof(tmpname->c_str()); + } + + // Smart output parameter + tmpElt = iterateElmt->FirstChildElement("ABR"); + if (tmpElt != NULL) + { + tmpname = tmpElt->Attribute("use"); + if (tmpname != NULL) + bAbrOutput = (tmpname->compare("true") == 0); + + tmpname = tmpElt->Attribute("min"); + if (tmpname != NULL) + AverageBitrate_Min = atoi(tmpname->c_str()); + + tmpname = tmpElt->Attribute("max"); + if (tmpname != NULL) + AverageBitrate_Max = atoi(tmpname->c_str()); + + tmpname = tmpElt->Attribute("step"); + if (tmpname != NULL) + AverageBitrate_Step = atoi(tmpname->c_str()); + } + + // Copyright parameter + tmpElt = iterateElmt->FirstChildElement("Copyright"); + if (tmpElt != NULL) + { + tmpname = tmpElt->Attribute("use"); + if (tmpname != NULL) + bCopyright = (tmpname->compare("true") == 0); + } + + // Copyright parameter + tmpElt = iterateElmt->FirstChildElement("CRC"); + if (tmpElt != NULL) + { + tmpname = tmpElt->Attribute("use"); + if (tmpname != NULL) + bCRC = (tmpname->compare("true") == 0); + } + + // Copyright parameter + tmpElt = iterateElmt->FirstChildElement("Original"); + if (tmpElt != NULL) + { + tmpname = tmpElt->Attribute("use"); + if (tmpname != NULL) + bOriginal = (tmpname->compare("true") == 0); + } + + // Copyright parameter + tmpElt = iterateElmt->FirstChildElement("Private"); + if (tmpElt != NULL) + { + tmpname = tmpElt->Attribute("use"); + if (tmpname != NULL) + bPrivate = (tmpname->compare("true") == 0); + } +/* + // Copyright parameter + tmpElt = iterateElmt->FirstChildElement("Bit_reservoir"); + if (tmpElt != NULL) + { + tmpname = tmpElt->Attribute("use"); + if (tmpname != NULL) + bNoBitRes = !(tmpname->compare("true") == 0); + } + + // bitrates + tmpElt = iterateElmt->FirstChildElement("bitrate"); + tmpname = tmpElt->Attribute("min"); + if (tmpname != NULL) + { + unsigned int uitmp = atoi(tmpname->c_str()); + for (int i=0;iAttribute("max"); + if (tmpname != NULL) + { + unsigned int uitmp = atoi(tmpname->c_str()); + for (int i=0;iFirstChildElement("resampling"); + if (tmpElt != NULL) + { + tmpname = tmpElt->Attribute("use"); + if (tmpname != NULL) + bResample = (tmpname->compare("true") == 0); + + unsigned int uitmp = atoi(tmpElt->Attribute("freq")->c_str()); + for (int i=0;iFirstChildElement("VBR"); + if (tmpElt != NULL) + { + tmpname = tmpElt->Attribute("use"); + if (tmpname != NULL) + { + if (tmpname->compare("ABR") == 0) + mBRmode = BR_ABR; + else if (tmpname->compare("true") == 0) + mBRmode = BR_VBR; + else + mBRmode = BR_CBR; + } + + tmpname = tmpElt->Attribute("header"); + if (tmpname != NULL) + bXingFrame = (tmpname->compare("true") == 0); + + tmpname = tmpElt->Attribute("quality"); + if (tmpname != NULL) + { + VbrQuality = atoi(tmpname->c_str()); + } + + tmpname = tmpElt->Attribute("average"); + if (tmpname != NULL) + { + AverageBitrate = atoi(tmpname->c_str()); + } + else + { + } + } + + // output parameters + tmpElt = iterateElmt->FirstChildElement("output"); + if (tmpElt != NULL) + { + OutputDir = *tmpElt->Attribute("path"); + } +*/ +//#ifdef OLD + // Channel mode parameter + tmpElt = iterateElmt->FirstChildElement("Channel"); + if (tmpElt != NULL) + { + const std::string * tmpStr = tmpElt->Attribute("mode"); + if (tmpStr != NULL) + { + for (int i=0;icompare(GetChannelModeString(i)) == 0) + { + nChannelIndex = i; + break; + } + } + } +/* + tmpname = tmpElt->Attribute("force"); + if (tmpname != NULL) + bForceChannel = (tmpname->compare("true") == 0); +*/ + } +//#endif // OLD + + // Preset parameter +/* + tmpElt = iterateElmt->FirstChildElement("Preset"); + if (tmpElt != NULL) + { + const std::string * tmpStr = tmpElt->Attribute("type"); + for (int i=0;icompare(GetPresetModeString(i)) == 0) + { + nPresetIndex = i; + break; + } + } + + } +*/ + } +} + +/** + \todo save the parameters +* / +void AEncodeProperties::SaveParams(const HWND hParentWnd) +{ + char string[MAX_PATH]; +/* int nIdx = SendMessage(::GetDlgItem( hParentWnd ,IDC_COMBO_SETTINGS ), CB_GETCURSEL, NULL, NULL); + ::SendMessage(::GetDlgItem( hParentWnd ,IDC_COMBO_SETTINGS ), CB_GETLBTEXT , nIdx, (LPARAM) string); +* / +}*/ + +bool AEncodeProperties::operator !=(const AEncodeProperties & the_instance) const +{ +/* + ::OutputDebugString(bCopyright != the_instance.bCopyright?"1":"-"); + ::OutputDebugString(bCRC != the_instance.bCRC ?"2":"-"); + ::OutputDebugString(bOriginal != the_instance.bOriginal ?"3":"-"); + ::OutputDebugString(bPrivate != the_instance.bPrivate ?"4":"-"); + ::OutputDebugString(bNoBitRes != the_instance.bNoBitRes ?"5":"-"); + ::OutputDebugString(mBRmode != the_instance.mBRmode ?"6":"-"); + ::OutputDebugString(bXingFrame != the_instance.bXingFrame?"7":"-"); + ::OutputDebugString(bForceChannel != the_instance.bForceChannel?"8":"-"); + ::OutputDebugString(bResample != the_instance.bResample ?"9":"-"); + ::OutputDebugString(nChannelIndex != the_instance.nChannelIndex?"10":"-"); + ::OutputDebugString(nMinBitrateIndex != the_instance.nMinBitrateIndex?"11":"-"); + ::OutputDebugString(nMaxBitrateIndex != the_instance.nMaxBitrateIndex?"12":"-"); + ::OutputDebugString(nPresetIndex != the_instance.nPresetIndex?"13":"-"); + ::OutputDebugString(VbrQuality != the_instance.VbrQuality?"14":"-"); + ::OutputDebugString(AverageBitrate != the_instance.AverageBitrate?"15":"-"); + ::OutputDebugString(nSamplingFreqIndex != the_instance.nSamplingFreqIndex?"16":"-"); + ::OutputDebugString(OutputDir.compare(the_instance.OutputDir) != 0?"17":"-"); + + std::string tmp = ""; + char tmpI[10]; + _itoa(AverageBitrate,tmpI,10); + tmp += tmpI; + tmp += " != "; + _itoa(the_instance.AverageBitrate,tmpI,10); + tmp += tmpI; + ::OutputDebugString(tmp.c_str()); +*/ + return ((bCopyright != the_instance.bCopyright) + || (bCRC != the_instance.bCRC) + || (bOriginal != the_instance.bOriginal) + || (bPrivate != the_instance.bPrivate) + || (bSmartOutput != the_instance.bSmartOutput) + || (SmartRatioMax != the_instance.SmartRatioMax) + || (bAbrOutput != the_instance.bAbrOutput) + || (AverageBitrate_Min != the_instance.AverageBitrate_Min) + || (AverageBitrate_Max != the_instance.AverageBitrate_Max) + || (AverageBitrate_Step != the_instance.AverageBitrate_Step) + || (bNoBitRes != the_instance.bNoBitRes) + || (mBRmode != the_instance.mBRmode) + || (bXingFrame != the_instance.bXingFrame) + || (bForceChannel != the_instance.bForceChannel) + || (bResample != the_instance.bResample) + || (nChannelIndex != the_instance.nChannelIndex) + || (nMinBitrateIndex != the_instance.nMinBitrateIndex) + || (nMaxBitrateIndex != the_instance.nMaxBitrateIndex) + || (nPresetIndex != the_instance.nPresetIndex) + || (VbrQuality != the_instance.VbrQuality) +// || (AverageBitrate != the_instance.AverageBitrate) + || (nSamplingFreqIndex != the_instance.nSamplingFreqIndex) +// || (OutputDir.compare(the_instance.OutputDir) != 0) + ); +} + +void AEncodeProperties::SelectSavedParams(const std::string the_string) +{ + // get the values from the saved file if possible + if (my_stored_data.LoadFile(my_store_location)) + { + TiXmlNode* node; + + node = my_stored_data.FirstChild("lame_acm"); + + TiXmlElement* CurrentNode = node->FirstChildElement("encodings"); + + if (CurrentNode != NULL) + { + CurrentNode->SetAttribute("default",the_string); + GetValuesFromKey(the_string, *CurrentNode); + my_stored_data.SaveFile(my_store_location); + } + } +} + +inline void AEncodeProperties::SetAttributeBool(TiXmlElement * the_elt,const std::string & the_string, const bool the_value) const +{ + if (the_value == false) + the_elt->SetAttribute(the_string, "false"); + else + the_elt->SetAttribute(the_string, "true"); +} + +void AEncodeProperties::SaveValuesToElement(TiXmlElement * the_element) const +{ + // get all the parameters saved in this Element + TiXmlElement * tmpElt; + + // Bit Reservoir parameter +/* + tmpElt = the_element->FirstChildElement("Bit_reservoir"); + if (tmpElt == NULL) + { + tmpElt = new TiXmlElement("Bit_reservoir"); + SetAttributeBool(tmpElt, "use", !bNoBitRes); + the_element->InsertEndChild(*tmpElt); + } + else + { + SetAttributeBool(tmpElt, "use", !bNoBitRes); + } +*/ + // Copyright parameter + tmpElt = the_element->FirstChildElement("Copyright"); + if (tmpElt == NULL) + { + tmpElt = new TiXmlElement("Copyright"); + SetAttributeBool( tmpElt, "use", bCopyright); + the_element->InsertEndChild(*tmpElt); + } + else + { + SetAttributeBool( tmpElt, "use", bCopyright); + } + + // Smart Output parameter + tmpElt = the_element->FirstChildElement("Smart"); + if (tmpElt == NULL) + { + tmpElt = new TiXmlElement("Smart"); + SetAttributeBool( tmpElt, "use", bSmartOutput); + tmpElt->SetAttribute("ratio", SmartRatioMax); + the_element->InsertEndChild(*tmpElt); + } + else + { + SetAttributeBool( tmpElt, "use", bSmartOutput); + tmpElt->SetAttribute("ratio", SmartRatioMax); + } + + // Smart Output parameter + tmpElt = the_element->FirstChildElement("ABR"); + if (tmpElt == NULL) + { + tmpElt = new TiXmlElement("ABR"); + SetAttributeBool( tmpElt, "use", bAbrOutput); + tmpElt->SetAttribute("min", AverageBitrate_Min); + tmpElt->SetAttribute("max", AverageBitrate_Max); + tmpElt->SetAttribute("step", AverageBitrate_Step); + the_element->InsertEndChild(*tmpElt); + } + else + { + SetAttributeBool( tmpElt, "use", bAbrOutput); + tmpElt->SetAttribute("min", AverageBitrate_Min); + tmpElt->SetAttribute("max", AverageBitrate_Max); + tmpElt->SetAttribute("step", AverageBitrate_Step); + } + + // CRC parameter + tmpElt = the_element->FirstChildElement("CRC"); + if (tmpElt == NULL) + { + tmpElt = new TiXmlElement("CRC"); + SetAttributeBool( tmpElt, "use", bCRC); + the_element->InsertEndChild(*tmpElt); + } + else + { + SetAttributeBool( tmpElt, "use", bCRC); + } + + // Original parameter + tmpElt = the_element->FirstChildElement("Original"); + if (tmpElt == NULL) + { + tmpElt = new TiXmlElement("Original"); + SetAttributeBool( tmpElt, "use", bOriginal); + the_element->InsertEndChild(*tmpElt); + } + else + { + SetAttributeBool( tmpElt, "use", bOriginal); + } + + // Private parameter + tmpElt = the_element->FirstChildElement("Private"); + if (tmpElt == NULL) + { + tmpElt = new TiXmlElement("Private"); + SetAttributeBool( tmpElt, "use", bPrivate); + the_element->InsertEndChild(*tmpElt); + } + else + { + SetAttributeBool( tmpElt, "use", bPrivate); + } + + // Channel Mode parameter + tmpElt = the_element->FirstChildElement("Channel"); + if (tmpElt == NULL) + { + tmpElt = new TiXmlElement("Channel"); + tmpElt->SetAttribute("mode", GetChannelModeString(nChannelIndex)); +// SetAttributeBool( tmpElt, "force", bForceChannel); + the_element->InsertEndChild(*tmpElt); + } + else + { + tmpElt->SetAttribute("mode", GetChannelModeString(nChannelIndex)); +// SetAttributeBool( tmpElt, "force", bForceChannel); + } +/* + // Preset parameter + tmpElt = the_element->FirstChildElement("Preset"); + if (tmpElt == NULL) + { + tmpElt = new TiXmlElement("Preset"); + tmpElt->SetAttribute("type", GetPresetModeString(nPresetIndex)); + the_element->InsertEndChild(*tmpElt); + } + else + { + tmpElt->SetAttribute("type", GetPresetModeString(nPresetIndex)); + } + + // Bitrate parameter + tmpElt = the_element->FirstChildElement("bitrate"); + if (tmpElt == NULL) + { + tmpElt = new TiXmlElement("bitrate"); + tmpElt->SetAttribute("min", the_Bitrates[nMinBitrateIndex]); + tmpElt->SetAttribute("max", the_Bitrates[nMaxBitrateIndex]); + the_element->InsertEndChild(*tmpElt); + } + else + { + tmpElt->SetAttribute("min", the_Bitrates[nMinBitrateIndex]); + tmpElt->SetAttribute("max", the_Bitrates[nMaxBitrateIndex]); + } + + // Output Directory parameter + tmpElt = the_element->FirstChildElement("output"); + if (tmpElt == NULL) + { + tmpElt = new TiXmlElement("output"); + tmpElt->SetAttribute("path", OutputDir); + the_element->InsertEndChild(*tmpElt); + } + else + { + tmpElt->SetAttribute("path", OutputDir); + } +*/ +/* + // Resampling parameter + tmpElt = the_element->FirstChildElement("resampling"); + if (tmpElt == NULL) + { + tmpElt = new TiXmlElement("resampling"); + SetAttributeBool( tmpElt, "use", bResample); + tmpElt->SetAttribute("freq", the_SamplingFreqs[nSamplingFreqIndex]); + the_element->InsertEndChild(*tmpElt); + } + else + { + SetAttributeBool( tmpElt, "use", bResample); + tmpElt->SetAttribute("freq", the_SamplingFreqs[nSamplingFreqIndex]); + } + + // VBR parameter + tmpElt = the_element->FirstChildElement("VBR"); + if (tmpElt == NULL) + { + tmpElt = new TiXmlElement("VBR"); + + if (mBRmode == BR_ABR) + tmpElt->SetAttribute("use", "ABR"); + else + SetAttributeBool( tmpElt, "use", (mBRmode != BR_CBR)); + + SetAttributeBool( tmpElt, "header", bXingFrame); + tmpElt->SetAttribute("quality", VbrQuality); + tmpElt->SetAttribute("average", AverageBitrate); + the_element->InsertEndChild(*tmpElt); + } + else + { + if (mBRmode == BR_ABR) + tmpElt->SetAttribute("use", "ABR"); + else + SetAttributeBool( tmpElt, "use", (mBRmode != BR_CBR)); + + SetAttributeBool( tmpElt, "header", bXingFrame); + tmpElt->SetAttribute("quality", VbrQuality); + tmpElt->SetAttribute("average", AverageBitrate); + } +*/ +} + +bool AEncodeProperties::HandleDialogCommand(const HWND parentWnd, const WPARAM wParam, const LPARAM lParam) +{ + UINT command; + command = GET_WM_COMMAND_ID(wParam, lParam); + + switch (command) + { + case IDOK : + { + bool bShouldEnd = true; + + // save parameters + char string[MAX_PATH]; +// ::GetWindowText(::GetDlgItem( parentWnd, IDC_COMBO_SETTINGS), string, MAX_PATH); + + wsprintf(string,"Current"); // only the Current config is supported at the moment + + my_debug.OutPut("my_hModule = 0x%08X",my_hModule); +/* + AEncodeProperties tmpDlgProps(my_hModule); + AEncodeProperties tmpSavedProps(my_hModule); +//#ifdef OLD + tmpDlgProps.UpdateValueFromDlg(parentWnd); + tmpSavedProps.SelectSavedParams(string); + tmpSavedProps.ParamsRestore(); + // check if the values from the DLG are the same as the one saved in the config file + // if yes, just do nothing +/* + if (tmpDlgProps != tmpSavedProps) + { + int save; + + if (strcmp(string,"Current") == 0) + { + // otherwise, prompt the user if he wants to overwrite the settings + TCHAR tmpStr[250]; + ::LoadString(AOut::GetInstance(),IDS_STRING_PROMPT_REPLACE_CURRENT,tmpStr,250); + + save = AOut::MyMessageBox( tmpStr, MB_OKCANCEL|MB_ICONQUESTION, parentWnd); + } + else + { + // otherwise, prompt the user if he wants to overwrite the settings + TCHAR tmpStr[250]; + ::LoadString(AOut::GetInstance(),IDS_STRING_PROMPT_REPLACE_SETING,tmpStr,250); + TCHAR tmpDsp[500]; + wsprintf(tmpDsp,tmpStr,string); + + save = AOut::MyMessageBox( tmpDsp, MB_YESNOCANCEL|MB_ICONQUESTION, parentWnd); + } + + if (save == IDCANCEL) + bShouldEnd = false; + else if (save == IDNO) + { + // save the values in 'current' + UpdateValueFromDlg(parentWnd); + SaveValuesToStringKey("Current"); + SelectSavedParams("Current"); + } + else + { + // do so and save in XML + UpdateValueFromDlg(parentWnd); + SaveValuesToStringKey(string); + } + } +*/ +//#endif // OLD +my_debug.OutPut("before : nChannelIndex %d, bCRC %d, bCopyright %d, bOriginal %d, bPrivate %d",nChannelIndex, bCRC, bCopyright, bOriginal, bPrivate); + +my_debug.OutPut("call UpdateValueFromDlg"); + + UpdateValueFromDlg(parentWnd); + +my_debug.OutPut("call SaveValuesToStringKey"); + + SaveValuesToStringKey("Current"); // only Current config is supported now + +// SaveParams(parentWnd); + +//my_debug.OutPut("call SelectSavedParams"); + +// SelectSavedParams(string); +// UpdateDlgFromValue(parentWnd); + +my_debug.OutPut("finished saving"); + + if (bShouldEnd) + { + RemoveProp(parentWnd, "AEncodeProperties-Config"); + + EndDialog(parentWnd, true); + } + } + break; + + case IDCANCEL: + RemoveProp(parentWnd, "AEncodeProperties-Config"); + EndDialog(parentWnd, false); + break; + +/* case IDC_FIND_DLL: + { + OPENFILENAME file; + char DllLocation[512]; + wsprintf(DllLocation,"%s",GetDllLocation()); + + memset(&file, 0, sizeof(file)); + file.lStructSize = sizeof(file); + file.hwndOwner = parentWnd; + file.Flags = OFN_FILEMUSTEXIST | OFN_NODEREFERENCELINKS | OFN_ENABLEHOOK | OFN_EXPLORER ; +/// file.lpstrFile = AOut::the_AOut->DllLocation; + file.lpstrFile = DllLocation; + file.lpstrFilter = "Lame DLL (lame_enc.dll)\0LAME_ENC.DLL\0DLL (*.dll)\0*.DLL\0All (*.*)\0*.*\0"; + file.nFilterIndex = 1; + file.nMaxFile = sizeof(DllLocation); + file.lpfnHook = DLLFindCallback; // use to validate the DLL chosen + + GetOpenFileName(&file); + + SetDllLocation(DllLocation); + // use this filename if necessary + } + break; +*/ +/* case IDC_BUTTON_OUTPUT: + { +#ifndef SIMPLE_FOLDER + BROWSEINFO info; + memset(&info,0,sizeof(info)); + + char FolderName[MAX_PATH]; + + info.hwndOwner = parentWnd; + info.pszDisplayName = FolderName; + info.lpfn = BrowseFolderCallbackroc; + info.lParam = (LPARAM) this; + + // get the localised window title + TCHAR output[250]; + ::LoadString(AOut::GetInstance(),IDS_STRING_DIR_SELECT,output,250); + info.lpszTitle = output; + +#ifdef BIF_EDITBOX + info.ulFlags |= BIF_EDITBOX; +#else // BIF_EDITBOX + info.ulFlags |= 0x0010; +#endif // BIF_EDITBOX + +#ifdef BIF_VALIDATE + info.ulFlags |= BIF_VALIDATE; +#else // BIF_VALIDATE + info.ulFlags |= 0x0020; +#endif // BIF_VALIDATE + +#ifdef BIF_NEWDIALOGSTYLE + info.ulFlags |= BIF_NEWDIALOGSTYLE; +#else // BIF_NEWDIALOGSTYLE + info.ulFlags |= 0x0040; +#endif // BIF_NEWDIALOGSTYLE + + ITEMIDLIST *item = SHBrowseForFolder(&info); + + if (item != NULL) + { + char tmpOutputDir[MAX_PATH]; + wsprintf(tmpOutputDir,"%s",GetOutputDirectory()); + + SHGetPathFromIDList( item,tmpOutputDir ); + SetOutputDirectory( tmpOutputDir ); + ::SetWindowText(GetDlgItem( parentWnd, IDC_EDIT_OUTPUTDIR), tmpOutputDir); +// wsprintf(OutputDir,FolderName); + } +#else // SIMPLE_FOLDER + OPENFILENAME file; + + memset(&file, 0, sizeof(file)); + file.lStructSize = sizeof(file); + file.hwndOwner = parentWnd; + file.Flags = OFN_FILEMUSTEXIST | OFN_NODEREFERENCELINKS | OFN_ENABLEHOOK | OFN_EXPLORER ; +// file.lpstrFile = GetDllLocation(); +// file.lpstrFile = GetOutputDirectory(); + file.lpstrInitialDir = GetOutputDirectory(); + file.lpstrFilter = "A Directory\0.*\0"; +// file.nFilterIndex = 1; + file.nMaxFile = MAX_PATH; +// file.lpfnHook = DLLFindCallback; // use to validate the DLL chosen +// file.Flags = OFN_ENABLESIZING | OFN_NOREADONLYRETURN | OFN_HIDEREADONLY; + file.Flags = OFN_NOREADONLYRETURN | OFN_HIDEREADONLY | OFN_EXPLORER; + + TCHAR output[250]; + ::LoadString(AOut::GetInstance(),IDS_STRING_DIR_SELECT,output,250); + file.lpstrTitle = output; + + GetSaveFileName(&file); +#endif // SIMPLE_FOLDER + } + break; +*/ + case IDC_CHECK_ENC_ABR: + EnableAbrOptions(parentWnd, ::IsDlgButtonChecked( parentWnd, IDC_CHECK_ENC_ABR) == BST_CHECKED); + break; +/* case IDC_RADIO_BITRATE_CBR: + AEncodeProperties::DisplayVbrOptions(parentWnd, AEncodeProperties::BR_CBR); + break; + + case IDC_RADIO_BITRATE_VBR: + AEncodeProperties::DisplayVbrOptions(parentWnd, AEncodeProperties::BR_VBR); + break; + + case IDC_RADIO_BITRATE_ABR: + AEncodeProperties::DisplayVbrOptions(parentWnd, AEncodeProperties::BR_ABR); + break; + + case IDC_CHECK_RESAMPLE: + { + bool tmp_bResampleUsed = (::IsDlgButtonChecked( parentWnd, IDC_CHECK_RESAMPLE) == BST_CHECKED); + if (tmp_bResampleUsed) + { + ::EnableWindow(::GetDlgItem(parentWnd,IDC_COMBO_SAMPLEFREQ), TRUE); + } + else + { + ::EnableWindow(::GetDlgItem(parentWnd,IDC_COMBO_SAMPLEFREQ), FALSE); + } + } + break; +*/ +/* case IDC_COMBO_SETTINGS: +// if (CBN_SELCHANGE == GET_WM_COMMAND_CMD(wParam, lParam)) + if (CBN_SELENDOK == GET_WM_COMMAND_CMD(wParam, lParam)) + { + char string[MAX_PATH]; + int nIdx = SendMessage(HWND(lParam), CB_GETCURSEL, NULL, NULL); + SendMessage(HWND(lParam), CB_GETLBTEXT , nIdx, (LPARAM) string); + + // get the info corresponding to the new selected item + SelectSavedParams(string); + UpdateDlgFromValue(parentWnd); + } + break; +*/ +/* case IDC_BUTTON_CONFIG_SAVE: + { + // save the data in the current config + char string[MAX_PATH]; + ::GetWindowText(::GetDlgItem( parentWnd, IDC_COMBO_SETTINGS), string, MAX_PATH); + + UpdateValueFromDlg(parentWnd); + SaveValuesToStringKey(string); + SelectSavedParams(string); + UpdateConfigs(parentWnd); + UpdateDlgFromValue(parentWnd); + } + break; + + case IDC_BUTTON_CONFIG_RENAME: + { + char string[MAX_PATH]; + ::GetWindowText(::GetDlgItem( parentWnd, IDC_COMBO_SETTINGS), string, MAX_PATH); + + if (RenameCurrentTo(string)) + { + // Update the names displayed + UpdateConfigs(parentWnd); + } + + } + break; + + case IDC_BUTTON_CONFIG_DELETE: + { + char string[MAX_PATH]; + ::GetWindowText(::GetDlgItem( parentWnd, IDC_COMBO_SETTINGS), string, MAX_PATH); + + if (DeleteConfig(string)) + { + // Update the names displayed + UpdateConfigs(parentWnd); + UpdateDlgFromValue(parentWnd); + } + } + break; +*/ + } + + return FALSE; +} + +bool AEncodeProperties::RenameCurrentTo(const std::string & new_config_name) +{ + bool bResult = false; + + // display all the names of the saved configs + // get the values from the saved file if possible + if (my_stored_data.LoadFile(my_store_location)) + { + TiXmlNode* node; + + node = my_stored_data.FirstChild("lame_acm"); + + TiXmlElement* CurrentNode = node->FirstChildElement("encodings"); + + if (CurrentNode->Attribute("default") != NULL) + { + std::string CurrentConfigName = *CurrentNode->Attribute("default"); + + // no rename possible for Current + if (CurrentConfigName == "") + { + bResult = true; + } + else if (CurrentConfigName != "Current") + { + // find the config that correspond to CurrentConfig + TiXmlElement* iterateElmt = CurrentNode->FirstChildElement("config"); +// int Idx = 0; + while (iterateElmt != NULL) + { + const std::string * tmpname = iterateElmt->Attribute("name"); + /** + \todo support language names + */ + if (tmpname != NULL) + { + if (tmpname->compare(CurrentConfigName) == 0) + { + iterateElmt->SetAttribute("name",new_config_name); + bResult = true; + break; + } + } +// Idx++; + iterateElmt = iterateElmt->NextSiblingElement("config"); + } + } + + if (bResult) + { + CurrentNode->SetAttribute("default",new_config_name); + + my_stored_data.SaveFile(my_store_location); + } + } + } + + return bResult; +} + +bool AEncodeProperties::DeleteConfig(const std::string & config_name) +{ + bool bResult = false; + + if (config_name != "Current") + { + // display all the names of the saved configs + // get the values from the saved file if possible + if (my_stored_data.LoadFile(my_store_location)) + { + TiXmlNode* node; + + node = my_stored_data.FirstChild("lame_acm"); + + TiXmlElement* CurrentNode = node->FirstChildElement("encodings"); + + TiXmlElement* iterateElmt = CurrentNode->FirstChildElement("config"); +// int Idx = 0; + while (iterateElmt != NULL) + { + const std::string * tmpname = iterateElmt->Attribute("name"); + /** + \todo support language names + */ + if (tmpname != NULL) + { + if (tmpname->compare(config_name) == 0) + { + CurrentNode->RemoveChild(iterateElmt); + bResult = true; + break; + } + } +// Idx++; + iterateElmt = iterateElmt->NextSiblingElement("config"); + } + } + + if (bResult) + { + my_stored_data.SaveFile(my_store_location); + + // select a new default config : "Current" + SelectSavedParams("Current"); + + } + } + + return bResult; +} + +void AEncodeProperties::UpdateConfigs(const HWND HwndDlg) +{ + // Add User configs +// SendMessage(GetDlgItem( HwndDlg, IDC_COMBO_SETTINGS), CB_RESETCONTENT , NULL, NULL); + + // display all the names of the saved configs + // get the values from the saved file if possible + if (my_stored_data.LoadFile(my_store_location)) + { + TiXmlNode* node; + + node = my_stored_data.FirstChild("lame_acm"); + + TiXmlElement* CurrentNode = node->FirstChildElement("encodings"); + + std::string CurrentConfig = ""; + + if (CurrentNode->Attribute("default") != NULL) + { + CurrentConfig = *CurrentNode->Attribute("default"); + } + + TiXmlElement* iterateElmt; + +my_debug.OutPut("are we here ?"); + + // find the config that correspond to CurrentConfig + iterateElmt = CurrentNode->FirstChildElement("config"); + int Idx = 0; + while (iterateElmt != NULL) + { + const std::string * tmpname = iterateElmt->Attribute("name"); + /** + \todo support language names + */ + if (tmpname != NULL) + { +// SendMessage(GetDlgItem( HwndDlg, IDC_COMBO_SETTINGS), CB_ADDSTRING, NULL, (LPARAM) tmpname->c_str()); + if (tmpname->compare(CurrentConfig) == 0) + { +// SendMessage(GetDlgItem( HwndDlg, IDC_COMBO_SETTINGS), CB_SETCURSEL, Idx, NULL); + SelectSavedParams(*tmpname); + UpdateDlgFromValue(HwndDlg); + } + } +my_debug.OutPut("Idx = %d",Idx); + + Idx++; + // only Current config supported now +// iterateElmt = iterateElmt->NextSiblingElement("config"); + iterateElmt = NULL; +my_debug.OutPut("iterateElmt = 0x%08X",iterateElmt); + + } + } +} +/* +void AEncodeProperties::UpdateAbrSteps(unsigned int min, unsigned int max, unsigned int step) const +{ +} +*/ +void AEncodeProperties::UpdateDlgFromSlides(HWND hwndDlg) const +{ + UINT value_min, value_max, value_step, value; + char tmp[4]; + + value_min = SendMessage(GetDlgItem( hwndDlg, IDC_SLIDER_AVERAGE_MIN), TBM_GETPOS, NULL, NULL); + value_max = SendMessage(GetDlgItem( hwndDlg, IDC_SLIDER_AVERAGE_MAX), TBM_GETPOS, NULL, NULL); + + if (value_min>value_max) + { + SendMessage(GetDlgItem( hwndDlg, IDC_SLIDER_AVERAGE_MIN), TBM_SETPOS, TRUE, value_max); + UpdateDlgFromSlides(hwndDlg); + return; + } + + if (value_max=value_min;i-=value_step) + { + SendMessage(GetDlgItem( hwndDlg, IDC_SLIDER_AVERAGE_SAMPLE), TBM_SETTIC, 0, i); + } + SendMessage(GetDlgItem( hwndDlg, IDC_SLIDER_AVERAGE_SAMPLE), TBM_SETLINESIZE, 0, value_step); + SendMessage(GetDlgItem( hwndDlg, IDC_SLIDER_AVERAGE_SAMPLE), TBM_SETPAGESIZE, 0, value_step); + + value = SendMessage(GetDlgItem( hwndDlg, IDC_SLIDER_AVERAGE_SAMPLE), TBM_GETPOS, NULL, NULL); + wsprintf(tmp,"%3d",value); + ::SetWindowText(GetDlgItem( hwndDlg, IDC_STATIC_AVERAGE_SAMPLE_VALUE), tmp); +} + +void AEncodeProperties::EnableAbrOptions(HWND hDialog, bool enable) +{ + ::EnableWindow(::GetDlgItem( hDialog, IDC_SLIDER_AVERAGE_MIN), enable); + ::EnableWindow(::GetDlgItem( hDialog, IDC_SLIDER_AVERAGE_MAX), enable); + ::EnableWindow(::GetDlgItem( hDialog, IDC_SLIDER_AVERAGE_STEP), enable); + ::EnableWindow(::GetDlgItem( hDialog, IDC_SLIDER_AVERAGE_SAMPLE), enable); + ::EnableWindow(::GetDlgItem( hDialog, IDC_STATIC_AVERAGE_MIN), enable); + ::EnableWindow(::GetDlgItem( hDialog, IDC_STATIC_AVERAGE_MAX), enable); + ::EnableWindow(::GetDlgItem( hDialog, IDC_STATIC_AVERAGE_STEP), enable); + ::EnableWindow(::GetDlgItem( hDialog, IDC_STATIC_AVERAGE_SAMPLE), enable); + ::EnableWindow(::GetDlgItem( hDialog, IDC_STATIC_AVERAGE_MIN_VALUE), enable); + ::EnableWindow(::GetDlgItem( hDialog, IDC_STATIC_AVERAGE_MAX_VALUE), enable); + ::EnableWindow(::GetDlgItem( hDialog, IDC_STATIC_AVERAGE_STEP_VALUE), enable); + ::EnableWindow(::GetDlgItem( hDialog, IDC_STATIC_AVERAGE_SAMPLE_VALUE), enable); +} + diff --git a/ACM/AEncodeProperties.h b/ACM/AEncodeProperties.h new file mode 100644 index 0000000..4d2e1db --- /dev/null +++ b/ACM/AEncodeProperties.h @@ -0,0 +1,448 @@ +/** + * + * Lame ACM wrapper, encode/decode MP3 based RIFF/AVI files in MS Windows + * + * Copyright (c) 2002 Steve Lhomme + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +/*! + \author Steve Lhomme + \version \$Id: AEncodeProperties.h,v 1.5 2002/04/07 13:31:35 robux4 Exp $ +*/ + +#if !defined(_AENCODEPROPERTIES_H__INCLUDED_) +#define _AENCODEPROPERTIES_H__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include +#include + +#include "ADbg/ADbg.h" +//#include "BladeMP3EncDLL.h" +#include "tinyxml/tinyxml.h" +//#include "AParameters/AParameters.h" + +typedef const struct { + UINT id; + const char *tip; +} ToolTipItem; +/** + \class AEncodeProperties + \brief the AEncodeProperties class is responsible for handling all the encoding properties +*/ +class AEncodeProperties +{ +public: + /** + \brief default constructor + + \param the windows module with which you can retrieve many informations + */ + AEncodeProperties(HMODULE hModule); + + /** + \brief default destructor + */ + virtual ~AEncodeProperties() {} + + /** + \enum BRMode + \brief A bitrate mode (CBR, VBR, ABR) + */ + enum BRMode { BR_CBR, BR_VBR, BR_ABR }; + + /** + \brief Handle all the commands that occur in the Config dialog box + */ + bool HandleDialogCommand(const HWND parentWnd, const WPARAM wParam, const LPARAM lParam); + /** + \brief check wether 2 instances are equal, ie have the same encoding parameters + */ + bool operator != (const AEncodeProperties & the_instance) const; + + /** + \brief Check wether the Encode process should use the Copyright bit + */ + inline const bool GetCopyrightMode() const { return bCopyright; } + /** + \brief Check wether the Encode process should use the CRC bit + */ + inline const bool GetCRCMode() const { return bCRC; } + /** + \brief Check wether the Encode process should use the Original bit + */ + inline const bool GetOriginalMode() const { return bOriginal; } + /** + \brief Check wether the Encode process should use the Private bit + */ + inline const bool GetPrivateMode() const { return bPrivate; } + /** + \brief Check wether the Encode process should use the Smart Bitrate output + */ + inline const bool GetSmartOutputMode() const { return bSmartOutput; } + /** + \brief Check wether the Encode process should allow Average Bitrate output + */ + inline const bool GetAbrOutputMode() const { return bAbrOutput; } + + /** + \brief Check wether the Encode process shouldn't use the Bit Reservoir + */ + inline const bool GetNoBiResMode() const { return bNoBitRes; } + + /** + \brief Check wether the Encode process should force the channel mode (stereo or mono resampling) + */ + inline const bool GetForceChannelMode() const { return bForceChannel; } + + /** + \brief Check wether the Encode process should use the VBR mode + */ + inline const BRMode GetVBRUseMode() const { return mBRmode; } + /** + \brief Check wether the Encode process should use the Xing frame in the VBR mode + \note the Xing frame is a silent frame at the beginning that contain VBR statistics about the file. + */ + inline const bool GetXingFrameMode() const { return bXingFrame; } + + /** + \brief Check wether the Encode process should resample before encoding + */ + inline const bool GetResampleMode() const { return bResample; } + + /** + \brief Set wether the Encode process should use the Copyright bit + */ + inline void SetCopyrightMode(const bool bMode) { bCopyright = bMode; } + /** + \brief Set wether the Encode process should use the CRC bit + */ + inline void SetCRCMode(const bool bMode) { bCRC = bMode; } + /** + \brief Set wether the Encode process should use the Original bit + */ + inline void SetOriginalMode(const bool bMode) { bOriginal = bMode; } + /** + \brief Set wether the Encode process should use the Private bit + */ + inline void SetPrivateMode(const bool bMode) { bPrivate = bMode; } + + /** + \brief Set wether the Encode process should use the Smart Bitrate output + */ + inline void SetSmartOutputMode(const bool bMode) { bSmartOutput = bMode; } + /** + \brief Set wether the Encode process should use the Average Bitrate output + */ + inline void SetAbrOutputMode(const bool bMode) { bAbrOutput = bMode; } + + + /** + \brief Set wether the Encode process shouldn't use the Bit Reservoir + */ + inline void SetNoBiResMode(const bool bMode) { bNoBitRes = bMode; } + + /** + \brief Set wether the Encode process should force the channel mode (stereo or mono resampling) + */ + inline void SetForceChannelMode(const bool bMode) { bForceChannel = bMode; } + + /** + \brief Set wether the Encode process should use the VBR mode + */ + inline void SetVBRUseMode(const BRMode mode) { mBRmode = mode; } + + /** + \brief Set wether the Encode process should use the Xing frame in the VBR mode + \note the Xing frame is a silent frame at the beginning that contain VBR statistics about the file. + */ + inline void SetXingFrameMode(const bool bMode) { bXingFrame = bMode; } + + /** + \brief CBR : Get the bitrate to use / + VBR : Get the minimum bitrate value + */ + const unsigned int GetBitrateValue() const; + + /** + \brief Get the current (VBR:min) bitrate for the specified MPEG version + + \param bitrate the data that will be filled with the bitrate + \param MPEG_Version The MPEG version (MPEG1 or MPEG2) + + \return 0 if the bitrate is not found, 1 if the bitrate is found + */ + const int GetBitrateValue(DWORD & bitrate, const DWORD MPEG_Version) const; + /** + \brief Get the current (VBR:min) bitrate for MPEG I + + \param bitrate the data that will be filled with the bitrate + + \return 0 if the bitrate is not found, 1 if the bitrate is found + */ + const int GetBitrateValueMPEG1(DWORD & bitrate) const; + /** + \brief Get the current (VBR:min) bitrate for MPEG II + + \param bitrate the data that will be filled with the bitrate + + \return 0 if the bitrate is not found, 1 if the bitrate is found + */ + const int GetBitrateValueMPEG2(DWORD & bitrate) const; + + /** + \brief Get the current (VBR:min) bitrate in the form of a string + + \param string the string that will be filled + \param string_size the size of the string + + \return -1 if the bitrate is not found, and the number of char copied otherwise + */ + inline const int GetBitrateString(char * string, int string_size) const {return GetBitrateString(string,string_size,nMinBitrateIndex); } + + /** + \brief Get the (VBR:min) bitrate corresponding to the specified index in the form of a string + + \param string the string that will be filled + \param string_size the size of the string + \param a_bitrateID the index in the Bitrate table + + \return -1 if the bitrate is not found, and the number of char copied otherwise + */ + const int GetBitrateString(char * string, int string_size, int a_bitrateID) const; + + /** + \brief Get the number of possible bitrates + */ + inline const int GetBitrateLentgh() const { return sizeof(the_Bitrates) / sizeof(unsigned int); } + /** + \brief Get the number of possible sampling frequencies + */ + inline const unsigned int GetResampleFreq() const { return the_SamplingFreqs[nSamplingFreqIndex]; } + /** + \brief Get the max compression ratio allowed (1:15 default) + */ + inline double GetSmartRatio() const { return SmartRatioMax;} + /** + \brief Get the min ABR bitrate possible + */ + inline unsigned int GetAbrBitrateMin() const { return AverageBitrate_Min;} + /** + \brief Get the max ABR bitrate possible + */ + inline unsigned int GetAbrBitrateMax() const { return AverageBitrate_Max;} + /** + \brief Get the step between ABR bitrates + */ + inline unsigned int GetAbrBitrateStep() const { return AverageBitrate_Step;} + + /** + \brief Get the VBR attributes for a specified MPEG version + + \param MaxBitrate receive the maximum bitrate possible in the VBR mode + \param Quality receive the quality value (0 to 9 see Lame doc for more info) + \param VBRHeader receive the value that indicates wether the VBR/Xing header should be filled + \param MPEG_Version The MPEG version (MPEG1 or MPEG2) + + \return the VBR mode (Old, New, ABR, MTRH, Default or None) + */ +// VBRMETHOD GetVBRValue(DWORD & MaxBitrate, int & Quality, DWORD & AbrBitrate, BOOL & VBRHeader, const DWORD MPEG_Version) const; + + /** + \brief Get the Lame DLL Location + */ +// const char * GetDllLocation() const { return DllLocation.c_str(); } + /** + \brief Set the Lame DLL Location + */ +// void SetDllLocation( const char * the_string ) { DllLocation = the_string; } + + /** + \brief Get the output directory for encoding + */ +// const char * GetOutputDirectory() const { return OutputDir.c_str(); } + /** + \brief Set the output directory for encoding + */ +// void SetOutputDirectory( const char * the_string ) { OutputDir = the_string; } + + /** + \brief Get the current channel mode to use + */ + const unsigned int GetChannelModeValue() const; + /** + \brief Get the current channel mode in the form of a string + */ + inline const char * GetChannelModeString() const {return GetChannelModeString(nChannelIndex); } + /** + \brief Get the channel mode in the form of a string for the specified Channel mode index + + \param a_channelID the Channel mode index (see GetChannelLentgh()) + */ + const char * GetChannelModeString(const int a_channelID) const; + /** + \brief Get the number of possible channel mode + */ + inline const int GetChannelLentgh() const { return 3; } + + /** + \brief Get the current preset to use, see lame documentation/code for more info on the possible presets + */ +// const LAME_QUALTIY_PRESET GetPresetModeValue() const; + /** + \brief Get the preset in the form of a string for the specified Channel mode index + + \param a_presetID the preset index (see GetPresetLentgh()) + */ + const char * GetPresetModeString(const int a_presetID) const; + /** + \brief Get the number of possible presets + */ +// inline const int GetPresetLentgh() const { return sizeof(the_Presets) / sizeof(LAME_QUALTIY_PRESET); } + + /** + \brief Start the user configuration process (called by AOut::config()) + */ + bool Config(const HINSTANCE hInstance, const HWND HwndParent); + + /** + \brief Init the config dialog box with the right texts and choices + */ + bool InitConfigDlg(HWND hDialog); + + /** + \brief Update the instance parameters from the config dialog box + */ + bool UpdateValueFromDlg(HWND hDialog); + /** + \brief Update the config dialog box from the instance parameters + */ + bool UpdateDlgFromValue(HWND hDialog); + + /** + \brief Update the config dialog box with the BitRate mode + */ + static void DisplayVbrOptions(const HWND hDialog, const BRMode the_mode); + + /** + \brief Handle the saving of parameters when something has changed in the config dialog box + */ + void SaveParams(const HWND hDialog); + + /** + \brief Save the current parameters (current config in use) + */ + void ParamsSave(void); + /** + \brief Load the parameters (current config in use) + */ + void ParamsRestore(void); + + /** + \brief Select the specified config name as the new default one + */ + void SelectSavedParams(const std::string config_name); + /** + \brief Save the current parameters to the specified config name + */ + void SaveValuesToStringKey(const std::string & config_name); + /** + \brief Rename the current config name to something else + */ + bool RenameCurrentTo(const std::string & new_config_name); + /** + \brief Delete the config name from the saved configs + */ + bool DeleteConfig(const std::string & config_name); + + ADbg my_debug; + + /** + \brief Update the slides value (on scroll) + */ + void UpdateDlgFromSlides(HWND parent_window) const; + + static ToolTipItem Tooltips[13]; +private: + + bool bCopyright; + bool bCRC; + bool bOriginal; + bool bPrivate; + bool bNoBitRes; + BRMode mBRmode; + bool bXingFrame; + bool bForceChannel; + bool bResample; + bool bSmartOutput; + bool bAbrOutput; + + int VbrQuality; + unsigned int AverageBitrate_Min; + unsigned int AverageBitrate_Max; + unsigned int AverageBitrate_Step; + + double SmartRatioMax; + + static const unsigned int the_ChannelModes[3]; + int nChannelIndex; + + static const unsigned int the_Bitrates[18]; + static const unsigned int the_MPEG1_Bitrates[14]; + static const unsigned int the_MPEG2_Bitrates[14]; + int nMinBitrateIndex; // CBR and VBR + int nMaxBitrateIndex; // only used in VBR mode + + static const unsigned int the_SamplingFreqs[9]; + int nSamplingFreqIndex; + +// static const LAME_QUALTIY_PRESET the_Presets[17]; + int nPresetIndex; + +// char DllLocation[512]; +// std::string DllLocation; +// char OutputDir[MAX_PATH]; +// std::string OutputDir; + +// AParameters my_base_parameters; + TiXmlDocument my_stored_data; + std::string my_store_location; + std::string my_current_config; + +// HINSTANCE hDllInstance; + + void SaveValuesToElement(TiXmlElement * the_element) const; + inline void SetAttributeBool(TiXmlElement * the_elt,const std::string & the_string, const bool the_value) const; + void UpdateConfigs(const HWND HwndDlg); + void EnableAbrOptions(HWND hDialog, bool enable); + + HMODULE my_hModule; + + /** + \brief + + \param config_name + \param parentNode + */ + void GetValuesFromKey(const std::string & config_name, const TiXmlNode & parentNode); +}; + +#endif // !defined(_AENCODEPROPERTIES_H__INCLUDED_) diff --git a/ACM/DecodeStream.cpp b/ACM/DecodeStream.cpp new file mode 100644 index 0000000..c2c753c --- /dev/null +++ b/ACM/DecodeStream.cpp @@ -0,0 +1,242 @@ +/** + * + * Lame ACM wrapper, encode/decode MP3 based RIFF/AVI files in MS Windows + * + * Copyright (c) 2002 Steve Lhomme + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +/*! + \author Steve Lhomme + \version \$Id: DecodeStream.cpp,v 1.3 2002/01/25 17:51:42 robux4 Exp $ +*/ + +#if !defined(STRICT) +#define STRICT +#endif // STRICT + +#include +#include + +#ifdef ENABLE_DECODING + +#include "adebug.h" + +#include "DecodeStream.h" + +// static methods + +DecodeStream * DecodeStream::Create() +{ + DecodeStream * Result; + + Result = new DecodeStream; + + return Result; +} + +const bool DecodeStream::Erase(const DecodeStream * a_ACMStream) +{ + delete a_ACMStream; + return true; +} + +// class methods + +DecodeStream::DecodeStream() : + m_WorkingBufferUseSize(0), + gfp(NULL) +{ + /// \todo get the debug level from the registry +my_debug = new ADbg(DEBUG_LEVEL_CREATION); + if (my_debug != NULL) { + unsigned char DebugFileName[512]; + + my_debug->setPrefix("MPG123stream"); /// \todo get it from the registry +my_debug->setIncludeTime(true); /// \todo get it from the registry + +// Check in the registry if we have to Output Debug information +DebugFileName[0] = '\0'; + + HKEY OssKey; + if (RegOpenKeyEx( HKEY_LOCAL_MACHINE, "SOFTWARE\\MUKOLI", 0, KEY_READ , &OssKey ) == ERROR_SUCCESS) { + DWORD DataType; + DWORD DebugFileNameSize = 512; + if (RegQueryValueEx( OssKey, "DebugFile", NULL, &DataType, DebugFileName, &DebugFileNameSize ) == ERROR_SUCCESS) { + if (DataType == REG_SZ) { + my_debug->setUseFile(true); + my_debug->setDebugFile((char *)DebugFileName); + my_debug->OutPut("Debug file is %s",(char *)DebugFileName); + } + } + } + my_debug->OutPut(DEBUG_LEVEL_FUNC_START, "DecodeStream Creation (0X%08X)",this); + } + else { + ADbg debug; + debug.OutPut("DecodeStream::ACMACMStream : Impossible to create my_debug"); + } + +} + +DecodeStream::~DecodeStream() +{ +// lame_close( gfp ); + + if (my_debug != NULL) + { + my_debug->OutPut(DEBUG_LEVEL_FUNC_START, "DecodeStream Deletion (0X%08X)",this); + delete my_debug; + } +} + +bool DecodeStream::init(const int nSamplesPerSec, const int nChannels, const int nAvgBytesPerSec, const int nSourceBitrate) +{ + bool bResult = false; + + my_SamplesPerSec = nSamplesPerSec; + my_Channels = nChannels; + my_AvgBytesPerSec = nAvgBytesPerSec; + my_SourceBitrate = nSourceBitrate; + + bResult = true; + + return bResult; +} + +bool DecodeStream::open() +{ + bool bResult = false; + + bResult = bool(InitMP3(&my_DecodeData) != 0); + + return bResult; +} + +bool DecodeStream::close(LPBYTE pOutputBuffer, DWORD *pOutputSize) +{ + + bool bResult = false; +/* + int nOutputSamples = 0; + + nOutputSamples = lame_encode_flush( gfp, pOutputBuffer, 0 ); + + if ( nOutputSamples < 0 ) + { + // BUFFER_TOO_SMALL + *pOutputSize = 0; + } + else + { + *pOutputSize = nOutputSamples; + + bResult = true; + } +/* + // lame will be close in VbrWriteTag function + if ( !lame_get_bWriteVbrTag( gfp ) ) + { + // clean up of allocated memory + lame_close( gfp ); + } +*/ + + ExitMP3(&my_DecodeData); + + bResult = true; + + return bResult; +} + +DWORD DecodeStream::GetOutputSizeForInput(const DWORD the_SrcLength) const +{ + DWORD Result; + + double OutputInputRatio = double(my_SamplesPerSec * 2 * my_Channels) / double(my_SourceBitrate); + + OutputInputRatio *= 1.15; // allow 15% more + + Result = DWORD(double(the_SrcLength) * OutputInputRatio); + + my_debug->OutPut(DEBUG_LEVEL_FUNC_CODE, "Result = %d (OutputInputRatio = %f)",Result,OutputInputRatio); + + return Result; +} + +bool DecodeStream::ConvertBuffer(LPACMDRVSTREAMHEADER a_StreamHeader) +{ + bool result = false; + +if (my_debug != NULL) +{ +my_debug->OutPut(DEBUG_LEVEL_FUNC_DEBUG, "enter DecodeStream::ConvertBuffer"); +} + + int ProcessedBytes; + + int ret = decodeMP3(&my_DecodeData, a_StreamHeader->pbSrc, a_StreamHeader->cbSrcLength, (char *)a_StreamHeader->pbDst, a_StreamHeader->cbDstLength, &ProcessedBytes); + + switch (ret) + { + case MP3_OK: + a_StreamHeader->cbSrcLengthUsed = a_StreamHeader->cbSrcLength; + a_StreamHeader->cbDstLengthUsed = ProcessedBytes; + result = true; + break; + case MP3_NEED_MORE: + a_StreamHeader->cbSrcLengthUsed = 0; + a_StreamHeader->cbDstLengthUsed = 0; + break; + case MP3_ERR: + break; + } + +/* + DWORD InSize = a_StreamHeader->cbSrcLength / 2, OutSize = a_StreamHeader->cbDstLength; // 2 for 8<->16 bits + +// Encode it +int dwSamples; + int nOutputSamples = 0; + + dwSamples = InSize / lame_get_num_channels( gfp ); + + if ( 1 == lame_get_num_channels( gfp ) ) + { + nOutputSamples = lame_encode_buffer(gfp,(PSHORT)a_StreamHeader->pbSrc,(PSHORT)a_StreamHeader->pbSrc,dwSamples,a_StreamHeader->pbDst,a_StreamHeader->cbDstLength); + } + else + { + nOutputSamples = lame_encode_buffer_interleaved(gfp,(PSHORT)a_StreamHeader->pbSrc,dwSamples,a_StreamHeader->pbDst,a_StreamHeader->cbDstLength); + } + + a_StreamHeader->cbSrcLengthUsed = a_StreamHeader->cbSrcLength; + a_StreamHeader->cbDstLengthUsed = nOutputSamples; + + result = a_StreamHeader->cbDstLengthUsed <= a_StreamHeader->cbDstLength; +*/ + my_debug->OutPut(DEBUG_LEVEL_FUNC_CODE, "UsedSize = %d / EncodedSize = %d, result = %d, ret = %s", a_StreamHeader->cbSrcLengthUsed, a_StreamHeader->cbDstLengthUsed, result, + (ret == MP3_OK)?"MP3_OK":(ret == MP3_NEED_MORE)?"MP3_NEED_MORE":"error"); + +if (my_debug != NULL) +{ +my_debug->OutPut(DEBUG_LEVEL_FUNC_DEBUG, "DecodeStream::ConvertBuffer result = %d",result); +} + + return result; +} +#endif // ENABLE_DECODING diff --git a/ACM/DecodeStream.h b/ACM/DecodeStream.h new file mode 100644 index 0000000..135ce21 --- /dev/null +++ b/ACM/DecodeStream.h @@ -0,0 +1,83 @@ +/** + * + * Lame ACM wrapper, encode/decode MP3 based RIFF/AVI files in MS Windows + * + * Copyright (c) 2002 Steve Lhomme + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +/*! + \author Steve Lhomme + \version \$Id: DecodeStream.h,v 1.2 2006/12/25 21:37:34 robert Exp $ +*/ + +#if !defined(_DECODESTREAM_H__INCLUDED_) +#define _DECODESTREAM_H__INCLUDED_ + +#if _MSC_VER >= 1000 +#pragma once +#endif // _MSC_VER >= 1000 + +#include +#include +#include + +#include "ADbg/ADbg.h" + + +struct lame_global_flags; + + +class DecodeStream +{ +public: + DecodeStream( ); + virtual ~DecodeStream( ); + + static DecodeStream * Create(); + static const bool Erase(const DecodeStream * a_ACMStream); + + bool init(const int nSamplesPerSec, const int nChannels, const int nAvgBytesPerSec, const int nSourceBitrate); + bool open(); + bool close(LPBYTE pOutputBuffer, DWORD *pOutputSize); + + DWORD GetOutputSizeForInput(const DWORD the_SrcLength) const; + bool ConvertBuffer(LPACMDRVSTREAMHEADER a_StreamHeader); + + static unsigned int GetOutputSampleRate(int samples_per_sec, int bitrate, int channels); + +protected: + lame_global_flags * gfp; + + ADbg * my_debug; + int my_SamplesPerSec; + int my_Channels; + int my_AvgBytesPerSec; + DWORD my_SamplesPerBlock; + int my_SourceBitrate; + + MPSTR my_DecodeData; + + unsigned int m_WorkingBufferUseSize; + char m_WorkingBuffer[2304*2]; // should be at least twice my_SamplesPerBlock + + inline int GetBytesPerBlock(DWORD bytes_per_sec, DWORD samples_per_sec, int BlockAlign) const; + +}; + +#endif // !defined(_DECODESTREAM_H__INCLUDED_) + diff --git a/ACM/LameACM.inf b/ACM/LameACM.inf new file mode 100644 index 0000000..be70430 --- /dev/null +++ b/ACM/LameACM.inf @@ -0,0 +1,91 @@ +; Lame codec +; enable MP3 compression in Windows + +; Usage : right-click on this file and choose "Install" in the pop up menu + +[Version] +Signature = "$CHICAGO$" +Class = MEDIA + +[SourceDisksNames] +1="Lame MP3 Install Disk",, 0001 + +[SourceDisksFiles] +LameACM.inf=1 +LameACM.acm=1 +lame_acm.xml=1 + +[Installable.Drivers] +lameacm = 1:LameACM.acm, "msacm.lameacm", %DisplayNameWin% , , , + +[DefaultInstall] +CopyFiles = LameACM.Copy,LameACM.Copy.Inf +Updateinis = LameACM.Updateini +;addreg = LameACM.AddReg,LameACM.AddReg9x,LameACM.DoReg +addreg = LameACM.AddReg,LameACM.AddReg9x +MediaType = SOFTWARE + +[DefaultInstall.ntx86] +CopyFiles = LameACM.Copy,LameACM.Copy.Inf +;addreg = LameACM.AddReg,LameACM.AddRegNT,LameACM.DoReg +addreg = LameACM.AddReg,LameACM.AddRegNT +MediaType = SOFTWARE + +[Remove_LameMP3] +;AddReg = LameACM.Unregister +DelReg = LameACM.DelReg +DelFiles = LameACM.Copy,LameACM.Copy.Inf +UpdateInis = LameACM.UpdateIni + +[LameACM.Copy] +LameACM.acm +lame_acm.xml + +[LameACM.Copy.Inf] +LameACM.inf + +[LameACM.UpdateIni] +system.ini, drivers32,,"msacm.lameacm=LameACM.acm" + +[LameACM.AddReg] +HKLM, "Software\Microsoft\Windows NT\CurrentVersion\Drivers32","msacm.lameacm",,"LameACM.acm" +HKLM, "Software\Microsoft\Windows NT\CurrentVersion\Drivers.desc","LameACM.acm",,%DisplayNameWin% + + +[LameACM.AddReg9x] +HKLM,SYSTEM\CurrentControlSet\Control\MediaResources\msacm\msacm.lameacm,Description,,%DisplayNameWin% +HKLM,SYSTEM\CurrentControlSet\Control\MediaResources\msacm\msacm.lameacm,Driver,,LameACM.acm +HKLM,SYSTEM\CurrentControlSet\Control\MediaResources\msacm\msacm.lameacm,FriendlyName,,%DisplayNameWin% +HKLM,%UnInstallPath%,DisplayName,,%DisplayNameWin% +HKLM,%UnInstallPath%,UninstallString,,"%10%\rundll.exe setupx.dll,InstallHinfSection Remove_LameMP3 132 %17%\%InfFile%" + +[LameACM.AddRegNT] +HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\drivers32","msacm.lameacm",,"LameACM.acm" +HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\drivers.desc","LameACM.acm",,%DisplayNameWin% +HKLM,%UnInstallPath%,DisplayName,,%DisplayNameWin% +HKLM,%UnInstallPath%,UninstallString,,"%11%\rundll32.exe setupapi,InstallHinfSection Remove_LameMP3 132 %17%\%InfFile%" + +;[LameACM.DoReg] +;HKLM,Software\Microsoft\Windows\CurrentVersion\RunOnce\Setup,"Lame ACM MP3 Codec",,"%11%\regsvr32.exe /s %11%\LameCom.acm" + +[LameACM.DelReg] +HKLM,"SYSTEM\CurrentControlSet\Control\MediaResources\msacm\msacm.lameacm" +HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\drivers.desc","LameACM.acm",,"" +HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\drivers32","msacm.lameacm",,"" +HKLM,%UnInstallPath% + +;[LameACM.Unregister] +;HKLM,"Software\Microsoft\Windows\CurrentVersion\RunOnce\Setup","Lame ACM MP3 Codec",,"%11%\regsvr32.exe /s /u %11%\LameCom.acm" + +[DestinationDirs] +DefaultDestDir = 11 ; LDID_SYS +LameACM.Copy = 11 +LameACM.Copy.Inf = 17 + +[Strings] +InfFile="LameACM.inf" +DisplayNameWin="Lame ACM MP3 Codec" +UnInstallPath="Software\Microsoft\Windows\CurrentVersion\Uninstall\LameACM" +MediaClassName="Media Devices" +mfgname="Steve Lhomme" + diff --git a/ACM/Makefile.am b/ACM/Makefile.am new file mode 100644 index 0000000..be13e08 --- /dev/null +++ b/ACM/Makefile.am @@ -0,0 +1,26 @@ +## $Id: Makefile.am,v 1.7 2008/11/09 13:50:16 aleidinger Exp $ + +include $(top_srcdir)/Makefile.am.global + +SUBDIRS = ADbg ddk tinyxml + +EXTRA_DIST = \ + ACM.cpp \ + ACM.h \ + ACMStream.cpp \ + ACMStream.h \ + AEncodeProperties.cpp \ + AEncodeProperties.h \ + DecodeStream.cpp \ + DecodeStream.h \ + LameACM.inf \ + TODO \ + acm.rc \ + adebug.h \ + lame.ico \ + lameACM.def \ + lame_acm.xml \ + main.cpp \ + readme.txt \ + resource.h + diff --git a/ACM/Makefile.in b/ACM/Makefile.in new file mode 100644 index 0000000..3d94616 --- /dev/null +++ b/ACM/Makefile.in @@ -0,0 +1,671 @@ +# Makefile.in generated by automake 1.15.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2017 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# global section for every Makefile.am +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = ACM +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + distdir +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.global TODO +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_DEFS = @CONFIG_DEFS@ +CONFIG_MATH_LIB = @CONFIG_MATH_LIB@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CPUCCODE = @CPUCCODE@ +CPUTYPE = @CPUTYPE@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FRONTEND_CFLAGS = @FRONTEND_CFLAGS@ +FRONTEND_LDADD = @FRONTEND_LDADD@ +FRONTEND_LDFLAGS = @FRONTEND_LDFLAGS@ +GREP = @GREP@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_CONFIG = @GTK_CONFIG@ +GTK_LIBS = @GTK_LIBS@ +INCLUDES = @INCLUDES@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDADD = @LDADD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_MAJOR_VERSION = @LIB_MAJOR_VERSION@ +LIB_MINOR_VERSION = @LIB_MINOR_VERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEDEP = @MAKEDEP@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NASM = @NASM@ +NASM_FORMAT = @NASM_FORMAT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM_F = @RM_F@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_FRONTEND = @WITH_FRONTEND@ +WITH_MP3RTP = @WITH_MP3RTP@ +WITH_MP3X = @WITH_MP3X@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = 1.15 foreign +SUBDIRS = ADbg ddk tinyxml +EXTRA_DIST = \ + ACM.cpp \ + ACM.h \ + ACMStream.cpp \ + ACMStream.h \ + AEncodeProperties.cpp \ + AEncodeProperties.h \ + DecodeStream.cpp \ + DecodeStream.h \ + LameACM.inf \ + TODO \ + acm.rc \ + adebug.h \ + lame.ico \ + lameACM.def \ + lame_acm.xml \ + main.cpp \ + readme.txt \ + resource.h + +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.global $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign ACM/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign ACM/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/Makefile.am.global $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(am__recursive_targets) install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ + check-am clean clean-generic clean-libtool cscopelist-am ctags \ + ctags-am distclean distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# end global section + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/ACM/TODO b/ACM/TODO new file mode 100644 index 0000000..c88aba2 --- /dev/null +++ b/ACM/TODO @@ -0,0 +1,9 @@ +- known bug : when recording, converting, and recording a lame_close() call fail +- allow decompression the same way as in the command-line +- allow VBR mode +- allow channel resampling (mono to stereo / stereo to mono) +- allow internal resampling (difference in the format suggestion) +- use global pointers for string +- use the bitrate/freq tables from LAME + +/ add the decoding engine diff --git a/ACM/acm.rc b/ACM/acm.rc new file mode 100644 index 0000000..117a5d7 --- /dev/null +++ b/ACM/acm.rc @@ -0,0 +1,219 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Franz�sisch (Frankreich) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_FRA) +#ifdef _WIN32 +LANGUAGE LANG_FRENCH, SUBLANG_FRENCH +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,9,1,0 + PRODUCTVERSION 0,9,1,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x3L + FILESUBTYPE 0x8L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "Comments", "This is an ACM driver for Win32 using Lame to encode\0" + VALUE "CompanyName", "http://www.mp3dev.org/\0" + VALUE "FileDescription", "Lame MP3 codec engine\0" + VALUE "FileVersion", "0.9.2\0" + VALUE "InternalName", "lameACM\0" + VALUE "LegalCopyright", "Copyright � 2002 Steve Lhomme, Copyright � 2002-2007 The LAME Project\0" + VALUE "LegalTrademarks", "LGPL (see gnu.org)\0" + VALUE "OriginalFilename", "lameACM.acm\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "Lame MP3 codec\0" + VALUE "ProductVersion", "0.9.2\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + +#endif // !_MAC + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_ICON ICON DISCARDABLE "lame.ico" + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_CONFIG DIALOGEX 0, 0, 231, 204 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Lame MP3 codec : About" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + DEFPUSHBUTTON "OK",IDOK,65,183,50,14 + PUSHBUTTON "Cancel",IDCANCEL,125,183,50,14 + GROUPBOX "Encoding",IDC_STATIC,7,7,142,166 + GROUPBOX "Decoding",IDC_STATIC_DECODING,154,7,70,113,WS_DISABLED + GROUPBOX "Bits",IDC_STATIC,16,121,124,42 + CONTROL "Copyright",IDC_CHECK_COPYRIGHT,"Button",BS_AUTOCHECKBOX | + BS_FLAT | WS_GROUP | WS_TABSTOP,23,132,45,10 + CONTROL "Checksum",IDC_CHECK_CHECKSUM,"Button",BS_AUTOCHECKBOX | + BS_FLAT | WS_GROUP | WS_TABSTOP,84,132,49,10 + CONTROL "Original",IDC_CHECK_ORIGINAL,"Button",BS_AUTOCHECKBOX | + BS_FLAT | WS_GROUP | WS_TABSTOP,23,148,39,10 + CONTROL "Private",IDC_CHECK_PRIVATE,"Button",BS_AUTOCHECKBOX | + BS_FLAT | WS_GROUP | WS_TABSTOP,84,148,38,10 + COMBOBOX IDC_COMBO_ENC_STEREO,70,21,60,53,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_GROUP | WS_TABSTOP + LTEXT "Stereo mode",IDC_STATIC,23,24,41,8 + CONTROL "Smart Encode",IDC_CHECK_ENC_SMART,"Button", + BS_AUTOCHECKBOX | BS_FLAT | WS_GROUP | WS_TABSTOP,49,39, + 61,10 + ICON IDI_ICON,IDC_STATIC_ENC_ICON,179,129,20,20 + CTEXT "v0.0.0 - 0.00",IDC_STATIC_CONFIG_VERSION,168,155,43,17 + CONTROL "Average BitRate",IDC_CHECK_ENC_ABR,"Button", + BS_AUTOCHECKBOX | BS_FLAT | WS_GROUP | WS_TABSTOP,49,53, + 68,10 + LTEXT "Min",IDC_STATIC_AVERAGE_MIN,19,67,12,8 + LTEXT "Max",IDC_STATIC_AVERAGE_MAX,17,79,14,8 + LTEXT "Step",IDC_STATIC_AVERAGE_STEP,15,91,16,8 + LTEXT "test",IDC_STATIC_AVERAGE_SAMPLE,19,105,12,8 + CONTROL "Slider2",IDC_SLIDER_AVERAGE_MIN,"msctls_trackbar32", + TBS_AUTOTICKS | TBS_BOTH | TBS_NOTICKS | WS_GROUP | + WS_TABSTOP,33,67,92,11 + CONTROL "Slider3",IDC_SLIDER_AVERAGE_MAX,"msctls_trackbar32", + TBS_AUTOTICKS | TBS_BOTH | TBS_NOTICKS | WS_GROUP | + WS_TABSTOP,33,79,92,11 + CONTROL "Slider1",IDC_SLIDER_AVERAGE_STEP,"msctls_trackbar32", + TBS_AUTOTICKS | TBS_BOTH | TBS_NOTICKS | WS_GROUP | + WS_TABSTOP,33,91,92,11 + CONTROL "Slider4",IDC_SLIDER_AVERAGE_SAMPLE,"msctls_trackbar32", + WS_TABSTOP,33,104,92,12 + CTEXT "000",IDC_STATIC_AVERAGE_SAMPLE_VALUE,125,105,15,9,0, + WS_EX_STATICEDGE + CTEXT "000",IDC_STATIC_AVERAGE_STEP_VALUE,125,92,15,9,0, + WS_EX_STATICEDGE + CTEXT "000",IDC_STATIC_AVERAGE_MAX_VALUE,125,80,15,9,0, + WS_EX_STATICEDGE + CTEXT "000",IDC_STATIC_AVERAGE_MIN_VALUE,125,67,15,9,0, + WS_EX_STATICEDGE +END + +IDD_ABOUT DIALOG DISCARDABLE 0, 0, 187, 77 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Lame MP3 codec : About" +FONT 8, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "OK",IDOK,130,56,50,14 + LTEXT "Steve Lhomme + LAME developers",IDC_STATIC,7,33,112,8 + LTEXT "LGPL license",IDC_STATIC,7,20,43,8 + ICON IDI_ICON,IDC_STATIC,145,16,20,20 + LTEXT "Static",IDC_STATIC_ABOUT_TITLE,7,7,173,8 + LTEXT "http://www.mp3dev.org/",IDC_STATIC_ABOUT_URL,7,47,80,8 + LTEXT "icon : Lucas Granito",IDC_STATIC,7,61,64,8 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO DISCARDABLE +BEGIN + IDD_CONFIG, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 224 + TOPMARGIN, 7 + BOTTOMMARGIN, 197 + END + + IDD_ABOUT, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 70 + END +END +#endif // APSTUDIO_INVOKED + +#endif // Franz�sisch (Frankreich) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/ACM/adebug.h b/ACM/adebug.h new file mode 100644 index 0000000..32ec192 --- /dev/null +++ b/ACM/adebug.h @@ -0,0 +1,39 @@ +/** + * + * Lame ACM wrapper, encode/decode MP3 based RIFF/AVI files in MS Windows + * + * Copyright (c) 2002 Steve Lhomme + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +/*! + \author Steve Lhomme + \version \$Id: adebug.h,v 1.2 2002/01/22 19:45:02 robux4 Exp $ +*/ + +#if !defined(_DEBUG_H__INCLUDED_) +#define _DEBUG_H__INCLUDED_ + +#define DEBUG_LEVEL_CREATION 0 + +#define DEBUG_LEVEL_MSG 0 +#define DEBUG_LEVEL_FUNC_START 1 +#define DEBUG_LEVEL_FUNC_DEBUG 2 +#define DEBUG_LEVEL_FUNC_CODE 3 + +#endif /* !defined(_DEBUG_H__INCLUDED_) */ + diff --git a/ACM/ddk/Makefile.am b/ACM/ddk/Makefile.am new file mode 100644 index 0000000..4988997 --- /dev/null +++ b/ACM/ddk/Makefile.am @@ -0,0 +1,6 @@ +## $Id: Makefile.am,v 1.1 2003/12/09 15:48:37 aleidinger Exp $ + +include $(top_srcdir)/Makefile.am.global + +EXTRA_DIST = \ + msacmdrv.h diff --git a/ACM/ddk/Makefile.in b/ACM/ddk/Makefile.in new file mode 100644 index 0000000..18b1216 --- /dev/null +++ b/ACM/ddk/Makefile.in @@ -0,0 +1,473 @@ +# Makefile.in generated by automake 1.15.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2017 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# global section for every Makefile.am +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = ACM/ddk +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.global +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_DEFS = @CONFIG_DEFS@ +CONFIG_MATH_LIB = @CONFIG_MATH_LIB@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CPUCCODE = @CPUCCODE@ +CPUTYPE = @CPUTYPE@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FRONTEND_CFLAGS = @FRONTEND_CFLAGS@ +FRONTEND_LDADD = @FRONTEND_LDADD@ +FRONTEND_LDFLAGS = @FRONTEND_LDFLAGS@ +GREP = @GREP@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_CONFIG = @GTK_CONFIG@ +GTK_LIBS = @GTK_LIBS@ +INCLUDES = @INCLUDES@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDADD = @LDADD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_MAJOR_VERSION = @LIB_MAJOR_VERSION@ +LIB_MINOR_VERSION = @LIB_MINOR_VERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEDEP = @MAKEDEP@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NASM = @NASM@ +NASM_FORMAT = @NASM_FORMAT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM_F = @RM_F@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_FRONTEND = @WITH_FRONTEND@ +WITH_MP3RTP = @WITH_MP3RTP@ +WITH_MP3X = @WITH_MP3X@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = 1.15 foreign +EXTRA_DIST = \ + msacmdrv.h + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.global $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign ACM/ddk/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign ACM/ddk/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/Makefile.am.global $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# end global section + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/ACM/ddk/msacmdrv.h b/ACM/ddk/msacmdrv.h new file mode 100644 index 0000000..aa3c200 --- /dev/null +++ b/ACM/ddk/msacmdrv.h @@ -0,0 +1,185 @@ +/** + * + * Alternative msacmdrv.h file, for use in the Lame project. + * File from the FFDshow project, released under LGPL by permission + * from Milan Cutka. + * Modified by Gabriel Bouvigne to allow compilation of Lame. + * + * Copyright (c) 2003 Milan Cutka + * Copyright (c) 2003 Gabriel Bouvigne + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _MSACMDRV_H_ +#define _MSACMDRV_H_ + + +#include +#include + + + +typedef unsigned long ULONG_PTR, *PULONG_PTR; + + + +typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR; + + +#undef ACMDRIVERDETAILS +#undef PACMDRIVERDETAILS +#undef LPACMDRIVERDETAILS + +#define ACMDRIVERDETAILS ACMDRIVERDETAILSW +#define PACMDRIVERDETAILS PACMDRIVERDETAILSW +#define LPACMDRIVERDETAILS LPACMDRIVERDETAILSW + +#undef ACMFORMATTAGDETAILS +#undef PACMFORMATTAGDETAILS +#undef LPACMFORMATTAGDETAILS + +#define ACMFORMATTAGDETAILS ACMFORMATTAGDETAILSW +#define PACMFORMATTAGDETAILS PACMFORMATTAGDETAILSW +#define LPACMFORMATTAGDETAILS LPACMFORMATTAGDETAILSW + +#undef ACMFORMATDETAILS +#undef PACMFORMATDETAILS +#undef LPACMFORMATDETAILS + +#define ACMFORMATDETAILS ACMFORMATDETAILSW +#define PACMFORMATDETAILS PACMFORMATDETAILSW +#define LPACMFORMATDETAILS LPACMFORMATDETAILSW + + +#define MAKE_ACM_VERSION(mjr, mnr, bld) (((long)(mjr)<<24)| \ + ((long)(mnr)<<16)| \ + ((long)bld)) + +#define VERSION_MSACM MAKE_ACM_VERSION(3, 50, 0) +#define VERSION_ACM_DRIVER MAKE_ACM_VERSION(4, 0, 0) + + +#define ACMDM_DRIVER_NOTIFY (ACMDM_BASE + 1) +#define ACMDM_DRIVER_DETAILS (ACMDM_BASE + 10) + +#define ACMDM_HARDWARE_WAVE_CAPS_INPUT (ACMDM_BASE + 20) +#define ACMDM_HARDWARE_WAVE_CAPS_OUTPUT (ACMDM_BASE + 21) + +#define ACMDM_FORMATTAG_DETAILS (ACMDM_BASE + 25) +#define ACMDM_FORMAT_DETAILS (ACMDM_BASE + 26) +#define ACMDM_FORMAT_SUGGEST (ACMDM_BASE + 27) + +#define ACMDM_FILTERTAG_DETAILS (ACMDM_BASE + 50) +#define ACMDM_FILTER_DETAILS (ACMDM_BASE + 51) + +#define ACMDM_STREAM_OPEN (ACMDM_BASE + 76) +#define ACMDM_STREAM_CLOSE (ACMDM_BASE + 77) +#define ACMDM_STREAM_SIZE (ACMDM_BASE + 78) +#define ACMDM_STREAM_CONVERT (ACMDM_BASE + 79) +#define ACMDM_STREAM_RESET (ACMDM_BASE + 80) +#define ACMDM_STREAM_PREPARE (ACMDM_BASE + 81) +#define ACMDM_STREAM_UNPREPARE (ACMDM_BASE + 82) + +typedef struct tACMDRVFORMATSUGGEST +{ + DWORD cbStruct; // sizeof(ACMDRVFORMATSUGGEST) + DWORD fdwSuggest; // Suggest flags + LPWAVEFORMATEX pwfxSrc; // Source Format + DWORD cbwfxSrc; // Source Size + LPWAVEFORMATEX pwfxDst; // Dest format + DWORD cbwfxDst; // Dest Size + +} ACMDRVFORMATSUGGEST, *PACMDRVFORMATSUGGEST, FAR *LPACMDRVFORMATSUGGEST; + + + + +typedef struct tACMDRVOPENDESC +{ + DWORD cbStruct; // sizeof(ACMDRVOPENDESC) + FOURCC fccType; // 'audc' + FOURCC fccComp; // sub-type (not used--must be 0) + DWORD dwVersion; // current version of ACM opening you + DWORD dwFlags; // + DWORD dwError; // result from DRV_OPEN request + LPCWSTR pszSectionName; // see DRVCONFIGINFO.lpszDCISectionName + LPCWSTR pszAliasName; // see DRVCONFIGINFO.lpszDCIAliasName + DWORD dnDevNode; // devnode id for pnp drivers. + +} ACMDRVOPENDESC, *PACMDRVOPENDESC, FAR *LPACMDRVOPENDESC; + + +typedef struct tACMDRVSTREAMINSTANCE +{ + DWORD cbStruct; + LPWAVEFORMATEX pwfxSrc; + LPWAVEFORMATEX pwfxDst; + LPWAVEFILTER pwfltr; + DWORD_PTR dwCallback; + DWORD_PTR dwInstance; + DWORD fdwOpen; + DWORD fdwDriver; + DWORD_PTR dwDriver; + HACMSTREAM has; + +} ACMDRVSTREAMINSTANCE, *PACMDRVSTREAMINSTANCE, FAR *LPACMDRVSTREAMINSTANCE; + +typedef struct tACMDRVSTREAMSIZE +{ + DWORD cbStruct; + DWORD fdwSize; + DWORD cbSrcLength; + DWORD cbDstLength; + +} ACMDRVSTREAMSIZE, *PACMDRVSTREAMSIZE, FAR *LPACMDRVSTREAMSIZE; + +typedef struct tACMDRVSTREAMHEADER FAR *LPACMDRVSTREAMHEADER; +typedef struct tACMDRVSTREAMHEADER +{ + DWORD cbStruct; + DWORD fdwStatus; + DWORD_PTR dwUser; + LPBYTE pbSrc; + DWORD cbSrcLength; + DWORD cbSrcLengthUsed; + DWORD_PTR dwSrcUser; + LPBYTE pbDst; + DWORD cbDstLength; + DWORD cbDstLengthUsed; + DWORD_PTR dwDstUser; + + DWORD fdwConvert; // flags passed from convert func + LPACMDRVSTREAMHEADER padshNext; // for async driver queueing + DWORD fdwDriver; // driver instance flags + DWORD_PTR dwDriver; // driver instance data + + // + // all remaining fields are used by the ACM for bookkeeping purposes. + // an ACM driver should never use these fields (though than can be + // helpful for debugging)--note that the meaning of these fields + // may change, so do NOT rely on them in shipping code. + // + DWORD fdwPrepared; + DWORD_PTR dwPrepared; + LPBYTE pbPreparedSrc; + DWORD cbPreparedSrcLength; + LPBYTE pbPreparedDst; + DWORD cbPreparedDstLength; + +} ACMDRVSTREAMHEADER, *PACMDRVSTREAMHEADER; + +#endif diff --git a/ACM/lame.ico b/ACM/lame.ico new file mode 100644 index 0000000..bf74cc3 Binary files /dev/null and b/ACM/lame.ico differ diff --git a/ACM/lameACM.def b/ACM/lameACM.def new file mode 100644 index 0000000..3dbe1b4 --- /dev/null +++ b/ACM/lameACM.def @@ -0,0 +1,25 @@ +; Lame ACM wrapper, encode/decode MP3 based RIFF/AVI files in MS Windows +; +; Copyright (c) 2002 Steve Lhomme +; +; This library is free software; you can redistribute it and/or +; modify it under the terms of the GNU Lesser General Public +; License as published by the Free Software Foundation; either +; version 2.1 of the License, or (at your option) any later version. +; +; This library 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 +; Lesser General Public License for more details. +; +; You should have received a copy of the GNU Lesser General Public +; License along with this library; if not, write to the Free Software +; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +LIBRARY lameACM + +DESCRIPTION 'lameACM.acm: MP3 Lame ACM Codec' + +EXPORTS DriverProc + +; EOF diff --git a/ACM/lame_acm.xml b/ACM/lame_acm.xml new file mode 100644 index 0000000..0fc5186 --- /dev/null +++ b/ACM/lame_acm.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ACM/main.cpp b/ACM/main.cpp new file mode 100644 index 0000000..84e4773 --- /dev/null +++ b/ACM/main.cpp @@ -0,0 +1,216 @@ +/** + * + * Lame ACM wrapper, encode/decode MP3 based RIFF/AVI files in MS Windows + * + * Copyright (c) 2002 Steve Lhomme + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +/*! + \author Steve Lhomme + \version \$Id: main.cpp,v 1.5 2006/12/25 21:37:34 robert Exp $ +*/ + +#if !defined(STRICT) +#define STRICT +#endif // STRICT + +#include + +/// The ACM is considered as a driver and run in Kernel-Mode +/// So the new/delete operators have to be overriden in order to use memory +/// readable out of the calling process + +void * operator new( unsigned int cb ) +{ + return LocalAlloc(LPTR, cb); // VirtualAlloc +} + +void operator delete(void *block) { + LocalFree(block); +} + +extern "C" { + + void *acm_Calloc( size_t num, size_t size ) + { + return LocalAlloc(LPTR, num * size); // VirtualAlloc + } + + void *acm_Malloc( size_t size ) + { + return LocalAlloc(LPTR, size); // VirtualAlloc + } + + void acm_Free( void * mem) + { + LocalFree(mem); + } +}; + +////// End of memory instrumentation + +#include +#include +#include + +#include + +#include "AEncodeProperties.h" +#include "ACM.h" +#include "resource.h" +#include "adebug.h" + + +ADbg * debug = NULL; + +LONG WINAPI DriverProc(DWORD dwDriverId, HDRVR hdrvr, UINT msg, LONG lParam1, LONG lParam2) +{ + + switch (msg) + { + case DRV_OPEN: // acmDriverOpen + { + if (debug == NULL) { + debug = new ADbg(DEBUG_LEVEL_CREATION); + debug->setPrefix("LAMEdrv"); + } + + if (debug != NULL) + { + // Sent when the driver is opened. + if (lParam2 != NULL) + debug->OutPut(DEBUG_LEVEL_MSG, "DRV_OPEN (ID 0x%08X), pDesc = 0x%08X",dwDriverId,lParam2); + else + debug->OutPut(DEBUG_LEVEL_MSG, "DRV_OPEN (ID 0x%08X), pDesc = NULL",dwDriverId); + } + + if (lParam2 != NULL) { + LPACMDRVOPENDESC pDesc = (LPACMDRVOPENDESC)lParam2; + + if (pDesc->fccType != ACMDRIVERDETAILS_FCCTYPE_AUDIOCODEC) { + if (debug != NULL) + { + debug->OutPut(DEBUG_LEVEL_FUNC_CODE, "wrong pDesc->fccType (0x%08X)",pDesc->fccType); + } + return NULL; + } + } else { + if (debug != NULL) + { + debug->OutPut(DEBUG_LEVEL_FUNC_CODE, "pDesc == NULL"); + } + } + + ACM * ThisACM = new ACM(GetDriverModuleHandle(hdrvr)); + + if (debug != NULL) + { + debug->OutPut(DEBUG_LEVEL_FUNC_CODE, "OPENED instance 0x%08X",ThisACM); + } + + return (LONG)ThisACM;// returns 0L to fail + // value subsequently used + // for dwDriverId. + } + break; + + case DRV_CLOSE: // acmDriverClose + { + if (debug != NULL) + { + // Sent when the driver is closed. Drivers are + // unloaded when the open count reaches zero. + debug->OutPut(DEBUG_LEVEL_MSG, "DRV_CLOSE"); + } + + ACM * ThisACM = (ACM *)dwDriverId; + delete ThisACM; + if (debug != NULL) + { + debug->OutPut(DEBUG_LEVEL_FUNC_CODE, "CLOSED instance 0x%08X",ThisACM); + delete debug; + debug = NULL; + } + return 1L; // returns 0L to fail + } + break; + + case DRV_LOAD: + { + // nothing to do + if (debug != NULL) + { +// debug->OutPut(DEBUG_LEVEL_MSG, "DRV_LOAD, version %s %s %s", ACM_VERSION, __DATE__, __TIME__); + debug->OutPut(DEBUG_LEVEL_MSG, "DRV_LOAD, %s %s", __DATE__, __TIME__); + } + return 1L; + } + break; + + case DRV_ENABLE: + { + // nothing to do + if (debug != NULL) + { + debug->OutPut(DEBUG_LEVEL_MSG, "DRV_ENABLE"); + } + return 1L; + } + break; + + case DRV_DISABLE: + { + // nothing to do + if (debug != NULL) + { + debug->OutPut(DEBUG_LEVEL_MSG, "DRV_DISABLE"); + } + return 1L; + } + break; + + case DRV_FREE: + { + if (debug != NULL) + { + debug->OutPut(DEBUG_LEVEL_MSG, "DRV_FREE"); + } + return 1L; + } + break; + + default: + { + ACM * ThisACM = (ACM *)dwDriverId; + + if (ThisACM != NULL) + return ThisACM->DriverProcedure(hdrvr, msg, lParam1, lParam2); + else + { + if (debug != NULL) + { + debug->OutPut(DEBUG_LEVEL_MSG, "Driver not opened, unknown message (0x%08X), lParam1 = 0x%08X, lParam2 = 0x%08X", msg, lParam1, lParam2); + } + + return DefDriverProc (dwDriverId, hdrvr, msg, lParam1, lParam2); + } + } + break; + } +} + diff --git a/ACM/readme.txt b/ACM/readme.txt new file mode 100644 index 0000000..92a6422 --- /dev/null +++ b/ACM/readme.txt @@ -0,0 +1,29 @@ +In order to build this codec, you need the Windows98 DDK from Microsoft. It can also work +with the Windows2000/ME/XP/2003 DDK: + +http://www.microsoft.com/ddk/ + +Alternatively, the required headers are also available in CYGWIN+w32api, MINGW32 or Wine : + +http://www.cygwin.com/ +http://www.mingw.org/ +http://www.winehq.com/ + + +If you do not have a ddk, you should be able to use the alternative msacmdrv.h provided +with this ACM codec. It is not used by default because it would probably broke any real +DDK already installed. + + + +--------------- + +Define ENABLE_DECODING if you want to use the decoding (alpha state, doesn't decode at the + moment, so use it only if you plan to develop) + +--------------- + +To release this codec you will need : +- lameACM.acm (result of the build process) +- lameACM.inf +- lame_acm.xml (where the initial configuration is stored) diff --git a/ACM/resource.h b/ACM/resource.h new file mode 100644 index 0000000..9052032 --- /dev/null +++ b/ACM/resource.h @@ -0,0 +1,42 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by acm.rc +// +#define IDI_ICON 101 +#define IDD_CONFIG 102 +#define IDD_ABOUT 103 +#define IDC_STATIC_DECODING 1000 +#define IDC_CHECK_COPYRIGHT 1001 +#define IDC_CHECK_CHECKSUM 1002 +#define IDC_CHECK_ORIGINAL 1003 +#define IDC_CHECK_PRIVATE 1004 +#define IDC_COMBO_ENC_STEREO 1005 +#define IDC_CHECK_ENC_SMART 1006 +#define IDC_STATIC_ENC_ICON 1007 +#define IDC_STATIC_ABOUT_TITLE 1008 +#define IDC_STATIC_ABOUT_URL 1009 +#define IDC_STATIC_CONFIG_VERSION 1010 +#define IDC_CHECK_ENC_ABR 1011 +#define IDC_SLIDER_AVERAGE_MIN 1012 +#define IDC_SLIDER_AVERAGE_MAX 1013 +#define IDC_SLIDER_AVERAGE_STEP 1014 +#define IDC_SLIDER_AVERAGE_SAMPLE 1015 +#define IDC_STATIC_AVERAGE_MIN 1016 +#define IDC_STATIC_AVERAGE_MAX 1017 +#define IDC_STATIC_AVERAGE_STEP 1018 +#define IDC_STATIC_AVERAGE_SAMPLE 1019 +#define IDC_STATIC_AVERAGE_MIN_VALUE 1020 +#define IDC_STATIC_AVERAGE_MAX_VALUE 1021 +#define IDC_STATIC_AVERAGE_STEP_VALUE 1022 +#define IDC_STATIC_AVERAGE_SAMPLE_VALUE 1023 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 105 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1024 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/ACM/tinyxml/Makefile.am b/ACM/tinyxml/Makefile.am new file mode 100644 index 0000000..56ade3b --- /dev/null +++ b/ACM/tinyxml/Makefile.am @@ -0,0 +1,16 @@ +## $Id: Makefile.am,v 1.3 2008/11/09 13:50:16 aleidinger Exp $ + +include $(top_srcdir)/Makefile.am.global + +EXTRA_DIST = \ + Makefile.tinyxml \ + changes.txt \ + dox \ + makedistlinux \ + makedistwin.bat \ + readme.txt \ + tinyxml.cpp \ + tinyxml.h \ + tinyxmlerror.cpp \ + tinyxmlparser.cpp \ + xmltest.cpp diff --git a/ACM/tinyxml/Makefile.in b/ACM/tinyxml/Makefile.in new file mode 100644 index 0000000..bfa13c9 --- /dev/null +++ b/ACM/tinyxml/Makefile.in @@ -0,0 +1,483 @@ +# Makefile.in generated by automake 1.15.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2017 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# global section for every Makefile.am +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = ACM/tinyxml +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.global +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_DEFS = @CONFIG_DEFS@ +CONFIG_MATH_LIB = @CONFIG_MATH_LIB@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CPUCCODE = @CPUCCODE@ +CPUTYPE = @CPUTYPE@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FRONTEND_CFLAGS = @FRONTEND_CFLAGS@ +FRONTEND_LDADD = @FRONTEND_LDADD@ +FRONTEND_LDFLAGS = @FRONTEND_LDFLAGS@ +GREP = @GREP@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_CONFIG = @GTK_CONFIG@ +GTK_LIBS = @GTK_LIBS@ +INCLUDES = @INCLUDES@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDADD = @LDADD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_MAJOR_VERSION = @LIB_MAJOR_VERSION@ +LIB_MINOR_VERSION = @LIB_MINOR_VERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEDEP = @MAKEDEP@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NASM = @NASM@ +NASM_FORMAT = @NASM_FORMAT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM_F = @RM_F@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_FRONTEND = @WITH_FRONTEND@ +WITH_MP3RTP = @WITH_MP3RTP@ +WITH_MP3X = @WITH_MP3X@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = 1.15 foreign +EXTRA_DIST = \ + Makefile.tinyxml \ + changes.txt \ + dox \ + makedistlinux \ + makedistwin.bat \ + readme.txt \ + tinyxml.cpp \ + tinyxml.h \ + tinyxmlerror.cpp \ + tinyxmlparser.cpp \ + xmltest.cpp + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.global $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign ACM/tinyxml/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign ACM/tinyxml/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/Makefile.am.global $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# end global section + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/ACM/tinyxml/Makefile.tinyxml b/ACM/tinyxml/Makefile.tinyxml new file mode 100644 index 0000000..58f4693 --- /dev/null +++ b/ACM/tinyxml/Makefile.tinyxml @@ -0,0 +1,150 @@ +#**************************************************************************** +# +# Makefil for TinyXml test. +# Lee Thomason +# www.grinninglizard.com +# +# This is a GNU make (gmake) makefile +#**************************************************************************** + +# DEBUG can be set to YES to include debugging info, or NO otherwise +DEBUG := YES + +# PROFILE can be set to YES to include profiling info, or NO otherwise +PROFILE := NO + +#**************************************************************************** + +CC := gcc +CXX := g++ +LD := g++ +AR := ar rc +RANLIB := ranlib + +DEBUG_CFLAGS := -Wall -Wno-unknown-pragmas -Wno-format -g -DDEBUG +RELEASE_CFLAGS := -Wall -Wno-unknown-pragmas -Wno-format -O2 + +LIBS := + +DEBUG_CXXFLAGS := ${DEBUG_CFLAGS} +RELEASE_CXXFLAGS := ${RELEASE_CFLAGS} + +DEBUG_LDFLAGS := -g +RELEASE_LDFLAGS := + +ifeq (YES, ${DEBUG}) + CFLAGS := ${DEBUG_CFLAGS} + CXXFLAGS := ${DEBUG_CXXFLAGS} + LDFLAGS := ${DEBUG_LDFLAGS} +else + CFLAGS := ${RELEASE_CFLAGS} + CXXFLAGS := ${RELEASE_CXXFLAGS} + LDFLAGS := ${RELEASE_LDFLAGS} +endif + +ifeq (YES, ${PROFILE}) + CFLAGS := ${CFLAGS} -pg + CXXFLAGS := ${CXXFLAGS} -pg + LDFLAGS := ${LDFLAGS} -pg +endif + +#**************************************************************************** +# Preprocessor directives +#**************************************************************************** + +ifeq (YES, ${PROFILE}) + DEFS := +else + DEFS := +endif + +#**************************************************************************** +# Include paths +#**************************************************************************** + +#INCS := -I/usr/include/g++-2 -I/usr/local/include +INCS := + + +#**************************************************************************** +# Makefile code common to all platforms +#**************************************************************************** + +CFLAGS := ${CFLAGS} ${DEFS} +CXXFLAGS := ${CXXFLAGS} ${DEFS} + +#**************************************************************************** +# Targets of the build +#**************************************************************************** + +OUTPUT := xmltest + +all: ${OUTPUT} + + +#**************************************************************************** +# Source files +#**************************************************************************** + +SRCS := tinyxml.cpp tinyxmlparser.cpp xmltest.cpp tinyxmlerror.cpp + +# Add on the sources for libraries +SRCS := ${SRCS} + +OBJS := $(addsuffix .o,$(basename ${SRCS})) + +#**************************************************************************** +# Output +#**************************************************************************** + +${OUTPUT}: ${OBJS} + ${LD} -o $@ ${LDFLAGS} ${OBJS} ${LIBS} ${EXTRA_LIBS} + +#**************************************************************************** +# common rules +#**************************************************************************** + +# Rules for compiling source files to object files +%.o : %.cpp + ${CXX} -c ${CXXFLAGS} ${INCS} $< -o $@ + +%.o : %.c + ${CC} -c ${CFLAGS} ${INCS} $< -o $@ + +clean: + -rm -f core ${OBJS} ${OUTPUT} + +depend: + makedepend ${INCS} ${SRCS} +# DO NOT DELETE + +tinyxml.o: tinyxml.h /usr/include/stdio.h /usr/include/features.h +tinyxml.o: /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h +tinyxml.o: /usr/include/bits/types.h /usr/include/bits/pthreadtypes.h +tinyxml.o: /usr/include/bits/sched.h /usr/include/libio.h +tinyxml.o: /usr/include/_G_config.h /usr/include/wchar.h +tinyxml.o: /usr/include/bits/wchar.h /usr/include/gconv.h +tinyxml.o: /usr/include/bits/stdio_lim.h /usr/include/assert.h +tinyxmlparser.o: tinyxml.h /usr/include/stdio.h /usr/include/features.h +tinyxmlparser.o: /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h +tinyxmlparser.o: /usr/include/bits/types.h /usr/include/bits/pthreadtypes.h +tinyxmlparser.o: /usr/include/bits/sched.h /usr/include/libio.h +tinyxmlparser.o: /usr/include/_G_config.h /usr/include/wchar.h +tinyxmlparser.o: /usr/include/bits/wchar.h /usr/include/gconv.h +tinyxmlparser.o: /usr/include/bits/stdio_lim.h /usr/include/assert.h +tinyxmlparser.o: /usr/include/ctype.h /usr/include/endian.h +tinyxmlparser.o: /usr/include/bits/endian.h +xmltest.o: tinyxml.h /usr/include/stdio.h /usr/include/features.h +xmltest.o: /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h +xmltest.o: /usr/include/bits/types.h /usr/include/bits/pthreadtypes.h +xmltest.o: /usr/include/bits/sched.h /usr/include/libio.h +xmltest.o: /usr/include/_G_config.h /usr/include/wchar.h +xmltest.o: /usr/include/bits/wchar.h /usr/include/gconv.h +xmltest.o: /usr/include/bits/stdio_lim.h /usr/include/assert.h +tinyxmlerror.o: tinyxml.h /usr/include/stdio.h /usr/include/features.h +tinyxmlerror.o: /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h +tinyxmlerror.o: /usr/include/bits/types.h /usr/include/bits/pthreadtypes.h +tinyxmlerror.o: /usr/include/bits/sched.h /usr/include/libio.h +tinyxmlerror.o: /usr/include/_G_config.h /usr/include/wchar.h +tinyxmlerror.o: /usr/include/bits/wchar.h /usr/include/gconv.h +tinyxmlerror.o: /usr/include/bits/stdio_lim.h /usr/include/assert.h diff --git a/ACM/tinyxml/changes.txt b/ACM/tinyxml/changes.txt new file mode 100644 index 0000000..c0b4cf7 --- /dev/null +++ b/ACM/tinyxml/changes.txt @@ -0,0 +1,81 @@ +Changes in version 1.0.1: +- Fixed comment tags which were outputing as ' include. Thanks + to Steve Lhomme for that. + +Changes in version 2.0.0 +- Made the ToXXX() casts safe if 'this' is null. + When "LoadFile" is called with a filename, the value will correctly get set. + Thanks to Brian Yoder. +- Fixed bug where isalpha() and isalnum() would get called with a negative value for + high ascii numbers. Thanks to Alesky Aksenov. +- Fixed some errors codes that were not getting set. +- Made methods "const" that were not. +- Added a switch to enable or disable the ignoring of white space. ( TiXmlDocument::SetIgnoreWhiteSpace() ) +- Greater standardization and code re-use in the parser. +- Added a stream out operator. +- Added a stream in operator. +- Entity support. + +TODO +CDATA. +Support for "generic entity" #xxx thing. + diff --git a/ACM/tinyxml/dox b/ACM/tinyxml/dox new file mode 100644 index 0000000..f431877 --- /dev/null +++ b/ACM/tinyxml/dox @@ -0,0 +1,708 @@ +# Doxyfile 1.2.2 + +# This file describes the settings to be used by doxygen for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# General configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = TinyXml + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = ./docs + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Dutch, French, Italian, Czech, Swedish, German, Finnish, Japanese, +# Korean, Hungarian, Spanish, Romanian, Russian, Croatian, Polish, and +# Portuguese. + +OUTPUT_LANGUAGE = English + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = YES + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these class will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = YES + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. It is allowed to use relative paths in the argument list. + +STRIP_FROM_PATH = + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a class diagram (in Html and LaTeX) for classes with base or +# super classes. Setting the tag to NO turns the diagrams off. + +CLASS_DIAGRAMS = YES + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower case letters. If set to YES upper case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# users are adviced to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the JAVADOC_AUTOBRIEF tag is set to YES (the default) then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the Javadoc-style will +# behave just like the Qt-style comments. + +JAVADOC_AUTOBRIEF = YES + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# reimplements. + +INHERIT_DOCS = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 4 + +# The ENABLE_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. + +WARN_FORMAT = "$file:$line: $text" + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = . "readme.txt" + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +FILE_PATTERNS = *.h + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. + +INPUT_FILTER = + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = NO + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = . + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimised for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using a WORD or other. +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assigments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. Warning: This feature +# is still experimental and very incomplete. + +GENERATE_XML = NO + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_PREDEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_PREDEF_ONLY tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +#--------------------------------------------------------------------------- +# Configuration::addtions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES tag can be used to specify one or more tagfiles. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the ENABLE_PREPROCESSING, INCLUDE_GRAPH, and HAVE_DOT tags are set to +# YES then doxygen will generate a graph for each documented file showing +# the direct and indirect include dependencies of the file with other +# documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, INCLUDED_BY_GRAPH, and HAVE_DOT tags are set to +# YES then doxygen will generate a graph for each documented header file showing +# the documented files that directly or indirectly include this file + +INCLUDED_BY_GRAPH = YES + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found on the path. + +DOT_PATH = + +# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_WIDTH = 1024 + +# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_HEIGHT = 1024 + +#--------------------------------------------------------------------------- +# Configuration::addtions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO + +# The CGI_NAME tag should be the name of the CGI script that +# starts the search engine (doxysearch) with the correct parameters. +# A script with this name will be generated by doxygen. + +CGI_NAME = search.cgi + +# The CGI_URL tag should be the absolute URL to the directory where the +# cgi binaries are located. See the documentation of your http daemon for +# details. + +CGI_URL = + +# The DOC_URL tag should be the absolute URL to the directory where the +# documentation is located. If left blank the absolute path to the +# documentation, with file:// prepended to it, will be used. + +DOC_URL = + +# The DOC_ABSPATH tag should be the absolute path to the directory where the +# documentation is located. If left blank the directory on the local machine +# will be used. + +DOC_ABSPATH = + +# The BIN_ABSPATH tag must point to the directory where the doxysearch binary +# is installed. + +BIN_ABSPATH = /usr/local/bin/ + +# The EXT_DOC_PATHS tag can be used to specify one or more paths to +# documentation generated for other projects. This allows doxysearch to search +# the documentation for these projects as well. + +EXT_DOC_PATHS = diff --git a/ACM/tinyxml/makedistlinux b/ACM/tinyxml/makedistlinux new file mode 100644 index 0000000..eaff150 --- /dev/null +++ b/ACM/tinyxml/makedistlinux @@ -0,0 +1,34 @@ +echo "Making version: " +echo $1 +echo $2 +echo $3 + +rm ./docs/* + +doxygen dox +rm -rf ./tinyxml/* + +rm tinyxml_$1_$2_$3.zip +rm tinyxml_$1_$2_$3.tar.gz + +rmdir tinyxml +mkdir tinyxml + +cp readme.txt ./tinyxml +cp changes.txt ./tinyxml +cp Makefile ./tinyxml + +cp tinyxml.cpp tinyxml +cp tinyxmlerror.cpp tinyxml +cp tinyxmlparser.cpp tinyxml +cp xmltest.cpp tinyxml + +cp tinyxml.h tinyxml +cp tinyxml.dsp tinyxml + +mkdir ./tinyxml/docs +cp ./docs/* ./tinyxml/docs + +tar -zcf tinyxml_$1_$2_$3.tar.gz tinyxml +zip -r -q -9 tinyxml_$1_$2_$3.zip tinyxml + diff --git a/ACM/tinyxml/makedistwin.bat b/ACM/tinyxml/makedistwin.bat new file mode 100755 index 0000000..99a7b11 --- /dev/null +++ b/ACM/tinyxml/makedistwin.bat @@ -0,0 +1,19 @@ +del .\tinyxml_win\*.* +del .\docs\*.* + +doxygen dox +mkdir tinyxml_win + +copy readme.txt tinyxml_win +copy changes.txt tinyxml_win + +copy *.cpp tinyxml_win +copy *.h tinyxml_win +copy *.dsp tinyxml_win +copy test0.xml tinyxml_win +copy test1.xml tinyxml_win +copy test2.xml tinyxml_win + +mkdir .\tinyxml_win\docs +copy docs .\tinyxml_win\docs + diff --git a/ACM/tinyxml/readme.txt b/ACM/tinyxml/readme.txt new file mode 100644 index 0000000..c98c0f3 --- /dev/null +++ b/ACM/tinyxml/readme.txt @@ -0,0 +1,309 @@ +/** @mainpage + +

TinyXml

+ +TinyXml is a simple, small, C++ XML parser that can be easily +integrating into other programs. + + +

What it does.

+ +In brief, TinyXml parses an XML document, and builds from that a +Document Object Model that can be read, modified, and saved. + +XML stands for "eXtensible Markup Language." It allows you to create +your own document markups. Where HTML does a very good job of marking +documents for browsers, XML allows you to define any kind of document +markup, for example a document that describes a "to do" list for an +organizer application. XML is a very structured and convenient format. +All those random file formats created to store application data can +all be replaced with XML. One parser for everything. + +There are different ways to access and interact with XML data. +TinyXml uses a Document Object Model, meaning the XML data is parsed +into a tree objects that can be browsed and manipulated, and then +written back to disk. You can also construct an XML document from +scratch with C++ objects and write this to disk. + +TinyXml is designed to be easy and fast. It is one header and three cpp +files. Simply add these to your project and off you go. There is an +example to get you started. It is released under the ZLib license, +so you can use it in open source or commercial code. + +It attempts to be a flexible parser, but with truly correct and +compliant XML output (with the exception of the character set, +below.) TinyXml should compile on any reasonably C++ +system. It does not rely on exceptions or RTTI, and only uses the STL +string class. + + +

What it doesn't do.

+ +It doesn�t parse or use DTDs (Document Type Definitions) or XSL�s +(eXtensible Stylesheet Language.) It is limited to the ASCII +character set. There are other parsers out there (check out +www.sourceforge.org, search for XML) that are much more fully +featured. But they are also much bigger, take longer to set up in +your project, have a higher learning curve, and often have a more +restrictive license. If you are working with browsers or have more +complete XML needs, TinyXml is not the parser for you. + + +

Code Status.

+ +Currently in use, TinyXml is looking pretty stable. If you find +bugs, send them in and we'll get them straightened out as soon as possible. + +There are some areas of improvement; please check sourceforge if you are +interested in working on TinxXml. + + +

Changes between version 1 and 2

+ + +

Entities

+TinyXml recognizes the pre-defined "entity references", meaning special +characters. Namely: + +@verbatim + & & + < < + > > + " " + ' � +@endverbatim + +These are recognized when the XML document is read, and translated to there +ASCII equivalents. For instance, text with the XML of: + +@verbatim + Far & Away +@endverbatim + +will have the Value() of "Far & Away" when queried from the TiXmlText object, +but will be written back to the XML stream/file as an entitity. + +TiXml will ignore unknown entities and the +@verbatim +"&#x" +@endverbatim +entities, and leave them unprocessed. + + +

Streams

+TiXml has been modified to support both C (FILE) and C++ (operator <<,>>) +streams. There are some differences that you may need to be aware of. + +C style output: + - based on FILE* + - the Print() and SaveFile() methods + + Generates formatted output, with plenty of white space, intended to be as + human-readable as possible. They are very fast, and tolerant of ill formed + XML documents. For example, an XML document that contains 2 root elements + and 2 declarations, will print. + +C style input: + - based on FILE* + - the Parse() and LoadFile() methods + + A fast, tolerant read. Use whenever you don't need the C++ streams. + +C++ style ouput: + - based on std::ostream + - operator<< + + Generates condensed output, intended for network transmission rather than + readability. Depending on your system's implementation of the ostream class, + these may be somewhat slower. (Or may not.) Not tolerant of ill formed XML: + a document should contain the correct one root element. Additional root level + elements will not be streamed out. + +C++ style input: + - based on std::istream + - operator>> + + Reads XML from a stream, making it useful for network transmission. The tricky + part is knowing when the XML document is complete, since there will almost + certainly be other data in the stream. TinyXml will assume the XML data is + complete after it reads the root element. Also not that operator>> is somewhat + slower than Parse, due to both implementation of the STL and limitations of + TinyXml. + +

White space

+The world simply does not agree on whether white space should be kept, or condensed. +For example, pretend the '_' is a space, and look at "Hello____world". HTML, and +at least some XML parsers, will interpret this as "Hello_world". They condense white +space. Some XML parsers do not, and will leave it as "Hello____world". (Remember +to keep pretending the _ is a space.) + +It's an issue that hasn't been resolved to my satisfaction. TinyXml supports both +motifs. Call TiXmlBase::SetCondenseWhiteSpace( bool ) to set the desired behavior. +The default is to condense white space. + +If you change the default, you should call TiXmlBase::SetCondenseWhiteSpace( bool ) +before making any calls to Parse XML data, and I don't recommend changing it after +it has been set. + + +

Using and Installing

+ +To Compile and Run xmltest: + +A Linux Makefile and a Windows Visual C++ .dsp file is provided. +Simply compile and run. It will write the file demotest.xml to your +disk and generate output on the screen. It also tests walking the +DOM by printing out the number of nodes found using different +techniques. + +The Linux makefile is very generic and will +probably run on other systems, but is only tested on Linux. You no +longer need to run 'make depend'. The dependecies have been +hard coded. + + +To Use in an Application: + +Add tinyxml.cpp, tinyxml.h, tinyxmlerror.cpp, and tinyxmlparser.cpp to your +project or make file. That's it! It should compile on any reasonably +compliant C++ system. You do not need to enable exceptions or +RTTI for TinyXml. + + +

Where it may go.

+ +At this point, I'm focusing on tightening up remaining issues. +Bug fixes (though comfortably rare) and minor interface +corrections. + +There are some "it would be nice if..." items. I'll keep those +posted as tasks on SourceForge. (www.sourceforge.net/projects/tinyxml) + + +

How TinyXml works.

+ +An example is probably the best way to go. Take: +@verbatim + + + + Go to the Toy store! + Do bills + +@endverbatim + +It�s not much of a To Do list, but it will do. To read this file +(say "demo.xml") you would create a document, and parse it in: +@verbatim + TiXmlDocument doc( "demo.xml" ); + doc.LoadFile(); +@endverbatim + +And it�s ready to go. Now let�s look at some lines and how they +relate to the DOM. + + + + The first line is a declaration, and gets turned into the + TiXmlDeclaration class. It will be the first child of the + document node. + + This is the only directive/special tag parsed by by TinyXml. + Generally directive targs are stored in TiXmlUnknown so the + commands won�t be lost when it is saved back to disk. + + + + A comment. Will become a TiXmlComment object. + + + + The ToDo tag defines a TiXmlElement object. This one does not have + any attributes, but will contain 2 other elements, both of which + are items. + + + + Creates another TiXmlElement which is a child of the "ToDo" element. + This element has 1 attribute, with the name �priority� and the value + �1�. + +Go to the + + A TiXmlText. This is a leaf node and cannot contain other nodes. + It is a child of the �Item" Element. + + + + Another TiXmlElement, this one a child of the "Item" element. + +Etc. + +Looking at the entire object tree, you end up with: +@verbatim +TiXmlDocument "demo.xml" + TiXmlDeclaration "version='1.0'" "standalone=�no�" + TiXmlComment " Our to do list data" + TiXmlElement "ToDo" + TiXmlElement "Item" Attribtutes: priority = 1 + TiXmlText "Go to the " + TiXmlElement "bold" + TiXmlText "Toy store!" + TiXmlElement "Item" Attributes: priority=2 + TiXmlText "bills" +@endverbatim + +

Contributors

+ +Thanks very much to everyone who sends suggestions, bugs, ideas, and +encouragement. It all helps, and makes this project fun. A special thanks +to the contributors on the web pages that keep it lively. + +So many people have sent in bugs and ideas, that rather than list here I +try to give credit due in the "changes.txt" file. + +

Documentation

+ +The documentation is build with Doxygen, using the 'dox' +configuration file. + +

License

+ +TinyXml is released under the zlib license: + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. + +

References

+ +The World Wide Web Consortium is the definitive standard body for +XML, and there web pages contain huge amounts of information. I also +recommend "XML Pocket Reference" by Robert Eckstein and published by +O�Reilly. + +

Contact Me:

+ +I�d appreciates your suggestions, and would love to know if you +use TinyXml. I hope you enjoy it and find it useful. Please post +questions, comments, file bugs, or contact me at: + +www.sourceforge.net/projects/tinyxml + +Lee Thomason +*/ diff --git a/ACM/tinyxml/tinyxml.cpp b/ACM/tinyxml/tinyxml.cpp new file mode 100644 index 0000000..981131e --- /dev/null +++ b/ACM/tinyxml/tinyxml.cpp @@ -0,0 +1,1007 @@ +/* +Copyright (c) 2000 Lee Thomason (www.grinninglizard.com) + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. +*/ + +#include +#include +#include +#include "tinyxml.h" +using namespace std; + + +bool TiXmlBase::condenseWhiteSpace = true; + + +void TiXmlBase::PutString( const std::string& str, std::ostream* stream ) +{ + // Scan for the all important '&' + unsigned int i=0, j=0; + + while ( i < str.length() ) + { + unsigned next = str.find( '&', i ); + + if ( next == string::npos ) + { + stream->write( &str.at( i ), str.length() - i ); + return; + } + + // We found an entity. + if ( next - i > 0 ) + stream->write( &str.at( i ), next - i ); + i = next; + + // Check for the special "&#x" entitity + if ( i < str.length() - 2 + && str[i] == '&' + && str[i+1] == '#' + && str[i+2] == 'x' ) + { + stream->put( str[i] ); + } + else + { + for ( j=0; jwrite( entity[j].str, entity[j].strLength ); + break; + } + } + if ( j == NUM_ENTITY ) + { + stream->put( str[i] ); + } + } + ++i; + } +} + + +TiXmlNode::TiXmlNode( NodeType _type ) +{ + parent = 0; + type = _type; + firstChild = 0; + lastChild = 0; + prev = 0; + next = 0; +} + + +TiXmlNode::~TiXmlNode() +{ + TiXmlNode* node = firstChild; + TiXmlNode* temp = 0; + + while ( node ) + { + temp = node; + node = node->next; + delete temp; + } +} + + +void TiXmlNode::Clear() +{ + TiXmlNode* node = firstChild; + TiXmlNode* temp = 0; + + while ( node ) + { + temp = node; + node = node->next; + delete temp; + } + + firstChild = 0; + lastChild = 0; +} + + +TiXmlNode* TiXmlNode::LinkEndChild( TiXmlNode* node ) +{ + node->parent = this; + + node->prev = lastChild; + node->next = 0; + + if ( lastChild ) + lastChild->next = node; + else + firstChild = node; // it was an empty list. + + lastChild = node; + return node; +} + + +TiXmlNode* TiXmlNode::InsertEndChild( const TiXmlNode& addThis ) +{ + TiXmlNode* node = addThis.Clone(); + if ( !node ) + return 0; + + return LinkEndChild( node ); +} + + +TiXmlNode* TiXmlNode::InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis ) +{ + if ( beforeThis->parent != this ) + return 0; + + TiXmlNode* node = addThis.Clone(); + if ( !node ) + return 0; + node->parent = this; + + node->next = beforeThis; + node->prev = beforeThis->prev; + beforeThis->prev->next = node; + beforeThis->prev = node; + return node; +} + + +TiXmlNode* TiXmlNode::InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis ) +{ + if ( afterThis->parent != this ) + return 0; + + TiXmlNode* node = addThis.Clone(); + if ( !node ) + return 0; + node->parent = this; + + node->prev = afterThis; + node->next = afterThis->next; + afterThis->next->prev = node; + afterThis->next = node; + return node; +} + + +TiXmlNode* TiXmlNode::ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis ) +{ + if ( replaceThis->parent != this ) + return 0; + + TiXmlNode* node = withThis.Clone(); + if ( !node ) + return 0; + + node->next = replaceThis->next; + node->prev = replaceThis->prev; + + if ( replaceThis->next ) + replaceThis->next->prev = node; + else + lastChild = node; + + if ( replaceThis->prev ) + replaceThis->prev->next = node; + else + firstChild = node; + + delete replaceThis; + node->parent = this; + return node; +} + + +bool TiXmlNode::RemoveChild( TiXmlNode* removeThis ) +{ + if ( removeThis->parent != this ) + { + assert( 0 ); + return false; + } + + if ( removeThis->next ) + removeThis->next->prev = removeThis->prev; + else + lastChild = removeThis->prev; + + if ( removeThis->prev ) + removeThis->prev->next = removeThis->next; + else + firstChild = removeThis->next; + + delete removeThis; + return true; +} + + +TiXmlNode* TiXmlNode::FirstChild( const std::string& value ) const +{ + TiXmlNode* node; + for ( node = firstChild; node; node = node->next ) + { + if ( node->Value() == value ) + return node; + } + return 0; +} + + +TiXmlNode* TiXmlNode::LastChild( const std::string& value ) const +{ + TiXmlNode* node; + for ( node = lastChild; node; node = node->prev ) + { + if ( node->Value() == value ) + return node; + } + return 0; +} + + +TiXmlNode* TiXmlNode::IterateChildren( TiXmlNode* previous ) const +{ + if ( !previous ) + { + return FirstChild(); + } + else + { + assert( previous->parent == this ); + return previous->NextSibling(); + } +} + + +TiXmlNode* TiXmlNode::IterateChildren( const std::string& val, TiXmlNode* previous ) const +{ + if ( !previous ) + { + return FirstChild( val ); + } + else + { + assert( previous->parent == this ); + return previous->NextSibling( val ); + } +} + + +TiXmlNode* TiXmlNode::NextSibling( const std::string& value ) const +{ + TiXmlNode* node; + for ( node = next; node; node = node->next ) + { + if ( node->Value() == value ) + return node; + } + return 0; +} + + +TiXmlNode* TiXmlNode::PreviousSibling( const std::string& value ) const +{ + TiXmlNode* node; + for ( node = prev; node; node = node->prev ) + { + if ( node->Value() == value ) + return node; + } + return 0; +} + + +void TiXmlElement::RemoveAttribute( const std::string& name ) +{ + TiXmlAttribute* node = attributeSet.Find( name ); + if ( node ) + { + attributeSet.Remove( node ); + delete node; + } +} + + +TiXmlElement* TiXmlNode::FirstChildElement() const +{ + TiXmlNode* node; + + for ( node = FirstChild(); + node; + node = node->NextSibling() ) + { + if ( node->ToElement() ) + return node->ToElement(); + } + return 0; +} + + +TiXmlElement* TiXmlNode::FirstChildElement( const std::string& value ) const +{ + TiXmlNode* node; + + for ( node = FirstChild( value ); + node; + node = node->NextSibling( value ) ) + { + if ( node->ToElement() ) + return node->ToElement(); + } + return 0; +} + + +TiXmlElement* TiXmlNode::NextSiblingElement() const +{ + TiXmlNode* node; + + for ( node = NextSibling(); + node; + node = node->NextSibling() ) + { + if ( node->ToElement() ) + return node->ToElement(); + } + return 0; +} + + +TiXmlElement* TiXmlNode::NextSiblingElement( const std::string& value ) const +{ + TiXmlNode* node; + + for ( node = NextSibling( value ); + node; + node = node->NextSibling( value ) ) + { + if ( node->ToElement() ) + return node->ToElement(); + } + return 0; +} + + + +TiXmlDocument* TiXmlNode::GetDocument() const +{ + const TiXmlNode* node; + + for( node = this; node; node = node->parent ) + { + if ( node->ToDocument() ) + return node->ToDocument(); + } + return 0; +} + + +// TiXmlElement::TiXmlElement() +// : TiXmlNode( TiXmlNode::ELEMENT ) +// { +// } + +TiXmlElement::TiXmlElement( const std::string& _value ) + : TiXmlNode( TiXmlNode::ELEMENT ) +{ + firstChild = lastChild = 0; + value = _value; +} + +TiXmlElement::~TiXmlElement() +{ + while( attributeSet.First() ) + { + TiXmlAttribute* node = attributeSet.First(); + attributeSet.Remove( node ); + delete node; + } +} + +const std::string* TiXmlElement::Attribute( const std::string& name ) const +{ + TiXmlAttribute* node = attributeSet.Find( name ); + + if ( node ) + return &(node->Value() ); + + return 0; +} + + +const std::string* TiXmlElement::Attribute( const std::string& name, int* i ) const +{ + const std::string* s = Attribute( name ); + if ( s ) + *i = atoi( s->c_str() ); + else + *i = 0; + return s; +} + + +void TiXmlElement::SetAttribute( const std::string& name, int val ) +{ + char buf[64]; + sprintf( buf, "%d", val ); + + std::string v = buf; + + SetAttribute( name, v ); +} + + +void TiXmlElement::SetAttribute( const std::string& name, const std::string& value ) +{ + TiXmlAttribute* node = attributeSet.Find( name ); + if ( node ) + { + node->SetValue( value ); + return; + } + + TiXmlAttribute* attrib = new TiXmlAttribute( name, value ); + if ( attrib ) + { + attributeSet.Add( attrib ); + } + else + { + TiXmlDocument* document = GetDocument(); + if ( document ) document->SetError( TIXML_ERROR_OUT_OF_MEMORY ); + } +} + + +void TiXmlElement::Print( FILE* cfile, int depth ) const +{ + int i; + for ( i=0; iNext() ) + { + fprintf( cfile, " " ); + attrib->Print( cfile, depth ); + } + + // There are 3 different formatting approaches: + // 1) An element without children is printed as a node + // 2) An element with only a text child is printed as text + // 3) An element with children is printed on multiple lines. + TiXmlNode* node; + if ( !firstChild ) + { + fprintf( cfile, " />" ); + } + else if ( firstChild == lastChild && firstChild->ToText() ) + { + fprintf( cfile, ">" ); + firstChild->Print( cfile, depth + 1 ); + fprintf( cfile, "", value.c_str() ); + } + else + { + fprintf( cfile, ">" ); + + for ( node = firstChild; node; node=node->NextSibling() ) + { + if ( !node->ToText() ) + { + fprintf( cfile, "\n" ); + } + node->Print( cfile, depth+1 ); + } + fprintf( cfile, "\n" ); + for( i=0; i", value.c_str() ); + } +} + + +void TiXmlElement::StreamOut( std::ostream* stream ) const +{ + (*stream) << "<" << value; + + TiXmlAttribute* attrib; + for ( attrib = attributeSet.First(); attrib; attrib = attrib->Next() ) + { + (*stream) << " "; + attrib->StreamOut( stream ); + } + + // If this node has children, give it a closing tag. Else + // make it an empty tag. + TiXmlNode* node; + if ( firstChild ) + { + (*stream) << ">"; + + for ( node = firstChild; node; node=node->NextSibling() ) + { + node->StreamOut( stream ); + } + (*stream) << ""; + } + else + { + (*stream) << " />"; + } +} + + +TiXmlNode* TiXmlElement::Clone() const +{ + TiXmlElement* clone = new TiXmlElement( Value() ); + + if ( !clone ) + return 0; + + CopyToClone( clone ); + + // Clone the attributes, then clone the children. + TiXmlAttribute* attribute = 0; + for( attribute = attributeSet.First(); + attribute; + attribute = attribute->Next() ) + { + clone->SetAttribute( attribute->Name(), attribute->Value() ); + } + + TiXmlNode* node = 0; + for ( node = firstChild; node; node = node->NextSibling() ) + { + clone->LinkEndChild( node->Clone() ); + } + return clone; +} + + +TiXmlDocument::TiXmlDocument() : TiXmlNode( TiXmlNode::DOCUMENT ) +{ + error = false; +// ignoreWhiteSpace = true; +} + + +TiXmlDocument::TiXmlDocument( const std::string& documentName ) : TiXmlNode( TiXmlNode::DOCUMENT ) +{ +// ignoreWhiteSpace = true; + value = documentName; + error = false; +} + + +bool TiXmlDocument::LoadFile() +{ + return LoadFile( value ); +} + + +bool TiXmlDocument::SaveFile() const +{ + return SaveFile( value ); +} + + +bool TiXmlDocument::LoadFile( const std::string& filename ) +{ + // Delete the existing data: + Clear(); + value = filename; + + FILE* file = fopen( filename.c_str(), "r" ); + + if ( file ) + { + // Get the file size, so we can pre-allocate the string. HUGE speed impact. + long length = 0; + fseek( file, 0, SEEK_END ); + length = ftell( file ); + fseek( file, 0, SEEK_SET ); + + // If we have a file, assume it is all one big XML file, and read it in. + // The document parser may decide the document ends sooner than the entire file, however. + std::string data; + data.reserve( length ); + + const int BUF_SIZE = 2048; + char buf[BUF_SIZE]; + + while( fgets( buf, BUF_SIZE, file ) ) + { + data += buf; + } + fclose( file ); + + Parse( data.c_str() ); + if ( !Error() ) + { + return true; + } + } + SetError( TIXML_ERROR_OPENING_FILE ); + return false; +} + + +bool TiXmlDocument::SaveFile( const std::string& filename ) const +{ + // The old c stuff lives on... + FILE* fp = fopen( filename.c_str(), "w" ); + if ( fp ) + { + Print( fp, 0 ); + fclose( fp ); + return true; + } + return false; +} + + +TiXmlNode* TiXmlDocument::Clone() const +{ + TiXmlDocument* clone = new TiXmlDocument(); + if ( !clone ) + return 0; + + CopyToClone( clone ); + clone->error = error; + clone->errorDesc = errorDesc; + + TiXmlNode* node = 0; + for ( node = firstChild; node; node = node->NextSibling() ) + { + clone->LinkEndChild( node->Clone() ); + } + return clone; +} + + +void TiXmlDocument::Print( FILE* cfile, int depth ) const +{ + TiXmlNode* node; + for ( node=FirstChild(); node; node=node->NextSibling() ) + { + node->Print( cfile, depth ); + fprintf( cfile, "\n" ); + } +} + + +void TiXmlDocument::StreamOut( std::ostream* out ) const +{ + TiXmlNode* node; + for ( node=FirstChild(); node; node=node->NextSibling() ) + { + node->StreamOut( out ); + + // Special rule for streams: stop after the root element. + // The stream in code will only read one element, so don't + // write more than one. + if ( node->ToElement() ) + break; + } +} + + +TiXmlAttribute* TiXmlAttribute::Next() const +{ + // We are using knowledge of the sentinel. The sentinel + // have a value or name. + if ( next->value.empty() && next->name.empty() ) + return 0; + return next; +} + + +TiXmlAttribute* TiXmlAttribute::Previous() const +{ + // We are using knowledge of the sentinel. The sentinel + // have a value or name. + if ( prev->value.empty() && prev->name.empty() ) + return 0; + return prev; +} + + +void TiXmlAttribute::Print( FILE* cfile, int /*depth*/ ) const +{ + ostringstream stream( ostringstream::out ); + stream.str().reserve( 500 ); + + StreamOut( &stream ); + fprintf( cfile, "%s", stream.str().c_str() ); +} + + +void TiXmlAttribute::StreamOut( std::ostream* stream ) const +{ + if ( value.find( '\"' ) != std::string::npos ) + { + PutString( name, stream ); + (*stream) << "=" << "'"; + PutString( value, stream ); + (*stream) << "'"; + } + else + { + PutString( name, stream ); + (*stream) << "=" << "\""; + PutString( value, stream ); + (*stream) << "\""; + } +} + + +void TiXmlAttribute::SetIntValue( int value ) +{ + std::string s; + std::ostringstream stream( s ); + stream << value; + SetValue( stream.str() ); +} + + +void TiXmlAttribute::SetDoubleValue( double value ) +{ + std::string s; + std::ostringstream stream( s ); + stream << value; + SetValue( stream.str() ); +} + + +const int TiXmlAttribute::IntValue() const +{ + int v; + std::istringstream string( value ); + string >> v; + return v; +} + + +const double TiXmlAttribute::DoubleValue() const +{ + double v; + std::istringstream string( value ); + string >> v; + return v; +} + + +void TiXmlComment::Print( FILE* cfile, int depth ) const +{ + ostringstream stream( ostringstream::out ); + stream.str().reserve( 1000 ); + + for ( int i=0; i"; +} + + +TiXmlNode* TiXmlComment::Clone() const +{ + TiXmlComment* clone = new TiXmlComment(); + + if ( !clone ) + return 0; + + CopyToClone( clone ); + return clone; +} + + +void TiXmlText::Print( FILE* cfile, int depth ) const +{ + ostringstream stream( ostringstream::out ); + stream.str().reserve( 1000 ); + StreamOut( &stream ); + fprintf( cfile, "%s", stream.str().c_str() ); +} + + +void TiXmlText::StreamOut( std::ostream* stream ) const +{ + PutString( value, stream ); +} + + +TiXmlNode* TiXmlText::Clone() const +{ + TiXmlText* clone = 0; + clone = new TiXmlText( "" ); + + if ( !clone ) + return 0; + + CopyToClone( clone ); + return clone; +} + + +TiXmlDeclaration::TiXmlDeclaration( const std::string& _version, + const std::string& _encoding, + const std::string& _standalone ) + : TiXmlNode( TiXmlNode::DECLARATION ) +{ + version = _version; + encoding = _encoding; + standalone = _standalone; +} + + +void TiXmlDeclaration::Print( FILE* cfile, int depth ) const +{ + ostringstream stream( ostringstream::out ); + stream.str().reserve( 200 ); + StreamOut( &stream ); + fprintf( cfile, "%s", stream.str().c_str() ); +} + + +void TiXmlDeclaration::StreamOut( std::ostream* stream ) const +{ + (*stream) << ""; +} + + +TiXmlNode* TiXmlDeclaration::Clone() const +{ + TiXmlDeclaration* clone = new TiXmlDeclaration(); + + if ( !clone ) + return 0; + + CopyToClone( clone ); + clone->version = version; + clone->encoding = encoding; + clone->standalone = standalone; + return clone; +} + + +void TiXmlUnknown::Print( FILE* cfile, int depth ) const +{ + ostringstream stream( ostringstream::out ); + stream.str().reserve( 200 ); + StreamOut( &stream ); + + for ( int i=0; i"; // Don't use entities hear! It is unknown. +} + + +TiXmlNode* TiXmlUnknown::Clone() const +{ + TiXmlUnknown* clone = new TiXmlUnknown(); + + if ( !clone ) + return 0; + + CopyToClone( clone ); + return clone; +} + + +TiXmlAttributeSet::TiXmlAttributeSet() +{ + sentinel.next = &sentinel; + sentinel.prev = &sentinel; +} + + +TiXmlAttributeSet::~TiXmlAttributeSet() +{ + assert( sentinel.next == &sentinel ); + assert( sentinel.prev == &sentinel ); +} + + +void TiXmlAttributeSet::Add( TiXmlAttribute* addMe ) +{ + assert( !Find( addMe->Name() ) ); // Shouldn't be multiply adding to the set. + + addMe->next = &sentinel; + addMe->prev = sentinel.prev; + + sentinel.prev->next = addMe; + sentinel.prev = addMe; +} + +void TiXmlAttributeSet::Remove( TiXmlAttribute* removeMe ) +{ + TiXmlAttribute* node; + + for( node = sentinel.next; node != &sentinel; node = node->next ) + { + if ( node == removeMe ) + { + node->prev->next = node->next; + node->next->prev = node->prev; + node->next = 0; + node->prev = 0; + return; + } + } + assert( 0 ); // we tried to remove a non-linked attribute. +} + + +TiXmlAttribute* TiXmlAttributeSet::Find( const std::string& name ) const +{ + TiXmlAttribute* node; + + for( node = sentinel.next; node != &sentinel; node = node->next ) + { + if ( node->Name() == name ) + return node; + } + return 0; +} + diff --git a/ACM/tinyxml/tinyxml.h b/ACM/tinyxml/tinyxml.h new file mode 100644 index 0000000..b9f1205 --- /dev/null +++ b/ACM/tinyxml/tinyxml.h @@ -0,0 +1,804 @@ +/* +Copyright (c) 2000 Lee Thomason (www.grinninglizard.com) + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. +*/ + + +#ifndef TINYXML_INCLUDED +#define TINYXML_INCLUDED + +#pragma warning( disable : 4530 ) +#pragma warning( disable : 4786 ) + +#include +#include +#include + +class TiXmlDocument; +class TiXmlElement; +class TiXmlComment; +class TiXmlUnknown; +class TiXmlAttribute; +class TiXmlText; +class TiXmlDeclaration; + + +// Help out windows: +#if defined( _DEBUG ) && !defined( DEBUG ) + #define DEBUG +#endif + +#if defined( DEBUG ) && defined( _MSC_VER ) + #include + #define TIXML_LOG OutputDebugString +#else + #define TIXML_LOG printf +#endif + + +/** TiXmlBase is a base class for every class in TinyXml. + It does little except to establish that TinyXml classes + can be printed and provide some utility functions. + + In XML, the document and elements can contain + other elements and other types of nodes. + + @verbatim + A Document can contain: Element (container or leaf) + Comment (leaf) + Unknown (leaf) + Declaration( leaf ) + + An Element can contain: Element (container or leaf) + Text (leaf) + Attributes (not on tree) + Comment (leaf) + Unknown (leaf) + + A Decleration contains: Attributes (not on tree) + @endverbatim +*/ +class TiXmlBase +{ + friend class TiXmlNode; + friend class TiXmlElement; + friend class TiXmlDocument; + + public: + TiXmlBase() {} + virtual ~TiXmlBase() {} + + /** All TinyXml classes can print themselves to a filestream. + This is a formatted print, and will insert tabs and newlines. + + (For an unformatted stream, use the << operator.) + */ + virtual void Print( FILE* cfile, int depth ) const = 0; + + // [internal] Underlying implementation of the operator << + virtual void StreamOut ( std::ostream* out ) const = 0; + + /** The world does not agree on whether white space should be kept or + not. In order to make everyone happy, these global, static functions + are provided to set whether or not TinyXml will condense all white space + into a single space or not. The default is to condense. Note changing these + values is not thread safe. + */ + static void SetCondenseWhiteSpace( bool condense ) { condenseWhiteSpace = condense; } + + /// Return the current white space setting. + static bool IsWhiteSpaceCondensed() { return condenseWhiteSpace; } + + protected: + static const char* SkipWhiteSpace( const char* ); + static bool StreamWhiteSpace( std::istream* in, std::string* tag ); + static bool IsWhiteSpace( int c ) { return ( isspace( c ) || c == '\n' || c == '\r' ); } + + /* Read to the specified character. + Returns true if the character found and no error. + */ + static bool StreamTo( std::istream* in, int character, std::string* tag ); + + /* Reads an XML name into the string provided. Returns + a pointer just past the last character of the name, + or 0 if the function has an error. + */ + static const char* ReadName( const char*, std::string* name ); + + /* Reads text. Returns a pointer past the given end tag. + Wickedly complex options, but it keeps the (sensitive) code in one place. + */ + static const char* ReadText( const char* in, // where to start + std::string* text, // the string read + bool ignoreWhiteSpace, // whether to keep the white space + const char* endTag, // what ends this text + bool ignoreCase ); // whether to ignore case in the end tag + + virtual const char* Parse( const char* p ) = 0; + + // If an entity has been found, transform it into a character. + static const char* GetEntity( const char* in, char* value ); + + // Get a character, while interpreting entities. + inline static const char* GetChar( const char* p, char* value ) + { + assert( p ); + if ( *p == '&' ) + { + return GetEntity( p, value ); + } + else + { + *value = *p; + return p+1; + } + } + + // Puts a string to a stream, expanding entities as it goes. + // Note this should not contian the '<', '>', etc, or they will be transformed into entities! + static void PutString( const std::string& str, std::ostream* stream ); + + // Return true if the next characters in the stream are any of the endTag sequences. + bool static StringEqual( const char* p, + const char* endTag, + bool ignoreCase ); + + + enum + { + TIXML_NO_ERROR = 0, + TIXML_ERROR, + TIXML_ERROR_OPENING_FILE, + TIXML_ERROR_OUT_OF_MEMORY, + TIXML_ERROR_PARSING_ELEMENT, + TIXML_ERROR_FAILED_TO_READ_ELEMENT_NAME, + TIXML_ERROR_READING_ELEMENT_VALUE, + TIXML_ERROR_READING_ATTRIBUTES, + TIXML_ERROR_PARSING_EMPTY, + TIXML_ERROR_READING_END_TAG, + TIXML_ERROR_PARSING_UNKNOWN, + TIXML_ERROR_PARSING_COMMENT, + TIXML_ERROR_PARSING_DECLARATION, + TIXML_ERROR_DOCUMENT_EMPTY, + + TIXML_ERROR_STRING_COUNT + }; + static const char* errorString[ TIXML_ERROR_STRING_COUNT ]; + + private: + struct Entity + { + const char* str; + unsigned int strLength; + int chr; + }; + enum + { + NUM_ENTITY = 5, + MAX_ENTITY_LENGTH = 6 + + }; + static Entity entity[ NUM_ENTITY ]; + static bool condenseWhiteSpace; +}; + + +/** The parent class for everything in the Document Object Model. + (Except for attributes, which are contained in elements.) + Nodes have siblings, a parent, and children. A node can be + in a document, or stand on its own. The type of a TiXmlNode + can be queried, and it can be cast to its more defined type. +*/ +class TiXmlNode : public TiXmlBase +{ + public: + + /** An output stream operator, for every class. Note that this outputs + without any newlines or formatting, as opposed to Print(), which + includes tabs and new lines. + + The operator<< and operator>> are not completely symmetric. Writing + a node to a stream is very well defined. You'll get a nice stream + of output, without any extra whitespace or newlines. + + But reading is not as well defined. (As it always is.) If you create + a TiXmlElement (for example) and read that from an input stream, + the text needs to define an element or junk will result. This is + true of all input streams, but it's worth keeping in mind. + + A TiXmlDocument will read nodes until it reads a root element. + */ + friend std::ostream& operator<< ( std::ostream& out, const TiXmlNode& base ) + { + base.StreamOut( &out ); + return out; + } + + /** An input stream operator, for every class. Tolerant of newlines and + formatting, but doesn't expect them. + */ + friend std::istream& operator>> ( std::istream& in, TiXmlNode& base ) + { + std::string tag; + tag.reserve( 8 * 1000 ); + base.StreamIn( &in, &tag ); + + base.Parse( tag.c_str() ); + return in; + } + + /** The types of XML nodes supported by TinyXml. (All the + unsupported types are picked up by UNKNOWN.) + */ + enum NodeType + { + DOCUMENT, + ELEMENT, + COMMENT, + UNKNOWN, + TEXT, + DECLARATION, + TYPECOUNT + }; + + virtual ~TiXmlNode(); + + /** The meaning of 'value' changes for the specific type of + TiXmlNode. + @verbatim + Document: filename of the xml file + Element: name of the element + Comment: the comment text + Unknown: the tag contents + Text: the text string + @endverbatim + + The subclasses will wrap this function. + */ + const std::string& Value() const { return value; } + + /** Changes the value of the node. Defined as: + @verbatim + Document: filename of the xml file + Element: name of the element + Comment: the comment text + Unknown: the tag contents + Text: the text string + @endverbatim + */ + void SetValue( const std::string& _value ) { value = _value; } + + /// Delete all the children of this node. Does not affect 'this'. + void Clear(); + + /// One step up the DOM. + TiXmlNode* Parent() const { return parent; } + + TiXmlNode* FirstChild() const { return firstChild; } ///< The first child of this node. Will be null if there are no children. + TiXmlNode* FirstChild( const std::string& value ) const; ///< The first child of this node with the matching 'value'. Will be null if none found. + + TiXmlNode* LastChild() const { return lastChild; } /// The last child of this node. Will be null if there are no children. + TiXmlNode* LastChild( const std::string& value ) const; /// The last child of this node matching 'value'. Will be null if there are no children. + + /** An alternate way to walk the children of a node. + One way to iterate over nodes is: + @verbatim + for( child = parent->FirstChild(); child; child = child->NextSibling() ) + @endverbatim + + IterateChildren does the same thing with the syntax: + @verbatim + child = 0; + while( child = parent->IterateChildren( child ) ) + @endverbatim + + IterateChildren takes the previous child as input and finds + the next one. If the previous child is null, it returns the + first. IterateChildren will return null when done. + */ + TiXmlNode* IterateChildren( TiXmlNode* previous ) const; + + /// This flavor of IterateChildren searches for children with a particular 'value' + TiXmlNode* IterateChildren( const std::string& value, TiXmlNode* previous ) const; + + /** Add a new node related to this. Adds a child past the LastChild. + Returns a pointer to the new object or NULL if an error occured. + */ + TiXmlNode* InsertEndChild( const TiXmlNode& addThis ); + + /** Add a new node related to this. Adds a child before the specified child. + Returns a pointer to the new object or NULL if an error occured. + */ + TiXmlNode* InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis ); + + /** Add a new node related to this. Adds a child after the specified child. + Returns a pointer to the new object or NULL if an error occured. + */ + TiXmlNode* InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis ); + + /** Replace a child of this node. + Returns a pointer to the new object or NULL if an error occured. + */ + TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis ); + + /// Delete a child of this node. + bool RemoveChild( TiXmlNode* removeThis ); + + /// Navigate to a sibling node. + TiXmlNode* PreviousSibling() const { return prev; } + + /// Navigate to a sibling node. + TiXmlNode* PreviousSibling( const std::string& ) const; + + /// Navigate to a sibling node. + TiXmlNode* NextSibling() const { return next; } + + /// Navigate to a sibling node with the given 'value'. + TiXmlNode* NextSibling( const std::string& ) const; + + /** Convenience function to get through elements. + Calls NextSibling and ToElement. Will skip all non-Element + nodes. Returns 0 if there is not another element. + */ + TiXmlElement* NextSiblingElement() const; + + /** Convenience function to get through elements. + Calls NextSibling and ToElement. Will skip all non-Element + nodes. Returns 0 if there is not another element. + */ + TiXmlElement* NextSiblingElement( const std::string& ) const; + + /// Convenience function to get through elements. + TiXmlElement* FirstChildElement() const; + + /// Convenience function to get through elements. + TiXmlElement* FirstChildElement( const std::string& value ) const; + + /// Query the type (as an enumerated value, above) of this node. + virtual int Type() const { return type; } + + /** Return a pointer to the Document this node lives in. + Returns null if not in a document. + */ + TiXmlDocument* GetDocument() const; + + /// Returns true if this node has no children. + bool NoChildren() const { return !firstChild; } + + TiXmlDocument* ToDocument() const { return ( this && type == DOCUMENT ) ? (TiXmlDocument*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. + TiXmlElement* ToElement() const { return ( this && type == ELEMENT ) ? (TiXmlElement*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. + TiXmlComment* ToComment() const { return ( this && type == COMMENT ) ? (TiXmlComment*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. + TiXmlUnknown* ToUnknown() const { return ( this && type == UNKNOWN ) ? (TiXmlUnknown*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. + TiXmlText* ToText() const { return ( this && type == TEXT ) ? (TiXmlText*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. + TiXmlDeclaration* ToDeclaration() const { return ( this && type == DECLARATION ) ? (TiXmlDeclaration*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. + + virtual TiXmlNode* Clone() const = 0; + + // The real work of the input operator. + virtual void StreamIn( std::istream* in, std::string* tag ) = 0; + + protected: + TiXmlNode( NodeType type ); + + // The node is passed in by ownership. This object will delete it. + TiXmlNode* LinkEndChild( TiXmlNode* addThis ); + + // Figure out what is at *p, and parse it. Returns null if it is not an xml node. + TiXmlNode* Identify( const char* start ); + + void CopyToClone( TiXmlNode* target ) const { target->value = value; } + + TiXmlNode* parent; + NodeType type; + + TiXmlNode* firstChild; + TiXmlNode* lastChild; + + std::string value; + + TiXmlNode* prev; + TiXmlNode* next; +}; + + +/** An attribute is a name-value pair. Elements have an arbitrary + number of attributes, each with a unique name. + + @note The attributes are not TiXmlNodes, since they are not + part of the tinyXML document object model. There are other + suggested ways to look at this problem. + + @note Attributes have a parent +*/ +class TiXmlAttribute : public TiXmlBase +{ + friend class TiXmlAttributeSet; + + public: + /// Construct an empty attribute. + TiXmlAttribute() : prev( 0 ), next( 0 ) {} + + /// Construct an attribute with a name and value. + TiXmlAttribute( const std::string& _name, const std::string& _value ) : name( _name ), value( _value ), prev( 0 ), next( 0 ) {} + + const std::string& Name() const { return name; } ///< Return the name of this attribute. + + const std::string& Value() const { return value; } ///< Return the value of this attribute. + const int IntValue() const; ///< Return the value of this attribute, converted to an integer. + const double DoubleValue() const; ///< Return the value of this attribute, converted to a double. + + void SetName( const std::string& _name ) { name = _name; } ///< Set the name of this attribute. + void SetValue( const std::string& _value ) { value = _value; } ///< Set the value. + void SetIntValue( int value ); ///< Set the value from an integer. + void SetDoubleValue( double value ); ///< Set the value from a double. + + /// Get the next sibling attribute in the DOM. Returns null at end. + TiXmlAttribute* Next() const; + /// Get the previous sibling attribute in the DOM. Returns null at beginning. + TiXmlAttribute* Previous() const; + + bool operator==( const TiXmlAttribute& rhs ) const { return rhs.name == name; } + bool operator<( const TiXmlAttribute& rhs ) const { return name < rhs.name; } + bool operator>( const TiXmlAttribute& rhs ) const { return name > rhs.name; } + + /* [internal use] + Attribtue parsing starts: first letter of the name + returns: the next char after the value end quote + */ + virtual const char* Parse( const char* p ); + + // [internal use] + virtual void Print( FILE* cfile, int depth ) const; + + // [internal use] + virtual void StreamOut( std::ostream* out ) const; + + // [internal use] + // Set the document pointer so the attribute can report errors. + void SetDocument( TiXmlDocument* doc ) { document = doc; } + + private: + TiXmlDocument* document; // A pointer back to a document, for error reporting. + std::string name; + std::string value; + + TiXmlAttribute* prev; + TiXmlAttribute* next; +}; + + +/* A class used to manage a group of attributes. + It is only used internally, both by the ELEMENT and the DECLARATION. + + The set can be changed transparent to the Element and Declaration + classes that use it, but NOT transparent to the Attribute + which has to implement a next() and previous() method. Which makes + it a bit problematic and prevents the use of STL. + + This version is implemented with circular lists because: + - I like circular lists + - it demonstrates some independence from the (typical) doubly linked list. +*/ +class TiXmlAttributeSet +{ + public: + TiXmlAttributeSet(); + ~TiXmlAttributeSet(); + + void Add( TiXmlAttribute* attribute ); + void Remove( TiXmlAttribute* attribute ); + + TiXmlAttribute* First() const { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; } + TiXmlAttribute* Last() const { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; } + + TiXmlAttribute* Find( const std::string& name ) const; + + private: + TiXmlAttribute sentinel; +}; + + +/** The element is a container class. It has a value, the element name, + and can contain other elements, text, comments, and unknowns. + Elements also contain an arbitrary number of attributes. +*/ +class TiXmlElement : public TiXmlNode +{ + public: + /// Construct an element. + TiXmlElement( const std::string& value ); + + virtual ~TiXmlElement(); + + /** Given an attribute name, attribute returns the value + for the attribute of that name, or null if none exists. + */ + const std::string* Attribute( const std::string& name ) const; + + /** Given an attribute name, attribute returns the value + for the attribute of that name, or null if none exists. + */ + const std::string* Attribute( const std::string& name, int* i ) const; + + /** Sets an attribute of name to a given value. The attribute + will be created if it does not exist, or changed if it does. + */ + void SetAttribute( const std::string& name, + const std::string& value ); + + /** Sets an attribute of name to a given value. The attribute + will be created if it does not exist, or changed if it does. + */ + void SetAttribute( const std::string& name, + int value ); + + /** Deletes an attribute with the given name. + */ + void RemoveAttribute( const std::string& name ); + + TiXmlAttribute* FirstAttribute() const { return attributeSet.First(); } ///< Access the first attribute in this element. + TiXmlAttribute* LastAttribute() const { return attributeSet.Last(); } ///< Access the last attribute in this element. + + // [internal use] Creates a new Element and returs it. + virtual TiXmlNode* Clone() const; + // [internal use] + virtual void Print( FILE* cfile, int depth ) const; + // [internal use] + virtual void StreamOut ( std::ostream* out ) const; + // [internal use] + virtual void StreamIn( std::istream* in, std::string* tag ); + + protected: + /* [internal use] + Attribtue parsing starts: next char past '<' + returns: next char past '>' + */ + virtual const char* Parse( const char* p ); + + /* [internal use] + Reads the "value" of the element -- another element, or text. + This should terminate with the current end tag. + */ + const char* ReadValue( const char* in ); + bool ReadValue( std::istream* in ); + + private: + TiXmlAttributeSet attributeSet; +}; + + +/** An XML comment. +*/ +class TiXmlComment : public TiXmlNode +{ + public: + /// Constructs an empty comment. + TiXmlComment() : TiXmlNode( TiXmlNode::COMMENT ) {} + virtual ~TiXmlComment() {} + + // [internal use] Creates a new Element and returs it. + virtual TiXmlNode* Clone() const; + // [internal use] + virtual void Print( FILE* cfile, int depth ) const; + // [internal use] + virtual void StreamOut ( std::ostream* out ) const; + // [internal use] + virtual void StreamIn( std::istream* in, std::string* tag ); + + protected: + /* [internal use] + Attribtue parsing starts: at the ! of the !-- + returns: next char past '>' + */ + virtual const char* Parse( const char* p ); +}; + + +/** XML text. Contained in an element. +*/ +class TiXmlText : public TiXmlNode +{ + public: + TiXmlText( const std::string& initValue ) : TiXmlNode( TiXmlNode::TEXT ) { SetValue( initValue ); } + virtual ~TiXmlText() {} + + + // [internal use] Creates a new Element and returns it. + virtual TiXmlNode* Clone() const; + // [internal use] + virtual void Print( FILE* cfile, int depth ) const; + // [internal use] + virtual void StreamOut ( std::ostream* out ) const; + // [internal use] + bool Blank() const; // returns true if all white space and new lines + /* [internal use] + Attribtue parsing starts: First char of the text + returns: next char past '>' + */ + virtual const char* Parse( const char* p ); + // [internal use] + virtual void StreamIn( std::istream* in, std::string* tag ); +}; + + +/** In correct XML the declaration is the first entry in the file. + @verbatim + + @endverbatim + + TinyXml will happily read or write files without a declaration, + however. There are 3 possible attributes to the declaration: + version, encoding, and standalone. + + Note: In this version of the code, the attributes are + handled as special cases, not generic attributes, simply + because there can only be at most 3 and they are always the same. +*/ +class TiXmlDeclaration : public TiXmlNode +{ + public: + /// Construct an empty declaration. + TiXmlDeclaration() : TiXmlNode( TiXmlNode::DECLARATION ) {} + + /// Construct. + TiXmlDeclaration( const std::string& version, + const std::string& encoding, + const std::string& standalone ); + + virtual ~TiXmlDeclaration() {} + + /// Version. Will return empty if none was found. + const std::string& Version() const { return version; } + /// Encoding. Will return empty if none was found. + const std::string& Encoding() const { return encoding; } + /// Is this a standalone document? + const std::string& Standalone() const { return standalone; } + + // [internal use] Creates a new Element and returs it. + virtual TiXmlNode* Clone() const; + // [internal use] + virtual void Print( FILE* cfile, int depth ) const; + // [internal use] + virtual void StreamOut ( std::ostream* out ) const; + // [internal use] + virtual void StreamIn( std::istream* in, std::string* tag ); + + protected: + // [internal use] + // Attribtue parsing starts: next char past '<' + // returns: next char past '>' + + virtual const char* Parse( const char* p ); + + private: + std::string version; + std::string encoding; + std::string standalone; +}; + + +/** Any tag that tinyXml doesn't recognize is save as an + unknown. It is a tag of text, but should not be modified. + It will be written back to the XML, unchanged, when the file + is saved. +*/ +class TiXmlUnknown : public TiXmlNode +{ + public: + TiXmlUnknown() : TiXmlNode( TiXmlNode::UNKNOWN ) {} + virtual ~TiXmlUnknown() {} + + // [internal use] + virtual TiXmlNode* Clone() const; + // [internal use] + virtual void Print( FILE* cfile, int depth ) const; + // [internal use] + virtual void StreamOut ( std::ostream* out ) const; + // [internal use] + virtual void StreamIn( std::istream* in, std::string* tag ); + + protected: + /* [internal use] + Attribute parsing starts: First char of the text + returns: next char past '>' + */ + virtual const char* Parse( const char* p ); +}; + + +/** Always the top level node. A document binds together all the + XML pieces. It can be saved, loaded, and printed to the screen. + The 'value' of a document node is the xml file name. +*/ +class TiXmlDocument : public TiXmlNode +{ + public: + /// Create an empty document, that has no name. + TiXmlDocument(); + /// Create a document with a name. The name of the document is also the filename of the xml. + TiXmlDocument( const std::string& documentName ); + + virtual ~TiXmlDocument() {} + + /** Load a file using the current document value. + Returns true if successful. Will delete any existing + document data before loading. + */ + bool LoadFile(); + /// Save a file using the current document value. Returns true if successful. + bool SaveFile() const; + /// Load a file using the given filename. Returns true if successful. + bool LoadFile( const std::string& filename ); + /// Save a file using the given filename. Returns true if successful. + bool SaveFile( const std::string& filename ) const; + + /// Parse the given null terminated block of xml data. + virtual const char* Parse( const char* p ); + + /** Get the root element -- the only top level element -- of the document. + In well formed XML, there should only be one. TinyXml is tolerant of + multiple elements at the document level. + */ + TiXmlElement* RootElement() const { return FirstChildElement(); } + + /// If, during parsing, a error occurs, Error will be set to true. + bool Error() const { return error; } + + /// Contains a textual (english) description of the error if one occurs. + const std::string& ErrorDesc() const { return errorDesc; } + + /** Generally, you probably want the error string ( ErrorDesc() ). But if you + prefer the ErrorId, this function will fetch it. + */ + const int ErrorId() const { return errorId; } + + /// If you have handled the error, it can be reset with this call. + void ClearError() { error = false; errorId = 0; errorDesc = ""; } + + /** Dump the document to standard out. */ + void Print() const { Print( stdout, 0 ); } + + // [internal use] + virtual void Print( FILE* cfile, int depth = 0 ) const; + // [internal use] + virtual void StreamOut ( std::ostream* out ) const; + // [internal use] + virtual TiXmlNode* Clone() const; + // [internal use] + void SetError( int err ) { assert( err > 0 && err < TIXML_ERROR_STRING_COUNT ); + error = true; + errorId = err; + errorDesc = errorString[ errorId ]; } + // [internal use] + virtual void StreamIn( std::istream* in, std::string* tag ); + + protected: + + private: + bool error; + int errorId; + std::string errorDesc; +}; + + + +#endif + diff --git a/ACM/tinyxml/tinyxmlerror.cpp b/ACM/tinyxml/tinyxmlerror.cpp new file mode 100644 index 0000000..11b9486 --- /dev/null +++ b/ACM/tinyxml/tinyxmlerror.cpp @@ -0,0 +1,26 @@ +#include "tinyxml.h" + +// The goal of the seperate error file is to make the first +// step towards localization. tinyxml (currently) only supports +// latin-1, but at least the error messages could now be translated. +// +// It also cleans up the code a bit. +// + +const char* TiXmlBase::errorString[ TIXML_ERROR_STRING_COUNT ] = +{ + "No error", + "Error", + "Failed to open file", + "Memory allocation failed.", + "Error parsing Element.", + "Failed to read Element name", + "Error reading Element value.", + "Error reading Attributes.", + "Error: empty tag.", + "Error reading end tag.", + "Error parsing Unknown.", + "Error parsing Comment.", + "Error parsing Declaration.", + "Error document empty." +}; diff --git a/ACM/tinyxml/tinyxmlparser.cpp b/ACM/tinyxml/tinyxmlparser.cpp new file mode 100644 index 0000000..ef9b0c1 --- /dev/null +++ b/ACM/tinyxml/tinyxmlparser.cpp @@ -0,0 +1,928 @@ +/* +Copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com) + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. +*/ + +#include "tinyxml.h" +#include +#include +using namespace std; + +//#define DEBUG_PARSER + +TiXmlBase::Entity TiXmlBase::entity[ NUM_ENTITY ] = +{ + { "&", 5, '&' }, + { "<", 4, '<' }, + { ">", 4, '>' }, + { """, 6, '\"' }, + { "'", 6, '\'' } +}; + + +const char* TiXmlBase::SkipWhiteSpace( const char* p ) +{ + if ( !p || !*p ) + { + return 0; + } + while ( p && *p ) + { + if ( isspace( *p ) || *p == '\n' || *p =='\r' ) // Still using old rules for white space. + ++p; + else + break; + } + + return p; +} + + +/*static*/ bool TiXmlBase::StreamWhiteSpace( std::istream* in, std::string* tag ) +{ + for( ;; ) + { + if ( !in->good() ) return false; + + int c = in->peek(); + if ( !IsWhiteSpace( c ) ) + return true; + *tag += in->get(); + } +} + + +/*static*/ bool TiXmlBase::StreamTo( std::istream* in, int character, std::string* tag ) +{ + while ( in->good() ) + { + int c = in->peek(); + if ( c == character ) + return true; + + in->get(); + *tag += c; + } + return false; +} + + +const char* TiXmlBase::ReadName( const char* p, string* name ) +{ + *name = ""; + assert( p ); + + // Names start with letters or underscores. + // After that, they can be letters, underscores, numbers, + // hyphens, or colons. (Colons are valid ony for namespaces, + // but tinyxml can't tell namespaces from names.) + if ( p && *p + && ( isalpha( (unsigned char) *p ) || *p == '_' ) ) + { + while( p && *p + && ( isalnum( (unsigned char ) *p ) + || *p == '_' + || *p == '-' + || *p == ':' ) ) + { + (*name) += *p; + ++p; + } + return p; + } + return 0; +} + + +const char* TiXmlBase::GetEntity( const char* p, char* value ) +{ + // Presume an entity, and pull it out. + string ent; + int i; + + // Ignore the &#x entities. + if ( strncmp( "&#x", p, 3 ) == 0 ) + { + *value = *p; + return p+1; + } + + // Now try to match it. + for( i=0; iappend( &c, 1 ); + } + } + else + { + bool whitespace = false; + + // Remove leading white space: + p = SkipWhiteSpace( p ); + while ( p && *p + && !StringEqual( p, endTag, caseInsensitive ) ) + { + if ( *p == '\r' || *p == '\n' ) + { + whitespace = true; + ++p; + } + else if ( isspace( *p ) ) + { + whitespace = true; + ++p; + } + else + { + // If we've found whitespace, add it before the + // new character. Any whitespace just becomes a space. + if ( whitespace ) + { + text->append( " ", 1 ); + whitespace = false; + } + char c; + p = GetChar( p, &c ); + text->append( &c, 1 ); + } + } + } + return p + strlen( endTag ); +} + + +void TiXmlDocument::StreamIn( std::istream* in, std::string* tag ) +{ + // The basic issue with a document is that we don't know what we're + // streaming. Read something presumed to be a tag (and hope), then + // identify it, and call the appropriate stream method on the tag. + // + // This "pre-streaming" will never read the closing ">" so the + // sub-tag can orient itself. + + if ( !StreamTo( in, '<', tag ) ) + { + SetError( TIXML_ERROR_PARSING_EMPTY ); + return; + } + + while ( in->good() ) + { + int tagIndex = tag->length(); + while ( in->good() && in->peek() != '>' ) + { + int c = in->get(); + (*tag) += (char) c; + } + + if ( in->good() ) + { + // We now have something we presume to be a node of + // some sort. Identify it, and call the node to + // continue streaming. + TiXmlNode* node = Identify( tag->c_str() + tagIndex ); + + if ( node ) + { + node->StreamIn( in, tag ); + bool isElement = node->ToElement() != 0; + delete node; + node = 0; + + // If this is the root element, we're done. Parsing will be + // done by the >> operator. + if ( isElement ) + { + return; + } + } + else + { + SetError( TIXML_ERROR ); + return; + } + } + } + // We should have returned sooner. + SetError( TIXML_ERROR ); +} + + +const char* TiXmlDocument::Parse( const char* p ) +{ + // Parse away, at the document level. Since a document + // contains nothing but other tags, most of what happens + // here is skipping white space. + // + // In this variant (as opposed to stream and Parse) we + // read everything we can. + + + if ( !p || !*p || !( p = SkipWhiteSpace( p ) ) ) + { + SetError( TIXML_ERROR_DOCUMENT_EMPTY ); + return false; + } + + while ( p && *p ) + { + TiXmlNode* node = Identify( p ); + if ( node ) + { + p = node->Parse( p ); + LinkEndChild( node ); + } + else + { + break; + } + p = SkipWhiteSpace( p ); + } + // All is well. + return p; +} + + +TiXmlNode* TiXmlNode::Identify( const char* p ) +{ + TiXmlNode* returnNode = 0; + + p = SkipWhiteSpace( p ); + if( !p || !*p || *p != '<' ) + { + return 0; + } + + TiXmlDocument* doc = GetDocument(); + p = SkipWhiteSpace( p ); + + if ( !p || !*p ) + { + return 0; + } + + // What is this thing? + // - Elements start with a letter or underscore, but xml is reserved. + // - Comments: "; + + if ( !StringEqual( p, startTag, false ) ) + { + document->SetError( TIXML_ERROR_PARSING_COMMENT ); + return 0; + } + p += strlen( startTag ); + p = ReadText( p, &value, false, endTag, false ); + return p; +} + + +const char* TiXmlAttribute::Parse( const char* p ) +{ + p = SkipWhiteSpace( p ); + if ( !p || !*p ) return 0; + + // Read the name, the '=' and the value. + p = ReadName( p, &name ); + if ( !p || !*p ) + { + if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES ); + return 0; + } + p = SkipWhiteSpace( p ); + if ( !p || !*p || *p != '=' ) + { + if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES ); + return 0; + } + + ++p; // skip '=' + p = SkipWhiteSpace( p ); + if ( !p || !*p ) + { + if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES ); + return 0; + } + + const char* end; + + if ( *p == '\'' ) + { + ++p; + end = "\'"; + p = ReadText( p, &value, false, end, false ); + } + else if ( *p == '"' ) + { + ++p; + end = "\""; + p = ReadText( p, &value, false, end, false ); + } + else + { + // All attribute values should be in single or double quotes. + // But this is such a common error that the parser will try + // its best, even without them. + value = ""; + while ( p && *p // existence + && !isspace( *p ) && *p != '\n' && *p != '\r' // whitespace + && *p != '/' && *p != '>' ) // tag end + { + value += *p; + ++p; + } + } + return p; +} + + +void TiXmlText::StreamIn( std::istream* in, std::string* tag ) +{ + while ( in->good() ) + { + int c = in->peek(); + if ( c == '<' ) + return; + + (*tag) += c; + in->get(); + } +} + + + +const char* TiXmlText::Parse( const char* p ) +{ + value = ""; + + //TiXmlDocument* doc = GetDocument(); + bool ignoreWhite = true; +// if ( doc && !doc->IgnoreWhiteSpace() ) ignoreWhite = false; + + const char* end = "<"; + p = ReadText( p, &value, ignoreWhite, end, false ); + if ( p ) + return p-1; // don't truncate the '<' + return 0; +} + + +void TiXmlDeclaration::StreamIn( std::istream* in, std::string* tag ) +{ + while ( in->good() ) + { + int c = in->get(); + (*tag) += c; + + if ( c == '>' ) + { + // All is well. + return; + } + } +} + +const char* TiXmlDeclaration::Parse( const char* p ) +{ + p = SkipWhiteSpace( p ); + // Find the beginning, find the end, and look for + // the stuff in-between. + TiXmlDocument* document = GetDocument(); + if ( !p || !*p || !StringEqual( p, "SetError( TIXML_ERROR_PARSING_DECLARATION ); + return 0; + } + + p += 5; +// const char* start = p+5; +// const char* end = strstr( start, "?>" ); + + version = ""; + encoding = ""; + standalone = ""; + + while ( p && *p ) + { + if ( *p == '>' ) + { + ++p; + return p; + } + + p = SkipWhiteSpace( p ); + if ( StringEqual( p, "version", true ) ) + { +// p += 7; + TiXmlAttribute attrib; + p = attrib.Parse( p ); + version = attrib.Value(); + } + else if ( StringEqual( p, "encoding", true ) ) + { +// p += 8; + TiXmlAttribute attrib; + p = attrib.Parse( p ); + encoding = attrib.Value(); + } + else if ( StringEqual( p, "standalone", true ) ) + { +// p += 10; + TiXmlAttribute attrib; + p = attrib.Parse( p ); + standalone = attrib.Value(); + } + else + { + // Read over whatever it is. + while( p && *p && *p != '>' && !isspace( *p ) ) + ++p; + } + } + return 0; +} + +bool TiXmlText::Blank() const +{ + for ( unsigned i=0; i +#include +#include +using namespace std; + +int gPass = 0; +int gFail = 0; + +// Utility functions: +template< class T > +bool XmlTest( const char* testString, T expected, T found, bool noEcho = false ) +{ + if ( expected == found ) + cout << "[pass]"; + else + cout << "[fail]"; + + if ( noEcho ) + cout << " " << testString; + else + cout << " " << testString << " [" << expected << "][" << found << "]"; + cout << "\n"; + + bool pass = ( expected == found ); + if ( pass ) + ++gPass; + else + ++gFail; + return pass; +} + + +// +// This file demonstrates some basic functionality of TinyXml. +// Note that the example is very contrived. It presumes you know +// what is in the XML file. But it does test the basic operations, +// and show how to add and remove nodes. +// + +int main() +{ + // + // We start with the 'demoStart' todo list. Process it. And + // should hopefully end up with the todo list as illustrated. + // + const char* demoStart = + "\n" + "" + "\n" + "\n" + " Go to the Toy store!" + " Do bills " + " Look for Evil Dinosaurs! " + ""; + + /* What the todo list should look like after processing. + In stream (no formatting) representation. */ + const char* demoEnd = + "" + "" + "" + "" + "Go to the" + "Toy store!" + "" + "" + "Talk to:" + "" + "" + "" + "" + "" + "" + "Do bills" + "" + ""; + + // The example parses from the character string (above): + + { + // Write to a file and read it back, to check file I/O. + + TiXmlDocument doc( "demotest.xml" ); + doc.Parse( demoStart ); + + if ( doc.Error() ) + { + printf( "Error in %s: %s\n", doc.Value().c_str(), doc.ErrorDesc().c_str() ); + exit( 1 ); + } + doc.SaveFile(); + } + + TiXmlDocument doc( "demotest.xml" ); + bool loadOkay = doc.LoadFile(); + + if ( !loadOkay ) + { + printf( "Could not load test file 'demotest.xml'. Error='%s'. Exiting.\n", doc.ErrorDesc().c_str() ); + exit( 1 ); + } + + printf( "** Demo doc read from disk: ** \n\n" ); + doc.Print( stdout ); + + TiXmlNode* node = 0; + TiXmlElement* todoElement = 0; + TiXmlElement* itemElement = 0; + + + // -------------------------------------------------------- + // An example of changing existing attributes, and removing + // an element from the document. + // -------------------------------------------------------- + + // Get the "ToDo" element. + // It is a child of the document, and can be selected by name. + node = doc.FirstChild( "ToDo" ); + assert( node ); + todoElement = node->ToElement(); + assert( todoElement ); + + // Going to the toy store is now our second priority... + // So set the "priority" attribute of the first item in the list. + node = todoElement->FirstChildElement(); // This skips the "PDA" comment. + assert( node ); + itemElement = node->ToElement(); + assert( itemElement ); + itemElement->SetAttribute( "priority", 2 ); + + // Change the distance to "doing bills" from + // "none" to "here". It's the next sibling element. + itemElement = itemElement->NextSiblingElement(); + assert( itemElement ); + itemElement->SetAttribute( "distance", "here" ); + + // Remove the "Look for Evil Dinosours!" item. + // It is 1 more sibling away. We ask the parent to remove + // a particular child. + itemElement = itemElement->NextSiblingElement(); + todoElement->RemoveChild( itemElement ); + + itemElement = 0; + + // -------------------------------------------------------- + // What follows is an example of created elements and text + // nodes and adding them to the document. + // -------------------------------------------------------- + + // Add some meetings. + TiXmlElement item( "Item" ); + item.SetAttribute( "priority", "1" ); + item.SetAttribute( "distance", "far" ); + + TiXmlText text( "Talk to:" ); + + TiXmlElement meeting1( "Meeting" ); + meeting1.SetAttribute( "where", "School" ); + + TiXmlElement meeting2( "Meeting" ); + meeting2.SetAttribute( "where", "Lunch" ); + + TiXmlElement attendee1( "Attendee" ); + attendee1.SetAttribute( "name", "Marple" ); + attendee1.SetAttribute( "position", "teacher" ); + + TiXmlElement attendee2( "Attendee" ); + attendee2.SetAttribute( "name", "Vo‚" ); + attendee2.SetAttribute( "position", "counselor" ); + + // Assemble the nodes we've created: + meeting1.InsertEndChild( attendee1 ); + meeting1.InsertEndChild( attendee2 ); + + item.InsertEndChild( text ); + item.InsertEndChild( meeting1 ); + item.InsertEndChild( meeting2 ); + + // And add the node to the existing list after the first child. + node = todoElement->FirstChild( "Item" ); + assert( node ); + itemElement = node->ToElement(); + assert( itemElement ); + + todoElement->InsertAfterChild( itemElement, item ); + + printf( "\n** Demo doc processed: ** \n\n" ); + doc.Print( stdout ); + + printf( "** Demo doc processed to stream: ** \n\n" ); + cout << doc << endl << endl; + + // -------------------------------------------------------- + // Different tests...do we have what we expect? + // -------------------------------------------------------- + + int count = 0; + TiXmlElement* element; + + ////////////////////////////////////////////////////// + cout << "** Basic structure. **\n"; + ostringstream outputStream( ostringstream::out ); + outputStream << doc; + + XmlTest( "Output stream correct.", string( demoEnd ), outputStream.str(), true ); + + node = doc.RootElement(); + XmlTest( "Root element exists.", true, ( node != 0 && node->ToElement() ) ); + XmlTest( "Root element value is 'ToDo'.", string( "ToDo" ), node->Value() ); + node = node->FirstChild(); + XmlTest( "First child exists & is a comment.", true, ( node != 0 && node->ToComment() ) ); + node = node->NextSibling(); + XmlTest( "Sibling element exists & is an element.", true, ( node != 0 && node->ToElement() ) ); + XmlTest( "Value is 'Item'.", string( "Item" ), node->Value() ); + node = node->FirstChild(); + XmlTest( "First child exists.", true, ( node != 0 && node->ToText() ) ); + XmlTest( "Value is 'Go to the'.", string( "Go to the" ), node->Value() ); + + + ////////////////////////////////////////////////////// + cout << "\n** Iterators. **" << "\n"; + // Walk all the top level nodes of the document. + count = 0; + for( node = doc.FirstChild(); + node; + node = node->NextSibling() ) + { + count++; + } + XmlTest( "Top level nodes, using First / Next.", 3, count ); + + count = 0; + for( node = doc.LastChild(); + node; + node = node->PreviousSibling() ) + { + count++; + } + XmlTest( "Top level nodes, using Last / Previous.", 3, count ); + + // Walk all the top level nodes of the document, + // using a different sytax. + count = 0; + for( node = doc.IterateChildren( 0 ); + node; + node = doc.IterateChildren( node ) ) + { + count++; + } + XmlTest( "Top level nodes, using IterateChildren.", 3, count ); + + // Walk all the elements in a node. + count = 0; + for( element = todoElement->FirstChildElement(); + element; + element = element->NextSiblingElement() ) + { + count++; + } + XmlTest( "Children of the 'ToDo' element, using First / Next.", + 3, count ); + + // Walk all the elements in a node by value. + count = 0; + for( node = todoElement->FirstChild( "Item" ); + node; + node = node->NextSibling( "Item" ) ) + { + count++; + } + XmlTest( "'Item' children of the 'ToDo' element, using First/Next.", 3, count ); + + count = 0; + for( node = todoElement->LastChild( "Item" ); + node; + node = node->PreviousSibling( "Item" ) ) + { + count++; + } + XmlTest( "'Item' children of the 'ToDo' element, using Last/Previous.", 3, count ); + + + ////////////////////////////////////////////////////// + cout << "\n** Parsing. **\n"; + istringstream parse0( "" ); + TiXmlElement element0( "default" ); + parse0 >> element0; + + XmlTest( "Element parsed, value is 'Element0'.", string( "Element0" ), element0.Value() ); + XmlTest( "Reads attribute 'attribute0=\"foo0\"'.", string( "foo0" ), *( element0.Attribute( "attribute0" ) ) ); + XmlTest( "Reads incorrectly formatted 'attribute1=noquotes'.", string( "noquotes" ), *( element0.Attribute( "attribute1" ) ) ); + XmlTest( "Read attribute with entity value '>'.", string( ">" ), *( element0.Attribute( "attribute2" ) ) ); + + ////////////////////////////////////////////////////// + cout << "\n** Streaming. **\n"; + + // Round trip check: stream in, then stream back out to verify. The stream + // out has already been checked, above. We use the output + + istringstream inputStringStream( outputStream.str() ); + TiXmlDocument document0; + + inputStringStream >> document0; + + ostringstream outputStream0( ostringstream::out ); + outputStream0 << document0; + + XmlTest( "Stream round trip correct.", string( demoEnd ), outputStream0.str(), true ); + + ////////////////////////////////////////////////////// + cout << "\n** Parsing, no Condense Whitespace **\n"; + TiXmlBase::SetCondenseWhiteSpace( false ); + + istringstream parse1( "This is \ntext" ); + TiXmlElement text1( "text" ); + parse1 >> text1; + + XmlTest( "Condense white space OFF.", string( "This is \ntext" ), + text1.FirstChild()->Value(), + true ); + + cout << endl << "Pass " << gPass << ", Fail " << gFail << endl; + return 0; +} + diff --git a/API b/API new file mode 100644 index 0000000..c850df5 --- /dev/null +++ b/API @@ -0,0 +1,107 @@ +The LAME API + +This is the simple interface to the encoding part of libmp3lame.so. +The library also contains routines for adding id3 tags and +mp3 decoding. These routines are not fully documented, +but you can figure them out by looking at "include/lame.h" and the +example frontend encoder/decoder source code in frontend/main.c + +All of these steps should be done for every MP3 to be encoded. + + +========================================================================= + +1. (optional) Get the version number of the encoder, if you are interested. + void get_lame_version(char *strbuf, size_t buflen, const char *prefix); + + +2. Error messages. By default, LAME will write error messages to +stderr using vfprintf(). For GUI applications, this is often a problem +and you need to set your own error message handlers: + + lame_set_errorf(gfp,error_handler_function); + lame_set_debugf(gfp,error_handler_function); + lame_set_msgf(gfp,error_handler_function); + +See lame.h for details. + + +3. Initialize the encoder. sets default for all encoder parameters. + + #include "lame.h" + lame_global_flags *gfp; + gfp = lame_init(); + +The default (if you set nothing) is a J-Stereo, 44.1khz +128kbps CBR mp3 file at quality 5. Override various default settings +as necessary, for example: + + lame_set_num_channels(gfp,2); + lame_set_in_samplerate(gfp,44100); + lame_set_brate(gfp,128); + lame_set_mode(gfp,1); + lame_set_quality(gfp,2); /* 2=high 5 = medium 7=low */ + + +See lame.h for the complete list of options. Note that there are +some lame_set_*() calls not documented in lame.h. These functions +are experimental and for testing only. They may be removed in +the future. + + + +4. Set more internal configuration based on data provided above, + as well as checking for problems. Check that ret_code >= 0. + + ret_code = lame_init_params(gfp); + + + +5. Encode some data. input pcm data, output (maybe) mp3 frames. +This routine handles all buffering, resampling and filtering for you. +The required mp3buffer_size can be computed from num_samples, +samplerate and encoding rate, but here is a worst case estimate: +mp3buffer_size (in bytes) = 1.25*num_samples + 7200. +num_samples = the number of PCM samples in each channel. It is +not the sum of the number of samples in the L and R channels. + +The return code = number of bytes output in mp3buffer. This can be 0. +If it is <0, an error occured. + + int lame_encode_buffer(lame_global_flags *gfp, + short int leftpcm[], short int rightpcm[], + int num_samples,char *mp3buffer,int mp3buffer_size); + + +There are also routines for various types of input +(float, long, interleaved, etc). See lame.h for details. + + +6. lame_encode_flush will flush the buffers and may return a +final few mp3 frames. mp3buffer should be at least 7200 bytes. +return code = number of bytes output to mp3buffer. This can be 0. + +int lame_encode_flush(lame_global_flags *,char *mp3buffer, int mp3buffer_size); + + +7. Write the Xing VBR/INFO tag to mp3 file. + +void lame_mp3_tags_fid(lame_global_flags *,FILE* fid); + +This adds a valid mp3 frame which contains information about the +bitstream some players may find usefull. It is used for CBR,ABR and +VBR. The routine will attempt to rewind the output stream to the +beginning. If this is not possible, (for example, you are encoding to +stdout) you should specifically disable the tag by calling +lame_set_bWriteVbrTag(gfp,0) in step 3 above, and call +lame_mp3_tags_fid() with fid=NULL. If the rewind fails and +the tag was not disabled, the first mp3 frame in the bitstream +will be all 0's. + + + +8. free the internal data structures. + +void lame_close(lame_global_flags *); + + diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..f503049 --- /dev/null +++ b/COPYING @@ -0,0 +1,481 @@ + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..6c5b842 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,40599 @@ + + ChangeLog for LAME +-==================- + + - All dates/times are in GMT. + - This file contains the complete changelog, even commit logs of + non official branches. An entry of the form "filename (branchname):" + may not apply to the source you get with this package. + - Generated from cvs log entries + (cvs2cl --gmt -S --branches --no-wrap --header ChangeLog.header) + +-- + +2017-10-13 20:22 aleidinger + + * vc_solution/Makefile.in: + + update + +2017-10-13 20:21 aleidinger + + * vc_solution/Makefile.am: + + list each file explicitely, make dist does not like globs. + +2017-10-13 20:16 aleidinger + + * testcase.mp3: + + Update testcase for 3.100 release. + Build on FreeBSD 64bit, clang 5.0.0, no advanced compiler flags/optimisations. + +2017-10-10 19:31 aleidinger + + * ChangeLog: + + update + +2017-09-26 12:25 robert + + * frontend/parse.c: + + forcing MS for j-stereo mode only + +2017-09-26 12:14 robert + + * Dll/BladeMP3EncDLL.c, frontend/parse.c, libmp3lame/lame.c: + + forcing MS for j-stereo mode only + +2017-09-26 10:31 robert + + * libmp3lame/lame.c: + + set 'use of safe joint' for joint-stereo only, (only effects a bit in vbr tag, sometimes) + +2017-09-21 11:00 robert + + * libmp3lame/: gain_analysis.c, machine.h: + + + fix multiple_of macro + +2017-09-19 16:58 robert + + * libmp3lame/version.h: + + release candidate + +2017-09-19 16:57 robert + + * frontend/parse.c: + + patch for bug #484: Lame doesn't recognize user locale correctly + +2017-09-06 19:40 aleidinger + + * ChangeLog: + + update + +2017-09-06 19:38 aleidinger + + * libmp3lame/psymodel.c: + + Add missing (at least in FreeBSD) include for FLT_EPSILON. + +2017-09-06 15:07 robert + + * frontend/get_audio.c, libmp3lame/fft.c, + libmp3lame/gain_analysis.c, libmp3lame/psymodel.c, + libmp3lame/quantize_pvt.c, libmp3lame/set_get.c, + libmp3lame/takehiro.c, libmp3lame/util.c, libmp3lame/util.h, + mpglib/interface.c, mpglib/tabinit.c: + + small fixes + +2017-08-31 14:14 robert + + * frontend/lame_main.c, include/lame.def, include/lame.h, + include/libmp3lame.sym, libmp3lame/bitstream.c, + libmp3lame/lame.c, libmp3lame/set_get.c: + + another go to fix bug #474: Buffer Overflow possible when input sample rate very low + + - do_copy_buffer did not check buffer size, when size was zero! + 0 was a bad choice for the purpose of not checking, because + it was possible to get there, even when checking was demeanded! + +2017-08-30 20:48 robert + + * libmp3lame/lame.c: + + fix for bug #474: Buffer Overflow possible when input sample rate very low + + When the input sample rate is very low, like 1 Hz, resampling to 8 kHz can result in a buffer overflow. + Found by Gustavo Grieco. + +2017-08-30 14:11 robert + + * frontend/: lame_main.c, parse.c, parse.h: + + fix for bug #473: Buffer Overflow possible in lame_main.c + - replaced parse_nogap_filename by generateOutPath + (now there is only one function building the output file names) + - all nogap file names are now build before any encoding starts + - decode and nogap are no valid combination of arguments anymore, wouldn't work as expected + +2017-08-28 15:39 robert + + * libmp3lame/id3tag.c: + + fix for bug #472: NULL Pointer Dereference in id3v2AddAudioDuration + - plus some more pointer checks + +2017-08-28 12:48 robert + + * frontend/gtkanal.c: + + fixing resource leak, hip deocder wasn't closed on quit + +2017-08-26 13:20 robert + + * libmp3lame/: lame.c, set_get.c: + + lame_init_params: + - removed some impossible returns + +2017-08-26 10:54 robert + + * libmp3lame/encoder.c: + + more of psy downgrade + +2017-08-24 20:43 robert + + * frontend/mp3rtp.c: + + - free was called twice for some argument c-string + +2017-08-23 13:22 robert + + * mpglib/: interface.c, layer1.c: + + hip layer 1 decode: testing for illegal bit allocation value + +2017-08-22 23:31 robert + + * mpglib/layer2.c: + + fix for bug #470: global-buffer-overflow mpglib/layer2.c:144 II_step_one + +2017-08-22 19:44 robert + + * libmp3lame/: id3tag.c, id3tag.h, util.c: + + id3v2: set 'language'property to a valid language code (COMM field) + +2017-08-22 16:02 robert + + * doc/html/history.html, frontend/get_audio.c, + frontend/lame_main.c: + + fixing bug i#434: --clipdetect scale suggestion unaware of --scale input value + +2017-08-21 17:10 robert + + * frontend/get_audio.c: + + fix for bug #469 Unable to build without mpglib + +2017-08-20 20:06 robert + + * mpglib/layer3.c: + + It looks like 'intensity stereo' decoding is broken. This change prevents a buffer overflow (read) and instead prints an indication, that there is something wrong. + +2017-08-20 13:56 robert + + * mpglib/layer3.c: + + fixing map for mixed-block band infos + +2017-08-19 20:17 robert + + * mpglib/layer3.c: + + fix for #467: stack-buffer-overflow mpglib/layer3.c:945 III_dequantize_sample + + fix for #468 global-buffer-overflow mpglib/layer3.c:1244 III_i_stereo + +2017-08-19 14:20 robert + + * mpglib/common.c: + + fix for bug #465: global-buffer-overflow layer2.c:144 II_step_one + - mpeg-2.5 is only supported by Layer3 + +2017-08-19 12:51 aleidinger + + * ChangeLog: + + update + +2017-08-18 22:06 robert + + * mpglib/layer3.c: + + fix for bug #466: "stack-buffer-overflow in ./mpglib/layer3.c:1264 III_i_stereo" + +2017-08-18 21:56 robert + + * frontend/: get_audio.c, lame_main.c: + + fix for bug #464: attempting double-free + +2017-08-15 19:51 robert + + * libmp3lame/set_get.c: + + estimation of total number of frames changed + +2017-08-15 15:40 aleidinger + + * make_changelog.sh: + + add comment how to generate the input file + +2017-08-15 15:35 aleidinger + + * ChangeLog: + + update ChangeLog + +2017-08-15 15:20 aleidinger + + * Makefile.in, ACM/Makefile.in, ACM/ADbg/Makefile.in, + ACM/ddk/Makefile.in, ACM/tinyxml/Makefile.in, Dll/Makefile.in, + doc/Makefile.in, doc/html/Makefile.in, doc/man/Makefile.in, + dshow/Makefile.in, frontend/Makefile.in, include/Makefile.in, + libmp3lame/Makefile.in, libmp3lame/i386/Makefile.in, + libmp3lame/vector/Makefile.in, mac/Makefile.in, + macosx/Makefile.in, macosx/English.lproj/Makefile.in, + macosx/LAME.xcodeproj/Makefile.in, misc/Makefile.in, + mpglib/Makefile.in, vc_solution/Makefile.in: + + regenerate + +2017-08-15 15:16 aleidinger + + * aclocal.m4, configure: + + regenerate + +2017-08-15 15:16 aleidinger + + * configure.in: + + Improve compiler version detection (clang changed version string). + Add some future GCC versions in the optimisation part. + +2017-08-15 15:15 aleidinger + + * include/lame.def: + + Add lame_encode_buffer_interleaved_int() by Michael Fink. + LAME Patch #27. + +2017-08-15 14:51 aleidinger + + * include/lame.h, include/libmp3lame.sym, libmp3lame/lame.c: + + patch #27: Add lame_encode_buffer_interleaved_int() by Michael Fink + +2017-08-15 14:46 aleidinger + + * compile, config.sub, depcomp, install-sh, missing, + frontend/depcomp, libmp3lame/depcomp, misc/depcomp, + mpglib/depcomp: + + update to a more recent autotools version + +2017-08-13 16:18 robert + + * libmp3lame/set_get.c: + + prevent some rare overflow in estimation of total number of frames + in case samplerate-out is higher than samplerate-in + (it is a visual glitch only) + +2017-08-13 13:57 robert + + * doc/html/history.html, frontend/get_audio.c, + libmp3lame/version.h: + + - sanity check when reading pcm data, avoid buffer overflow + - version 3.100 beta 0 + +2017-08-12 18:56 robert + + * frontend/get_audio.c, frontend/lame_main.c, frontend/main.c, + mpglib/common.c, mpglib/interface.c: + + - avoid calling exit in library + - free up resources after error condition in frontend + +2017-08-12 18:14 robert + + * mpglib/layer3.c: + + - workaround for heap corruption while decoding layer3 + - some fix for mpeg2.5 decoding with mixed block feature, taken from Takehiro's branch + +2017-08-08 17:52 robert + + * doc/man/lame.1: + + fix typo + +2017-08-08 13:56 robert + + * doc/html/history.html, libmp3lame/vector/xmm_quantize_sub.c: + + Fix for bug ticket [ #449 ] Make sure functions with SSE instructions maintain their own properly aligned stack. Thanks to Fabian Greffrath + +2017-08-08 13:26 robert + + * doc/html/history.html, mpglib/interface.c: + + Fix for bug ticket #445: dereference of a null pointer possible in loop. Thanks to Renu Tyagi + +2017-08-08 12:40 robert + + * doc/html/history.html, frontend/lame_main.c: + + Fix for bug ticket #447: Fix dereference NULL and Buffer not NULL terminated issues. Thanks to Surabhi Mishra + +2017-08-06 18:15 robert + + * frontend/get_audio.c, libmp3lame/VbrTag.c, libmp3lame/lame.c, + libmp3lame/set_get.c, libmp3lame/util.h: + + in case of illegal sample rate and number of channel, let lame print an error message + +2017-08-03 13:07 rjamorim + + * HACKING, INSTALL, LICENSE, README, README.WINGTK, TODO: + + Typos, formatting, grammar... + +2017-08-03 13:06 rjamorim + + * ACM/lame.ico: + + Updated icon to the current LAME logo + +2017-08-03 12:32 rjamorim + + * USAGE: + + Updated USAGE: fixed typos, formatting, some grammar + +2017-08-02 19:56 robert + + * doc/html/history.html: + + - reverting psymodel to that of version 3.99.5 + - changing version back to 3.99.5 to ease binary mp3 file comparisons with version 3.99.5 + + Committed on the Free edition of March Hare Software CVSNT Client. + Upgrade to CVS Suite for more features and support: + http://march-hare.com/cvsnt/ + +2017-08-02 19:48 robert + + * libmp3lame/: psymodel.c, quantize.c, quantize_pvt.c, util.h, + version.h: + + - reverting psymodel to that of version 3.99.5 + - changing version back to 3.99.5 to ease binary mp3 file comparisons with version 3.99.5 + + Committed on the Free edition of March Hare Software CVSNT Client. + Upgrade to CVS Suite for more features and support: + http://march-hare.com/cvsnt/ + +2016-01-29 21:36 aleidinger + + * ChangeLog: + + update history + +2016-01-29 21:06 aleidinger + + * aclocal.m4, config.h.in, config.sub, Makefile.in, compile, + config.guess, depcomp, install-sh, ltmain.sh, missing, + ACM/Makefile.in, ACM/ADbg/Makefile.in, ACM/ddk/Makefile.in, + ACM/tinyxml/Makefile.in, Dll/Makefile.in, doc/Makefile.in, + doc/html/Makefile.in, doc/man/Makefile.in, dshow/Makefile.in, + frontend/Makefile.in, frontend/depcomp, include/Makefile.in, + libmp3lame/Makefile.in, libmp3lame/depcomp, + libmp3lame/i386/Makefile.in, libmp3lame/vector/Makefile.in, + mac/Makefile.in, macosx/Makefile.in, + macosx/English.lproj/Makefile.in, + macosx/LAME.xcodeproj/Makefile.in, misc/Makefile.in, + misc/depcomp, mpglib/Makefile.in, mpglib/depcomp, + vc_solution/Makefile.in, configure: + + regen + +2016-01-29 21:06 aleidinger + + * HACKING, Makefile.MSVC, Makefile.am.global, Makefile.unix, + configure.in, Dll/Makefile.mingw32, libmp3lame/Makefile.am: + + - better check for SSE intrinsics [1] + - don't define NDEBUG in release builds + -> asserts trigger segfaults even in release builds + -> quick and user-unfriendly fix until user-fiendly error checks are + implemented + - fix spelling mistakes in HACKING file [2] + - enable cross-compiling for mingw [3] + - fix linker path for libmpelame for mingw [3] + - fix out-of-source-tree builds [4] + - update files to automake 1.15, autconf 2.69 + - update compiler version detection (detect clang and add optimization + for at least 3.7.x) + + Submitted by: dim@FreeBSD.org [1], FreeBSD PR 206620 + tridecethtwelve@users.sf.net [2] LAME patch #68 + bardware@users.sf.net [3] LAME patch #70 + m-a@users.sf.net [4] LAmE patch #67 + +2015-05-11 07:01 rbrito + + * libmp3lame/lame.c: + + libmp3lame: Remove redundant check for invalid sample rates. + + Thanks Fabian Greffrath for letting me know that I screwed up. :) + + Signed-off-by: Rogério Brito + +2015-04-28 22:12 rbrito + + * libmp3lame/lame.c: + + libmp3lame: Add check for negative number of channels. + + Thanks to Maks Naumov and Fabian Greffrath for the contribution. + +2015-04-28 22:07 rbrito + + * libmp3lame/util.c: + + libmp3lame: Fix decision if sample rate ratio is an integer value or not. + + From Fabian Greffrath's original description: + + If the sample rate of the input file is sufficiently close to an integer + multiple of the output sample rate, the value of the intratio variable is + calculated incorrectly. This leads to further values being miscalculated + up to the joff variable which is used as an index to dereference the + esv->blackfilt array. This leads top an overflow and causes a + segmentation fault. + + See https://bugs.debian.org/778529 for a discussion. + +2015-04-28 22:03 rbrito + + * frontend/get_audio.c: + + frontend: Avoid division by zero. + + Avoid malformed wav causing floating point exception (integer divide by + zero). + + Kindly contributed by Fabian Greffrath . See + https://bugs.debian.org/777159 for a discussion. + +2015-02-21 23:03 rbrito + + * test/lametest.py: + + test: lametest: Some more PEP-8 love. + + This is mostly regarding not having parentheses around boolean expressions. + +2015-02-21 22:57 rbrito + + * test/lametest.py: + + test: lametest: Add some PEP-8 love. + +2015-02-21 22:49 rbrito + + * test/lametest.py: + + test: lametest: Fix some trailing whitespace. + +2015-02-21 22:35 rbrito + + * libmp3lame/lame.c: + + Add check for invalid input sample rate. + + Patch by Maks Naumov , forwared to me by Fabian Greffrath + from the Debian packaging. + + Thanks for the contribution! + +2014-10-01 17:54 jaz001 + + * doc/html/links.html: + + links update. + +2014-01-28 14:48 robert + + * frontend/get_audio.c, frontend/main.c, libmp3lame/lame.c, + libmp3lame/machine.h, Makefile.MSVC: + + some minor changes: + - do not disable replaygain calc and find peak sample, when not writing LAME info header (patch tracker item #66) + - remove deprecated linker option from Makefile.MSVC (bug tracker item #442) + +2013-12-17 11:24 robert + + * frontend/get_audio.c, frontend/main.h, frontend/parse.c, + libmp3lame/gain_analysis.c, libmp3lame/id3tag.h, + libmp3lame/machine.h, libmp3lame/psymodel.c: + + applying submitted patches + #64: fixes undefined references when compiling with mingw32 (send by Patrick) + #59: changes static_assert into a more portable form (send by Doug Cook) + #55: fixes issues with wave files >2GB (send by lvqcl) + + plus some minor changes to reduce compiler warnings with GCC v4.7.1 + +2013-12-08 19:49 jaz001 + + * LICENSE, USAGE, doc/html/detailed.html, doc/man/lame.1, + frontend/parse.c: + + Documentation updates: + -q setting rewording in all docs + general updates in USAGE and man page. + Small updates in the --help, --longhelp , and --preset help + +2013-06-12 09:16 rbrito + + * aclocal.m4, configure.in, doc/html/Makefile.am, + doc/man/Makefile.am, libmp3lame/i386/Makefile.am: + + Make autotools files compatible with automake >= 1.12 + + Newer autotools versions don't seem to support ansi2knr, which is probably + not a problem, given the last decades of compilers accepting ANSI C (and the + rest of the LAME code being written in ANSI C itself). + + This fixes ticket #60, with a patch of Brennan Shacklett, from the Gentoo + community. + +2013-06-12 09:06 rbrito + + * aclocal.m4, configure.in, doc/html/Makefile.am: + + Kill spurious trailing whitespace from some files. + +2013-06-11 08:41 rbrito + + * frontend/brhist.c: + + frontend: brhist: Fix type of formatting string parameter. + +2013-06-11 08:41 rbrito + + * frontend/get_audio.c: + + frontend: get_audio: Add missing formatting string parameter. + +2013-06-11 08:19 rbrito + + * Dll/Example.cpp: + + Dll/Example.cpp: Remove (some) spurious whitespace. + +2013-06-11 08:19 rbrito + + * Dll/Example.cpp: + + Dll/Example.cpp: Remove resource leaks in example code. + +2013-06-11 07:26 rbrito + + * config.guess, config.sub: + + config.{sub,guess}: Update files to pick up newer arches. + + This closes ticket #406. Perhaps a better solution would be to rewrite part + of our autotools system, but, then, perhaps not. + +2013-06-11 06:46 rbrito + + * include/libmp3lame.sym: + + libmp3lame: Regenerate libmp3lame.sym from header file. + + Part of patch submitted by Reimar Döffinger on ticket #63. + + We should review this to check if there are any symbols that we don't want + exported. + +2013-06-11 06:45 rbrito + + * libmp3lame/Makefile.am: + + libmp3lame: Consider the symbols in libmp3lame.sym. + + This is part of the patch sent by Reimar Döffinger in ticket #63. + +2013-03-20 20:38 robert + + * frontend/timestatus.c, doc/html/history.html: + + fix for tracker item 3608583: input file name displayed with wrong character encoding (windows) + +2012-10-25 18:46 robert + + * doc/html/history.html, frontend/lame_main.c, frontend/main.c, + frontend/parse.c: + + fix for tracker item 3580176: environment variable LAMEOPT doesn't work anymore + +2012-10-13 14:10 robert + + * doc/html/history.html, frontend/parse.c: + + fix for tracker item 3544957: scale (empty) silent encode without warning + + switches with missing argument values will be ignored. (Those with integer or floating point values, at least) + +2012-10-13 11:50 robert + + * doc/html/history.html, frontend/parse.c: + + fix for tracker item 3565659: no progress indication with pipe input :( + +2012-10-13 10:36 robert + + * doc/html/history.html, frontend/parse.c: + + fix for tracker item 3567844: problem with Tag genre + +2012-10-13 09:33 robert + + * doc/html/history.html, frontend/parse.c: + + fix for tracker item ID 3558466: Bug in path handling + +2012-10-09 21:39 robert + + * libmp3lame/version.h: + + bump version + +2012-10-09 21:37 robert + + * libmp3lame/: psymodel.c, util.h: + + trying to improve strong tonal samples (lead-voice.wav) + +2012-10-09 21:35 robert + + * frontend/parse.c: + + ignore developer-only switches, but parse them for command line compatibility reasons + +2012-10-06 15:54 robert + + * libmp3lame/psymodel.c: + + - code refactorings + - changed "mask adding", get the max of 3 different ones + +2012-10-06 11:44 robert + + * frontend/parse.c, libmp3lame/presets.c: + + + new command line option "--gain x", more convenient to adjust replay gain, just use whatever decibel value LAME reported before. + + out-dir option mentioned in long help text + +2012-07-19 20:57 robert + + * doc/html/history.html, frontend/get_audio.c, mpglib/interface.c, + libmp3lame/version.h: + + Improved detection of MPEG audio data in RIFF WAVE files. + see tracker item 3545112: Invalid sampling detection + +2012-07-11 18:31 jaz001 + + * doc/html/: detailed.html, usage.html: + + Updates to reflect recent changes in hydrogenaudio wiki. + +2012-06-19 00:15 rbrito + + * doc/html/history.html: + + Update the HTML changelog. + +2012-06-19 00:00 rbrito + + * Makefile.am, configure.in: + + Don't use use the debian directory as build target. + + Include debian as extra directory instead of directory part of + subdirectories used in build. + + Patch stolen from: + + http://anonscm.debian.org/gitweb/?p=pkg-multimedia/lame.git;a=tree;f=debian/patches + +2012-06-18 20:52 rbrito + + * libmp3lame/i386/Makefile.am: + + libmp3lame: Fix possible race condition causing build failures. + + This was discovered in automated builds by the Debian project and the patch + provided is by Andres Mejia . + + Please, note that only part of the patch (the one touching Makefile.am) was + applied, since the changes in Makefile.in should be picked up when + regenerating files with autotools. + + Signed-off-by: Rogério Brito + +2012-06-18 20:51 rbrito + + * acinclude.m4: + + acinclude.m4: Include GTK-1 autoconf directives in build system. + + Resurrect knowledge of how to deal with GTK1. This was transplanted back + from aclocal.m4 with a patch provided by Andres Mejia , + from Debian's packaging of lame, even though the original code is attributed + to Owen Taylor and dated 97-11-3. + + Anyway, with this part not lost again, we can easily regenerate autotools' + files with a simple `autoconf -vfi` invocation. + + Signed-off-by: Rogério Brito + +2012-06-18 20:48 rbrito + + * configure.in: + + configure.in: Rewrap for (human) legibility. + + This also helps by being diff-friendly if we change only one of the parts of + a long line. + + Signed-off-by: Rogério Brito + +2012-02-28 19:07 robert + + * doc/html/history.html: + + bug-fix release 3.99.5 + +2012-02-28 18:57 robert + + * ChangeLog, configure, configure.in, testcase.mp3, + doc/html/history.html (lame3_99): + + bug-fix release 3.99.5 + +2012-02-19 00:02 robert + + * libmp3lame/: gain_analysis.c, machine.h: + + rearranging gain analysis kernel table and calc loops to allow better code vectorization + +2012-02-18 13:08 robert + + * frontend/get_audio.c, frontend/lame_main.c, frontend/main.c, + frontend/parse.c, libmp3lame/mpglib_interface.c, mpglib/layer2.c: + + removing VC11 x86-64 compiler warnings + +2012-02-14 14:24 robert + + * libmp3lame/: VbrTag.c, bitstream.c, encoder.c, id3tag.c, lame.c, + machine.h, mpglib_interface.c, psymodel.c, util.c, util.h: + + some code refactorings + +2012-02-14 11:06 robert + + * ChangeLog, doc/html/history.html (lame3_99), ChangeLog, + doc/html/history.html: + + updating history/changelog + +2012-02-11 12:11 robert + + * frontend/get_audio.c: + + Bug fix for tracker item ID: 3486753 Artifacts at the beginning of decoded file + +2012-02-11 12:10 robert + + * mpglib/layer3.c: + + some hidden global temporary variable removed, could have been some multi threading issue + +2012-02-11 12:00 robert + + * frontend/get_audio.c (lame3_99): + + Bug fix for tracker item ID: 3486753 Artifacts at the beginning of decoded file + +2012-02-11 11:03 robert + + * mpglib/layer3.c (lame3_99): + + some hidden global temporary variable removed, could have been some multi threading issue + +2012-02-10 18:13 rbrito + + * config.h.in, configure.in: + + autotools: Fix compilation on alpha using proper ifdef guards. + + Thanks to Andres Mejia for the patch (with minor + whitespace adjustments). + +2012-02-10 18:11 rbrito + + * doc/html/history.html: + + doc: Correctly spell Fabian Greffrath's name to give proper credit. + +2012-02-10 18:06 rbrito + + * config.h.in, configure.in (lame3_99): + + autotools: Fix compilation on alpha using proper ifdef guards. + + Thanks to Andres Mejia for the patch (with minor + whitespace adjustments). + +2012-02-10 18:05 rbrito + + * doc/html/history.html (lame3_99): + + doc: Correctly spell Fabian Greffrath's name to give proper credit. + +2012-02-07 13:52 robert + + * configMS.h (lame3_99), configMS.h: + + reduce compiler warnings for SSE2 build with VC 11 + +2012-02-07 13:40 robert + + * configMS.h, frontend/parse.c, libmp3lame/l3side.h, + libmp3lame/machine.h, libmp3lame/quantize_pvt.c, + libmp3lame/vbrquantize.c, libmp3lame/version.h (lame3_99): + + - workaround for cygwin build problem + - fix "fast floating point math" problem (possible bitrate bloat on quiet pieces) + +2012-02-07 13:36 robert + + * configMS.h, libmp3lame/l3side.h, libmp3lame/machine.h, + libmp3lame/quantize_pvt.c, libmp3lame/vbrquantize.c: + + - workaround for cygwin build problem + - fix "fast floating point math" problem (possible bitrate bloat on quiet pieces) + +2012-01-25 13:01 robert + + * ChangeLog, doc/html/history.html: + + updating Changelog and History + +2012-01-25 12:47 robert + + * configure, configure.in, testcase.mp3 (lame3_99): + + Bug-fix release 3.99.4 + +2012-01-25 12:33 robert + + * ChangeLog, testcase.mp3, doc/html/history.html (lame3_99): + + updating history and changelog + +2012-01-19 14:27 robert + + * frontend/parse.c (lame3_99): + + fix for tracker item ID: 3475581 - lame crashes at .w64 input file + +2012-01-19 12:15 robert + + * frontend/parse.c: + + fix for tracker item ID: 3475581 - lame crashes at .w64 input file + +2012-01-08 23:49 robert + + * include/lame.h, libmp3lame/id3tag.c, libmp3lame/id3tag.h, + libmp3lame/quantize.c, libmp3lame/quantize_pvt.c, + libmp3lame/util.c, libmp3lame/version.h (lame3_99), + include/lame.h, libmp3lame/id3tag.c, libmp3lame/id3tag.h, + libmp3lame/quantize_pvt.c, libmp3lame/util.c: + + Addressing things brought to attention by tracker item ID: 3463197: 3.99.x problem WFED and PCST frames + + + WFED and PCST frames can now be added, to tag podcasts iTunes recognizes + + USER frames are now supported + + COMM frames can now have a description, when passed via --tv "COMM==" + + - possible divide-by-zero exception should be fixed + - adding malformed user-defined-frames could result in abnormal program termination, fixed + +2011-12-04 12:35 robert + + * libmp3lame/: lame.rc (lame3_99), lame.rc: + + re tracker ID: 3449748 Incomplete resource definition file + A translation value seems to be mandatory by convention. + +2011-11-26 19:49 robert + + * ChangeLog, configure, configure.in (lame3_99): + + releasing 3.99.3 + +2011-11-26 18:26 robert + + * doc/html/history.html, libmp3lame/id3tag.c: + + bug fix for tracker item ID: 3441349: --tg does not handle genre number when adding unicode tag + +2011-11-26 18:15 robert + + * doc/html/history.html, libmp3lame/id3tag.c, libmp3lame/version.h + (lame3_99): + + bug fix for tracker item ID: 3441349: --tg does not handle genre number when adding unicode tag + +2011-11-18 09:51 robert + + * doc/html/history.html, libmp3lame/VbrTag.c, libmp3lame/version.c: + + merge with 3.99 branch modifications + +2011-11-18 09:39 robert + + * ChangeLog (lame3_99): + + releasing 3.99.2 + +2011-11-18 09:30 robert + + * configure, configure.in (lame3_99): + + releasing 3.99.2 stable + +2011-11-18 09:18 robert + + * testcase.mp3, doc/html/history.html, libmp3lame/VbrTag.c, + libmp3lame/version.c, libmp3lame/version.h (lame3_99): + + Due to some bugs in 3rd party HW/SW decoders, those were not + be able to make use of LAME's extended info tag anymore, + resulting in problems with things like gapless playback. + +2011-11-18 08:38 robert + + * frontend/: get_audio.c, get_audio.h, lame_main.c (lame3_99): + + copy old id3v2 tag + +2011-11-10 21:39 robert + + * libmp3lame/version.c (lame3_99): + + small fix + +2011-11-10 18:46 robert + + * libmp3lame/version.c: + + small fix + +2011-11-10 13:19 robert + + * frontend/: get_audio.c, get_audio.h, lame_main.c: + + when transcoding, copy old id3v2 tag. feature requests: + ID: 1985551 lame --pass-ID3-tags-unscathed + ID: 977304 ID3 tags lost when transcoding + +2011-11-09 00:15 robert + + * libmp3lame/: quantize.c, quantize_pvt.c: + + aiming for a more balanced bit reservoir usage + +2011-11-08 19:36 robert + + * libmp3lame/quantize_pvt.c: + + at lower sample rates, make a cut at last usable scalefactor band + +2011-11-08 18:19 robert + + * libmp3lame/quantize.c: + + 8kHz mpeg2.5 uses fewer scale factor bands. + +2011-11-06 18:34 robert + + * libmp3lame/encoder.c: + + use same meaning of PE in cbr and vbr modes + +2011-11-05 17:53 robert + + * configure, configure.in, doc/html/history.html, + libmp3lame/version.h: + + main-branch open for next development cycle + +2011-11-05 17:33 robert + + * ChangeLog, configure, configure.in (lame3_99): + + releasing 3.99.1 + +2011-11-05 17:00 robert + + * doc/html/history.html, libmp3lame/version.h (lame3_99): + + releasing 3.99.1 stable + +2011-11-05 16:32 robert + + * misc/: Makefile.am, Makefile.in: + + adding mk_mp3.sh to dist files + +2011-11-02 00:20 robert + + * Makefile.MSVC, libmp3lame/machine.h: + + fixing vc6 compile problem, VC6 seems to miss exporting some inline functions from math.h. + +2011-11-01 19:50 robert + + * libmp3lame/id3tag.c: + + oops, fixing writing unicode strings in id3tags + +2011-11-01 16:59 robert + + * doc/html/history.html, frontend/parse.c, libmp3lame/id3tag.c: + + Fixes for several issues with ID3v2 unicode tags, using Big-Endian text + encodings. Because of several other software (like Windows Media Player), + LAME writes Little-Endian unicode tags only. + Thanks to Taihei Monma, for reporting these issues. + Tracker items: [ 3431203, 3431222, 3431241 ] + +2011-10-18 21:54 robert + + * Dll/BladeMP3EncDLL.h: + + Fixing typedef HBE_STREAM, has to be a pointer type. + +2011-10-18 21:51 robert + + * libmp3lame/: lame.c, util.c: + + Fixing a small display problem for x64 platform + +2011-10-17 23:15 robert + + * libmp3lame/id3tag.c: + + bug fix: ID3 tags are always added + +2011-10-16 13:09 robert + + * frontend/: Makefile.am, Makefile.in: + + file rtp.h was missing in distribution list + +2011-10-15 15:46 robert + + * doc/html/history.html: + + Updating history + +2011-10-15 14:37 robert + + * ChangeLog: + + updating Changelog + +2011-10-15 14:31 robert + + * testcase.mp3, debian/Makefile.am, debian/Makefile.in, + doc/html/detailed.html, libmp3lame/version.h: + + preparing release + +2011-10-15 12:38 robert + + * misc/mk_mp3.sh: + + updating script for building mp3 collection from lossless archive + +2011-10-06 23:12 robert + + * ChangeLog: + + updating changelog + +2011-10-06 23:07 robert + + * frontend/: get_audio.c, parse.c: + + let iconv use transliteration + +2011-10-04 15:37 robert + + * frontend/parse.c: + + fixing compiler warning + +2011-10-04 11:42 robert + + * frontend/: get_audio.c, lame_main.c, main.h, parse.c: + + using our input file reading functions when reading from stdin + allow -s to overwrite input samplerate for non RAW input files too + +2011-10-03 13:28 robert + + * doc/html/history.html, frontend/lame_main.c: + + fix for tracker item ID: 3034259 Fix for confusing fatal error: can't update LAME-tag frame! + +2011-10-03 13:22 robert + + * libmp3lame/id3tag.c, frontend/parse.c: + + making sure, the id3v1 tags get filled + +2011-10-02 21:45 robert + + * doc/html/history.html, frontend/get_audio.c: + + Bug fix for tracker item ID: 3368977 Wave Parser doesn't pad chunks + +2011-10-02 18:39 robert + + * frontend/: portableio.c, portableio.h: + + removing portableio.[ch] files, not needed anymore + +2011-10-02 18:24 robert + + * frontend/parse.c, libmp3lame/id3tag.c: + + fixing some compiler warnings + +2011-10-02 17:13 robert + + * Makefile.MSVC, frontend/Makefile.am, frontend/Makefile.in, + frontend/get_audio.c, frontend/mp3rtp.c, Makefile.unix, + vc_solution/vc9_lame_lame.vcproj, + vc_solution/vc9_lame_mp3rtp.vcproj, + vc_solution/vc9_lame_mp3x.vcproj: + + replacing "portableio" by own code in get_audio.c + +2011-10-02 14:52 robert + + * doc/html/detailed.html, doc/man/lame.1, libmp3lame/id3tag.c, + frontend/main.c, frontend/main.h, frontend/parse.c, + include/lame.def, include/lame.h: + + clearify, unicode tags are utf-16 + +2011-09-28 19:11 robert + + * doc/html/history.html, libmp3lame/id3tag.c, frontend/parse.c, + vc_solution/vc9_lame.sln, vc_solution/vc9_lame_lame.vcproj, + vc_solution/vc9_lame_mp3rtp.vcproj, + vc_solution/vc9_lame_mp3x.vcproj, + vc_solution/vc9_libmp3lame.vcproj, + vc_solution/vc9_libmp3lame_dll.vcproj, + vc_solution/vc9_mpglib.vcproj: + + bug fix for tracker item 3395813: id3tag_set_fieldvalue for URL link frames Broken + + now one can add URL link frames to the ID3v2 tag, like: + --tv "WOAR=www.mypage.com" --tv "WXXX=get remixes here=www.dj.org" + +2011-09-25 17:08 robert + + * libmp3lame/version.h: + + increasing patch level + +2011-07-26 11:48 rbrito + + * frontend/parse.c: + + frontend: Update licensing message. + + Patch supplied by Andres Mejia according to previous + discussions in the mailing lists `lame-dev` and `pkg-multimedia-maintainers`. + + http://lists.alioth.debian.org/pipermail/pkg-multimedia-maintainers/2011-July/020417.html + +2011-06-17 06:22 aleidinger + + * Makefile.am.global: + + Remove ansi2knr part. It will be deprecated and subsequently removed from + automake. + + Notified by: Stefano Lattarini + +2011-05-24 20:45 robert + + * Makefile.unix, libmp3lame/psymodel.c, libmp3lame/quantize_pvt.c: + + small change in addition of simultaneous maskings + +2011-05-24 20:40 robert + + * mpglib/layer2.c: + + workaround for tracker item 3301963:"assertion failed in layer 2 decoding" + +2011-05-07 16:05 rbrito + + * README, Dll/BladeMP3EncDLL.c, Dll/BladeMP3EncDLL.h, + Dll/Example.cpp, debian/copyright, frontend/brhist.c, + frontend/brhist.h, frontend/get_audio.c, frontend/get_audio.h, + frontend/gpkplotting.c, frontend/gpkplotting.h, + frontend/gtkanal.c, frontend/gtkanal.h, frontend/lame_main.c, + frontend/lametime.c, frontend/lametime.h, frontend/main.c, + frontend/main.h, frontend/mp3rtp.c, frontend/parse.c, + frontend/rtp.c, frontend/rtp.h, frontend/timestatus.c, + frontend/timestatus.h, include/lame.h, libmp3lame/VbrTag.c, + libmp3lame/VbrTag.h, libmp3lame/bitstream.c, + libmp3lame/bitstream.h, libmp3lame/encoder.c, + libmp3lame/encoder.h, libmp3lame/fft.h, libmp3lame/id3tag.c, + libmp3lame/l3side.h, libmp3lame/lame-analysis.h, + libmp3lame/lame.c, libmp3lame/machine.h, + libmp3lame/mpglib_interface.c, libmp3lame/newmdct.c, + libmp3lame/newmdct.h, libmp3lame/presets.c, + libmp3lame/psymodel.c, libmp3lame/psymodel.h, + libmp3lame/quantize.c, libmp3lame/quantize.h, + libmp3lame/quantize_pvt.c, libmp3lame/quantize_pvt.h, + libmp3lame/reservoir.c, libmp3lame/reservoir.h, + libmp3lame/set_get.c, libmp3lame/set_get.h, libmp3lame/tables.c, + libmp3lame/tables.h, libmp3lame/takehiro.c, libmp3lame/util.c, + libmp3lame/util.h, libmp3lame/vbrquantize.c, + libmp3lame/vbrquantize.h, libmp3lame/version.c, + libmp3lame/version.h, libmp3lame/vector/lame_intrin.h, + libmp3lame/vector/xmm_quantize_sub.c, test/lame_test.cpp: + + Make explicit that the licence is the Library GPLv2. + + According to Jonas Smedegaard, there is no Lesser GPLv2, only Lesser GPLv2.1. + + Thanks to Andres. + +2011-05-07 15:56 rbrito + + * frontend/parse.c: + + Fix some warnings in 64-bit arches. Changing s/size_t/unsigned int/ + + This should not be a problem with the variables in question, as they can't + be much larger than what an unsigned int is able to hold. + + Patch from: + + http://git.debian.org/?p=pkg-multimedia/lame.git;a=blob;f=debian/patches/07-field-width-fix.patch + + Sent by Andres. + +2011-05-07 15:44 rbrito + + * configure.in: + + Work round buggy softfloat optimization in ARM EABI compilers. + + A bug present in gcc-4.[123] up to 4.3.3 makes a buggy optimization + for single-precision floats when -ffinite-math-only (enabled by -ffast-math) + Refer to the following. + + https://sourceforge.net/tracker/index.php?func=detail&aid=2681646&group_id=290&atid=100290 + https://trac.xiph.org/ticket/1526 + http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39501 + + Thanks to Andres Mejia. This fixes SF bug 2681646. + +2011-05-07 15:35 rbrito + + * libmp3lame/i386/nasm.h: + + Disable executable patch. + + Patch from Russell Coker to disable executable stack from Christian + Marillat's packaging. Sent by Andres Mejia. + +2011-05-07 01:23 rbrito + + * README: + + Tweak slightly the disclaimer of patents from the README file. + + This change was proposed by me with suggestions made by Andres Mejia. + +2011-05-06 20:14 rbrito + + * libmp3lame/lame.c: + + libmp3lame: lame: Put some parentheses to shut up some static analysis tools. + + The statement + + frames_left -= ((frame_num != gfc->ov_enc.frame_number) ? 1 : 0); + + could probably be written as + + frames_left -= (frame_num != gfc->ov_enc.frame_number); + + unless we know of some platform where a boolean evaluation does not result + in a 1 in case of it being true. + +2011-05-06 19:59 rbrito + + * README: + + Remove problematic restriction to the LGPL, to make it legally OK. + + Also update the copyright years of the LAME team. + +2011-04-20 13:03 aleidinger + + * config.rpath: + + looks like this is needed now + +2011-04-20 12:52 aleidinger + + * aclocal.m4, Makefile.in, configure, ACM/Makefile.in, + ACM/ADbg/Makefile.in, ACM/ddk/Makefile.in, + ACM/tinyxml/Makefile.in, Dll/Makefile.in, debian/Makefile.in, + doc/Makefile.in, doc/html/Makefile.in, doc/man/Makefile.in, + dshow/Makefile.in, frontend/Makefile.in, include/Makefile.in, + libmp3lame/Makefile.in, libmp3lame/i386/Makefile.in, + libmp3lame/vector/Makefile.in, mac/Makefile.in, + macosx/Makefile.in, macosx/English.lproj/Makefile.in, + macosx/LAME.xcodeproj/Makefile.in, misc/Makefile.in, + mpglib/Makefile.in, vc_solution/Makefile.in, config.h.in: + + regen + +2011-04-20 12:51 aleidinger + + * configure.in: + + - correct the VBR check message to something more correct (curses) + - check for libiconv and use it in the frontend + +2011-04-19 15:36 robert + + * doc/man/lame.1, frontend/parse.c: + + lame(1) manpage patch - ID: 3161674 + Typo in --longhelp - ID: 3288886 + replaced strnicmp, isn't portable + +2011-04-15 20:17 robert + + * libmp3lame/lame.c: + + Bug fix: when aborting an encode before any samples were fed into the encoder, an assert was falsely triggered. + +2011-04-14 20:48 robert + + * frontend/parse.c: + + Allow -Z switch in none alpha builds (for now) + +2011-04-14 19:36 robert + + * doc/html/history.html, frontend/parse.c, libmp3lame/presets.c, + libmp3lame/version.h: + + 3.99 beta phase + +2011-04-08 23:50 robert + + * misc/mk_mp3.sh: + + mk_mp3.sh - script to encode and tag CDs + +2011-04-08 22:55 robert + + * libmp3lame/psymodel.c: + + some code cleanup: unused vars, defines, etc. + +2011-04-08 19:26 robert + + * frontend/: lame_main.c, main.c, main.h: + + Unicode support for extra options passed via environment varialbe LAMEOPT + +2011-04-07 23:03 robert + + * frontend/get_audio.c: + + quick fix for tracker item 3277412: Segmentation fault at layer2.c:105 with + --decode + (problem sample contains multiple ID3v2 tags) + +2011-04-07 23:01 robert + + * libmp3lame/: psymodel.c, util.h: + + - some code cleanup + - calculate short block thm from long blocks, in case we eventually + may need it for pre-echo control of the next granule + +2011-04-05 19:17 jaz001 + + * doc/html/detailed.html: + + corrected spelling. + +2011-04-04 19:40 robert + + * libmp3lame/psymodel.c: + + small update for the pre-echo control + +2011-04-04 11:49 aleidinger + + * ChangeLog: + + Update upto now. + +2011-04-04 11:48 aleidinger + + * make_changelog.sh: + + Add the script to generate the changelog, not added to Makefile.am as it + does not make sense to distribute it. + + I keep the "cvs log" output in '../log_output', the script expects it there. + +2011-04-04 09:54 aleidinger + + * Makefile.in, config.h.in, configure, ACM/Makefile.in, + ACM/ADbg/Makefile.in, ACM/ddk/Makefile.in, + ACM/tinyxml/Makefile.in, Dll/Makefile.in, debian/Makefile.in, + doc/Makefile.in, doc/html/Makefile.in, doc/man/Makefile.in, + dshow/Makefile.in, frontend/Makefile.in, include/Makefile.in, + libmp3lame/Makefile.in, libmp3lame/i386/Makefile.in, + libmp3lame/vector/Makefile.in, mac/Makefile.in, + macosx/Makefile.in, macosx/English.lproj/Makefile.in, + macosx/LAME.xcodeproj/Makefile.in, misc/Makefile.in, + mpglib/Makefile.in, vc_solution/Makefile.in: + + regen + +2011-04-04 09:51 aleidinger + + * aclocal.m4: + + regen + +2011-04-04 09:49 aleidinger + + * configure.in: + + - depend upon at least autoconf 2.68, this should fix the variable type + size check in configure on Windows (mingw) + - readd check for termcap lib (needed for brhist) + - remove float8 (requested by Robert Hegemann) + - my gcc moans about -march=generic not being supported (anymore), use + 'native' instead of 'generic' in one place + +2011-04-04 09:45 aleidinger + + * Makefile.am.global: + + Depend upon automake 1.11. + +2011-04-04 09:42 aleidinger + + * libmp3lame/i386/Makefile.am: + + Create the directory in any case, seems to prevent a race condition. + +2011-04-04 09:41 aleidinger + + * configMS.h: + + Remove superflous brhist define. + +2011-04-04 09:40 aleidinger + + * INSTALL: + + Remove superflous explication about brhist switch. + +2011-04-04 09:36 aleidinger + + * depcomp, install-sh, ltmain.sh, missing, frontend/depcomp, + libmp3lame/depcomp, misc/depcomp, mpglib/depcomp: + + Update files from automake 1.11 and libtool 2.2.10. + +2011-04-03 22:26 robert + + * libmp3lame/: psymodel.c, version.h: + + pre-echo control for short blocks is dependent on previous frame. + maybe we can relax it later, to speed-up things again. + +2011-03-25 19:57 robert + + * frontend/parse.c: + + dropping note about mpglib being GPL, because we use HIP for decoding. + +2011-03-24 20:19 robert + + * doc/html/detailed.html, doc/man/lame.1, frontend/parse.c, + libmp3lame/id3tag.c: + + new switches controlling the string encoding mode for ID3v2 tags: + --id3v2-latin1 turns on ID3v2 tags, text encoding ISO-8859-1 + --id3v2-ucs2 turns on ID3v2 only tags, text encoding UCS-2 + + Similar experimental switches removed. + +2011-03-24 10:25 robert + + * doc/html/history.html: + + fixing glitch in Joseph's name + +2011-03-24 10:21 robert + + * doc/html/history.html: + + updating history with info about latest changes + +2011-03-22 20:35 robert + + * ChangeLog, libmp3lame/version.h: + + updating ChangeLog + +2011-03-05 20:05 robert + + * libmp3lame/: presets.c, quantize_pvt.c: + + adapting some parameters for vbr-old/cbr/abr, because of the now used psy model + +2011-03-05 18:54 robert + + * libmp3lame/: encoder.c, presets.c, psymodel.c, quantize_pvt.c: + + now all modes use the same (latest) psy model + + code cleanup + +2011-03-05 14:06 robert + + * mpglib/layer3.c: + + fix for a possible out of bounds array access + + re ID: 3091776 crash at III_dequantize_sample + This bug may be fixed now, don't have original problem sample to be sure. + +2011-03-02 16:56 rbrito + + * debian/changelog: + + debian: Update changelog. + +2011-03-02 16:56 rbrito + + * debian/changelog: + + Put my SF email or we get warnings from lintian. + +2011-03-02 16:54 rbrito + + * debian/control: + + Verified that the packaging conforms to the Policy version 3.9.1 + +2011-03-02 16:54 rbrito + + * debian/control: + + Verified that the packaging conforms to the Policy version 3.9.0 + +2011-03-02 16:54 rbrito + + * debian/control: + + Remove unused Conflicts: and Replaces: fields. + + They were never part of any stable release and 3rd party sites were, + perhaps, faster than us in providing changed packages (when the packaging + was not up-to-date). + +2011-03-02 16:53 rbrito + + * debian/control: + + Verified that the packaging conforms to the Policy version 3.8.4 + +2011-03-02 16:53 rbrito + + * debian/control: + + Verified that the packaging conforms to the Policy version 3.8.3 + +2011-03-02 16:52 rbrito + + * debian/control: + + Verified that the packaging conforms to the Policy version 3.8.2 + +2011-03-02 16:52 rbrito + + * debian/control: + + Verified that the packaging conforms to the Policy version 3.8.1.0 + +2011-03-02 16:52 rbrito + + * debian/control: + + Fix lintian's debhelper-but-no-misc-depends from the binary packages. + +2011-03-02 16:51 rbrito + + * debian/changelog: + + Update debian/changelog. + +2011-03-02 16:50 rbrito + + * debian/control: + + debian/control: Change B-D on nasm to allow any i386 platform (no amd64, though). + +2011-03-02 16:50 rbrito + + * debian/control: + + debian/control: Rewrap the Build-Depends field for legibility. + + This also buys us some diff-friendliness. + +2011-03-02 16:48 rbrito + + * debian/: changelog, rules: + + debian: Transition to the debhelper 7 format. + + This format is easier to manage and other people should find it easy to + adapt to downstream necessities. + +2011-03-01 00:34 robert + + * testcase.mp3, libmp3lame/lame.c, libmp3lame/vbrquantize.c: + + - new VBR: mpeg2.5 at 8 kHz doesn't use some scalefactor bands + +2011-02-27 21:08 robert + + * libmp3lame/lame.c: + + small update for q_map + +2011-02-27 01:52 robert + + * libmp3lame/: lame.c, presets.c: + + last patch made manual lowpass setting impossable (for VBR) + +2011-02-27 00:52 robert + + * Makefile.unix, libmp3lame/lame.c, libmp3lame/presets.c, + libmp3lame/psymodel.c, libmp3lame/version.h: + + make use of resampling at lower VBR quality levels + +2011-02-22 19:00 robert + + * libmp3lame/: bitstream.c, encoder.c, lame.c, psymodel.c, + quantize.c, quantize_pvt.c, version.h: + + Starting to use newer VBR psy-model for CBR and ABR encoding too + + bug tracker ID: 3187397 - Strange compression behavior + +2011-02-22 17:58 robert + + * libmp3lame/: bitstream.c, lame.c, presets.c, psymodel.c, + quantize_pvt.c, version.c: + + some code cleanup + +2011-02-13 22:54 rbrito + + * frontend/brhist.c: + + frontend: remove unused variable and computation from brhist.c + +2011-02-13 16:36 robert + + * libmp3lame/: lame.c, quantize.c, quantize_pvt.c, version.h: + + make vbr_mt the default vbr mode + +2011-02-13 13:50 robert + + * frontend/parse.c, include/lame.h, libmp3lame/lame.c, + libmp3lame/presets.c, libmp3lame/set_get.c: + + new mono encoding switches: + -ml encodes left channel only + -mr encodes right channel only + +2011-02-12 16:16 robert + + * frontend/main.h, libmp3lame/presets.c, libmp3lame/vbrquantize.c: + + small fixes for compiler warnings + (vbrquantize.c) bug fix, out of bounds memory write + +2011-02-11 20:17 robert + + * libmp3lame/: lame.c, presets.c, psymodel.c, quantize.c, + vbrquantize.c, version.h: + + - reintroduction of fast encoding mode (-q7 / -f) (vbr_mt / vbr_mtrh) + - minor fix for sfb21 encoding (vbr_mt / vbr_mrth) + - small tunings + +2010-12-08 15:28 robert + + * Dll/: BladeMP3EncDLL.c, BladeMP3EncDLL.h: + + fixing some compile issues when compiling as C++ code + + bug tracker ID: 3125235: make -f Makefile.mingw32 fails + +2010-12-05 12:25 robert + + * Dll/BladeMP3EncDLL.c: + + fixing some compile issues when compiling as C++ code + + bug tracker ID: 3125235: make -f Makefile.mingw32 fails + +2010-12-04 20:43 jaz001 + + * doc/html/detailed.html: + + spelling and better description on -b, -F and -t settings + +2010-12-04 13:30 robert + + * libmp3lame/gain_analysis.h: + + fixing some compile issues with strict compiler settings. + + bug tracker ID: 3025801: gain_analysis.h needs int constants + +2010-12-04 12:55 robert + + * Dll/BladeMP3EncDLL.c: + + fixing some compile issues with strict compiler settings. + + bug tracker ID: 3125235: make -f Makefile.mingw32 fails + +2010-12-03 19:46 jaz001 + + * doc/html/about.html: + + fixed listening tests URL. + +2010-11-21 20:45 jaz001 + + * doc/html/: detailed.html, usage.html: + + yet more small detail changes. + +2010-11-21 20:31 jaz001 + + * doc/html/detailed.html: + + more details about the q switch and the vbr-new/old + some formating changes + +2010-11-21 20:07 jaz001 + + * doc/html/: abr.html, cbr.html, detailed.html, usage.html: + + updates/fixes to the documentation. + +2010-10-30 13:21 robert + + * Makefile.am, Makefile.in, lame_vc8.sln, Dll/LameDll_vc8.vcproj, + Dll/Makefile.am, Dll/Makefile.in, frontend/Makefile.am, + frontend/Makefile.in, frontend/lame_vc8.vcproj, + frontend/mp3x_vc8.vcproj, libmp3lame/Makefile.am, + libmp3lame/Makefile.in, libmp3lame/libmp3lame_vc8.vcproj, + mpglib/Makefile.am, mpglib/Makefile.in, mpglib/mpglib_vc8.vcproj, + vc_solution/vc9_libmp3lame_dll.vcproj: + + VC8 no more + +2010-09-30 20:58 jaz001 + + * doc/html/: Makefile.am, Makefile.in: + + fixed the erroneous naming of files. (fixes: 3078255) + +2010-08-29 05:45 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + reduce table size by merging escHB[512](short) and escLen[512](char) into + escHBL[512](unsigned short). + +2010-08-29 05:16 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + move code to update bitstream position out of loop. + +2010-08-17 23:39 rbrito + + * README: + + Put a notice that Mark Taylor is not the current maintainer, but The + LAME team is. + +2010-08-17 23:36 rbrito + + * README: + + Update the URL to point to the Sourceforge webpage. + +2010-08-17 23:35 rbrito + + * README: + + Update the date of the README file. + +2010-08-17 23:34 rbrito + + * README: + + Cosmetic: delete trailing whitespaces. + +2010-08-17 23:32 rbrito + + * README: + + Remove duplicate copyright entry for Mark Taylor. + +2010-08-17 23:32 rbrito + + * README: + + Update copyright years of the LAME Project. + +2010-07-09 18:59 jaz001 + + * doc/html/: basic.html, examples.html, id3.html, lame.css, + modes.html, node6.html, switchs.html: + + delete old documentation + +2010-07-09 18:58 jaz001 + + * doc/html/detailed.html: + + added anchors to the descriptions, so that one can link to them with an URL. + Corrected a few errors. + +2010-06-11 17:44 jaz001 + + * doc/html/: Makefile.am, about.html, abr.html, cbr.html, + contact.html, contributors.html, detailed.html, index.html, + introduction.html, links.html, list.html, ms_stereo.html, + usage.html, vbr.html, images/logo.gif, images/valid-css.png, + images/valid-xhtml10.png, styles/lame.css: + + Initial commit of the new documentation. Makefile.in should be regenerated. + +2010-06-07 00:18 robert + + * libmp3lame/: presets.c, psymodel.c: + + something to try later + +2010-06-06 19:20 robert + + * frontend/rtp.c: + + fix compile problem on Linux system + +2010-06-06 01:04 robert + + * libmp3lame/: encoder.c, lame.c, lame_global_flags.h, presets.c, + psymodel.c, quantize.c, quantize_pvt.c, set_get.c, util.h, + version.h: + + some further tweaking of vbr new + +2010-06-01 21:55 robert + + * libmp3lame/: lame.c, presets.c, quantize.c, quantize_pvt.c, + quantize_pvt.h, util.h, version.h: + + more tuning on vbr_mt + +2010-06-01 18:51 robert + + * libmp3lame/: bitstream.c, lame.c: + + changing default buffer constraint for vbr_mt + +2010-06-01 16:21 robert + + * libmp3lame/lame.c: + + fixing some compiler warnings + +2010-06-01 15:59 robert + + * frontend/get_audio.c, frontend/get_audio.h, frontend/lametime.c, + frontend/lametime.h, libmp3lame/lame.c, libmp3lame/presets.c, + libmp3lame/quantize.c, libmp3lame/quantize_pvt.c, + libmp3lame/util.c, libmp3lame/util.h, libmp3lame/version.h: + + some work on VBR scale tuning, accessible with --vbr-new + +2010-05-02 20:29 robert + + * frontend/get_audio.c, frontend/get_audio.h, frontend/gtkanal.c, + libmp3lame/lame.c, libmp3lame/presets.c, libmp3lame/util.c, + libmp3lame/version.h: + + work-in-progress: VBR scale tuning + +2010-04-29 00:29 robert + + * libmp3lame/lame.c, libmp3lame/presets.c, libmp3lame/psymodel.c, + libmp3lame/quantize.c, frontend/parse.c, + libmp3lame/quantize_pvt.c, libmp3lame/quantize_pvt.h, + libmp3lame/util.h, libmp3lame/version.h: + + some work on VBR scale tuning, accessible with --vbr-new + +2010-04-15 10:44 robert + + * libmp3lame/: lame.c, VbrTag.c, util.h: + + - calculate input transform matrix once on initialization + - calculate clip detect even when scaling was set; else one doesn't notice that clipping still might happen. + +2010-04-14 09:38 robert + + * libmp3lame/i386/: Makefile.in (lame3_98), Makefile.in: + + Bug fix for tracker item ID: 2986823: Error when building Lame with NASM support -still exists + +2010-04-11 15:46 robert + + * Makefile.MSVC, libmp3lame/lame.rc, libmp3lame/set_get.h: + + adding version/icon resource to VC6 binary builds + +2010-04-11 13:07 robert + + * libmp3lame/lame.c, include/lame.def, include/lame.h: + + add encoding functions passing double precision pcm values ( +/- 1 fulll scale) + +2010-04-09 21:51 robert + + * doc/html/switchs.html, doc/man/lame.1, frontend/get_audio.c, + frontend/main.h, frontend/parse.c: + + - unicode filenames now working with libsndfile on MS-Windows + - presets use the default VBR engine, no need for extra parameter "fast" + +2010-04-08 11:07 robert + + * frontend/get_audio.c, frontend/get_audio.h, frontend/lame_main.c, + frontend/mp3rtp.c, frontend/mp3x.c, frontend/parse.c, + libmp3lame/id3tag.c, libmp3lame/version.h: + + enabling to read OGG Vorbis files via libsndfile + +2010-04-06 11:13 robert + + * libmp3lame/id3tag.c, frontend/lame_main.c, libmp3lame/lame.c, + frontend/get_audio.h, frontend/parse.c, include/lame.def, + include/lame.h: + + - preparing to use ieee float [-1,+1] as internal pcm sample representation in LAME frontend + - removing id3v2 picture size limit + - fixing id3v2 TXXX frame storage + +2010-03-23 11:22 robert + + * include/lame.h: + + small typo + +2010-03-22 23:12 robert + + * libmp3lame/: quantize.c, version.h: + + vbrnew: pad frame to build up bitrservoir + +2010-03-22 20:48 robert + + * ChangeLog (lame3_98): + + updating Changelog + +2010-03-22 20:28 robert + + * doc/html/: history.html (lame3_98), history.html: + + updating latest changes + +2010-03-22 20:25 robert + + * configure, configure.in (lame3_98): + + Update version number in preparation for release. + +2010-03-22 20:19 robert + + * doc/html/: history.html (lame3_98), history.html: + + updating latest changes + +2010-03-22 20:08 robert + + * dshow/: Mpegac.cpp, Mpegac.h, Property.rc, README (lame3_98): + + Joseph Flynn's direct show improvements + +2010-03-22 19:44 robert + + * vc_solution/vc9_mpglib.vcproj: + + adding header file to project + +2010-03-22 14:43 robert + + * mpglib/: README (lame3_98), AUTHORS, README: + + update licence information/header in decoder files + +2010-03-22 14:30 robert + + * mpglib/common.c (lame3_98), LICENSE, mpglib/Makefile.am, + mpglib/Makefile.in, mpglib/common.c, mpglib/common.h, + mpglib/dct64_i386.c, mpglib/dct64_i386.h, mpglib/decode_i386.c, + mpglib/decode_i386.h, mpglib/huffman.h, mpglib/interface.c, + mpglib/interface.h, mpglib/l2tables.h, mpglib/layer1.c, + mpglib/layer1.h, mpglib/layer2.c, mpglib/layer2.h, + mpglib/layer3.c, mpglib/layer3.h, mpglib/mpg123.h, + mpglib/mpglib.h, mpglib/tabinit.c, mpglib/tabinit.h: + + update licence information/header in decoder files + +2010-03-22 14:17 robert + + * mpglib/AUTHORS, mpglib/Makefile.am, mpglib/Makefile.in, + mpglib/common.c, mpglib/common.h, mpglib/dct64_i386.c, + mpglib/dct64_i386.h, mpglib/decode_i386.c, mpglib/decode_i386.h, + mpglib/huffman.h, mpglib/interface.c, mpglib/interface.h, + mpglib/l2tables.h, mpglib/layer1.c, mpglib/layer1.h, + mpglib/layer2.c, mpglib/layer2.h, mpglib/layer3.c, + mpglib/layer3.h, mpglib/mpg123.h, mpglib/mpglib.h, + mpglib/tabinit.c, mpglib/tabinit.h, LICENSE (lame3_98): + + update licence information/header in decoder files + +2010-03-22 11:49 robert + + * vc_solution/vc9_mpglib.vcproj (lame3_98): + + adding header file to project + +2010-03-21 22:22 robert + + * frontend/parse.c, libmp3lame/set_get.c, mpglib/common.c, + mpglib/layer3.c: + + minor changes + +2010-03-21 22:18 robert + + * libmp3lame/reservoir.c: + + Bug fix for tracker item ID: 2973877: A problem regarding the new drain code + +2010-03-21 12:34 robert + + * libmp3lame/version.h (lame3_98): + + Update version number in preparation for release. + +2010-03-21 12:28 robert + + * debian/: Makefile.am, Makefile.in (lame3_98): + + Bug fix for tracker item ID: 2964898: Missing debian/compat + +2010-03-21 12:15 robert + + * libmp3lame/util.c (lame3_98): + + Bug fix for tracker item ID 2963080: Missing #ifdef/#endif in util.c ? + +2010-03-21 12:11 robert + + * libmp3lame/reservoir.c (lame3_98): + + Bug fix for tracker item ID: 2973877: A problem regarding the new drain code + +2010-03-15 01:32 robert + + * frontend/gtkanal.c, vc_solution/vc9_lame.sln, + vc_solution/vc9_lame_mp3x.vcproj: + + it makes no sense, to link mp3x against libmp3lame.dll, because of strong dependencies between them. (pinfo struct) + +2010-03-15 01:07 robert + + * libmp3lame/bitstream.c, libmp3lame/lame.c, frontend/parse.c, + include/lame.def, include/lame.h, libmp3lame/VbrTag.c, + libmp3lame/tables.c, libmp3lame/tables.h, libmp3lame/util.c: + + access functions for bitrate and samplerate tables. exporting of global vars doesn't work well with DLLs. + +2010-03-14 22:47 robert + + * frontend/get_audio.c, frontend/lame_main.c, frontend/main.c, + frontend/main.h, frontend/parse.c, frontend/timestatus.c, + libmp3lame/set_get.h, vc_solution/vc9_lame.sln: + + some code refactorings + +2010-03-14 19:48 robert + + * frontend/timestatus.c, libmp3lame/lame.rc, + vc_solution/vc9_lame_mp3x.vcproj: + + adding resource file containing version and program icon to MP3x project + +2010-03-14 17:23 robert + + * Makefile.MSVC, Makefile.unix, configure.in, frontend/Makefile.am, + frontend/Makefile.in, frontend/brhist.c, frontend/lame_main.c, + frontend/timestatus.c, include/Makefile.am, + include/libmp3lame.sym, vc_solution/Makefile.am: + + BRHIST is mandatory + Layer1 and Layer2 decoding is mandatory + adding libmp3lame.sym file, to use with libtool, declares exported symbols + +2010-03-14 16:15 robert + + * frontend/mp3rtp.c, libmp3lame/set_get.c: + + fixing some compiler warnings + +2010-03-14 15:39 robert + + * testcase.mp3, frontend/main.c, frontend/timestatus.c, + libmp3lame/encoder.c, libmp3lame/psymodel.c, + libmp3lame/quantize.c, libmp3lame/set_get.c, libmp3lame/util.h: + + trying to get rid of remaining GCC compiler warnings + +2010-03-13 21:10 robert + + * Makefile.MSVC: + + additional target mp3rtp + +2010-03-13 20:45 robert + + * frontend/Makefile.am, frontend/lame_main.c, frontend/main.c, + Makefile.MSVC, Makefile.unix, frontend/Makefile.in, + frontend/lame_vc8.vcproj, frontend/mp3rtp.c, frontend/mp3x.c, + frontend/mp3x_vc8.vcproj, vc_solution/vc9_lame.sln, + vc_solution/vc9_lame_lame.vcproj, + vc_solution/vc9_lame_mp3rtp.vcproj, + vc_solution/vc9_lame_mp3x.vcproj: + + main.c is now entry point for all frontend programs + similar to mp3x and mp3rtp, there is now lame_main.c for lame + +2010-03-13 01:49 robert + + * doc/html/history.html: + + support for WAVE_FORMAT_IEEE_FLOAT + +2010-03-13 01:17 robert + + * frontend/get_audio.c: + + support for WAVE_FORMAT_IEEE_FLOAT (for reading via libsndfile) + +2010-03-12 14:00 robert + + * frontend/get_audio.c: + + support for WAVE_FORMAT_IEEE_FLOAT (for reading) + +2010-03-11 00:59 robert + + * frontend/console.c, frontend/get_audio.c, frontend/main.c, + frontend/main.h, frontend/mp3rtp.c, frontend/parse.c, + frontend/rtp.c, frontend/timestatus.c, include/lame.def, + include/lame.h, libmp3lame/id3tag.h: + + experimental unicode support on Windows OS + +2010-03-10 01:41 robert + + * frontend/: main.c, timestatus.c: + + Starting with Unicode support for LAME on Windows + +2010-03-10 00:43 robert + + * frontend/timestatus.c: + + small fix for time status display during encoding + +2010-03-10 00:35 robert + + * frontend/: get_audio.c, main.c, timestatus.c, timestatus.h: + + display of estimated number of frames should be more accurate now, even when re-encoding mp3->mp3 + +2010-03-09 00:03 robert + + * libmp3lame/set_get.c: + + calculation of totalframes more in line with current enc-delay+padding + +2010-03-08 00:17 robert + + * frontend/get_audio.c, frontend/main.c, frontend/timestatus.c, + libmp3lame/bitstream.c, libmp3lame/util.h: + + - reducing some warnings + - lame_get_totalframes still returns wrong estimate when re-encoding + +2010-03-07 21:14 robert + + * frontend/: get_audio.c, get_audio.h, main.c, mp3rtp.c, mp3x.c, + timestatus.c: + + some more code refactoring to clean up encoder/decoder loops + +2010-03-06 21:34 robert + + * doc/html/history.html: + + Bug fix for tracker item ID: 2962223: Encoder delay and padding values ignored when transcoding + +2010-03-06 21:30 robert + + * frontend/: get_audio.c, main.c: + + Bug fix for tracker item ID: 2962223: Encoder delay and padding values ignored when transcoding + +2010-03-06 02:15 robert + + * frontend/: get_audio.c, get_audio.h, main.c, parse.c: + + some code refactorings + +2010-03-05 02:01 robert + + * doc/html/history.html: + + updating history text + +2010-03-04 21:37 robert + + * frontend/rtp.c: + + cleanup some pre-processor code + +2010-03-04 20:03 robert + + * frontend/rtp.c: + + more work on mp3rtp + +2010-03-04 19:42 robert + + * frontend/: mp3rtp.c, rtp.c, rtp.h: + + more work on mp3rtp + should compile with VC9 and GCC now + +2010-03-04 16:38 robert + + * frontend/mp3rtp.c, include/lame.def, frontend/rtp.c, + frontend/rtp.h, vc_solution/vc9_lame.sln, + vc_solution/vc9_lame_mp3rtp.vcproj: + + mp3rtp compiles with VC9 now + +2010-03-04 09:32 robert + + * vc_solution/vc9_lame_mp3rtp.vcproj: + + adding mp3rtp project to VC solution + +2010-03-04 09:23 robert + + * vc_solution/vc9_lame.sln: + + adding mp3rtp project to VC solution + +2010-03-03 00:32 robert + + * mpglib/: layer3.c, mpglib.h: + + Eliminated some remaining global variable in layer3 decoder code. + +2010-03-02 01:21 robert + + * frontend/: brhist.h, console.h, get_audio.c, gtkanal.c, + lametime.h, main.c, main.h, mp3rtp.c, parse.c, parse.h, + portableio.h, timestatus.c, timestatus.h: + + some code refactoring + +2010-02-28 17:22 robert + + * ChangeLog: + + updating Changelog + +2010-02-28 16:52 robert + + * libmp3lame/bitstream.c: + + For free format mp3 above 320 kbps, the maximum allowed bits was limited too far. + +2010-02-27 03:57 robert + + * dshow/: dshow.dsp, dshow.dsw (lame3_98): + + Fixing line ending problem in VC project files, when checked out via make dist. + +2010-02-27 03:18 robert + + * doc/html/history.html: + + updating history text + +2010-02-27 02:58 robert + + * ChangeLog (lame3_98): + + updating Changelog + +2010-02-27 02:51 robert + + * doc/html/history.html (lame3_98): + + updating history text + +2010-02-26 23:23 robert + + * Dll/: Example_vc6.dsp, LameDll_vc6.dsp (lame3_98): + + Bug fix for tracker ID: 2688413 + lib name problem in VS6 + +2010-02-26 22:59 robert + + * dshow/dshow.dsw (lame3_98): + + seems dshow workspace got messed up some time ago + +2010-02-26 22:33 robert + + * Makefile.am, Makefile.in (lame3_98): + + add some missing files used by "make dist" to the configure magic + +2010-02-26 22:24 robert + + * libmp3lame/: Makefile.in, Makefile.am (lame3_98): + + add some missing files used by "make dist" to the configure magic + +2010-02-26 03:40 robert + + * include/Makefile.am, include/Makefile.in, libmp3lame/Makefile.am, + libmp3lame/Makefile.in, libmp3lame/lame.rc (lame3_98): + + adding some files missing after "make dist" + +2010-02-26 03:04 robert + + * Makefile.in (lame3_98): + + adding vc_solution path to configure magic + +2010-02-26 02:49 robert + + * configure, mpglib/Makefile.in (lame3_98): + + adding vc_solution path to configure magic + +2010-02-26 01:59 robert + + * Makefile.am, configure.in (lame3_98): + + adding vc_solution dir, used for "make dist" + +2010-02-26 01:56 robert + + * vc_solution/: Makefile.am, Makefile.in (lame3_98): + + initial check in, used by "make dist" + +2010-02-26 00:55 robert + + * libmp3lame/i386/: Makefile.am (lame3_98), Makefile.am: + + Tracker item ID: 2807676: + Error when building Lame with NASM support + + Patch reported by Bernhard Doebler. + +2010-02-25 23:33 robert + + * testcase.mp3 (lame3_98): + + updating testcase for 3.98.3 + +2010-02-24 08:54 rbrito + + * debian/: changelog, control, copyright, rules (lame3_98): + + Update the debian packaging for the new release. + +2010-02-20 21:19 robert + + * test/lame_test.cpp, vc_solution/vc9_lame_clients.sln, + vc_solution/vc9_lame_test.vcproj: + + adding some small LAME test project. + +2010-02-20 21:08 robert + + * libmp3lame/: lame.c (lame3_98), lame.c: + + Bug fix for tracker ID: 2824296 + wrong enc_padding value in LAME 3.99a & 3.98.3 (from CVS) + +2010-02-20 21:01 robert + + * libmp3lame/VbrTag.c (lame3_98): + + Bug fix for tracker ID: 2872590 + LameTAG: "Music length" missmatch in Lame3.98 + +2010-02-20 20:58 robert + + * libmp3lame/VbrTag.c: + + Bug fix for tracker ID: 2872590 + LameTAG: "Music length" missmatch in Lame3.98 + +2010-02-19 00:44 robert + + * libmp3lame/: id3tag.c (lame3_98), id3tag.c: + + Bug fix for tracker ID: 2887359 + Wrong length in ID3v2 tag when num_samples isn't set + +2010-02-19 00:30 robert + + * Dll/: BladeMP3EncDLL.c (lame3_98), BladeMP3EncDLL.c: + + Bug fix for tracker ID: 2893101 + Access Violation in BladeMP3EncDLL if UNICODE was defined. + +2010-02-19 00:03 robert + + * doc/man/: lame.1 (lame3_98), lame.1: + + Bug fix for tracker ID: 2928684 + Error in man page about "fast insane" + +2010-02-18 22:42 robert + + * libmp3lame/reservoir.c (lame3_98): + + Revisiting the FhG decoder problem (FhG V1.5 build 50, ships with MS Windows): + enabling the new drain code seems to solve that issue better, than restricting the buffer size. + +2010-02-13 23:21 robert + + * frontend/brhist.c, frontend/console.h, frontend/get_audio.c, + frontend/parse.c, frontend/timestatus.c, include/lame.h, + libmp3lame/bitstream.c, libmp3lame/bitstream.h, + libmp3lame/lame.c, libmp3lame/reservoir.c, libmp3lame/version.h: + + Revisiting the FhG decoder problem (FhG V1.5 build 50, ships with MS Windows): + enabling the new drain code seems to solve that issue better, than restricting the buffer size. + +2010-02-06 23:01 robert + + * frontend/parse.c, include/lame.h, libmp3lame/lame.c, + libmp3lame/reservoir.c, libmp3lame/set_get.c, libmp3lame/util.h: + + added new switch for control buffer constraint + +2009-12-12 15:28 robert + + * frontend/console.c: + + increasing size of term_buff array, it might have become too small by now + +2009-12-11 23:19 robert + + * libmp3lame/util.c: + + small issue,: if-def out hip functions, when not using decode-on-the-fly + +2009-12-11 22:44 robert + + * frontend/parse.c (lame3_98): + + Tracker ID: 2891879 + Because of Windows API change, there was a problem with prority switch. Should work again. + +2009-12-11 22:30 robert + + * frontend/parse.c: + + Tracker ID: 2891879 + Because of Windows API change, there was a problem with prority switch. Should work again. + +2009-11-22 22:29 rbrito + + * debian/rules: + + Enable the frontend to be dynamically linked to libmp3lame. + +2009-11-22 22:09 rbrito + + * debian/lame.doc-base: + + Fix correct section of doc-base. + +2009-11-22 21:27 rbrito + + * debian/changelog: + + Consolidate changelog entries. + +2009-11-22 21:18 rbrito + + * debian/source/format: + + Part of migration to new format (3.0 quilt) of Debian packages. + +2009-09-17 06:42 rbrito + + * debian/lame.doc-base: + + Update the section field. + +2009-09-17 05:54 rbrito + + * debian/lame.doc-base: + + Include Debian's doc-base configuration. + +2009-05-16 10:20 rbrito + + * debian/rules: + + Revert cleaning of files in the debian/rules file. + +2009-05-16 10:19 rbrito + + * debian/: Makefile.am, rules: + + Update the list of files in Makefile.am + +2009-05-15 23:09 robert + + * mpglib/: interface.c, layer1.c, layer1.h, layer2.c, layer2.h, + layer3.c, layer3.h: + + trying to handle the case, when audio data exceeds frame size + +2009-05-15 23:05 robert + + * libmp3lame/: bitstream.c, lame.c: + + starting to demangle bitstream buffer handling from postprocessing features like "clip detect" and "replaygain". + +2009-05-10 22:08 jwflynn1 + + * dshow/Mpegac.h: + + minor correction + +2009-05-10 22:06 jwflynn1 + + * dshow/Mpegac.cpp: + + Allocator buffer count on the output pin had been hardcoded to 1. This was changed so that it will now attempt to use the buffer count suggested by the downstream filter or default to 1 if none is specified. + +2009-05-02 13:45 rbrito + + * debian/: lame.files, libmp3lame0-dev.docs, libmp3lame0-dev.files, + libmp3lame0.files: + + Remove obsolete files. We need to fix the auto* files to use the new files. + +2009-05-02 13:44 rbrito + + * debian/: changelog, compat, control, lame.install, + libmp3lame-dev.install, libmp3lame0.install, rules: + + Update Debian/Ubuntu packaging. Add new files. + +2009-04-20 21:47 robert + + * frontend/parse.c, frontend/portableio.c, mpglib/common.c, + mpglib/common.h, mpglib/layer1.c, mpglib/layer2.c, + vc_solution/vc9_lame_config.vsprops, frontend/console.c, + frontend/get_audio.c, frontend/main.c, libmp3lame/fft.c: + + fixing some more compiler warnings + +2009-04-20 05:39 rbrito + + * debian/: changelog, control, copyright, rules, watch: + + Updating the Debian packaging and doing some investigation regarding symbols. + +2009-04-19 22:17 robert + + * libmp3lame/id3tag.c, libmp3lame/takehiro.c, mpglib/layer1.c: + + reducing compiler warnings + +2009-04-19 18:10 robert + + * mpglib/: interface.c, layer2.c: + + Starting to fix decoding bugs. + +2009-04-18 18:33 robert + + * libmp3lame/lame.rc, mpglib/interface.c, mpglib/layer1.c, + mpglib/layer2.c, mpglib/mpg123.h: + + Starting to fix decoding bugs. + +2009-04-17 22:21 robert + + * frontend/console.c, frontend/console.h, frontend/get_audio.c, + frontend/main.c, frontend/parse.c, frontend/timestatus.c, + libmp3lame/lame.c, libmp3lame/util.c, libmp3lame/util.h, + mpglib/interface.c, mpglib/mpglib.h: + + commandline option 'quiet' should suppress any message now + +2009-04-17 11:24 robert + + * frontend/get_audio.c, include/lame.h, libmp3lame/lame.c, + libmp3lame/mpglib_interface.c, libmp3lame/util.c, + libmp3lame/util.h, mpglib/common.c, mpglib/common.h, + mpglib/interface.c, mpglib/layer3.c, mpglib/mpglib.h: + + replaced fprintf calls by lame reporting function calls. this allows to silence decoder. (it used to spit out error messages to stderr) + +2009-04-11 16:04 jwflynn1 + + * dshow/README: + + [no log message] + +2009-04-11 15:59 jwflynn1 + + * dshow/Mpegac.cpp: + + - Added support for the DirectShow IAMStreamConfig Interface to the LAME encoder filter output pin. + + - Modified the DirectShow filter registration section so that the LAME Encoder filter is correctly registered in the Audio Compressors filter category. This will allow third-party encoding applications using the DirectShow System Device Enumerator Interface to correctly detect the LAME encoder when querying the Audio Compressors filter group. + + - Modified the filter registration information so that the MP3 audio subtype is correctly reported as being supported on the encoder output pin. This will allow third-party encoding applications using the DirectShow IFilterMapper2 Interface to recognize that the LAME encoder supports MP3 output. + + - Altered the Filter Merit Value that was being used when the filter was registered so that it is now using the standard DirectShow compressor filter merit value of MERIT_DO_NOT_USE (0x200000). Previously, the filter was being registered using a value of MERIT_SW_COMPRESSOR (0x100000), which was at a lower priority (i.e. worse priority) than MERIT_DO_NOT_USE. This prevented the LAME Encoder filter from being selected for use by some third-party encoding applications. + + - Added code to calculate the frame length of the audio frames used for the nBlockSize element of the WAVEFORMATEX output structure. Previously this value was simply hard-coded to 1. + +2009-04-11 15:51 jwflynn1 + + * dshow/Mpegac.h: + + Added support for the DirectShow IAMStreamConfig Interface + +2009-04-11 15:47 jwflynn1 + + * dshow/Property.rc: + + Updated the embedded "FileVersion" and "ProductVersion" fields + +2009-03-31 22:37 robert + + * libmp3lame/: util.c, util.h (lame3_98), util.c, util.h: + + fix for tracker item 2723518: resampling in 3.98 and 3.99alpha + +2009-03-30 19:48 robert + + * libmp3lame/lame.c (lame3_98): + + ensure we padd at least 288 samples + +2009-03-30 14:38 robert + + * libmp3lame/lame.c: + + ensure we pad with 288 samples at least + +2009-03-30 13:42 robert + + * frontend/: main.c, main.h, parse.c: + + commandline option "--swap-channel" added, as requested. see item: 1118412 + +2009-03-29 18:28 robert + + * libmp3lame/psymodel.c: + + take away sandpaper safety margin for lower samplerates. + It seems samplerates which have convolution bands containing single lines are affected only (at least I don't have any testcase for lower samplerates to justify the safety margin right now) + +2009-03-29 17:35 robert + + * libmp3lame/: lame.c, util.c, util.h: + + workaround for FFMPEG bug, which uses to call lame_encode_flush more than once in loop + +2009-03-29 14:43 robert + + * libmp3lame/lame.c (lame3_98): + + workaround for FFMPEG bug, which uses to call lame_encode_flush more than once in loop + +2009-03-28 22:09 robert + + * libmp3lame/lame.c (lame3_98): + + avoid extra frame at end + +2009-03-02 23:27 robert + + * libmp3lame/VbrTag.c: + + GetVbrTag only works for Layer3, so ignore it when Layer1 or 2. + +2009-02-14 21:59 robert + + * Makefile.unix: + + adding CFG=RH_INTEL for Intel C(++) compiler setup + +2009-02-13 15:03 robert + + * libmp3lame/fft.c, libmp3lame/vector/xmm_quantize_sub.c, + vc_solution/vc9_libmp3lame.vcproj: + + fix crash in VC9 Release Build + +2009-02-13 03:47 robert + + * libmp3lame/takehiro.c, vc_solution/arch_sse2.vsprops, + libmp3lame/fft.c, libmp3lame/quantize.c: + + small changes + +2009-02-12 14:31 robert + + * libmp3lame/: quantize.c, takehiro.c, vector/xmm_quantize_sub.c: + + some tiny changes + +2009-02-12 11:35 robert + + * libmp3lame/fft.c, libmp3lame/vector/lame_intrin.h, + libmp3lame/vector/xmm_quantize_sub.c, + vc_solution/arch_sse2.vsprops: + + first try to add fht using SSE intrinsics + +2009-02-11 00:22 robert + + * vc_solution/vc9_lame_config.vsprops: + + adding configuration for SSE2 target architectures + +2009-02-07 11:18 robert + + * Dll/: Makefile.mingw32 (lame3_98), Makefile.mingw32: + + applying patch from item tracker: [ 2406420 ] compile lame_enc.dll under cygwin + +2009-02-07 00:44 robert + + * libmp3lame/: id3tag.c, vector/xmm_quantize_sub.c: + + small changes + +2009-02-06 23:27 robert + + * libmp3lame/id3tag.c: + + silence some GCC compiler warning + +2009-02-06 23:26 robert + + * libmp3lame/: VbrTag.c, lame.c: + + bug-fix: low bitrate CBR incorrectly tried to write LAME-Tag; var inconsistency + +2009-02-06 23:22 robert + + * libmp3lame/vector/xmm_quantize_sub.c: + + - fix compiler warning about strict-aliasing problem + - fix possible use of uninitialized vars + +2009-02-06 23:20 robert + + * Makefile.unix: + + adding work-configuration for SSE2 optimization under SuSE 32bit + +2009-02-06 00:21 robert + + * vc_solution/: arch_nasm.vsprops, arch_sse2.vsprops, + arch_x87.vsprops, vc9_lame_lame.vcproj, vc9_lame_mp3x.vcproj, + vc9_libmp3lame.vcproj, vc9_libmp3lame_dll.vcproj, + vc9_mpglib.vcproj: + + adding configuration for SSE2 target architectures + +2009-02-06 00:16 robert + + * configMS.h, libmp3lame/vbrquantize.c, vc_solution/vc9_lame.sln, + vc_solution/vc9_lame_lame.vcproj, + vc_solution/vc9_lame_mp3x.vcproj, + vc_solution/vc9_libmp3lame.vcproj, + vc_solution/vc9_libmp3lame_dll.vcproj, + vc_solution/vc9_mpglib.vcproj: + + adding configuration for SSE2 target architectures + +2009-01-18 15:57 robert + + * frontend/get_audio.c, frontend/gtkanal.c, frontend/lametime.c, + frontend/main.c, libmp3lame/bitstream.c, libmp3lame/lame.c, + libmp3lame/psymodel.c, libmp3lame/quantize_pvt.c, + libmp3lame/vector/xmm_quantize_sub.c, mpglib/interface.c, + mpglib/mpglib.h: + + replacing C++ style comments by C style comments + +2009-01-18 15:44 robert + + * libmp3lame/bitstream.c, libmp3lame/lame.c, libmp3lame/psymodel.c, + frontend/get_audio.c, frontend/gtkanal.c, frontend/lametime.c, + frontend/main.c, include/lame.h, libmp3lame/quantize_pvt.c, + libmp3lame/vector/xmm_quantize_sub.c, mpglib/interface.c, + mpglib/mpglib.h (lame3_98): + + replacing C++ style comments by C style comments + +2009-01-18 13:59 robert + + * doc/: html/switchs.html, man/lame.1 (lame3_98), + html/switchs.html, man/lame.1: + + fix for bug tracker item [ 2051870 ] documentation clarifications + +2009-01-18 13:10 robert + + * doc/man/: lame.1 (lame3_98), lame.1: + + fix for bug tracker item 2423650 + +2008-12-26 11:58 robert + + * libmp3lame/: presets.c, psymodel.c: + + disabling testcode + +2008-12-02 03:23 robert + + * libmp3lame/: presets.c, psymodel.c: + + testing some low quality tuning (VBR-new only) + +2008-11-30 00:20 robert + + * Makefile.unix, libmp3lame/presets.c, libmp3lame/psymodel.c: + + testing some different short block switching and change in masking tonal + samples (VBR-NEW only) + +2008-11-09 14:14 robert + + * vc_solution/Makefile.in (lame3_98): + + file Makefile.in was added on branch lame3_98 on 2010-02-26 01:56:52 +0000 + +2008-11-09 14:13 aleidinger + + * ACM/Makefile.in, ACM/ADbg/Makefile.in, ACM/ddk/Makefile.in, + ACM/tinyxml/Makefile.in, Dll/Makefile.in, debian/Makefile.in, + doc/Makefile.in, doc/html/Makefile.in, doc/man/Makefile.in, + dshow/Makefile.in, frontend/Makefile.in, include/Makefile.in, + libmp3lame/i386/Makefile.in, libmp3lame/vector/Makefile.in, + mac/Makefile.in, macosx/English.lproj/Makefile.in, Makefile.in, + libmp3lame/Makefile.in, macosx/LAME.xcodeproj/Makefile.in, + misc/Makefile.in, mpglib/Makefile.in, vc_solution/Makefile.in, + macosx/Makefile.in: + + regen + +2008-11-09 14:11 aleidinger + + * config.h.in, aclocal.m4, configure: + + regen (with autoconf 2.62) + +2008-11-09 14:10 aleidinger + + * libmp3lame/Makefile.am: + + Add missing files, remove deleted ones. + +2008-11-09 14:06 robert + + * vc_solution/Makefile.am (lame3_98): + + file Makefile.am was added on branch lame3_98 on 2010-02-26 01:56:52 +0000 + +2008-11-09 14:06 aleidinger + + * vc_solution/Makefile.am: + + Add missing automake Makefile. + +2008-11-09 14:05 aleidinger + + * configure.in: + + Add possibility to build frontends with dynamic libmp3lame. + +2008-11-09 14:00 aleidinger + + * frontend/Makefile.am: + + Remove -static in preparation for corresponding configure option. + +2008-11-09 13:56 aleidinger + + * ltmain.sh: + + Update to version from libtool 1.5.26. + +2008-11-09 13:50 aleidinger + + * Makefile.am, ACM/Makefile.am, ACM/ADbg/Makefile.am, + ACM/tinyxml/Makefile.am, Dll/Makefile.am, debian/Makefile.am, + dshow/Makefile.am, frontend/Makefile.am, include/Makefile.am, + libmp3lame/i386/Makefile.am, mpglib/Makefile.am: + + Add files which are new, and remove deleted ones. + +2008-11-06 07:10 rbrito + + * doc/html/history.html: + + Update history file with my changes. + +2008-11-06 06:56 rbrito + + * debian/rules: + + Actually remove the rpath issue part. + +2008-11-06 06:55 rbrito + + * debian/: changelog, control: + + Include suggestions of Fabian on the packaging. + Clean up the packaging a bit. + Update the mainline version package. + +2008-11-02 15:26 robert + + * libmp3lame/: quantize_pvt.c, version.h: + + start of 3.99 development cycle: + - demangling "calc_xmin" + +2008-11-01 21:39 robert + + * ACM/lameACM_vc7.vcproj, ACM/ADbg/ADbg_vc7.vcproj, + ACM/tinyxml/tinyxml_vc7.vcproj, dshow/Mpegac.cpp, dshow/REG.CPP, + dshow/REG.H, dshow/aboutprp.cpp: + + - Name clash with our CRegKey class and ATL::CRegKey class solved by putting ours in namespace Lame. + +2008-11-01 21:21 robert + + * vc_solution/: vc9_lame_acm.vcproj, vc9_lame_acm_adbg.vcproj, + vc9_lame_acm_tinyxml.vcproj, vc9_lame_dll.vcproj, + vc9_lame_dll_example.vcproj, vc9_lame_dshow.vcproj, + vc9_lame_lame.vcproj, vc9_lame_mp3x.vcproj, + vc9_libmp3lame.vcproj, vc9_libmp3lame_dll.vcproj, + vc9_mpglib.vcproj: + + moving common VS projects settings into own property page + +2008-11-01 20:41 robert + + * ACM/ACM.cpp, ACM/ACMStream.cpp, ACM/AEncodeProperties.cpp, + ACM/lameACM.def, dshow/Mpegac.cpp, dshow/aboutprp.cpp, + vc_solution/vc9_lame_acm.vcproj, + vc_solution/vc9_lame_acm_adbg.vcproj, + vc_solution/vc9_lame_acm_tinyxml.vcproj, + vc_solution/vc9_lame_config.vsprops, + vc_solution/vc9_lame_dll.vcproj, + vc_solution/vc9_lame_dll_example.vcproj, + vc_solution/vc9_lame_dshow.vcproj, + vc_solution/vc9_lame_lame.vcproj, + vc_solution/vc9_lame_mp3x.vcproj, + vc_solution/vc9_libmp3lame.vcproj, + vc_solution/vc9_libmp3lame_dll.vcproj, + vc_solution/vc9_mpglib.vcproj (lame3_98): + + moving common VS projects settings into own property page + +2008-11-01 13:32 robert + + * dshow/Mpegac.cpp, dshow/REG.CPP, dshow/REG.H, + vc_solution/vc9_lame_acm.vcproj, + vc_solution/vc9_lame_acm_adbg.vcproj, + vc_solution/vc9_lame_acm_tinyxml.vcproj, + vc_solution/vc9_lame_dll.vcproj, + vc_solution/vc9_lame_dll_example.vcproj, + vc_solution/vc9_lame_dshow.vcproj (lame3_98): + + - VC6 upgrade property pages removed, not needed + - Name clash with our CRegKey class and ATL::CRegKey class solved by putting ours in namespace Lame. + +2008-10-23 23:35 robert + + * mpglib/: README, TODO, common.c, common.h, dct64_i386.c, + dct64_i386.h, decode_i386.c, decode_i386.h, huffman.h, + interface.c, interface.h, l2tables.h, layer1.c, layer1.h, + layer2.c, layer2.h, layer3.c, layer3.h, mpg123.h, mpglib.h, + tabinit.c, tabinit.h (lame3_98): + + exchanging mpglib by libhip from main-branch + +2008-10-23 23:26 robert + + * mpglib/: common.c, common.h, dct64_i386.c, dct64_i386.h, + decode_i386.c, decode_i386.h, huffman.h, interface.c, + interface.h, l2tables.h, layer1.c, layer1.h, layer2.c, layer2.h, + layer3.c, layer3.h, mpg123.h, mpglib.h, tabinit.c, tabinit.h: + + fixing indentation + +2008-10-23 23:17 robert + + * frontend/brhist.h, frontend/get_audio.c, frontend/get_audio.h, + frontend/main.c, frontend/main.h, frontend/portableio.c, + frontend/portableio.h, mpglib/common.c, mpglib/common.h, + mpglib/dct64_i386.c, mpglib/dct64_i386.h, mpglib/decode_i386.c, + mpglib/decode_i386.h, mpglib/huffman.h, mpglib/interface.c, + mpglib/interface.h, mpglib/layer1.h, mpglib/layer2.c, + mpglib/layer2.h, mpglib/layer3.c, mpglib/layer3.h, + mpglib/mpg123.h, mpglib/tabinit.c, mpglib/tabinit.h: + + removing some tabs + preparing for indent + +2008-10-21 23:09 robert + + * mpglib/: TODO, interface.c, layer3.c, mpg123.h, mpglib.h: + + re-applying some of our changes to decoding lib + +2008-10-21 22:35 robert + + * mpglib/: README, common.c, common.h, dct64_i386.c, dct64_i386.h, + decode_i386.c, decode_i386.h, huffman.h, interface.c, + interface.h, l2tables.h, layer1.c, layer1.h, layer2.c, layer2.h, + layer3.c, layer3.h, mpg123.h, mpglib.h, tabinit.c, tabinit.h: + + replacing mpglib by libhip + +2008-10-21 22:34 robert + + * include/lame.h: + + fix small issues with C99 + +2008-10-21 22:06 robert + + * include/lame.h (lame3_98): + + fix small issues with C99 + +2008-10-12 19:46 robert + + * libmp3lame/version.h (lame3_98), libmp3lame/lame.rc, + libmp3lame/logoe.ico, libmp3lame/version.c, libmp3lame/version.h, + vc_solution/vc9_lame_lame.vcproj, + vc_solution/vc9_libmp3lame_dll.vcproj: + + Adding resources to EXE and DLL + +2008-10-12 19:33 robert + + * libmp3lame/lame.rc, libmp3lame/logoe.ico, libmp3lame/version.c, + libmp3lame/version.h, vc_solution/vc9_lame_lame.vcproj, + vc_solution/vc9_libmp3lame_dll.vcproj (lame3_98): + + Adding resources to EXE and DLL + +2008-10-11 19:12 robert + + * ChangeLog (lame3_98): + + updating Changelog + +2008-10-11 19:08 robert + + * frontend/gtkanal.c, libmp3lame/mpglib_interface.c, + libmp3lame/util.h (lame3_98): + + fixing mp3x build + +2008-10-11 18:58 robert + + * frontend/gtkanal.c, libmp3lame/mpglib_interface.c, + libmp3lame/util.h: + + fixing mp3x build + +2008-10-11 18:04 robert + + * doc/html/history.html, frontend/get_audio.c, frontend/gtkanal.c, + frontend/parse.c, libmp3lame/bitstream.c, libmp3lame/id3tag.c, + libmp3lame/lame.c, libmp3lame/mpglib_interface.c, + libmp3lame/util.c, libmp3lame/util.h, mpglib/.cvsignore, + mpglib/common.c, mpglib/interface.c, mpglib/layer3.c, + mpglib/mpg123.h, mpglib/mpglib.h, include/lame.def, + include/lame.h, vc_solution/vc9_libmp3lame.vcproj, + vc_solution/vc9_libmp3lame_dll.vcproj (lame3_98), + doc/html/history.html, frontend/gtkanal.c, include/lame.def, + include/lame.h, libmp3lame/id3tag.c, + libmp3lame/mpglib_interface.c, mpglib/layer3.c, mpglib/mpglib.h, + vc_solution/vc9_libmp3lame.vcproj, + vc_solution/vc9_libmp3lame_dll.vcproj: + + Library API change: lame_decode functions are now obsolete but still present, please use hip_decode instead. + + The reason for this change is: lame_decode functions use a single global variable within the library to store decoder setup, hip_decode functions don't. + + The encoder now uses hip_decode internally and it is now possible to use clipdetect feature while reencoding mp3 to mp3. + +2008-10-07 21:57 robert + + * doc/html/history.html, frontend/parse.c: + + - let ignore-tag-errors effect albumart option too + - updating history + +2008-10-07 20:24 robert + + * doc/html/history.html, frontend/parse.c, libmp3lame/version.h + (lame3_98): + + - let ignore-tag-errors effect albumart option too + - updating history + +2008-09-22 20:21 robert + + * libmp3lame/: takehiro.c, version.h (lame3_98): + + source merging resultet in bug: loop var was incremented twice + now fixed + +2008-09-21 15:53 robert + + * testcase.mp3 (lame3_98): + + updating testcase.mp3 to current version + +2008-09-21 15:51 robert + + * ChangeLog (lame3_98): + + updating Changelog of branch lame3_98 + +2008-09-21 15:29 robert + + * doc/man/lame.1: + + fixing Rogerios patch + +2008-09-19 07:30 rbrito + + * debian/: changelog, control, rules (lame3_98): + + Various improvements to the packaging. Thanks to Fabian. + +2008-09-19 07:08 rbrito + + * doc/man/lame.1 (lame3_98): + + Remove warnings from nroff while processing the manpage. + +2008-09-19 07:02 rbrito + + * doc/man/lame.1: + + Fixing warnings generated by nroff. + +2008-09-14 15:21 robert + + * frontend/parse.c: + + replacing stricmp by local_strcasecmp + +2008-09-14 11:54 robert + + * doc/html/history.html, doc/html/id3.html, doc/man/lame.1, + frontend/parse.c, libmp3lame/id3tag.c, USAGE: + + Fixing some ID3 tagging issues: + - some sloppier search for genre names + - new switch --pad-id3v2-size which allows some user defined padding + +2008-09-14 11:51 robert + + * doc/html/history.html, doc/html/id3.html, doc/man/lame.1, + frontend/parse.c, include/lame.def, include/lame.h, + libmp3lame/id3tag.c, libmp3lame/id3tag.h, USAGE (lame3_98): + + Fixing some ID3 tagging issues: + - some sloppier search for genre names + - new switch --pad-id3v2-size which allows some user defined padding + +2008-09-13 21:44 robert + + * doc/html/id3.html, libmp3lame/id3tag.c (lame3_98): + + fixing typo + +2008-09-12 19:41 robert + + * libmp3lame/id3tag.c, libmp3lame/id3tag.h, frontend/parse.c, + include/lame.def, include/lame.h: + + new frontend switch "--pad-id3v2-size ": + allow id3v2 padding of 0 to 128000 bytes + +2008-09-11 00:49 robert + + * frontend/parse.c: + + replace common suffixes by MP3/WAV when no output filename was given + +2008-09-08 22:46 robert + + * frontend/main.c, frontend/parse.c, include/lame.h, + libmp3lame/mpglib_interface.c: + + eleminating some compiler warnings + +2008-08-31 19:35 robert + + * libmp3lame/i386/nasm.h (lame3_98): + + fixing the fix to get it assemble for ELF again + +2008-08-31 19:31 robert + + * include/lame.h, libmp3lame/i386/nasm.h: + + fixing the fix to get it assembling for ELF again + +2008-08-31 17:52 robert + + * include/lame.h: + + remove some debugging noise + +2008-08-31 16:14 robert + + * frontend/get_audio.c, libmp3lame/bitstream.c, libmp3lame/lame.c, + libmp3lame/mpglib_interface.c, libmp3lame/util.c, + libmp3lame/util.h, frontend/gtkanal.c, frontend/parse.c, + include/lame.def, include/lame.h, mpglib/layer3.c, + mpglib/mpglib.h: + + Fix for API problem: + lame decoding functionality used one global data structure in libmp3lame for all decoding ativities. This is a big problem with dynamic linking! + New API functions added, which use handles to work with. + Old API functions are still there, but are deprecated. + +2008-08-31 12:26 robert + + * libmp3lame/i386/: choose_table.nas, fft3dn.nas, fftsse.nas, + nasm.h (lame3_98), choose_table.nas, fft3dn.nas, fftsse.nas, + nasm.h: + + fixing none PIC assembling problem + +2008-08-27 10:27 rbrito + + * libmp3lame/i386/: Makefile.am, choose_table.nas, fft3dn.nas, + fftsse.nas, nasm.h: + + Committing the changes from Gentoo and PaX Team to the HEAD. + +2008-08-25 12:57 rbrito + + * debian/changelog, libmp3lame/i386/choose_table.nas, + libmp3lame/i386/fft3dn.nas, libmp3lame/i386/fftsse.nas + (lame3_98): + + Fix text relocations and update debian changelog. + Thanks to the PaX Team and Gentoo people. + +2008-08-25 12:43 rbrito + + * libmp3lame/i386/nasm.h (lame3_98): + + Fix to executable stack (thanks to Gentoo people) + +2008-08-25 12:38 rbrito + + * libmp3lame/i386/Makefile.am (lame3_98): + + Fixes building of asm with libtool 2.2 (thanks to Gentoo people) + +2008-08-16 12:48 robert + + * doc/man/: lame.1 (lame3_98), lame.1: + + adding MPEG-2.5 bitrate table + +2008-08-13 21:01 robert + + * libmp3lame/tables.h: + + revert + +2008-08-13 20:38 robert + + * libmp3lame/: tables.c, tables.h: + + fix compilation via configure/make + +2008-08-11 20:55 robert + + * libmp3lame/: takehiro.c (lame3_98), takehiro.c: + + loop rewritten; result of discussion with Michael Stoner + +2008-08-08 20:34 robert + + * libmp3lame/takehiro.c: + + tiny speed-up + +2008-08-07 20:55 robert + + * Makefile.unix, doc/html/switchs.html, doc/man/lame.1, + frontend/parse.c, libmp3lame/lame.c: + + making some switches developer only switches + +2008-08-07 14:53 robert + + * mpglib/: .cvsignore, common.c, dct64_i386.h, huffman.h, + interface.c, l2tables.h, layer1.h, mpg123.h, mpglib.h, tabinit.h: + + sync with HIP development + +2008-08-07 14:52 robert + + * libmp3lame/lame.c: + + we did init bitstream (Xing header) before final decisions were made + +2008-08-06 17:12 robert + + * frontend/parse.c (lame3_98): + + add proper file closing + +2008-08-06 17:12 robert + + * doc/html/history.html, frontend/parse.c: + + fix for tracker item [ 2039648 ] potential memory leak in parse_args() function in parse.c + +2008-08-06 17:06 robert + + * doc/html/history.html, frontend/parse.c (lame3_98): + + fix for tracker item [ 2039648 ] potential memory leak in parse_args() function in parse.c + +2008-08-06 16:14 robert + + * frontend/parse.c: + + internal switches are available only when compiled with + preprocessor symbol _ALLOW_INTERNAL_OPTIONS + defined. + +2008-08-06 16:10 robert + + * USAGE, doc/html/switchs.html, frontend/parse.c, doc/man/lame.1: + + removing some obsolete switches + +2008-08-06 15:57 robert + + * USAGE (lame3_98): + + removing some obsolete switches + +2008-08-06 15:52 robert + + * doc/man/lame.1 (lame3_98): + + removing some obsolete switches + +2008-08-06 15:35 robert + + * frontend/parse.c (lame3_98): + + removing some obsolete switches + +2008-08-06 15:24 robert + + * doc/html/switchs.html (lame3_98): + + removing internal switches + +2008-08-06 11:55 robert + + * libmp3lame/presets.c (lame3_98): + + keeping "sfb21mod" as in 3.98 release + +2008-08-05 17:45 robert + + * doc/html/history.html, frontend/parse.c, libmp3lame/lame.c: + + fix for bugtracker item [ 2029282 ] Frequency filtering API broken in 3.98 + +2008-08-05 17:26 robert + + * doc/html/history.html, frontend/parse.c, libmp3lame/lame.c + (lame3_98): + + bug fix for tracker item [ 2029282 ] Frequency filtering API broken in 3.98 + +2008-08-05 14:19 robert + + * doc/html/history.html: + + updating history + +2008-08-05 14:16 robert + + * HACKING, Makefile.unix, configure.in, debian/changelog, + debian/rules, doc/html/history.html, doc/man/lame.1, + frontend/mp3rtp.c, frontend/rtp.c, libmp3lame/VbrTag.c, + libmp3lame/bitstream.c, libmp3lame/encoder.c, + libmp3lame/gain_analysis.c, libmp3lame/id3tag.c, + libmp3lame/lame.c, libmp3lame/presets.c, libmp3lame/psymodel.c, + libmp3lame/quantize.c, libmp3lame/quantize_pvt.c, + libmp3lame/quantize_pvt.h, libmp3lame/util.c, + libmp3lame/vbrquantize.c, libmp3lame/version.h, misc/abx.c + (lame3_98): + + bug fixes from main branch + +2008-08-05 12:33 robert + + * libmp3lame/id3tag.c: + + fix for bug: LAME writes ID3v2 tag when some ID3v1 field length is too short to hold the text, even in case ID3v1 only is specified. + +2008-08-05 12:32 robert + + * libmp3lame/: bitstream.c, util.h, vbrquantize.c: + + changes after doing some linting + +2008-08-04 19:53 robert + + * libmp3lame/: bitstream.c, VbrTag.c, encoder.c, encoder.h, fft.c, + fft.h, gain_analysis.c, gain_analysis.h, id3tag.c, id3tag.h, + lame-analysis.h, lame.c, machine.h, mpglib_interface.c, + presets.c, psymodel.c, psymodel.h, quantize.c, quantize.h, + quantize_pvt.c, quantize_pvt.h, set_get.c, tables.c, tables.h, + takehiro.c, util.c, util.h, vbrquantize.c, vbrquantize.h, + VbrTag.h: + + changes after doing some linting + +2008-07-28 17:18 robert + + * libmp3lame/lame.c, misc/abx.c: + + fixing swapped parameters on calloc call + +2008-07-28 16:57 robert + + * libmp3lame/psymodel.c: + + fixing small typo + +2008-07-28 16:38 robert + + * include/lame.h, libmp3lame/VbrTag.c, libmp3lame/VbrTag.h, + libmp3lame/bitstream.c, libmp3lame/bitstream.h, + libmp3lame/encoder.c, libmp3lame/encoder.h, libmp3lame/id3tag.c, + libmp3lame/id3tag.h, libmp3lame/lame.c, + libmp3lame/lame_global_flags.h, libmp3lame/machine.h, + libmp3lame/newmdct.c, libmp3lame/psymodel.c, + libmp3lame/psymodel.h, libmp3lame/quantize.c, + libmp3lame/quantize.h, libmp3lame/quantize_pvt.c, + libmp3lame/quantize_pvt.h, libmp3lame/reservoir.c, + libmp3lame/reservoir.h, libmp3lame/set_get.c, + libmp3lame/takehiro.c, libmp3lame/util.c, libmp3lame/util.h, + libmp3lame/vbrquantize.c: + + reorganizing the huge lame_internal_flags structure + +2008-07-23 14:59 robert + + * libmp3lame/util.c: + + removed extra line. + tracker item: [ 2022101 ] tiny bug(?) in fill_buffer_resample() + +2008-07-23 14:46 robert + + * libmp3lame/lame.c: + + fix for tracker item: [ 2022035 ] encoder_padding value and resampling + +2008-07-19 13:34 rbrito + + * HACKING: + + Fixed HACKING documentation. + +2008-07-19 13:09 rbrito + + * HACKING: + + Fix documentation for set_get/get_set confusion. + +2008-07-19 12:54 rbrito + + * doc/html/history.html, frontend/mp3rtp.c, frontend/rtp.c: + + Fixed compilation of mp3rtp and closed bug on sourceforge tracker. + +2008-07-18 22:43 robert + + * libmp3lame/: VbrTag.c, quantize_pvt.h, encoder.c, + gain_analysis.c, id3tag.c, psymodel.c, quantize.c, + quantize_pvt.c, vbrquantize.c, bitstream.c: + + - removing some unused variables + - fix a possible 'divide by zero' in vbrpsy_mask_add + +2008-07-12 15:59 rbrito + + * Makefile.unix: + + Tidying up the Makefile.unix file. Possibly more to come. + +2008-07-12 14:32 rbrito + + * debian/changelog: + + Mention changes to the build system on debian/ubuntu/whatever systems. + +2008-07-12 14:28 rbrito + + * debian/rules: + + Include changes so that the linker only includes libraries directly needed. + +2008-07-12 14:26 rbrito + + * Makefile.unix: + + Include a clue for emacs to know that this is a makefile. + +2008-07-08 07:14 rbrito + + * doc/man/lame.1: + + Small updates to the manpage + +2008-07-07 23:50 robert + + * doc/html/history.html, libmp3lame/presets.c: + + linear interpolate preset param sf21mod + +2008-07-07 10:20 rbrito + + * Makefile.unix: + + Fixed typo in one option. + +2008-07-07 09:32 rbrito + + * Makefile.unix: + + Include flags for compilation for newer machines running Linux. + Comment the use of gtk1.2 for Linux at least (don't know about *BSD). + +2008-07-07 02:18 rbrito + + * doc/html/history.html: + + Many fixes to the HTML file (too numerous to mention here). Now, it + validates at w3.org (and let us keep it this way, please). + +2008-07-07 00:17 rbrito + + * misc/abx.c: + + Finally fix the endianness issue and be able to close the reported bug. + +2008-07-07 00:16 rbrito + + * misc/abx.c: + + Fix a memory leak (detected by running valgrind). + +2008-07-07 00:14 rbrito + + * misc/abx.c: + + Remove inactive/commented coded that doesn't seem to be necessary. + +2008-07-05 11:51 robert + + * lame_clients_vc6.dsw, lame_projects_vc6.dsp, lame_vc6.dsw: + + we don't support VC6 anymore + +2008-07-05 07:50 robert + + * ACM/lameACM_vc6.dsp, ACM/ADbg/ADbg.dsp, ACM/tinyxml/test.dsp, + ACM/tinyxml/test.dsw, ACM/tinyxml/tinyxml.dsp, + Dll/Example_vc6.dsp, Dll/Example_vc6.dsw, Dll/LameDll_vc6.dsp, + dshow/dshow.dsp, dshow/dshow.dsw, frontend/lame_vc6.dsp, + frontend/mp3x_vc6.dsp, libmp3lame/libmp3lame_dll_vc6.dsp, + libmp3lame/libmp3lame_vc6.dsp, mpglib/mpglib_vc6.dsp: + + we don't support VC6 anymore + +2008-07-05 07:38 robert + + * libmp3lame/version.h, configure.in: + + Main branch at 3.99 alpha + +2008-07-03 22:04 robert + + * libmp3lame/version.h (lame3_98): + + preparing release + +2008-06-30 23:31 robert + + * configMS.h, dshow/Property.rc, dshow/aboutprp.cpp: + + updating LAME version property + +2008-06-29 21:40 rbrito + + * configure, configure.in, debian/changelog: + + New updated options for compiling with expopt (to be cleaned up latter). + Fixes to the Debian packaging for the pending release. + +2008-06-29 03:25 rbrito + + * doc/html/history.html: + + Fixed my name on an older entry of the history. + +2008-06-28 22:36 robert + + * doc/html/: Makefile.am, Makefile.in: + + removing presets.html, it is not in repository anymore + +2008-06-27 20:47 robert + + * Makefile.unix, testcase.mp3: + + updating testcase for 3.98 stable release + +2008-06-26 21:26 robert + + * vc_solution/: vc9_lame.sln, vc9_lame_acm.vcproj, + vc9_lame_acm_adbg.vcproj, vc9_lame_acm_tinyxml.vcproj, + vc9_lame_dll.vcproj, vc9_lame_dll_example.vcproj, + vc9_lame_dshow.vcproj, vc9_lame_lame.vcproj, + vc9_lame_mp3x.vcproj, vc9_libmp3lame.vcproj, + vc9_libmp3lame_dll.vcproj, vc9_mpglib.vcproj: + + removing blanks from configuration and project names (because of NASM rule) + +2008-06-26 10:26 bouvigne + + * doc/html/index.html, doc/html/presets.html, doc/man/lame.1, + frontend/parse.c: + + simplified --preset docs + +2008-06-26 10:09 bouvigne + + * doc/html/: history.html, index.html: + + updated the html docs for 3.98 + +2008-06-26 08:57 bouvigne + + * libmp3lame/psymodel.c: + + revert my calc_energy changes + +2008-06-25 21:59 robert + + * mpglib/: layer2.c, layer3.c, mpg123.h: + + cosmetic changes, some more compiler (gcc) warnings eliminated + +2008-06-25 12:45 aleidinger + + * ChangeLog: + + recent changes + +2008-06-25 12:43 aleidinger + + * doc/html/history.html: + + a little bit of history + +2008-06-25 12:40 aleidinger + + * configure: + + regen + +2008-06-25 12:37 aleidinger + + * configure.in: + + fix --diable-cpml switch + +2008-06-25 12:17 aleidinger + + * mpglib/Makefile.in, Makefile.in, ACM/Makefile.in, + ACM/ADbg/Makefile.in, ACM/ddk/Makefile.in, + ACM/tinyxml/Makefile.in, Dll/Makefile.in, debian/Makefile.in, + doc/Makefile.in, doc/html/Makefile.in, doc/man/Makefile.in, + dshow/Makefile.in, frontend/Makefile.in, include/Makefile.in, + libmp3lame/Makefile.in, libmp3lame/i386/Makefile.in, + libmp3lame/vector/Makefile.in, mac/Makefile.in, + macosx/Makefile.in, macosx/English.lproj/Makefile.in, + macosx/LAME.xcodeproj/Makefile.in, misc/Makefile.in: + + regen (math lib change) + +2008-06-25 12:13 aleidinger + + * configure.in: + + export the math lib, allow to disable the use of the alpha optimized math lib + +2008-06-25 12:12 aleidinger + + * libmp3lame/Makefile.am: + + add the math lib explicitely to the build of the lib + +2008-06-25 08:20 robert + + * frontend/parse.c, mpglib/decode_i386.c, mpglib/interface.c, + mpglib/interface.h, mpglib/layer1.c, mpglib/layer2.c, + mpglib/mpglib.h: + + Some cosmetic changes, now the vc9 compiles the workspace vc9_lame without any warning + +2008-06-24 19:07 rbrito + + * doc/html/history.html: + + Add some modifications of mine to the history + +2008-06-24 18:39 rbrito + + * debian/: changelog, control, rules: + + Updates to the Debian packaging. + +2008-06-24 17:06 rbrito + + * misc/abx.c: + + Quick and dirty fix for some memory leak (detected via Valgrind). + +2008-06-22 18:39 robert + + * doc/html/: history.html, contributors.html: + + tracker item [ lame-Patches-1990643 ] DShow direct file writer output + patch by Anton Sergunov (setosha) + +2008-06-22 18:31 robert + + * dshow/: Encoder.cpp, Encoder.h, Mpegac.cpp, Mpegac.h: + + tracker item [ lame-Patches-1990643 ] DShow direct file writer output + patch by Anton Sergunov (setosha) + +2008-06-22 18:29 robert + + * vc_solution/: vc9_lame_acm.vcproj, vc9_lame_acm_adbg.vcproj, + vc9_lame_acm_tinyxml.vcproj, vc9_lame_dll_example.vcproj, + vc9_lame_dshow.vcproj: + + linking against multithreaded (debug) DLL + +2008-06-17 20:57 robert + + * frontend/parse.c, libmp3lame/presets.c: + + bug fix: preset INSANE wasn't a CBR preset anymore, but preset help said it should be + +2008-06-10 19:24 rbrito + + * misc/abx.c: + + Fixes for consistency (lack of PATH on some commands) + +2008-06-10 19:14 rbrito + + * misc/abx.c: + + Removing spurious whitespaces at the end of lines. + +2008-06-10 16:10 rbrito + + * misc/abx.c: + + Corrected the abx.c file to work on Linux x86-64 (it should work on ia32 too). + + I think that I can remove latter the commented lines. They were prejudicial + to playing the file on Linux (i.e., a 1min file was played in less than 5s, + which is not exactly something that useful for doing an abx test). + +2008-05-24 08:40 aleidinger + + * ChangeLog: + + Add nearly a year of history. + +2008-05-24 08:37 aleidinger + + * Makefile.in, configure: + + regen + +2008-05-24 08:31 aleidinger + + * macosx/: Makefile.in, English.lproj/Makefile.in, + LAME.xcodeproj/Makefile.in: + + regen + +2008-05-24 08:28 aleidinger + + * configure.in, macosx/Makefile.am, + macosx/English.lproj/Makefile.am, + macosx/LAME.xcodeproj/Makefile.am: + + Add some more macosx stuff + +2008-05-22 17:32 audiofileeng + + * macosx/: English.lproj/InfoPlist.strings, + LAME.xcodeproj/project.pbxproj: + + adding files in subdirectories in macosx + +2008-05-22 06:26 aleidinger + + * Makefile.am, configure.in, macosx/Makefile.am: + + add the new macosx directory + +2008-05-21 03:05 audiofileeng + + * macosx/: Info.plist, LAME_Prefix.pch: + + added XCode framework project for Mac OS X + +2008-05-19 07:41 bouvigne + + * libmp3lame/: psymodel.c, util.h: + + faster calc_energy: don't loop if there is a single line within the band + +2008-05-18 17:49 bouvigne + + * libmp3lame/psymodel.c: + + faster calc_energy: dont' loop if there is a single line within the band + +2008-05-14 07:43 rbrito + + * debian/watch: + + New file for detecting new versions of the package. + +2008-05-14 07:42 rbrito + + * debian/: changelog, control, copyright, lame.docs, + libmp3lame0-dev.docs, libmp3lame0-dev.files, rules: + + Updates to the Debian packaging. + +2008-04-28 20:32 robert + + * frontend/get_audio.c: + + fixing LIBSNDFILE compile problem found by Rogério Brito + +2008-04-23 01:50 robert + + * frontend/main.c, frontend/parse.h, libmp3lame/lame.c, + libmp3lame/lame_global_flags.h, libmp3lame/machine.h, + libmp3lame/psymodel.c: + + fix for bug-tracker item:[ 1948101 ] Memory not freed (lame-3.97, lame-3.98b8) + plus, we didn't call lame_close in decode-only case + +2008-04-22 23:01 robert + + * libmp3lame/machine.h, libmp3lame/newmdct.c, + libmp3lame/quantize.c, libmp3lame/quantize_pvt.c, + mpglib/interface.c, mpglib/layer1.c: + + fixing a problem if you are using --fast-math compiler switch + +2008-04-13 22:03 robert + + * doc/html/history.html, libmp3lame/version.h: + + updating history, we are now at 3.98 beta 8 + +2008-04-13 21:27 robert + + * frontend/get_audio.c, frontend/main.h, frontend/parse.c, + libmp3lame/psymodel.c: + + found some problem in Naoki's additive masking code and fixed it for VBR_NEW + +2008-04-13 13:45 robert + + * testcase.mp3, frontend/get_audio.c: + + changed compile-time test for machine byte order into run-time test, + this should solve issues PPC users seem to have + +2008-04-13 02:52 robert + + * libmp3lame/psymodel.c: + + some SNR testcode to try with -Z3 + +2008-04-12 18:18 robert + + * frontend/parse.c, frontend/timestatus.c, include/lame.def, + include/lame.h, libmp3lame/VbrTag.c, libmp3lame/bitstream.c, + libmp3lame/encoder.c, libmp3lame/fft.c, + libmp3lame/gain_analysis.c, libmp3lame/id3tag.c, + libmp3lame/lame.c, libmp3lame/lame_global_flags.h, + libmp3lame/mpglib_interface.c, libmp3lame/newmdct.c, + libmp3lame/presets.c, libmp3lame/psymodel.c, + libmp3lame/quantize.c, libmp3lame/quantize_pvt.c, + libmp3lame/reservoir.c, libmp3lame/set_get.c, + libmp3lame/tables.c, libmp3lame/takehiro.c, libmp3lame/util.c, + libmp3lame/vbrquantize.c: + + extended VBR quality scale: 0, ..., 9.999 as floating point value + +2008-04-06 15:07 robert + + * doc/html/history.html, frontend/main.c: + + updating history.html + +2008-04-06 02:38 robert + + * libmp3lame/lame_global_flags.h, libmp3lame/presets.c, + libmp3lame/psymodel.c, libmp3lame/set_get.c, + libmp3lame/version.h, mpglib/layer3.c: + + some simpler spreading function for VBR NEW + +2008-04-05 17:38 robert + + * Makefile.unix, frontend/brhist.c, frontend/brhist.h, + frontend/main.c, frontend/parse.c, frontend/timestatus.c: + + removing "#ifdef/#endif" from code bocks, which were always compiled in + +2008-04-05 17:13 robert + + * lame.spec.in, debian/copyright, libmp3lame/id3tag.c, misc/abx.c, + misc/lameGUI.html: + + changing some links from "www.mp3dev.org/mp3" to "www.mp3dev.org" + and from "www.sulaco.org/mp3" to "www.mp3dev.org" + +2008-03-20 22:28 robert + + * include/lame.h: + + keep 'lame_mp3_tags_fid' alive at least for next stable release + +2008-03-12 11:23 robert + + * libmp3lame/psymodel.c, vc_solution/vc9_libmp3lame.vcproj, + vc_solution/vc9_libmp3lame_dll.vcproj, + vc_solution/vc9_mpglib.vcproj: + + bug fix: stack corruption in vbrpsy_compute_masking_s + +2008-03-11 21:57 robert + + * libmp3lame/: set_get.c, vbrquantize.c: + + fixing some more compiler warnings + +2008-03-11 21:17 robert + + * libmp3lame/VbrTag.c, libmp3lame/fft.c, libmp3lame/id3tag.c, + libmp3lame/lame.c, libmp3lame/mpglib_interface.c, + libmp3lame/quantize.c, libmp3lame/takehiro.c, libmp3lame/util.c, + libmp3lame/vbrquantize.c, vc_solution/vc9_libmp3lame.vcproj, + vc_solution/vc9_libmp3lame_dll.vcproj: + + fixing some more compiler warnings + +2008-03-11 00:56 robert + + * libmp3lame/set_get.c: + + fixing some more compiler warnings + +2008-03-11 00:21 robert + + * vc_solution/vc9_libmp3lame.vcproj: + + update for nasm file config + +2008-03-10 23:47 robert + + * libmp3lame/: bitstream.c, encoder.c, gain_analysis.c, id3tag.c, + lame.c, machine.h, mpglib_interface.c, newmdct.c, psymodel.c, + quantize.c, quantize.h, quantize_pvt.c, quantize_pvt.h, + set_get.c, util.h, vbrquantize.c, vbrquantize.h: + + fixing some compiler warnings + +2008-03-09 22:37 robert + + * frontend/parse.c: + + for now, keep old ID3 tag switches passing raw character encoded strings + some experimental switches for Linux systems: + + (ID3v1/ID3v2) + --lTtitle + --lArtist + --lAlbum + --lGenre + --lComment + --lFieldvalue + + (ID3v2) + --uTitle + --uArtist + --uAlbum + --uGenre + --uComment + +2008-03-09 22:29 robert + + * include/lame.h: + + under Linux we need some C-library includes here (why not on Win32?) + +2008-03-09 19:31 robert + + * libmp3lame/: takehiro.c, vbrquantize.c: + + fixing some compiler warnings about: + - integer constant overflow + - signed/unsigned mismatch + +2008-03-09 17:13 robert + + * Dll/BladeMP3EncDLL.c, dshow/aboutprp.cpp, frontend/brhist.c, + frontend/mp3x.c, frontend/parse.c, include/lame.h: + + removing unneccessary stdlib includes from lame.h + +2008-03-09 16:33 robert + + * vc_solution/: vc9_lame_lame.vcproj, vc9_libmp3lame.vcproj, + vc9_libmp3lame_dll.vcproj, vc9_nasm.rules: + + adding NASM build rule + +2008-02-23 20:58 robert + + * frontend/parse.c, libmp3lame/id3tag.c: + + adding ICONV character conversion (NOT for WIN32), because ID3 tags have to + be in ISO Latin-1 or UCS-2 text encoding. Previously we wrote bytes into ID3 + tags, as we got them from the commandline, in locale text encoding. + + There are some experimental switches to store UCS-2 encoded ID3 tags: + --uArtist, --uAlbum, --uTitle, --uGenre and --uComment + +2008-02-23 12:58 robert + + * libmp3lame/: id3tag.c, id3tag.h, util.c: + + locate and replace {TXXX,COMM} field if LANGUAGE and DESCRIPTION match new one + +2008-02-22 02:48 robert + + * libmp3lame/: id3tag.c, id3tag.h, util.c: + + preparing unicode id3v2 tags + +2008-02-22 02:38 robert + + * libmp3lame/: lame.c, vbrquantize.c, version.c: + + fixing some compiler warnings + +2008-02-20 03:04 robert + + * vc_solution/vc9_lame_dll_example.vcproj: + + VC9 Solution files + +2008-02-20 02:40 robert + + * vc_solution/vc9_lame_dshow.vcproj: + + VC9 Solution files + +2008-02-20 01:53 robert + + * vc_solution/vc9_lame_acm.vcproj: + + VC9 Solution files + +2008-02-20 00:38 robert + + * vc_solution/: .cvsignore, vc9_lame.sln, vc9_lame_acm.vcproj, + vc9_lame_acm_adbg.vcproj, vc9_lame_acm_tinyxml.vcproj, + vc9_lame_clients.sln, vc9_lame_dll.vcproj, + vc9_lame_dll_example.vcproj, vc9_lame_dshow.vcproj, + vc9_lame_lame.vcproj, vc9_lame_mp3x.vcproj, + vc9_libmp3lame.vcproj, vc9_libmp3lame_dll.vcproj, + vc9_mpglib.vcproj: + + VC9 Solution files + +2008-02-15 01:27 robert + + * Dll/BladeMP3EncDLL.c: + + use new API function for LAME-tag frame update + +2008-02-15 00:23 robert + + * libmp3lame/VbrTag.c: + + let the dummy Xing frame have a valid mp3 sync word + +2008-02-10 18:38 robert + + * libmp3lame/id3tag.c, include/lame.def, include/lame.h: + + fixes: + id3tag.c - some block scope missing + lame.h, lame.def: - some exported function was missing + +2008-02-10 17:35 robert + + * frontend/main.c, include/lame.def, include/lame.h, + libmp3lame/VbrTag.c, libmp3lame/VbrTag.h, libmp3lame/id3tag.c, + libmp3lame/lame.c, libmp3lame/lame_global_flags.h, + libmp3lame/set_get.c, libmp3lame/version.h: + + Adding some new API functions + - to en-/dis- able automatic ID3 tag writing into audio stream (default on): + + void CDECL lame_set_write_id3tag_automatic(lame_global_flags * gfp, int); + int CDECL lame_get_write_id3tag_automatic(lame_global_flags const* gfp); + + - to query ID3 tags into a buffer: + + size_t CDECL lame_get_id3v1_tag( + lame_global_flags * gfp, unsigned char* buffer, size_t size); + size_t CDECL lame_get_id3v2_tag( + lame_global_flags * gfp, unsigned char* buffer, size_t size); + + - to query the final Xing/LAME tag frame into a buffer: + size_t CDECL lame_get_lametag_frame( + const lame_global_flags *, unsigned char* buffer, size_t size); + + Those new functions allow to encode a complete input file into RAM first, + before writing it into a file/socket/whatever... + +2008-02-03 14:28 robert + + * libmp3lame/psymodel.c: + + VBRPSY: don't use ATH in 'additive masking' function + +2008-01-09 20:46 rbrito + + * debian/: changelog, compat, control, rules: + + Updated the Debian packaging. + +2008-01-06 16:46 robert + + * libmp3lame/: lame.c, quantize.c: + + VBR-NEW can be mixed with free format now. The result will be a free format + stream using VBR-NEW quantization routine. + + note: following free format bitrates are maximum bitrates which make sense: + samplerate: 8 11 12 16 22 24 32 44 48 + kbps 109 151 164 218 301 327 435 600 640(652) + + Using the maximum bitrate one may look and see how the VBR code behaves + when the bitrate pressure is lowered to the theoretical minimum, like: + lame -V0 -b600 --freeformat x.wav x.mp3 + +2008-01-03 00:03 aleidinger + + * configure: + + regenerate with autoconf 2.61 + +2008-01-03 00:02 aleidinger + + * Makefile.in, ACM/Makefile.in, ACM/ADbg/Makefile.in, + ACM/ddk/Makefile.in, ACM/tinyxml/Makefile.in, Dll/Makefile.in, + debian/Makefile.in, doc/Makefile.in, doc/html/Makefile.in, + doc/man/Makefile.in, dshow/Makefile.in, frontend/Makefile.in, + include/Makefile.in, libmp3lame/Makefile.in, + libmp3lame/i386/Makefile.in, libmp3lame/vector/Makefile.in, + mac/Makefile.in, misc/Makefile.in, mpglib/Makefile.in: + + regenerate with automake 1.10 + +2008-01-03 00:01 aleidinger + + * aclocal.m4: + + update with stuff from more recent autotools + +2008-01-03 00:00 aleidinger + + * ltmain.sh: + + update to a libtool 1.5.24 version + +2008-01-02 23:58 aleidinger + + * configure.in: + + After installing sndfile: + - fix SNDFILE_xxx + + Give a better failure description for some errors (sizeof check). + + If there are intXX_t but no uintXX_t, use the intXX_t with "unsigned" instead + of trying to find the right K&R-C integral type. + + Use macho as the format type for NASM on OSX, but disable the nasm use by + default there, as there seems to be a problem with the nasm code on OSX. + +2008-01-02 22:00 aleidinger + + * configure.in: + + - If SNDFILE_xxx are defined and the fileio is sndfile, then assume the + user is knowing what he does (some systems don't have pkg-config but + have sndfile). + - Fix the problem case where SNDFILE_CFLAGS has spaces at the beginning. + +2008-01-02 20:30 robert + + * libmp3lame/id3tag.c: + + fix for tracker item: [ 1861450 ] TLEN tag fixed on encode from stdin with ID3v2 tags + +2007-12-26 22:04 robert + + * ACM/ACMStream.cpp, Dll/BladeMP3EncDLL.c: + + removing obsolete function calls + +2007-12-26 13:12 robert + + * Makefile.MSVC, frontend/parse.c, include/lame.h, + libmp3lame/encoder.c, libmp3lame/lame.c, + libmp3lame/lame_global_flags.h, libmp3lame/presets.c, + libmp3lame/psymodel.c, libmp3lame/psymodel.h, + libmp3lame/quantize.c, libmp3lame/quantize_pvt.c, + libmp3lame/set_get.c, libmp3lame/set_get.h, libmp3lame/util.h: + + removing dead code + +2007-12-25 16:15 robert + + * libmp3lame/vbrquantize.c: + + some small code simplification + +2007-12-25 00:16 robert + + * libmp3lame/: presets.c, psymodel.c: + + clean code from obsolete branches + +2007-12-24 16:00 robert + + * frontend/parse.c, libmp3lame/lame.c, libmp3lame/psymodel.c, + libmp3lame/quantize_pvt.c, libmp3lame/quantize_pvt.h, + libmp3lame/set_get.c, libmp3lame/takehiro.c, libmp3lame/util.h, + libmp3lame/vbrquantize.c: + + - removing legacy ISO quantization code + - vbr-new now has only two -qx settings left: q0 and q5 + - vbr-new can't use legacy GPSYCHO anymore + + TODO: + + remove legacy GPSYCHO code, as we don't use it anymore + + remove superflouos psy-model selection switches + + remove superflouos psy-model configuration switches like --cwlimit + +2007-12-20 14:44 robert + + * libmp3lame/vbrquantize.c: + + in rare cases, where one channel is completely zero, some illegal "scalefactor + selection info" might be used in VBR-NEW. fixed + +2007-12-17 20:54 robert + + * doc/html/history.html: + + fixing typo + +2007-12-17 00:08 robert + + * libmp3lame/vbrquantize.c: + + fixing typo + +2007-12-16 17:56 robert + + * doc/html/history.html, libmp3lame/psymodel.c: + + disabling the use of the "interchannel masking feature" in dual-channel case + +2007-12-16 17:18 robert + + * libmp3lame/: psymodel.c, vbrquantize.c: + + VBR-NEW: + -quantization: another "out of bits" strategy + -psymodel: dropped "inter channel effect", because the effect doesn't save + many bits, but raises the chance of annoying artefacts a lot. + +2007-12-14 02:52 robert + + * libmp3lame/psymodel.c: + + found new test sample SNAPS which needs some more short blocks + +2007-12-09 22:47 robert + + * libmp3lame/: encoder.c, lame.c, presets.c, psymodel.c, + psymodel.h, quantize_pvt.c, util.h: + + merger from test branch: + - features a new psy model, a modification from NSPSY + + VBR NEW uses the new psy model, unless you call lame with --nspsytune, or + the developer only switch --psymodel x, with x in {1,2} + + features of the new psy model: + - speed: it does determine the resulting block type before doing the fft + and other psy stuff and will calc long/short blocks only as necessary + - interchannel masking effect: it will be calculated after the mid-side fix + and it's working on convolution bands, instead of scalefactor bands + - mid-side fix: calculated on convolution bands, instead of sf bands + - mask_adjust feature: it's now used earlier in the convolution calculation + +2007-12-09 17:06 robert + + * libmp3lame/psymodel.c (rh0710_test): + + some fixes, ie. the short block pre-echo control was applied twice + +2007-12-08 23:27 robert + + * libmp3lame/: encoder.c, lame.c, presets.c, psymodel.c, + psymodel.h, quantize_pvt.c, util.h (rh0710_test): + + modified psy model for vbr-new + +2007-11-26 00:14 robert + + * Makefile.unix, frontend/get_audio.c, frontend/parse.c, + libmp3lame/psymodel.c, libmp3lame/vbrquantize.c: + + psymodel.c: + - bug fix in init_numlines: it returned sometimes a too large npart_[sl] + - fixing some more compiler warnings + get_audio.c: + - some fix in error-report in case of unsupported input format + +2007-11-25 23:38 robert + + * Makefile.unix, libmp3lame/presets.c, libmp3lame/psymodel.c, + libmp3lame/quantize.c, libmp3lame/quantize_pvt.h, + libmp3lame/util.h, libmp3lame/vbrquantize.c (rh0710_test): + + re-tuning + +2007-11-21 21:30 robert + + * libmp3lame/: quantize.c, quantize_pvt.h: + + bug fix for bin_search_StepSize. It returned illegal values, leading to + assertion failures in fast encoding mode, which only adjusts global step size. + +2007-11-12 10:46 robert + + * libmp3lame/: psymodel.c, util.h, vbrquantize.c (rh0710_test): + + - inter channel masking now on convolution bands + - mid/side fix now on convolution bands + +2007-11-08 01:13 robert + + * Makefile.unix, frontend/parse.c, libmp3lame/psymodel.c, + libmp3lame/quantize_pvt.c (rh0710_test): + + moving masking_lower adjustment into psymodel.c (for vbr-new) + +2007-11-03 14:04 robert + + * frontend/get_audio.c, libmp3lame/presets.c, libmp3lame/psymodel.c + (rh0710_test): + + limiting the sandpaper-noise hack to the minval range (ca. 1.2 kHz) + +2007-11-01 20:28 robert + + * doc/man/lame.1, frontend/get_audio.c, frontend/parse.c + (rh0710_test): + + adding main branch fixes + +2007-11-01 19:52 robert + + * frontend/get_audio.c: + + enabling --signed / --unsigned switches for 8 bit raw pcm input data + +2007-11-01 19:25 robert + + * frontend/: get_audio.c, parse.c: + + [ 1823881 ] lame 3.97 produces complete garbage + now invalid WAV/AIFF files are rejected, instead of trying to encode them as + raw pcm files. + +2007-11-01 19:23 robert + + * doc/man/lame.1: + + [ 1158193 ] Man page doesn't tell about stereo format in raw + [ 1158253 ] Data format is not described in the manpage + added some info to manpage + +2007-11-01 19:16 robert + + * libmp3lame/lame.c: + + bitrate_index may have been uninitialized under some rare circumstances + +2007-10-25 01:59 robert + + * libmp3lame/lame.c (rh0710_test): + + fixing some bad initialed value gfc->bitrate_index + +2007-10-24 02:04 robert + + * libmp3lame/psymodel.c: + + back to the roots. Maybe I'll branch from here + +2007-10-23 23:23 robert + + * libmp3lame/vbrquantize.c: + + turn of scalefac scale feature + +2007-10-23 02:46 robert + + * libmp3lame/psymodel.c: + + yeah, ok it's C and not C++ + open block scope for local variable + +2007-10-23 02:31 robert + + * libmp3lame/: psymodel.c, vbrquantize.c: + + dropping Naoki's idea of "simultaneous masking addition" for the newer VBR code + for now + +2007-10-22 12:00 robert + + * libmp3lame/: presets.c, psymodel.c: + + re-establishing previous mask adjustments + +2007-10-21 00:45 robert + + * libmp3lame/: lame.c, presets.c, psymodel.c, quantize.c, + version.h: + + recalibration of VBR new's compression level settings, because of recent bug fixes + +2007-10-19 00:10 robert + + * Makefile.unix: + + moving GTK config script to MP3x target compilation, it's not needed outside MP3x + +2007-10-18 02:54 robert + + * frontend/get_audio.c: + + seems, VC compiler doesn't like redundant semicolon, fixed + +2007-10-18 02:09 robert + + * libmp3lame/: machine.h, psymodel.c, quantize.c, set_get.c: + + PSY: the newer vbr code uses tonalality estimation from long blocks for short blocks + +2007-10-16 01:07 robert + + * doc/html/history.html, frontend/get_audio.c: + + Fix for bugtracker item: [ 1813496 ] AIFF parsing bug + +2007-10-14 20:18 robert + + * frontend/get_audio.c, libmp3lame/id3tag.h, libmp3lame/util.c: + + some more compiler and compiler-warning fixes + +2007-10-14 19:54 robert + + * frontend/get_audio.c, frontend/get_audio.h, frontend/mp3x.c, + frontend/parse.c, frontend/portableio.c, include/lame.h, + libmp3lame/bitstream.c, libmp3lame/id3tag.c, libmp3lame/lame.c, + libmp3lame/quantize.c, libmp3lame/quantize_pvt.c, + libmp3lame/set_get.c, libmp3lame/takehiro.c, libmp3lame/util.c, + libmp3lame/vector/xmm_quantize_sub.c: + + eliminating some of the several hundred compiler warnings + +2007-10-14 14:16 robert + + * doc/html/history.html: + + updating history to latest changes: + - bug fix scalefactor selection in vbr new code + - feature added: WAVE_FORMAT_EXTENSIBLE + +2007-10-14 13:33 robert + + * frontend/get_audio.c: + + feature request [ 1811483 ] WAVE_FORMAT_EXTENSIBLE support + + We still support PCM wave files only with our little wave reader, + it is just that we now accept them when written in wave format extensible. + +2007-10-13 20:34 robert + + * libmp3lame/vbrquantize.c: + + Bug-fix: the quantization-find-routine could under some circumstances return + some way too large quantization step size. For example, the song Piku from + The Chemical Brothers had almost 550 scalefactors wrong. For most songs this + fix makes no difference. + +2007-10-08 20:59 robert + + * frontend/brhist.c: + + replaced variable 'lines' by 'lines_used', because term.h has some macro + definition for 'lines'. + +2007-09-29 19:17 robert + + * libmp3lame/vbrquantize.c: + + - Removing dead code. + - Avoiding unnecessary search for quantization step sizes. This speeds-up lower quality encodings. + If energy is below masking threshold, the resulting step size will be at 255. So no need to search what we already know. + +2007-08-29 13:44 aleidinger + + * configure: + + regen + +2007-08-29 13:43 aleidinger + + * configure.in: + + Don't change the include/library path, if there's no corresponding soundfile + path set. + + This is supposed to fix the compile problem with soundfile Rogério sees on + Debian. + +2007-08-20 21:54 robert + + * Makefile.MSVC: + + removing duplicate target_dir references + +2007-08-12 18:30 robert + + * Makefile.MSVC: + + let targets link against multi threaded C-library + +2007-08-12 00:07 robert + + * doc/html/history.html, libmp3lame/vbrquantize.c, + libmp3lame/version.h: + + small speedup in VBR NEW + + we are now at 3.98 beta 5, a release candidate for 3.98 stable? + +2007-08-11 23:06 robert + + * testcase.mp3: + + updating "testcase.mp3" for LAME 3.98 beta 5 + +2007-08-11 21:44 robert + + * libmp3lame/psymodel.c: + + Short block masking: the CBR/ABR code seems to rely on the old masking definition. The VBR NEW code on the other hand needs the lowered masking. + +2007-07-30 06:51 aleidinger + + * ChangeLog: + + Add the changelog for the last ~10 months. + +2007-07-30 06:39 aleidinger + + * configure: + + regen with autoconf 2.61 + +2007-07-30 06:37 aleidinger + + * configure.in: + + oops, previous fix for the gcc version pattern matching was wrong... + +2007-07-30 06:30 aleidinger + + * configure.in: + + - fix the pattern matching for the gcc version check + - improve the optimization stuff for gcc 4.x + +2007-07-30 06:28 aleidinger + + * config.h.in: + + regen with autoconf 2.61 + +2007-07-30 06:28 aleidinger + + * Makefile.in, aclocal.m4, ACM/Makefile.in, ACM/ADbg/Makefile.in, + ACM/ddk/Makefile.in, ACM/tinyxml/Makefile.in, Dll/Makefile.in, + debian/Makefile.in, doc/Makefile.in, doc/html/Makefile.in, + doc/man/Makefile.in, dshow/Makefile.in, frontend/Makefile.in, + include/Makefile.in, libmp3lame/Makefile.in, + libmp3lame/i386/Makefile.in, libmp3lame/vector/Makefile.in, + mac/Makefile.in, misc/Makefile.in, mpglib/Makefile.in: + + regen with automake 1.10 + +2007-07-29 22:46 robert + + * doc/html/history.html: + + adding latest bug fixes to history + +2007-07-29 22:07 robert + + * ACM/ADbg/ADbg.dsp, frontend/lame_vc6.dsp, dshow/dshow.dsp, + include/lame.def, lame_vc6.dsw, ACM/lameACM_vc6.dsp, + Dll/LameDll_vc6.dsp, ACM/tinyxml/tinyxml.dsp, + frontend/mp3x_vc6.dsp, libmp3lame/libmp3lame_dll_vc6.dsp, + libmp3lame/libmp3lame_vc6.dsp, mpglib/mpglib_vc6.dsp: + + updating VC6 project files + + from MSDN: DLLs should be linking against multi-threaded MS VC rountime library + +2007-07-29 16:02 robert + + * Dll/: BladeMP3EncDLL.c, BladeMP3EncDLL.h: + + Fixing a possible resource leak + +2007-07-28 12:48 aleidinger + + * configure: + + regen (new LAME version) + +2007-07-28 00:41 robert + + * frontend/get_audio.c: + + task tracker item [ 1445175 ] Input being stdin fails in Windows on WAV files + and item [ 1576370 ] Fix for piping in a non PCM file via stdin under Windows + + The workaround tests the actual file descriptor being a pipe or not. + In case being a pipe, the number of bytes to skip are simply read. + +2007-07-27 08:49 bouvigne + + * README: + + 3.98 + +2007-07-24 17:46 bouvigne + + * frontend/brhist.c, frontend/brhist.h, frontend/get_audio.c, + frontend/get_audio.h, frontend/gpkplotting.c, + frontend/gpkplotting.h, frontend/gtkanal.c, frontend/gtkanal.h, + frontend/lametime.c, frontend/lametime.h, frontend/main.c, + frontend/main.h, frontend/parse.c, frontend/timestatus.c, + frontend/timestatus.h, include/lame.h, libmp3lame/VbrTag.c, + libmp3lame/VbrTag.h, libmp3lame/bitstream.c, + libmp3lame/bitstream.h, libmp3lame/encoder.c, + libmp3lame/encoder.h, libmp3lame/fft.h, libmp3lame/id3tag.c, + libmp3lame/l3side.h, libmp3lame/lame-analysis.h, + libmp3lame/lame.c, libmp3lame/machine.h, + libmp3lame/mpglib_interface.c, libmp3lame/newmdct.c, + libmp3lame/newmdct.h, libmp3lame/presets.c, + libmp3lame/psymodel.c, libmp3lame/psymodel.h, + libmp3lame/quantize.c, libmp3lame/quantize.h, + libmp3lame/quantize_pvt.c, libmp3lame/quantize_pvt.h, + libmp3lame/reservoir.c, libmp3lame/reservoir.h, + libmp3lame/set_get.c, libmp3lame/set_get.h, libmp3lame/tables.c, + libmp3lame/tables.h, libmp3lame/takehiro.c, libmp3lame/util.c, + libmp3lame/util.h, libmp3lame/vbrquantize.c, + libmp3lame/vbrquantize.h, libmp3lame/version.c, + libmp3lame/version.h, libmp3lame/vector/lame_intrin.h, + libmp3lame/vector/xmm_quantize_sub.c: + + Library GPL -> Lesser GPL + +2007-07-24 15:26 robert + + * frontend/: get_audio.c, parse.c: + + bug item [ 1160757 ] --big-endian and --little-endian don't work with -m s -a + and item [ 1160741 ] --big-endian and --little-endian are swapped + + the --big-endian/--little-endian switches do now work with our minimal + wave and pcm reader too. + + The problems reported in the above bug tracker items should be solved now + +2007-07-22 18:49 robert + + * libmp3lame/lame.c: + + bug fix: [ 1746336 ] Incorrect Bitrate with ABR und --resample, LAME 3.98b4 + + There was a typo in patch Revision 1.294 "restrict mpeg 2.5 to 64kbps" + which set the average bitrate up to the maximum allowed bitrate. + +2007-07-20 23:23 robert + + * libmp3lame/bitstream.c: + + fixing task tracker item: [ 1755981 ] Percent signs in print format not escaped + +2007-07-16 20:06 bouvigne + + * include/lame.h: + + gpl -> lgpl (we forgot about it a long time ago) + +2007-07-10 21:05 robert + + * dshow/Property.rc: + + updating version info + +2007-07-01 20:05 robert + + * mpglib/: common.c, common.h, interface.c, layer1.c, layer2.c, + layer2.h, mpg123.h: + + we will always use Layer1 and 2 decoding + +2007-07-01 16:17 robert + + * doc/html/history.html: + + word wrapping fixed + +2007-07-01 16:16 robert + + * doc/html/history.html: + + adding latest changes for Task tracker item [ 1719593 ] and [ 1742623 ] + +2007-07-01 14:39 robert + + * frontend/: get_audio.c, get_audio.h, gtkanal.c, main.c, parse.c: + + trying to fix Bugs item #1742623 + +2007-06-30 17:14 robert + + * USAGE, frontend/parse.c, include/lame.h, libmp3lame/id3tag.c: + + bug fix: [ 1719593 ] Track numbers > 255 not allowed even with --id3v2-only + +2007-06-27 21:23 robert + + * configMS.h, configure.in: + + changing version number 3.97 to 3.98 + +2007-06-27 21:22 robert + + * include/lame.def: + + adding newly id3tag functions to DLL export definition + +2007-06-26 01:33 robert + + * libmp3lame/VbrTag.c: + + I missed the swapped arguments in the patch by Jonathan Stott, now fixed. + +2007-06-26 00:57 robert + + * doc/html/contributors.html, doc/html/history.html, + libmp3lame/VbrTag.c, libmp3lame/lame.c: + + Patch by Jonathan Stott: + + Bug tracker items: [ 1590693 ] ID3v2 tag not writing, [ 1636267 ] ID3v2 tags overwritten + If the output file is opened 'write-only', then LAME can't update the LAME tag. + In this case LAME silently overwrote the first bytes of the file and an + optional ID3v2 tag disappeared. Now an error message will be printed and + no data is written in this case. + +2007-06-23 18:43 robert + + * libmp3lame/: id3tag.c, util.c, util.h: + + fixing another possible memory leak + +2007-06-23 17:39 robert + + * frontend/main.c, frontend/parse.c, libmp3lame/id3tag.c, + libmp3lame/id3tag.h, libmp3lame/util.c, libmp3lame/version.h: + + Some simplifications on ID3 tag usage: + - specifying an unlisted ID3v1 genre does not count as an error anymore, it is mapped to "Other" and passed as-is to an ID3v2 genre tag + - an ID3 track argument is passed directly to an ID3v2 TRCK tag, allowing for example "002/012" + +2007-06-23 15:16 robert + + * libmp3lame/: id3tag.c, util.c: + + Now ID3 tag are local copies of given parameters. This allows to pass strings located on the program stack and you don't have to think about the lifetime of your strings you pass as arguments. + +2007-06-23 13:27 robert + + * libmp3lame/util.c: + + Bug fix: Nyaochi's "ID3v2 extension" patches introduced some memory leaks + +2007-06-04 22:31 robert + + * doc/html/history.html: + + ups: moved history entry "TLEN bug" up into correct list + +2007-06-04 22:25 robert + + * doc/html/history.html: + + added: bugfix TLEN computation + +2007-06-04 22:04 robert + + * libmp3lame/id3tag.c: + + bug fix: [ 1730875 ] TLEN calculation wrong + fixing the calculation of "playlength in ms" written into the ID3v2 tag TLEN + +2007-05-25 03:38 robert + + * libmp3lame/vbrquantize.c: + + VBR_NEW: more tuned 'out of bits' strategy + +2007-05-24 13:26 bouvigne + + * doc/html/contributors.html, doc/html/history.html, + doc/html/id3.html, doc/man/lame.1, frontend/parse.c: + + support for total tracks count in the frontend (id3 tags) + +2007-05-24 13:10 bouvigne + + * libmp3lame/id3tag.c: + + adding a total track count should add an id3 V2 tag + +2007-05-24 12:58 bouvigne + + * doc/html/history.html, doc/html/id3.html, frontend/main.c, + frontend/parse.c, frontend/parse.h, include/lame.h, + libmp3lame/id3tag.c, libmp3lame/id3tag.h: + + Albumart (APIC ID3v2.3 frame) patch by Nyaochi + +2007-05-24 12:29 bouvigne + + * doc/html/contributors.html, doc/html/history.html, + doc/html/id3.html, frontend/parse.c, include/lame.h, + libmp3lame/id3tag.c, libmp3lame/id3tag.h: + + Ability to set user-defined ID3v2.3 frame (patch from Nyaochi) + +2007-05-23 14:44 bouvigne + + * doc/html/: contributors.html, history.html, index.html: + + Updated history + +2007-05-22 10:10 robert + + * libmp3lame/: quantize.c, quantize_pvt.c, version.h: + + ok, now the real bug fix, forget the last commit: + the ABR routine did not apply format specific bitrate constrains when allocating bits; now it does + +2007-05-22 08:39 robert + + * libmp3lame/: quantize.c, quantize_pvt.c: + + bug fix: reduce side was given a too large 'max bits' parameter, resulting in assertion aborts + +2007-05-21 22:20 robert + + * libmp3lame/: lame.c, util.c, util.h: + + bug fix for feature request: + "adjust user min/max bitrate if outside of allowed range (ex: -V9 -B320) + Requested by Benski" + + Some input files with unusual sample frequencies couldn't be encoded at CBR anymore, no matter what resample/bitrate options where passed to LAME. + (Testsample: FX319.WAV) + +2007-05-20 18:07 robert + + * libmp3lame/: quantize.c, quantize_pvt.c, util.h, vbrquantize.c, + version.h: + + VBR_NEW: 'out of bits' situation improved + +2007-05-17 22:25 robert + + * ACM/ACM.cpp, libmp3lame/VbrTag.c: + + Bugs item #1693461: fixing memory leaks in LAME ACM + +2007-05-16 02:43 robert + + * libmp3lame/version.h: + + we are now at 3.98 beta 1 (of many more to come) + +2007-05-16 01:30 robert + + * frontend/parse.c, libmp3lame/lame.c, + libmp3lame/lame_global_flags.h, libmp3lame/psymodel.c, + libmp3lame/quantize_pvt.c, libmp3lame/set_get.c, + libmp3lame/util.h, libmp3lame/vbrquantize.c: + + - some code clean-up + - bug fix: in rare cases 'on_pe' returned target bits violating the 4095 bit + maximum constrain for a granule + - VBR-NEW: modified strategy to handle 'out of bits' cases + +2007-05-13 18:31 robert + + * libmp3lame/: VbrTag.c, bitstream.c, bitstream.h, encoder.c, + id3tag.c, lame_global_flags.h, util.h, version.h: + + bug fix: [ 1711980 ] LAME writes invalid Xing header when ID3 tags exist + +2007-03-12 21:56 bouvigne + + * libmp3lame/util.c: + + adjust user min/max bitrate if outside of allowed range (ex: -V9 -B320) + + Requested by Benski + +2007-01-13 18:02 robert + + * libmp3lame/util.h: + + bug fix. + bug tracker entry: [ 1634092 ] encoder.c doesn't compile with --disable-brhist + +2007-01-13 17:58 robert + + * libmp3lame/: encoder.c, lame.c: + + bug fix. + bug tracker entry: [ 1634092 ] encoder.c doesn't compile with --disable-brhist + +2007-01-09 23:10 robert + + * Makefile.unix: + + adding vector/xmm_quantize_sub.c + +2007-01-09 22:24 bouvigne + + * libmp3lame/libmp3lame_vc8.vcproj: + + directory x86_64 -> vector + +2007-01-09 12:02 aleidinger + + * libmp3lame/: lame.c, mpglib_interface.c, psymodel.c: + + fix the easy warnings + +2007-01-09 10:31 aleidinger + + * libmp3lame/quantize.c: + + include the right intrinsics header and only if we need it + +2007-01-09 10:29 aleidinger + + * Makefile.MSVC: + + use the code in the vector directory + +2007-01-09 10:25 aleidinger + + * Makefile.in, ACM/Makefile.in, ACM/ADbg/Makefile.in, + ACM/ddk/Makefile.in, ACM/tinyxml/Makefile.in, Dll/Makefile.in, + debian/Makefile.in, doc/Makefile.in, doc/html/Makefile.in, + doc/man/Makefile.in, dshow/Makefile.in, frontend/Makefile.in, + include/Makefile.in, libmp3lame/Makefile.in, + libmp3lame/i386/Makefile.in, mac/Makefile.in, misc/Makefile.in, + mpglib/Makefile.in, configure: + + regen + +2007-01-09 10:23 aleidinger + + * libmp3lame/i386/Makefile.am: + + the quoting does not work out as expected, remove it + +2007-01-09 10:22 aleidinger + + * libmp3lame/: lame.c, quantize.c: + + remove the CPUCCODE check, it is not needed anymore + +2007-01-09 10:21 aleidinger + + * config.h.in: + + regen + +2007-01-09 10:20 aleidinger + + * configure.in: + + Use the vector lib on amd64 and x86. + + This only works with gcc when -msse is specified in CFLAGS at configure + time. Currently I get a sigbus with gcc 3.4.6 with the vector lib. + + Remove the HAVE_GTK define, it is not used anymore. + +2007-01-09 10:18 aleidinger + + * libmp3lame/Makefile.am: + + add the vector lib and remove the x86_64 part + +2007-01-09 10:15 aleidinger + + * libmp3lame/vector/: Makefile.am, Makefile.in, lame_intrin.h, + xmm_quantize_sub.c: + + this is a copy of the x86_64 parts with modified automake stuff + +2007-01-07 21:28 robert + + * Makefile.MSVC: + + do not build legacy BLame DLL on make target all + +2007-01-07 20:00 aleidinger + + * libmp3lame/i386/Makefile.in: + + regen + +2007-01-07 20:00 aleidinger + + * libmp3lame/i386/Makefile.am: + + fftsse.nas is used now. + +2007-01-07 18:03 robert + + * lame_vc6.dsw, frontend/lame_vc6.dsp, frontend/mp3x_vc6.dsp, + libmp3lame/libmp3lame_dll_vc6.dsp, libmp3lame/libmp3lame_vc6.dsp, + mpglib/mpglib_vc6.dsp: + + VC6 project files updated, added project to generate Libmp3lame-dynamic.lib/dll + +2007-01-07 14:51 robert + + * Makefile.MSVC: + + Makefile with some basic Libmp3lame-dynamic.lib generation ability + +2007-01-07 14:31 robert + + * include/lame.def: + + export definition for Libmp3lame-dynamic.lib + +2007-01-07 14:30 robert + + * libmp3lame/fft.c, Makefile.unix, frontend/parse.c, + include/lame.h, libmp3lame/lame.c, mpglib/mpg123.h: + + adding FFTSSE assembler code to the HAVE_NASM conditional code + +2007-01-07 14:28 robert + + * .cvsignore, lame_clients_vc6.dsw, frontend/.cvsignore: + + collecting all LAME client projects in lame_clients_vc6.dsw workspace. + +2007-01-07 14:24 robert + + * dshow/: dshow.dsp, README: + + DirectShow Filter links against Libmp3lame-dynamic.lib now + +2007-01-07 14:23 robert + + * Dll/LameDll_vc6.dsp: + + BLAME DLL links against Libmp3lame-dynamic.lib now + +2007-01-07 14:21 robert + + * ACM/: lameACM_vc6.dsp, ADbg/ADbg.dsp, tinyxml/tinyxml.dsp: + + ACM links against Libmp3lame-dynamic.lib now + +2006-12-28 21:56 robert + + * Dll/BladeMP3EncDLL.c: + + we are now at 3.98a11 + +2006-12-28 21:49 robert + + * dshow/dshow.dsp: + + we are now at 3.98a11 + +2006-12-28 21:44 robert + + * libmp3lame/version.h: + + we are now at 3.98a11 + +2006-12-28 21:41 robert + + * doc/html/history.html: + + update history + +2006-12-28 20:41 robert + + * dshow/: Encoder.cpp, Encoder.h, Property.rc, dshow.dsp, + dshow.dsw: + + DirectShow filter uses LAME Library API now + +2006-12-27 22:19 robert + + * libmp3lame/reservoir.c: + + small change in the bitreservoir handling, enable the old + --strictly-enforce-ISO switch again + +2006-12-27 22:09 robert + + * doc/html/history.html: + + updating history entries + +2006-12-25 21:37 robert + + * ACM/: ACM.cpp, ACM.h, ACMStream.cpp, ACMStream.h, + AEncodeProperties.cpp, DecodeStream.h, acm.rc, lameACM_vc6.dsp, + main.cpp: + + some changes, now I can compile the ACM stuff at least + +2006-12-25 16:15 robert + + * libmp3lame/reservoir.c: + + relaxing the FhG bitreservoir restriction a little bit: + at 320 kbps it seems to be possible to use the reservoir if we limit it to almost the size of bits used for sideinfo + +2006-12-21 09:15 aleidinger + + * Makefile.in, ACM/Makefile.in, Dll/Makefile.in, + debian/Makefile.in, doc/Makefile.in, dshow/Makefile.in, + frontend/Makefile.in, ACM/ADbg/Makefile.in, include/Makefile.in, + libmp3lame/Makefile.in, mac/Makefile.in, misc/Makefile.in, + mpglib/Makefile.in, ACM/ddk/Makefile.in, ACM/tinyxml/Makefile.in, + doc/html/Makefile.in, doc/man/Makefile.in, + libmp3lame/i386/Makefile.in, configure: + + regen + +2006-12-21 09:14 aleidinger + + * libmp3lame/Makefile.am: + + Handle CPU specific C code in a generic way. + +2006-12-21 09:09 aleidinger + + * libmp3lame/i386/Makefile.am: + + Quote some parts in case directory names contain spaces. + +2006-12-21 09:07 aleidinger + + * aclocal.m4, config.h.in: + + regen + +2006-12-21 09:04 aleidinger + + * configure.in: + + Additional stuff for x86_64. First cut... + +2006-12-21 09:03 aleidinger + + * acinclude.m4: + + Properly quote some parts according to the new rules auf aclocal. + +2006-12-21 09:00 aleidinger + + * libmp3lame/: lame.c, quantize.c: + + On x86 we also have the xmmintrin header, but we don't use such code there. + So not only check for the header, but also for a CPUCCODE define. This may + be refined later depending on further inline C code showing up or not. + +2006-12-21 02:18 robert + + * libmp3lame/: machine.h, version.h: + + we are now at patch level 10 + +2006-12-21 02:17 robert + + * libmp3lame/psymodel.c: + + fixing some divide by zero error + +2006-12-20 00:17 robert + + * frontend/: get_audio.c, parse.c: + + let LAME be more strict when it comes to unrecognized program options or unsupported input file formats + +2006-12-19 18:50 bouvigne + + * libmp3lame/libmp3lame_vc8.vcproj: + + include paths + +2006-12-19 01:23 robert + + * frontend/parse.c: + + add some help text entries + +2006-12-19 01:23 robert + + * libmp3lame/lame.c: + + disabling temporal masking effect by default for vbr-mtrh, it works against other tunings in this mode + +2006-12-18 23:11 robert + + * libmp3lame/psymodel.c: + + fixing some index problems in convolution loops + +2006-12-17 23:21 robert + + * libmp3lame/version.h: + + we are at 3.98 alpha 9 + +2006-12-17 21:16 robert + + * libmp3lame/psymodel.c: + + fixing two possible out of range index errors accessing fftenergy array + for GPSYCHO too + +2006-12-17 20:53 robert + + * libmp3lame/: psymodel.c, util.h: + + fixing two possible out of range index errors accessing fftenergy array + + convert partition to scalefac: + as we replaced ISO tables with own calculations we forgot to add proper + weightening for the convolution band where the transition from one scalefactor + to th next scalefactor happens. Now added. + +2006-12-17 20:49 robert + + * libmp3lame/bitstream.c: + + assert didn't match valid input range: bitrate 8 - 640 kbps + +2006-12-15 22:16 robert + + * libmp3lame/version.h: + + we are now at 3.98 alpha 8 + +2006-12-15 22:15 robert + + * libmp3lame/psymodel.c: + + 2 bug fixes + a) in some cases we did access uninitialized data in conversion from partition bands to scalefac bands + b) in nsspy-code the conversion from partition to scalefac bands for short blocks did not match the long block case, nor gpsycho. + +2006-12-07 10:50 robert + + * frontend/main.c, libmp3lame/util.c: + + disabling the "process affinity kludge" + +2006-11-27 20:28 robert + + * libmp3lame/lame.c: + + - removed unused function parameter nVbrScale in function PutVbrTag + +2006-11-20 20:02 robert + + * libmp3lame/: VbrTag.c, VbrTag.h: + + - removed unused function parameter nVbrScale in function PutVbrTag + - reduced compilation warnings + +2006-11-15 02:25 robert + + * libmp3lame/lame.c: + + bug fix: [ 1596306 ] lame 3.97: "fatal error during initialization" with this wav + + an invalid MPEG samplerate was returned by optimum_samplefreq function + +2006-11-15 02:21 robert + + * Makefile.MSVC, libmp3lame/quantize.c: + + fixing compile problem with quantize_sub.c + +2006-11-12 11:44 bouvigne + + * doc/html/history.html: + + history + +2006-11-11 17:58 bouvigne + + * libmp3lame/: libmp3lame_vc8.vcproj, quantize.c: + + intrinsics functions are now in a separate directory (as in v4) + +2006-11-11 17:32 bouvigne + + * frontend/mp3x_vc8.vcproj: + + bring back mp3x to life (vc8) + +2006-11-11 17:14 bouvigne + + * README.WINGTK, lame_vc8.sln, Dll/LameDll_vc8.vcproj, + frontend/lame_vc8.vcproj, libmp3lame/libmp3lame_vc8.vcproj, + mpglib/mpglib_vc8.vcproj: + + bring back mp3x to life (vc8) + +2006-11-08 01:53 robert + + * frontend/: get_audio.c, main.c, main.h, parse.c: + + feature request: [ 1588283 ] Flushing output stream in lame.exe + + 'flush' option added + +2006-11-07 01:35 robert + + * libmp3lame/: gain_analysis.c, id3tag.c, lame_global_flags.h, + util.c: + + fixing some compiler warnings, removing some unused lame_global_flags elements + +2006-11-07 00:36 robert + + * libmp3lame/lame.c, libmp3lame/lame_global_flags.h, + libmp3lame/quantize.c, frontend/parse.c, libmp3lame/VbrTag.c, + libmp3lame/set_get.c, libmp3lame/util.h: + + removing dead code: + side channel sparsing didn't work as hoped + +2006-11-06 22:39 robert + + * frontend/: brhist.c, get_audio.c, parse.c: + + eliminating some compiler warnings + +2006-11-05 18:54 robert + + * frontend/console.c: + + bug tracker item: + [ 1585942 ] lame not --silent when TERM not set + + in case LAME was build with TERMCAP defined and no TERM environment is + defined, now we do not issue an error message and silently fallback to the default + behaviour as if LAME was compiled without TERMCAP defined. + +2006-11-05 17:49 robert + + * frontend/timestatus.c: + + include string header file added + unused variable removed in encoder_progress_end + +2006-11-05 16:08 robert + + * frontend/: main.c, timestatus.c, timestatus.h: + + refactoring progress display code out of encoding loop + it's located in timestatus.c now + + Windows specific: + fixed parameter type for SetProcessAffinityMask + Gabriel: do we need similar things for Win64 too? + +2006-11-05 13:37 robert + + * frontend/console.c: + + dead code removed + +2006-11-05 02:30 robert + + * libmp3lame/libmp3lame_vc8.vcproj: + + using fftsse.nas + +2006-11-05 01:55 robert + + * Makefile.MSVC: + + using fftsse.nas + +2006-11-04 18:59 robert + + * Makefile.MSVC, Makefile.unix, frontend/parse.c, libmp3lame/fft.c, + libmp3lame/lame.c, libmp3lame/version.h, + libmp3lame/i386/fft3dn.nas, libmp3lame/i386/fftsse.nas, + libmp3lame/i386/nasm.h: + + we are now at patch level 7 + + changes in lame frontend switches + -k removed, + call lowpass and highpass if you need to change them + --short/noshort/allshort - degraded into DEVELOPER ONLY switches + normal users shouldn't use them + -X -Z degraded to DEVELOPER ONLY switches + -X is too tough to communicate to end users + -Z isn't used actualy + + fft3dnow and fftsse nasm code taken from LAME4 branch + but not added to the configure stuff/VC project files + +2006-10-18 20:29 bouvigne + + * Dll/LameDll_vc8.vcproj: + + added back the .def config + +2006-10-05 21:07 bouvigne + + * libmp3lame/lame.c: + + error in a test (noticed by Robert) + +2006-09-30 19:55 kylev + + * lame.spec.in: + + we distribute a .gz, not a .bz2, and there really isn't a public URL for the file + +2006-09-30 15:35 aleidinger + + * configure.in: + + Only check for sndfile if it is requested. + +2006-09-30 15:35 aleidinger + + * Makefile.in, Dll/Makefile.in, frontend/Makefile.in, + libmp3lame/Makefile.in, mpglib/Makefile.in, configure: + + regen + +2006-09-30 09:17 bouvigne + + * Makefile.am, Dll/Makefile.am, frontend/Makefile.am, + libmp3lame/Makefile.am, mpglib/Makefile.am: + + updated the .am files to change vc7 to vc8 + +2006-09-24 16:17 bouvigne + + * doc/html/history.html: + + updated history + +2006-09-23 22:02 bouvigne + + * libmp3lame/version.h (lame3_97): + + 3.97 release + +2006-09-23 21:46 bouvigne + + * doc/html/history.html: + + release 3.97 + +2006-09-23 19:30 aleidinger + + * configure: + + regen + +2006-09-23 19:29 aleidinger + + * config.h.in, configure.in: + + check for xmmintrin.h + +2006-09-23 08:42 bouvigne + + * configMS.h (lame3_97): + + borland config (from main branch) + +2006-09-23 08:25 bouvigne + + * Dll/: BladeMP3EncDLL.c (lame3_97), BladeMP3EncDLL.c: + + fix in boolean comparison for Delphi progs (bug #1536751) + +2006-09-23 08:01 bouvigne + + * doc/html/: history.html, index.html (lame3_97): + + 3.97 + +2006-09-22 19:18 aleidinger + + * ChangeLog: + + update from CVS history + +2006-09-22 18:51 aleidinger + + * configMS.h: + + Borland C seems to follow the lead of MSC. + + Bug ID: 1563522 + +2006-09-10 14:25 bouvigne + + * frontend/parse.c, libmp3lame/lame.c, libmp3lame/tables.c, + libmp3lame/util.c: + + restrict mpeg 2.5 to 64kbps + +2006-09-03 15:07 bouvigne + + * lame_vc7.sln, Dll/LameDll_vc7.vcproj, frontend/lame_vc7.vcproj, + frontend/mp3x_vc7.vcproj, libmp3lame/libmp3lame_vc7.vcproj, + mpglib/mpglib_vc7.vcproj: + + removed unmaintained VC7 project files + +2006-08-18 18:22 bouvigne + + * doc/html/history.html, libmp3lame/psymodel.c, + libmp3lame/version.h (lame3_97): + + backported the workaround against short block detection issue + +2006-08-06 16:44 takehiro + + * libmp3lame/: psymodel.c, tables.c + (takehiro-2002_05_07-experimental): + + update ATH adjustment algorithm. + - if the block type is short, do not use ATH adjustment with equal pressure + curve, because the curve is not exact for impulse-like signal. + +2006-07-30 13:53 bouvigne + + * configMS.h, libmp3lame/util.c: + + enable SSE code when using x64 + +2006-07-30 09:51 bouvigne + + * lame_vc8.sln, Dll/LameDll_vc8.vcproj, frontend/lame_vc8.vcproj, + libmp3lame/libmp3lame_vc8.vcproj, mpglib/mpglib_vc8.vcproj: + + x64 builds + +2006-07-30 09:32 bouvigne + + * Dll/LameDll_vc8.vcproj: + + updated project + +2006-07-30 09:11 bouvigne + + * lame_vc8.sln, Dll/LameDll_vc8.vcproj: + + added lame DLL VC8 project + +2006-07-14 16:06 bouvigne + + * lame_vc8.sln, frontend/lame_vc8.vcproj, + libmp3lame/libmp3lame_vc8.vcproj, mpglib/mpglib_vc8.vcproj: + + VC8 projects + +2006-07-14 15:58 bouvigne + + * libmp3lame/psymodel.c: + + slight change in the short block detection safety threshold + +2006-06-28 23:05 robert + + * libmp3lame/lame.c: + + full outer loop search disabled because of audible distortions it may generate + +2006-06-28 21:05 robert + + * libmp3lame/psymodel.c: + + normalizing the spreading function (vbr-new) + +2006-06-24 15:19 robert + + * libmp3lame/: lame.c, quantize_pvt.c, version.h: + + enabling the conditional RH_ATHAA_FIX code for vbr-new + we are now at patch level 6 + +2006-06-24 01:57 robert + + * libmp3lame/: lame.c, quantize_pvt.c: + + tuning ATHAA_FIX for high quality VBR new presets + +2006-06-23 23:40 robert + + * libmp3lame/: lame.c, quantize.c, quantize_pvt.c, vbrquantize.c: + + tuning ATHAA_FIX for midrange VBR new presets + +2006-06-23 23:09 robert + + * libmp3lame/machine.h: + + always compile in assertions for alpha builds + +2006-06-23 23:06 robert + + * Makefile.MSVC: + + updating LibSndFile support, it's used by default now + +2006-06-23 20:52 aleidinger + + * libmp3lame/version.h: + + bump the patchlevel for the updated sndfile support + +2006-06-23 20:49 aleidinger + + * doc/html/history.html: + + document the updated libsndfile support + +2006-06-23 20:46 aleidinger + + * Makefile.in, aclocal.m4, configure, ACM/Makefile.in, + ACM/ADbg/Makefile.in, ACM/ddk/Makefile.in, + ACM/tinyxml/Makefile.in, Dll/Makefile.in, debian/Makefile.in, + doc/Makefile.in, doc/html/Makefile.in, doc/man/Makefile.in, + dshow/Makefile.in, frontend/Makefile.in, include/Makefile.in, + libmp3lame/Makefile.in, libmp3lame/i386/Makefile.in, + mac/Makefile.in, misc/Makefile.in, mpglib/Makefile.in: + + regen + +2006-06-23 20:40 aleidinger + + * frontend/get_audio.c, configure.in, frontend/Makefile.am: + + Add support for a recent sndfile library. + + Submitted by: Erik de Castro Lopo (sndfile author) + +2006-06-18 23:02 robert + + * libmp3lame/lame.c: + + developer only switch "--tune x" mow modifies current mask_adjust settings + instead of assigning x to it + +2006-06-18 21:32 robert + + * Makefile.unix, libmp3lame/quantize.h: + + adding RH_TEST_ATHAA_FIX to the Makefile config RH + matching declaration and implementation of trancate_smallsspectrums + +2006-06-18 20:49 robert + + * libmp3lame/bitstream.c: + + fixing asserts + +2006-06-18 20:48 robert + + * libmp3lame/psymodel.c: + + bugfix: in NSPSY highpass filter, out of bounds access in fircoef + bugfix: loss of fraction in equal loudness weighting + +2006-06-18 19:20 robert + + * libmp3lame/quantize_pvt.c: + + small update to the ATHAA problem fix + +2006-06-18 18:16 robert + + * Makefile.MSVC, libmp3lame/machine.h, libmp3lame/quantize.h, + libmp3lame/quantize_pvt.c, libmp3lame/reservoir.c: + + trying to fix ATHAA problem for low volume files + to enable the code, one has to define RH_TEST_ATHAA_FIX at compile time + +2006-06-18 16:45 robert + + * frontend/gtkanal.c: + + needs console.h + +2006-06-18 16:44 robert + + * libmp3lame/bitstream.c: + + fixed assertion + +2006-06-16 00:16 robert + + * libmp3lame/quantize.c, libmp3lame/util.h, mpglib/interface.c: + + few more include dependencies sorted + +2006-06-15 23:51 robert + + * frontend/gtkanal.c, frontend/mp3x.c, libmp3lame/VbrTag.c, + libmp3lame/VbrTag.h, libmp3lame/bitstream.c, + libmp3lame/bitstream.h, libmp3lame/encoder.c, + libmp3lame/encoder.h, libmp3lame/fft.c, libmp3lame/fft.h, + libmp3lame/gain_analysis.c, libmp3lame/gain_analysis.h, + libmp3lame/id3tag.c, libmp3lame/id3tag.h, libmp3lame/l3side.h, + libmp3lame/lame-analysis.h, libmp3lame/lame.c, + libmp3lame/lame_global_flags.h, libmp3lame/lameerror.h, + libmp3lame/machine.h, libmp3lame/mpglib_interface.c, + libmp3lame/newmdct.c, libmp3lame/newmdct.h, libmp3lame/presets.c, + libmp3lame/psymodel.c, libmp3lame/psymodel.h, + libmp3lame/quantize.c, libmp3lame/quantize.h, + libmp3lame/quantize_pvt.c, libmp3lame/quantize_pvt.h, + libmp3lame/reservoir.c, libmp3lame/reservoir.h, + libmp3lame/set_get.c, libmp3lame/set_get.h, libmp3lame/tables.c, + libmp3lame/tables.h, libmp3lame/takehiro.c, libmp3lame/util.c, + libmp3lame/util.h, libmp3lame/vbrquantize.c, + libmp3lame/version.c, libmp3lame/version.h, mpglib/interface.c, + mpglib/layer3.c, mpglib/mpglib.h: + + some more header dependencies, indentation + +2006-06-15 23:07 robert + + * libmp3lame/: VbrTag.h, bitstream.c, bitstream.h, encoder.c, + encoder.h, fft.c, fft.h, gain_analysis.c, gain_analysis.h, + lame.c, libmp3lame_vc6.dsp, machine.h, mpglib_interface.c, + newmdct.c, presets.c, psymodel.c, psymodel.h, quantize.c, + quantize.h, quantize_pvt.c, quantize_pvt.h, reservoir.c, + reservoir.h, tables.c, takehiro.c, util.c, util.h, vbrquantize.c, + vbrquantize.h, version.c, version.h: + + making arguments and variables const where possible + +2006-06-15 16:03 robert + + * libmp3lame/: VbrTag.c, VbrTag.h, bitstream.c, bitstream.h, + encoder.c, encoder.h, fft.c, fft.h, gain_analysis.h, id3tag.c, + id3tag.h, l3side.h, lame-analysis.h, lame.c, lame_global_flags.h, + machine.h, mpglib_interface.c, newmdct.c, presets.c, psymodel.c, + psymodel.h, quantize.c, quantize.h, quantize_pvt.c, + quantize_pvt.h, reservoir.c, set_get.c, set_get.h, tables.c, + tables.h, takehiro.c, util.c, util.h, vbrquantize.c, version.c: + + tried to avoid includes within include headers to make dependencies more obvious + +2006-06-03 13:34 aleidinger + + * ChangeLog: + + Add nearly a year of history. + +2006-06-03 13:14 aleidinger + + * doc/html/history.html: + + add todays history + +2006-06-03 13:12 aleidinger + + * ltconfig, mkinstalldirs, stamp-h.in: + + Remove obsolete files (at least after the use of the new autotools, + they are not created anymore). + +2006-06-03 13:11 aleidinger + + * configure, config.h.in: + + Update to: + - libtool 1.5.22 + - automake 1.9 + - autoconf 2.59 + +2006-06-03 13:07 aleidinger + + * libmp3lame/i386/Makefile.am, Makefile.am.global, configure.in, + aclocal.m4, ltmain.sh, Makefile.in, ACM/Makefile.in, + ACM/ADbg/Makefile.in, ACM/ddk/Makefile.in, + ACM/tinyxml/Makefile.in, Dll/Makefile.in, debian/Makefile.in, + doc/Makefile.in, doc/html/Makefile.in, doc/man/Makefile.in, + dshow/Makefile.in, frontend/Makefile.in, include/Makefile.in, + libmp3lame/Makefile.in, libmp3lame/i386/Makefile.in, + mac/Makefile.in, misc/Makefile.in, mpglib/Makefile.in: + + Update to: + - libtool 1.5.22 + - automake 1.9 + - autoconf 2.59 + +2006-06-03 13:03 aleidinger + + * libmp3lame/lame.c: + + - Fix bug introduced in last revision. + - Don't segfault in lame_close() in case of an error on initialisation. + +2006-06-03 11:41 aleidinger + + * libmp3lame/lame.c: + + Plug some memory leaks in the error case. + + Noticed by: Christophe Fergeau + SF-Bug: 1443630 + +2006-06-03 11:05 aleidinger + + * lame.spec.in: + + - Remove requirements for specific gcc versions, since modern ones "just work". + - Remove out-dated hyper-optimizations (some of which weren't valid compiler + flags anymore). + - Update to current RPM techniques and macros (inspired by freshrpms.net spec). + + Submitted by: Kyle VanderBeek + SF-Patch: 1488468 + +2006-05-04 19:50 bouvigne + + * libmp3lame/: reservoir.c, version.h: + + restrict max mp3 buf to solve compatibility issue with FhG directshow filter + +2006-05-04 19:43 bouvigne + + * libmp3lame/psymodel.c: + + attack detection: workaround against "low freq" periodic signals (like trumpet) + +2006-04-16 12:18 takehiro + + * configure (takehiro-2002_05_07-experimental): + + regen + +2006-04-16 09:02 takehiro + + * configure.in: + + better socket library configuration. + +2006-04-16 08:23 takehiro + + * configure.in (takehiro-2002_05_07-experimental): + + better socket function configuration. + +2006-04-16 07:06 takehiro + + * config.h.in, configure.in: + + remove winsock check. It seems we do not need it anymore. + +2006-04-09 16:12 takehiro + + * libmp3lame/.cvsignore (takehiro-2002_05_07-experimental): + + ignore pkgconfig file. + +2006-04-09 16:11 takehiro + + * Makefile.in, configure, configure.in, testcase.mp3, + ACM/Makefile.in, ACM/ADbg/Makefile.in, ACM/ddk/Makefile.in, + ACM/tinyxml/Makefile.in, Dll/Makefile.in, debian/Makefile.in, + doc/Makefile.in, doc/html/Makefile.in, doc/man/Makefile.in, + dshow/Makefile.in, frontend/Makefile.in, include/Makefile.in, + libmp3lame/Makefile.in, libmp3lame/libmp3lame.pc.in, + libmp3lame/i386/Makefile.in, mac/Makefile.in, misc/Makefile.in, + mpglib/Makefile.in (takehiro-2002_05_07-experimental): + + prepare for pkgconfig support + +2006-04-08 11:57 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + tirivial hack of huffman coding with ESC code. + +2006-04-08 11:54 takehiro + + * libmp3lame/: machine.h, psymodel.c + (takehiro-2002_05_07-experimental): + + add alignment macro for not gcc environment + +2006-04-08 09:08 takehiro + + * libmp3lame/tags.c (takehiro-2002_05_07-experimental): + + supress magic numbers + +2006-04-08 07:46 takehiro + + * mpglib/: common.c, interface.c + (takehiro-2002_05_07-experimental): + + suppress warnings + +2006-04-08 07:46 takehiro + + * libmp3lame/: lame.c, set_get.c, set_get.h, tags.c + (takehiro-2002_05_07-experimental): + + supress warnings + +2006-04-08 07:45 takehiro + + * frontend/: gtkanal.c, mp3x.c (takehiro-2002_05_07-experimental): + + supress singed/unsigned warnings with gcc4.x + +2006-04-08 07:45 takehiro + + * configure.in (takehiro-2002_05_07-experimental): + + add one more warning option + +2006-04-08 07:44 takehiro + + * doc/html/id3.html (takehiro-2002_05_07-experimental): + + fix typos + +2006-04-08 07:16 takehiro + + * libmp3lame/: bitstream.c, gain_analysis.c, quantize.c, util.c, + util.h (takehiro-2002_05_07-experimental): + + fix singed/unsigned warning with gcc4.x + +2006-04-08 07:14 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + fix alignment error when gcc4.x with SSE enabled build + +2006-04-08 07:13 takehiro + + * libmp3lame/tags.c (takehiro-2002_05_07-experimental): + + fix typos in genre list. + suppress signed/unsigned warining with gcc4.x + +2006-04-08 07:12 takehiro + + * libmp3lame/id3tag.c: + + fix genre tag spelling as reported by CrazySoul + +2006-04-08 07:08 takehiro + + * doc/html/id3.html: + + fix spelling as reported by CrazySoul + +2006-02-18 16:35 takehiro + + * frontend/get_audio.c: + + remove redundant description. + +2006-02-18 16:35 takehiro + + * frontend/main.c: + + fix decoding problem when the output is stdout, reported by john.edwards33 + (sf.net bugid #1430719) + +2006-02-03 06:52 vitaly-ivanov + + * dshow/README: + + typo fix + +2006-02-02 21:04 robert + + * frontend/parse.c (lame3_97): + + "console_printf" replaced by "printf" + +2006-01-30 15:41 takehiro + + * frontend/get_audio.c: + + fix error message when unsupported format AIFF file. + (related bugid #1414515, + http://sourceforge.net/tracker/index.php?func=detail&aid=1414515&group_id=290&atid=100290 + ) + +2006-01-22 17:52 robert + + * include/lame.h, libmp3lame/encoder.c, libmp3lame/lame-analysis.h, + libmp3lame/lame.c, libmp3lame/psymodel.c, libmp3lame/quantize.c, + libmp3lame/quantize_pvt.c, libmp3lame/quantize_pvt.h, + libmp3lame/reservoir.c, libmp3lame/util.h, libmp3lame/version.h: + + bug fixes: psy code used long block ATH in short block case + workaround: quantization routines of new vbr code failed on strong tonal + samples, due to over optimistic masking promises from psy model + +2006-01-21 16:39 takehiro + + * frontend/: get_audio.c, get_audio.h, main.c, parse.c + (takehiro-2002_05_07-experimental): + + prepare for RIFF-wave MP3 file. + +2006-01-21 16:29 takehiro + + * libmp3lame/id3tag.c (lame3_97): + + backport of rev 1.28 + - patch #1379187, "id3tag_write_v2 doesn't allocate enough memory for track" + +2006-01-21 13:10 takehiro + + * libmp3lame/id3tag.c: + + patch #1379187, "id3tag_write_v2 doesn't allocate enough memory for track" + +2005-12-21 21:40 robert + + * frontend/: parse.c (lame3_97), parse.c: + + bug fix: implementation of the priority commandline switch did not what + the documentation says (windows only) + +2005-12-18 18:49 robert + + * frontend/: brhist.c, main.c (lame3_97): + + fixing some display glitch for very long input files + +2005-12-18 18:39 robert + + * Makefile.unix, configMS.h (lame3_97): + + fixing some gcc 4.0.2 compiler issues to get LAME compiled again + +2005-12-18 18:26 robert + + * frontend/brhist.c: + + fixing display glitch with very long files + +2005-12-05 15:57 takehiro + + * libmp3lame/id3tag.c: + + fix id3v2 genre tag problem, reported by wylda@volny. + now LAME won't crash with "--id3v2-only --tg 14". + +2005-11-29 21:21 robert + + * frontend/: mp3rtp.c, mp3x.c: + + commit was pending, needed for John33's decoding patch + +2005-11-29 19:49 robert + + * doc/html/history.html: + + updating history + +2005-11-28 10:09 vitaly-ivanov + + * dshow/: Encoder.h, Mpegac.cpp, Mpegac.h, PropPage.cpp, + PropPage.h, PropPage_adv.cpp, PropPage_adv.h, Property.rc, + README, iaudioprops.h, resource.h: + + Property page update - moved "set duration" check box to the advanced page, added "allow sample overlap" check box (uncheck it if downstream filter is Avi Mux, otherwise use it for better video/audio synchronization - especially when capturing). Copying terms update (README file) + +2005-11-27 15:02 bouvigne + + * libmp3lame/bitstream.c, libmp3lame/encoder.c, libmp3lame/fft.c, + libmp3lame/lame.c, doc/html/history.html, libmp3lame/VbrTag.c, + libmp3lame/mpglib_interface.c, libmp3lame/newmdct.c, + libmp3lame/presets.c, libmp3lame/psymodel.c, + libmp3lame/quantize.c, libmp3lame/quantize_pvt.c, + libmp3lame/reservoir.c, libmp3lame/set_get.c, + libmp3lame/takehiro.c, libmp3lame/util.c, + libmp3lame/vbrquantize.c, doc/man/lame.1, frontend/parse.c: + + merge from 3.97 branch + +2005-11-27 14:47 bouvigne + + * doc/html/history.html, libmp3lame/gain_analysis.c (lame3_97): + + hack against replayGain slowness on silent parts + +2005-11-27 10:20 bouvigne + + * libmp3lame/VbrTag.c (lame3_97): + + fixed Xing/Info tag parsing + +2005-11-26 18:43 bouvigne + + * libmp3lame/version.h (lame3_97): + + 3.97b2 + +2005-11-26 18:43 bouvigne + + * doc/html/history.html (lame3_97): + + history + +2005-11-26 18:37 bouvigne + + * libmp3lame/: reservoir.c, set_get.c (lame3_97): + + reinstated bit reservoir for 320kbps + +2005-11-26 14:21 bouvigne + + * libmp3lame/presets.c (lame3_97): + + slight change of athaa in V5 + +2005-11-26 14:19 bouvigne + + * frontend/parse.c (lame3_97): + + restored availability of athaa-sensitivity in command line frontend, + as it was available in 3.96 release + +2005-11-22 22:15 robert + + * frontend/: console.c, console.h, get_audio.c, get_audio.h, + gtkanal.c, lametime.c, main.c, main.h, parse.c, rtp.c: + + John33's lame decoding fix + +2005-11-20 14:25 takehiro + + * libmp3lame/gain_analysis.c (takehiro-2002_05_07-experimental): + + fix built problem on Sun Studio 10, reported by Moinak Ghosh + +2005-11-20 14:24 takehiro + + * libmp3lame/gain_analysis.c: + + fix built problem with Sun Studio 10, reported by Moinak Ghosh + +2005-11-20 14:08 bouvigne + + * libmp3lame/: VbrTag.c, bitstream.c, encoder.c, fft.c, lame.c, + mpglib_interface.c, newmdct.c, presets.c, psymodel.c, quantize.c, + quantize_pvt.c, reservoir.c, set_get.c, takehiro.c, util.c, + vbrquantize.c (lame3_97): + + updated copyrights + +2005-11-12 18:52 bouvigne + + * libmp3lame/gain_analysis.c: + + speedup of silent parts analysis + +2005-11-12 18:33 bouvigne + + * doc/html/history.html: + + history from 3.97 branch + +2005-11-12 18:21 bouvigne + + * Makefile.MSVC: + + added console.c + +2005-11-09 18:56 aleidinger + + * frontend/rtp.c: + + Fix bug #1349332 + +2005-11-09 18:40 aleidinger + + * libmp3lame/id3tag.c: + + Fix bug #1351021. + +2005-11-06 17:41 bouvigne + + * doc/html/history.html, libmp3lame/lame.c, libmp3lame/quantize.c + (lame3_97): + + fixes from main branch + +2005-11-05 16:35 aleidinger + + * doc/html/history.html: + + add todays work + +2005-11-05 16:20 aleidinger + + * libmp3lame/: id3tag.c, id3tag.h: + + Add support for total number of tracks per album. + + Submitted by: Kyle VanderBeek + + While I'm here add some abort() calls in case we overflow some arrays + (this is only compile tested, so pass me the pointy hat if it fails). + +2005-11-05 15:54 aleidinger + + * libmp3lame/id3tag.c: + + Add id3v2 TLEN support. + + Submitted by: Linus Walleij + +2005-11-05 15:52 aleidinger + + * frontend/console.c: + + some compilers really want the void nowadays... + +2005-11-05 15:51 aleidinger + + * frontend/Makefile.in: + + regen + +2005-11-05 15:49 aleidinger + + * frontend/console.h: + + make some pseudo prototypes to real prototypes (fixes gcc warnings) + +2005-11-05 15:48 aleidinger + + * frontend/Makefile.am: + + console.[ch] is now mandatory, so build it + +2005-11-05 15:47 aleidinger + + * include/lame.h: + + remove redundant function prototypes (we need only one prototype) + +2005-11-01 20:17 robert + + * frontend/console.c: + + bug fix: FILE pointer may be NULL for DEBUGF + +2005-11-01 13:54 robert + + * frontend/: mp3rtp.c, rtp.c: + + getting mp3rtp working again + +2005-11-01 13:10 robert + + * frontend/mp3x.c: + + replacing (f)printf by console_printf, error_printf and report_printf. fixes the problem that some messages would be send to stdout instead of stderr. added internal switch '--debug-file ', allows to debug the code more comfortably by writing DEBUGF(xyz) at code hot spots. + +2005-11-01 13:01 robert + + * frontend/: .indent.pro, amiga_mpega.c, brhist.c, brhist.h, + console.c, console.h, get_audio.c, get_audio.h, gpkplotting.c, + gpkplotting.h, gtkanal.c, gtkanal.h, lame_vc6.dsp, + lame_vc7.vcproj, lametime.c, lametime.h, main.c, main.h, + mp3rtp.c, mp3x.c, mp3x_vc6.dsp, mp3x_vc7.vcproj, parse.c, + parse.h, portableio.c, portableio.h, rtp.c, rtp.h, timestatus.c, + timestatus.h: + + replacing (f)printf by console_printf, error_printf and report_printf. fixes the problem that some messages would be send to stdout instead of stderr. added internal switch '--debug-file ', allows to debug the code more comfortably by writing DEBUGF(xyz) at code hot spots. + +2005-11-01 12:51 robert + + * Makefile.unix, configMS.h: + + [no log message] + +2005-10-31 13:02 bouvigne + + * libmp3lame/quantize.c: + + fixed bug 1227632 + +2005-10-31 13:01 bouvigne + + * libmp3lame/lame.c: + + fixed bug 1337556 + +2005-10-31 13:00 bouvigne + + * frontend/main.c: + + spelling of Takehiro's name + +2005-10-10 07:05 rbrito + + * COPYING, debian/changelog, debian/copyright, debian/rules, + doc/man/lame.1: + + Updated manpage to include accented characters; + Updated debian packaging; + Updated documentation to include the new FSF address. + +2005-10-01 09:03 takehiro + + * lame.spec.in (takehiro-2002_05_07-experimental): + + update configure options + +2005-09-29 21:21 robert + + * libmp3lame/i386/: fft3dn.nas (lame3_97), fft3dn.nas: + + taken from lame4 branch: + fix possible link problem on cygwin + +2005-09-25 22:09 glessard + + * libmp3lame/quantize.c: + + GCC 4 on OS X was choking on line 615. + Given the assignment on line 630, clearly 'work' isn't a pointer to an array + of constants anyway. + +2005-09-24 10:20 takehiro + + * libmp3lame/i386/choose_table.nas + (takehiro-2002_05_07-experimental): + + suppress warnings for YASM. + +2005-09-24 10:20 takehiro + + * libmp3lame/i386/nasm.h (takehiro-2002_05_07-experimental): + + added LINUX detection for non-executable stack suuport. + +2005-09-24 09:34 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + simplify drain_into_ancillary() + +2005-09-24 08:45 takehiro + + * libmp3lame/i386/quantSSE.nas (takehiro-2002_05_07-experimental): + + small optimization + +2005-09-24 08:28 takehiro + + * libmp3lame/newmdct.c (takehiro-2002_05_07-experimental): + + fixed window shape when mixed_block_flag is enabled. + +2005-09-24 08:01 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + Now LAME4 does not use MMX when SSE2 is available. + +2005-09-24 07:54 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + added TODO as comments + +2005-09-22 16:00 takehiro + + * configure (takehiro-2002_05_07-experimental): + + regen + +2005-09-22 15:48 takehiro + + * configure.in (takehiro-2002_05_07-experimental): + + fix when without nasm + +2005-09-22 14:03 takehiro + + * configure.in (takehiro-2002_05_07-experimental): + + i*86-linux detection for NASM code not to mark "exectable stack" + +2005-09-22 13:50 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + cache gfc->bitidx value. + +2005-09-20 19:51 robert + + * libmp3lame/util.c: + + fix wrong typing + +2005-09-20 19:41 robert + + * libmp3lame/: quantize.c, vbrquantize.c, vbrquantize.h: + + moved loop from quantize.c to vbrquantize.c + +2005-09-20 19:38 robert + + * libmp3lame/: util.h, util.c: + + malloc with n-bytes alignment + +2005-09-20 09:19 robert + + * frontend/parse.c, libmp3lame/lame.c, + libmp3lame/lame_global_flags.h, libmp3lame/set_get.c: + + added internal developer switch to select between ISO and x^3/4 quantization + + --quantization-type n n=0: no change, n=1: ISO, n=2: x^3/4 + +2005-09-18 22:57 robert + + * libmp3lame/: vbrquantize.c, vbrquantize.h, version.h: + + vbr new noise shaping: let lame abort in exceptional cases + + now on alpha 2 + +2005-09-18 21:38 robert + + * libmp3lame/: encoder.c, lame.c, quantize.c, quantize.h, util.h, + vbrquantize.c: + + vbr-new: bug fix for "searchGlobalStepSizeMax" + + demangling vbr_old and vbr_new code + +2005-09-14 17:24 takehiro + + * configure.in (takehiro-2002_05_07-experimental): + + clean up assembler code support. + - nasmw support on cygwin. + - clean up yasm support, as I decided not to use yasm on x86-64. + - do not set "not exectable stack" flag not on linux environment. + +2005-09-13 15:38 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + code clean up + +2005-09-12 15:51 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + better region division point for lossless coding. + +2005-09-12 01:38 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + code clean up. + +2005-09-11 17:12 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + fix assertion failure at lossless coding. + +2005-09-11 17:07 takehiro + + * libmp3lame/: encoder.h, tables.c, takehiro.c + (takehiro-2002_05_07-experimental): + + more efficient lossless coding when without brute force search. + And it makes little speed improvement when with brute force search. + +2005-09-11 10:20 bouvigne + + * libmp3lame/version.h: + + welcome to 3.98 + +2005-09-11 09:57 bouvigne + + * lame_vc7.sln: + + missing file + +2005-09-11 09:14 bouvigne + + * libmp3lame/version.h: + + 3.97b + +2005-09-11 07:35 takehiro + + * libmp3lame/i386/quantSSE.nas (takehiro-2002_05_07-experimental): + + experimental SSE2 support for calc_sfb_noise_fast. + but because it slows down the VBR encoding on Celeron-M, it is not enabled by + default. + +2005-09-10 17:08 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + more efficient lossless coding, especially for low bitrate. + +2005-09-08 22:57 takehiro + + * doc/html/history.html: + + fixed style. + +2005-09-08 22:57 takehiro + + * doc/html/history.html: + + added my changes for 3.97. + +2005-09-08 02:44 rbrito + + * doc/man/lame.1: + + Fixed typo. + +2005-09-07 21:15 bouvigne + + * testcase.mp3: + + updated testcase for 3.97b1 + +2005-09-06 18:24 bouvigne + + * doc/html/history.html: + + typo + +2005-09-06 15:34 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + fix assertion failure in lossless coding. + +2005-09-05 21:24 bouvigne + + * doc/html/: history.html, index.html: + + updated history for 3.97b + +2005-09-05 20:49 bouvigne + + * frontend/parse.c: + + -Vx short help + +2005-09-05 04:29 rbrito + + * debian/: changelog, rules: + + Update generation of package with full optimization, now that compilation with GCC 4 works. + +2005-09-05 01:55 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + always use adaptive cutoff + +2005-09-05 01:52 takehiro + + * libmp3lame/: quantize.c, i386/quantSSE.nas + (takehiro-2002_05_07-experimental): + + optimized calc_sfb_noise_fast(). + Exit the loop as soon as it detect the audible noise. + +2005-09-04 19:52 aleidinger + + * ChangeLog: + + Update with recent history. + +2005-09-04 19:45 aleidinger + + * configure: + + Regen. + +2005-09-04 19:35 aleidinger + + * config.h.in: + + Add the bits for largefile support. + + Submitted by: Diego "Flameeyes" Pettenò + Bug ID: 1271744 + +2005-09-04 19:11 aleidinger + + * configure.in: + + Remove some flags which gcc 4.x doesn't understand anymore. + + Noticed by: Rogério Brito + +2005-09-04 19:05 aleidinger + + * aclocal.m4, config.h.in, Makefile.in, ACM/Makefile.in, + ACM/ADbg/Makefile.in, ACM/ddk/Makefile.in, + ACM/tinyxml/Makefile.in, Dll/Makefile.in, debian/Makefile.in, + doc/Makefile.in, doc/html/Makefile.in, doc/man/Makefile.in, + dshow/Makefile.in, frontend/Makefile.in, include/Makefile.in, + libmp3lame/Makefile.in, libmp3lame/i386/Makefile.in, + mac/Makefile.in, misc/Makefile.in, mpglib/Makefile.in: + + Regen. + +2005-09-04 19:05 aleidinger + + * depcomp, install-sh, ltmain.sh, missing, mkinstalldirs, + frontend/depcomp, libmp3lame/depcomp, misc/depcomp, + mpglib/depcomp: + + Update to recent autotools. + +2005-09-04 19:02 aleidinger + + * frontend/Makefile.am: + + Play catchup with the autotools. + +2005-09-04 18:54 aleidinger + + * configure.in: + + Initialize autoconf correctly (with lame mailinglist address). + +2005-09-04 16:19 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + fix adptive threshold calculation. + +2005-09-04 12:03 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + little bit better lossless coding + +2005-09-04 11:52 rbrito + + * doc/man/lame.1: + + Fixed typo in manpage. + +2005-09-04 07:15 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + better skip method for not audible scalefactor band. + +2005-09-04 06:56 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + do not calculate not audible scalefactor band. + +2005-09-04 06:16 takehiro + + * libmp3lame/encoder.h (takehiro-2002_05_07-experimental): + + forgot to commit when adding sfb energy caching. sorry. + +2005-09-04 03:10 takehiro + + * libmp3lame/: quantize.c, i386/quantSSE.nas + (takehiro-2002_05_07-experimental): + + caching sfb energy = sum of xr^2 + +2005-09-04 03:09 takehiro + + * libmp3lame/i386/choose_table.nas + (takehiro-2002_05_07-experimental): + + suppress conditional jump + +2005-09-04 02:21 takehiro + + * libmp3lame/i386/choose_table.nas + (takehiro-2002_05_07-experimental): + + better pipelining and use of pshufd in ix_max_SSE2 + +2005-09-04 02:09 takehiro + + * libmp3lame/: tables.c, i386/choose_table.nas + (takehiro-2002_05_07-experimental): + + SSE2 version of ix_max() + +2005-09-04 02:08 takehiro + + * libmp3lame/i386/quantSSE.nas (takehiro-2002_05_07-experimental): + + trivial optimization + +2005-09-03 15:38 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + clean up coding. + +2005-09-03 14:49 takehiro + + * libmp3lame/: quantize.c, i386/choose_table.nas + (takehiro-2002_05_07-experimental): + + changed parameter of xrmax_MMX() + +2005-09-03 13:38 takehiro + + * libmp3lame/i386/choose_table.nas + (takehiro-2002_05_07-experimental): + + trivial optimization + +2005-09-03 13:31 takehiro + + * libmp3lame/: quantize.c, i386/quantSSE.nas + (takehiro-2002_05_07-experimental): + + added sumofsqr_SSE() for ia32 + +2005-09-03 13:10 takehiro + + * libmp3lame/i386/choose_table.nas + (takehiro-2002_05_07-experimental): + + use aligned memory access + +2005-09-03 12:45 takehiro + + * libmp3lame/i386/quantSSE.nas (takehiro-2002_05_07-experimental): + + use SSE register for data backup. + +2005-09-03 12:28 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + xrmax_SSE() support on x86_64 + +2005-09-03 11:16 takehiro + + * libmp3lame/: quantize.c, i386/choose_table.nas + (takehiro-2002_05_07-experimental): + + SSE version of xrmax() + +2005-09-02 18:09 bouvigne + + * frontend/parse.c: + + fixed a stupid bug with --preset medium/standard/extreme + +2005-09-02 17:16 takehiro + + * frontend/parse.c (takehiro-2002_05_07-experimental): + + changed default setting of replaygain analysis, "enable fast" -> "disable all". + +2005-09-01 18:12 bouvigne + + * libmp3lame/VbrTag.c: + + 320kbps cbr was flagged as "non optimal" in the info header + +2005-08-31 16:21 takehiro + + * libmp3lame/quantize.c, libmp3lame/lame-analysis.h, + frontend/gtkanal.c (takehiro-2002_05_07-experimental): + + display how many bits used in the "large value" region and count1 region. + +2005-08-28 17:30 bouvigne + + * frontend/parse.c, libmp3lame/version.h: + + Changed the way "--preset xxx" is handled, + as I've seen many users passing "--preset standard --vbr-new". + Presets are now evaluated during initialisation, so this kind of command + line now properly works. + +2005-08-28 17:02 bouvigne + + * libmp3lame/lame.c, Makefile.MSVC, libmp3lame/version.c, + libmp3lame/version.h, frontend/parse.c: + + 64bits build from within win64 platform sdk + +2005-08-28 12:19 takehiro + + * libmp3lame/i386/fftsse.nas (takehiro-2002_05_07-experimental): + + use 128bit constants + +2005-08-28 12:11 takehiro + + * libmp3lame/i386/fftsse.nas (takehiro-2002_05_07-experimental): + + better pipelining + +2005-08-27 12:03 takehiro + + * libmp3lame/i386/fftsse.nas (takehiro-2002_05_07-experimental): + + use cos(2x) = cos(x)*cos(x) - sin(x)*sin(x) = 1 - 2*sin(x)*sin(x) + +2005-08-27 08:25 takehiro + + * configure, configure.in: + + fix for configure problem reported by Steven P. Ulrick. + +2005-08-27 08:10 takehiro + + * libmp3lame/i386/fftsse.nas (takehiro-2002_05_07-experimental): + + clean up. + +2005-08-27 07:58 takehiro + + * libmp3lame/i386/fftsse.nas (takehiro-2002_05_07-experimental): + + clean up counter register usage + +2005-08-25 16:28 takehiro + + * libmp3lame/i386/fftsse.nas (takehiro-2002_05_07-experimental): + + suppress table size + +2005-08-25 12:14 takehiro + + * debian/: Makefile.am, Makefile.in: + + follow the file name change. + +2005-08-23 15:50 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + new tonality -> masking ratio conversion method and masking ratio limitation + in the lower frequency region. + +2005-08-23 14:15 takehiro + + * libmp3lame/: encoder.h, lame.c, newmdct.c, psymodel.c, tables.c + (takehiro-2002_05_07-experimental): + + rename internal variable name, start_sfb_* -> max_sfb_* + update verbose print of internal setting. + +2005-08-22 16:20 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + do not call best_scalefac_store() when no noise shaping, becase in such case + all the scalefac values are always zero. + +2005-08-22 15:21 takehiro + + * libmp3lame/newmdct.c (takehiro-2002_05_07-experimental): + + do not calculate MDCT beyond cutoff even when adaptive cutoff is enabled. + +2005-08-22 13:47 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + display internal setting for "adaptive lowpass cutoff" + +2005-08-22 13:46 takehiro + + * libmp3lame/tags.c (takehiro-2002_05_07-experimental): + + fix "optimal setting" flag is always cleared when the input file is below 32kH + +2005-08-22 13:11 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + do not process filtering when no filter enabled. + +2005-08-21 17:32 bouvigne + + * Makefile.am, ACM/Makefile.am, ACM/lameACM_vc7.vcproj, + ACM/ADbg/ADbg_vc7.vcproj, ACM/ADbg/Makefile.am, + ACM/tinyxml/Makefile.am, ACM/tinyxml/tinyxml_vc7.vcproj, + Dll/LameDll_vc7.vcproj, Dll/Makefile.am, frontend/Makefile.am, + frontend/lame_vc7.vcproj, frontend/mp3x_vc7.vcproj, + libmp3lame/Makefile.am, libmp3lame/libmp3lame_vc7.vcproj, + mpglib/Makefile.am, mpglib/mpglib_vc7.vcproj: + + added project files for VC7 + +2005-08-21 17:00 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + use adaptive cutoff when no lowpass filter setting ("-k" option) + +2005-08-21 15:25 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + fix default cutoff setting when adaptive cutoff. + +2005-08-21 14:15 takehiro + + * libmp3lame/: encoder.h, lame.c, psymodel.c, quantize.c, tables.c + (takehiro-2002_05_07-experimental): + + adaptive cutoff frequency calculation. + very experimental and not works correctly (of course is not enabled by default) + +2005-08-21 08:40 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + revive -q settings for VBR/ABR + +2005-08-21 08:05 takehiro + + * libmp3lame/i386/: fftsse.nas, quantSSE.nas + (takehiro-2002_05_07-experimental): + + clean up + +2005-08-21 06:38 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + clean up x86_64 code. + +2005-08-21 06:09 takehiro + + * libmp3lame/i386/fftsse.nas (takehiro-2002_05_07-experimental): + + use loopalign instead of align + +2005-08-21 05:54 takehiro + + * libmp3lame/i386/fftsse.nas (takehiro-2002_05_07-experimental): + + use movlps instead of movups + +2005-08-21 05:42 takehiro + + * libmp3lame/i386/fftsse.nas (takehiro-2002_05_07-experimental): + + trivial + +2005-08-21 04:50 takehiro + + * libmp3lame/i386/: choose_table.nas, quantSSE.nas + (takehiro-2002_05_07-experimental): + + small asm-coding hack. + +2005-08-21 03:32 takehiro + + * libmp3lame/: encoder.h, tags.c + (takehiro-2002_05_07-experimental): + + Support generic genre name like "MyOriginalGenre" (bugid #1265218 @ sf.net) + +2005-08-20 18:34 takehiro + + * libmp3lame/i386/fftsse.nas (takehiro-2002_05_07-experimental): + + clean up. + +2005-08-20 18:05 takehiro + + * libmp3lame/: util.c, util.h (takehiro-2002_05_07-experimental): + + one more support for SSE on x86_64 + +2005-08-20 18:01 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + ASM code support for x86_64 environment (only tested with FedoraCore3@cf.sf.net) + +2005-08-20 17:48 bouvigne + + * doc/html/switchs.html: + + typo + +2005-08-20 16:47 takehiro + + * configure, configure.in, libmp3lame/Makefile.am, + libmp3lame/Makefile.in (takehiro-2002_05_07-experimental): + + auto* things for x86_64 related files. + +2005-08-20 14:21 takehiro + + * libmp3lame/i386/ssesub.c (takehiro-2002_05_07-experimental): + + remove unused files/dirs + +2005-08-20 13:42 takehiro + + * libmp3lame/i386/quantSSE.nas (takehiro-2002_05_07-experimental): + + remove redundant operation and fix comments. + +2005-08-20 11:32 takehiro + + * libmp3lame/: lame.c, psymodel.c, util.h + (takehiro-2002_05_07-experimental): + + modification related to asm version of lr2ms (forgot to commit. oops) + +2005-08-20 09:25 takehiro + + * libmp3lame/: util.c, i386/quantSSE.nas + (takehiro-2002_05_07-experimental): + + SSE version of LR -> MS. gains 1% speed. + +2005-08-20 08:49 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + trivial optimization + +2005-08-16 07:56 rbrito + + * debian/: changelog, control: + + Make libmp3lame0 provide and replace liblame0, not conflict with it. + +2005-08-16 07:11 rbrito + + * debian/: changelog, control, libmp3lame0-dev.files: + + Fixed development package to not include shared libraries. + Other misc fixes. + + Yet more to come. + +2005-08-16 01:42 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + optimized pow075() for generic CPU. + remove C++ style comments. + +2005-08-15 04:25 rbrito + + * debian/: changelog, control, liblame0-dev.docs, + liblame0-dev.files, liblame0.files, libmp3lame0-dev.docs, + libmp3lame0-dev.files, libmp3lame0.files, rules: + + Update Debian packaging so that the library packages follow the SONAME + rules. + + Also incorporate some changes from Christian Marillat's packages in the + basic lame package. + + More changes to come soon. + +2005-08-14 07:05 takehiro + + * libmp3lame/: bitstream.c, i386/quantSSE.nas + (takehiro-2002_05_07-experimental): + + trivial optimization + +2005-08-13 14:12 takehiro + + * libmp3lame/: bitstream.c, tables.c, tables.h + (takehiro-2002_05_07-experimental): + + optimize quad-code writing routine. + +2005-08-13 12:09 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + move the comments at more suitable place. + +2005-08-13 12:08 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + trivial optimizations. + +2005-08-13 09:17 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + faster count bits for quad-code region. + +2005-08-11 14:43 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + reduce memory access by caching data to be written. + +2005-08-10 15:22 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + caching huffman code to be written to reduce bitwise operation. + +2005-08-10 14:55 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + more pruning at lossless coding. same result, faster calculation. + +2005-08-08 17:22 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + one more pruning of lossless coding. + +2005-08-08 16:33 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + optimize speed of lossless coding with better pruning. + +2005-08-07 14:07 takehiro + + * doc/man/lame.1: + + when the input is raw, the input file will be treated as native endian. + (bugid 1158189) + +2005-08-07 13:24 bouvigne + + * doc/html/switchs.html: + + update of stereo modes description + +2005-08-07 12:34 takehiro + + * configure, aclocal.m4 (takehiro-2002_05_07-experimental): + + regen + +2005-08-07 10:44 takehiro + + * libmp3lame/: quantize.c, takehiro.c + (takehiro-2002_05_07-experimental): + + surpress memcpy + +2005-08-07 09:37 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + fix debug build + +2005-08-06 17:29 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + reduce table size. + +2005-08-06 17:20 takehiro + + * libmp3lame/tags.c (takehiro-2002_05_07-experimental): + + surpress warnings + +2005-08-06 17:14 takehiro + + * libmp3lame/tables.h (takehiro-2002_05_07-experimental): + + fix comments + +2005-08-06 14:51 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix typo. + +2005-08-06 06:37 takehiro + + * libmp3lame/: psymodel.c, i386/ssesub.c + (takehiro-2002_05_07-experimental): + + trivial + +2005-08-06 06:09 takehiro + + * libmp3lame/: machine.h, tables.c, tables.h + (takehiro-2002_05_07-experimental): + + cleanup and suppress memory usage when SMALL_CACHE and IEEE754 + +2005-08-06 04:46 takehiro + + * frontend/timestatus.c (takehiro-2002_05_07-experimental): + + fix --nohist switch. + +2005-08-05 15:22 takehiro + + * doc/man/lame.1: + + added "per sample" for the description of --bitwidth option. (bugid #1158196) + +2005-08-05 09:22 vitaly-ivanov + + * dshow/: Mpegac.cpp, Mpegac.h: + + Another timestamp fix. Added additional resynchronization points (now there are 4 resynch points) in order to implement absolutely accurate in-out synchronization + +2005-08-04 15:15 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + fix MPEG2 Layer3 VBR encoding (correct form of rev.1.178.2.223). + +2005-08-04 14:56 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix short block encoding. It may select the subblock gain which makes quantized + values larger than the IXMAX. + +2005-08-04 14:01 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + revert last (rev.1.178.2.223) changes. + +2005-08-04 14:00 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + do not use preflag when MPEG2 + +2005-08-04 11:27 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + fix for MPEG2 VBR coding. Still MPEG2-VBR needs many tweaking. + +2005-08-04 06:15 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + trivial simplification. + +2005-08-04 02:30 takehiro + + * libmp3lame/: encoder.h, lame.c + (takehiro-2002_05_07-experimental): + + fix bitrate histgram display when mono. + +2005-08-04 01:42 rbrito + + * debian/: changelog, control, rules: + + Updates for Debian packaging. + +2005-08-04 01:40 rbrito + + * doc/man/lame.1: + + Documentation of switches: --{un,}signed and --{big,little}-endian. + +2005-08-03 14:40 takehiro + + * libmp3lame/tags.c (takehiro-2002_05_07-experimental): + + supress warnings on 64bit environment. + +2005-08-03 14:04 takehiro + + * frontend/main.c (takehiro-2002_05_07-experimental): + + more clean up when with --nohist or --silent. + +2005-08-03 07:11 takehiro + + * libmp3lame/i386/nasm.h (takehiro-2002_05_07-experimental): + + Add magic words from libflac to tell LAME does not need exectable stack. + +2005-08-02 13:30 takehiro + + * frontend/main.c, libmp3lame/lame.c + (takehiro-2002_05_07-experimental): + + fix brhist display when CBR + +2005-08-01 17:16 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + update comments + +2005-08-01 15:51 takehiro + + * libmp3lame/: quantize.c, tables.c + (takehiro-2002_05_07-experimental): + + more MAX_BITS off-by-one fixes, including comments. + +2005-08-01 13:10 vitaly-ivanov + + * dshow/: Mpegac.cpp, Property.rc: + + Output timestamps fix. There was a serious bug when input audio samples had time gaps between each other - DirectShow timestamps for output samples were calculated wrong in this case + +2005-08-01 07:06 takehiro + + * libmp3lame/encoder.h (takehiro-2002_05_07-experimental): + + fix off by one of MAX_BITS. + +2005-08-01 06:30 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + supress table size. + +2005-07-30 16:30 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + do not use 4096 bits/granule limits when not strict ISO mode. + +2005-07-28 13:05 rbrito + + * doc/html/: basic.html, contributors.html, examples.html, + history.html, id3.html, switchs.html: + + Minor spelling corrections and other fixes to documentation. + +2005-07-28 13:02 rbrito + + * debian/rules: + + Safe version for compilation with GCC 4. + +2005-07-27 21:49 rbrito + + * doc/html/: presets.html, switchs.html: + + Spelling fixes for documentation. + +2005-07-27 21:38 rbrito + + * doc/man/lame.1: + + Include description of the "medium" preset in the manpage. + + Fix some spelling errors on the manpage. + +2005-07-27 08:43 rbrito + + * debian/changelog, debian/control, debian/lame.manpages, + debian/rules, doc/man/lame.1: + + Small fixes for lame manpage to make lintian happy. More updates to come. + +2005-07-27 07:41 rbrito + + * debian/changelog: + + Preparation for the new beta release. More changes to come. + +2005-07-26 23:31 takehiro + + * config.h.in, configure.in, frontend/main.c + (takehiro-2002_05_07-experimental): + + experimental patch to autodetect UTF-8 ID3v2 tag by Edmund GRIMLEY EVANS. + +2005-07-26 13:59 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix 4096bits limits for one _granule_ when VBR. + old code mistook it for one _channel and granule_. + +2005-07-24 16:54 takehiro + + * libmp3lame/: lame.c, psymodel.c, util.h + (takehiro-2002_05_07-experimental): + + suppress warnings + +2005-07-24 16:52 takehiro + + * libmp3lame/: lame.c, psymodel.c, util.c + (takehiro-2002_05_07-experimental): + + added lr2ms() function and use it. This is the preparation for future asm-optimizations. + +2005-07-24 16:51 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + fixed reservoir limitation setup. + +2005-07-24 16:49 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + added some comments arround the bit reservoir. + +2005-07-24 16:28 takehiro + + * libmp3lame/i386/quantSSE.nas (takehiro-2002_05_07-experimental): + + [no log message] + +2005-07-24 16:11 takehiro + + * libmp3lame/: lame.c, quantize.c, i386/quantSSE.nas + (takehiro-2002_05_07-experimental): + + SSE2 version of quntize_ISO (from gogo) + +2005-07-24 13:02 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + fix bit/byte confusion. + +2005-07-20 14:30 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + fixed compilation problem on some OS which has a "trancate" + +2005-07-20 14:22 takehiro + + * libmp3lame/encoder.h (takehiro-2002_05_07-experimental): + + update comments. + +2005-07-16 08:30 takehiro + + * libmp3lame/tags.c (takehiro-2002_05_07-experimental): + + fixed tarck tag ID. + +2005-07-16 08:04 takehiro + + * frontend/parse.c, include/lame.h, libmp3lame/encoder.h, + libmp3lame/tags.c (takehiro-2002_05_07-experimental): + + ID3 tag update. + - merged UTF-8 patch from egrimleyevans + (http://sourceforge.net/tracker/index.php?func=detail&aid=1192706&group_id=290&atid=300290) + + - Fixed ID3v1 track number tag. When the track number is larger than 255, it was recoded as "track number % 256" in the ID3v1. + + - Changed internal track number representation to char* from int. It may allow + to use "leading zero" track number in ID3v2 tag, like "01/23". + +2005-07-16 07:30 takehiro + + * frontend/parse.c (takehiro-2002_05_07-experimental): + + added "--ignore-tag-errors" to the usage message + +2005-07-10 16:13 bouvigne + + * libmp3lame/: presets.c, version.h: + + alpha 11: update of abr/cbr 160-320 + +2005-06-29 12:26 vitaly-ivanov + + * dshow/: Encoder.cpp, PropPage.cpp, PropPage_adv.cpp, Property.rc: + + Joint / Standard stereo selection fix. Got rid of automatic joint stereo encoding when the bit rate is relatively low, now it's up to the user + +2005-06-25 08:14 vitaly-ivanov + + * dshow/: Encoder.h, Property.rc, aboutprp.cpp, .cvsignore: + + [no log message] + +2005-06-24 10:03 vitaly-ivanov + + * dshow/: .cvsignore, Encoder.cpp, Encoder.h, Mpegac.cpp, + Mpegac.def, Mpegac.h, PropPage.cpp, PropPage.h, PropPage_adv.cpp, + PropPage_adv.h, Property.rc, README, REG.CPP, UIDS.H, + aboutprp.cpp, aboutprp.h, dshow.dsp, dshow.dsw, iaudioprops.h, + resource.h: + + [no log message] + +2005-06-24 09:37 vitaly-ivanov + + * dshow/REG.H: + + [no log message] + +2005-06-04 16:06 takehiro + + * libmp3lame/i386/: Makefile.am, Makefile.in + (takehiro-2002_05_07-experimental): + + fix for configure with --disable-shared. + +2005-05-29 16:41 takehiro + + * Makefile.in, aclocal.m4, configure, ltmain.sh, ACM/Makefile.in, + ACM/ADbg/Makefile.in, ACM/ddk/Makefile.in, + ACM/tinyxml/Makefile.in, Dll/Makefile.in, debian/Makefile.in, + doc/Makefile.in, doc/html/Makefile.in, doc/man/Makefile.in, + dshow/Makefile.in, frontend/Makefile.in, include/Makefile.in, + libmp3lame/Makefile.in, libmp3lame/i386/Makefile.in, + mac/Makefile.in, misc/Makefile.in, mpglib/Makefile.in + (takehiro-2002_05_07-experimental): + + regen with automake1.9.5 + +2005-05-29 16:40 takehiro + + * libmp3lame/: tables.c, psymodel.c + (takehiro-2002_05_07-experimental): + + psymodel parameter tuning (1) + +2005-05-29 16:10 takehiro + + * debian/: changelog, control: + + fixed version number (upstream -> downstream) + + patch from Jack, from + http://sourceforge.net/tracker/index.php?func=detail&aid=1201172&group_id=290&atid=100290 + +2005-05-29 15:59 takehiro + + * debian/rules (takehiro-2002_05_07-experimental): + + added files to remove when clean. + +2005-05-29 14:43 takehiro + + * libmp3lame/: tables.c, takehiro.c, i386/choose_table.nas + (takehiro-2002_05_07-experimental): + + fix sing handling. + It somtime makes assertion failure on MMX2 supported machines. + +2005-05-29 14:40 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + optimized init_global_gain(), by initializing gi->count1, gi->big_values + only when it is "really" needed. + +2005-05-25 14:17 takehiro + + * frontend/: get_audio.c, parse.c: + + fixed output message even when "--silent" + (bug #1145932) + +2005-05-25 13:56 takehiro + + * libmp3lame/lame.c: + + fix format strings to print out the "float" value. + (bug #1207470) + +2005-05-25 13:47 takehiro + + * frontend/parse.c: + + removed -Z option description, which has no effects currently. + +2005-05-21 09:07 takehiro + + * libmp3lame/: psymodel.c, psymodel.h, tables.c + (takehiro-2002_05_07-experimental): + + suppress magic number. + +2005-05-20 14:46 takehiro + + * libmp3lame/: psymodel.c, tables.c + (takehiro-2002_05_07-experimental): + + clean up the new workarround for the frequency resolution + in the lower frequency. + +2005-05-17 15:46 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + Do not calculate the simultaneous masking in the lower frequency, where the + frequency resolution is not sufficient. + + This is a temporaly code. This should be done by changing the spread function. + +2005-05-14 17:45 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + dirty hack arround truncate() + +2005-05-14 16:28 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + reduce division by changing log(x/y) -> log(x) - log(y), part 2. + supress magic numbers. + +2005-05-14 16:27 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + fix assertion failure when a quantized value exceeds IXMAX(8206) + +2005-05-14 13:47 takehiro + + * configure (takehiro-2002_05_07-experimental): + + regen + +2005-05-14 13:16 takehiro + + * configure.in (takehiro-2002_05_07-experimental): + + remove some optimization options which is not supported by gcc4. + +2005-05-14 12:31 takehiro + + * libmp3lame/machine.h (takehiro-2002_05_07-experimental): + + fix debug built problem on the machine without memset() + +2005-05-14 08:00 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + changed log(x/y) as log(x)-log(y), when FAST_LOG. + +2005-05-14 06:53 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + fix built problem when USE_IEEE754_HACK but not USE_FAST_LOG. + +2005-05-14 03:43 takehiro + + * debian/: changelog, control (takehiro-2002_05_07-experimental): + + patch from Jack (jablko), including the bug report #1201172 + +2005-05-12 17:40 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + supress magic numbers + +2005-05-11 15:51 takehiro + + * libmp3lame/: psymodel.c, quantize.c + (takehiro-2002_05_07-experimental): + + for better portability, do not use "long long", use uint64_t instead. + +2005-05-11 15:50 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + remove unused portion of window coefs. + +2005-05-11 15:14 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + optimizing mask_add(), part 2. + - faster log() -> trncate() calculation for IEEE754 HACK. + +2005-05-11 14:59 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + optimizing mask_add() (part 1) + +2005-05-10 17:24 takehiro + + * libmp3lame/: psymodel.c, machine.h + (takehiro-2002_05_07-experimental): + + optimizing PE calculation. + +2005-05-10 17:10 takehiro + + * libmp3lame/: tables.c, machine.h + (takehiro-2002_05_07-experimental): + + use integer calculation @ fast_log2(). + This is a preparation for farther speed optimizations. + +2005-05-06 01:06 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + fix typo. + +2005-05-04 17:21 takehiro + + * libmp3lame/tables.h (takehiro-2002_05_07-experimental): + + fix typo + +2005-05-04 17:01 takehiro + + * configure (takehiro-2002_05_07-experimental): + + regen by hand. + +2005-05-04 17:00 takehiro + + * configure.in (takehiro-2002_05_07-experimental): + + - do not use "-march" option for the case of cross build. + - added comments about SPARC + IEEE754 hack + +2005-05-04 16:58 takehiro + + * libmp3lame/: quantize.c, i386/quantSSE.nas + (takehiro-2002_05_07-experimental): + + update x^(3/4) hack. + - use IEEE754 HACK version of fabs() + - better "digital silent" detection. not use sum, but use maximum. + +2005-05-04 16:57 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + common expression reduction. + +2005-04-26 16:08 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix selection of the band to increase the scalefactor, when all the band have no + audible noise. + +2005-04-25 16:35 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix handling of SCALEFAC_ANYTHING_GOES in calc_noise(). + This sometimes makes assertion failure when with --substep option. + +2005-04-24 10:28 takehiro + + * frontend/main.c (takehiro-2002_05_07-experimental): + + fix it skips clipping when with --decode option. + +2005-04-23 18:25 takehiro + + * libmp3lame/mpglib_interface.c (takehiro-2002_05_07-experimental): + + clean up. + +2005-04-23 18:20 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + Handmade aprox. code to calculate x^(3/4) for IEEE754 machines. + On MacOSX + G4, the speed gain is arround 14% ! + +2005-04-23 15:31 takehiro + + * libmp3lame/gain_analysis.c (takehiro-2002_05_07-experimental): + + supress warnings + +2005-04-23 15:11 takehiro + + * testcase.mp3, frontend/get_audio.c, frontend/get_audio.h, + frontend/gtkanal.c, frontend/main.c, include/lame.h, + libmp3lame/lame.c, libmp3lame/mpglib_interface.c + (takehiro-2002_05_07-experimental): + + use floating values for the data between frontend and encoding core. + +2005-04-23 10:10 takehiro + + * libmp3lame/mpglib_interface.c (takehiro-2002_05_07-experimental): + + prevent to re-initialization. + +2005-04-23 10:08 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + add error check for lame_decoe_init() + fix comment. + +2005-04-23 09:57 takehiro + + * libmp3lame/mpglib_interface.c (takehiro-2002_05_07-experimental): + + clean up + +2005-04-23 09:56 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + clean up endianness. + fix mp3 decoding. + +2005-04-23 08:42 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + tuning masking parameter balance for long/short blocks. + +2005-04-23 08:11 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix memory copy size in CBR_2nd_iteration(). + This bug causes assertion failure when CBR with -h option. + +2005-04-23 08:07 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + reduce memory copy size. + +2005-04-23 07:57 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + little bit better initial value for quantization factor search. + +2005-04-23 07:55 takehiro + + * libmp3lame/: quantize.c, quantize_pvt.h + (takehiro-2002_05_07-experimental): + + reduce memory copy size. + +2005-04-22 17:39 takehiro + + * mpglib/interface.c (takehiro-2002_05_07-experimental): + + supress warnings with GCC4.0 + +2005-04-21 16:36 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + oops, stupid bug in loop counter... sorry. + +2005-04-21 15:42 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + improve the spreading function for the lower frequency, + where the resolution of frequency is not sufficient for phsycho-analysis. + +2005-04-21 15:36 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + clean up. + +2005-04-21 15:03 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + verbose the configuration message. + +2005-04-17 17:28 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + clean up arround lame_print_internals() + +2005-04-17 16:16 takehiro + + * frontend/: get_audio.c, get_audio.h, main.c, main.h, parse.c + (takehiro-2002_05_07-experimental): + + clean up endianness detection and configuration. + +2005-04-17 15:49 takehiro + + * frontend/: get_audio.c, get_audio.h + (takehiro-2002_05_07-experimental): + + clean up MAX_U_32_NUM definition + +2005-04-17 15:42 takehiro + + * frontend/parse.c (takehiro-2002_05_07-experimental): + + general clean up. + +2005-04-17 15:35 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + fix assertion failure when CBR encoding. + +2005-04-17 12:49 takehiro + + * frontend/parse.c (takehiro-2002_05_07-experimental): + + clean up options. + - make some options as experimental. + - fix floating point/integer argument. + +2005-04-17 11:01 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + optimized best_huffman_divide(), by removing needless call of choose_table(). + +2005-04-16 15:58 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + general clean up. + - supress magic numbers + - use putbits16() instead of putbits24(), where it can. + - trivial loop counter optimization + +2005-04-16 13:55 takehiro + + * testcase.mp3, libmp3lame/psymodel.c + (takehiro-2002_05_07-experimental): + + ATH value adjustment for M/S channels. + +2005-04-16 13:53 takehiro + + * libmp3lame/bitstream.c, frontend/brhist.c, frontend/main.c + (takehiro-2002_05_07-experimental): + + supress warnings + +2005-04-16 10:42 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + reduce conditional jumps + +2005-04-16 10:42 takehiro + + * libmp3lame/machine.h (takehiro-2002_05_07-experimental): + + added (FLOAT) cast in fast_log() macros. + +2005-04-13 14:12 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + oops, I disabled the new code... + +2005-04-13 14:11 takehiro + + * frontend/gtkanal.c (takehiro-2002_05_07-experimental): + + one more fix for the delay. + +2005-04-13 13:50 takehiro + + * frontend/gtkanal.c (takehiro-2002_05_07-experimental): + + fix frame delay + +2005-04-13 13:41 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + optimize lossless coding efficiency and speed (mainly for low bitrate). + +2005-04-09 17:50 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + optimized bitstream copy code. + +2005-04-09 17:29 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + one more reduction of needless divide point search in best_huffman_divide() + +2005-04-09 09:58 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + prevent needless search of best_huffman_divide(). + +2005-04-04 01:20 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + optimize best_scalefac_store() + - only call noquant_count_bits() when it is really needed. + - skip the band with the SCALEFAC_ANYTHING_GOES. + +2005-04-03 18:28 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + little bit better lossless coding. + +2005-04-03 18:27 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + make assertion condition strictly. + +2005-04-03 17:42 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + one more off by one... oops. + +2005-04-03 17:24 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + fix off-by-one bug. + +2005-04-03 12:25 takehiro + + * libmp3lame/: quantize.c, quantize_pvt.h + (takehiro-2002_05_07-experimental): + + use the theoretical minimum value of xr34. + +2005-04-03 11:57 takehiro + + * frontend/: gtkanal.c, mp3x.c (takehiro-2002_05_07-experimental): + + fix (part of) mp3x display delay problem + +2005-04-03 11:32 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + fix table selection + +2005-04-03 05:50 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + reduce calling ixmax() and simplify count_bits() + +2005-04-02 18:32 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + potential fix for floating point exception when analysing MPEG2 Layer3 encoding by mp3x. + +2005-04-02 17:06 takehiro + + * frontend/timestatus.c (takehiro-2002_05_07-experimental): + + reduce calling GetRealTime() + +2005-04-02 16:45 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + Try to find the better quantization factor in the higher frequncy band, + even when it fails to encode without the noise in the lower frequency band. + +2005-04-02 16:21 takehiro + + * libmp3lame/i386/choose_table.nas + (takehiro-2002_05_07-experimental): + + simplify the loop condition. + +2005-04-02 14:54 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + do not use putbits24(), where the length to write is lesser than 18. + +2005-04-02 14:02 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + fix off-by-one bug in best_huffman_divide() + +2005-04-02 12:21 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + fix comments and reduce the table size. + +2005-04-02 12:13 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + simplify cont_bit_noESC_from4() and add comments. + +2005-04-02 11:56 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + remove needless memory clear. + +2005-04-02 07:28 takehiro + + * libmp3lame/version.h (takehiro-2002_05_07-experimental): + + Now alpha 14. + - Dramatical VBR speed improvement. + 10-20% on typical archtecture (i86, Alpha, Sparc), and 95% on G4. + CBR also gains but it is little (2% on the typical arch, 30% on G4). + - New and improved ATH level autoadjustment. + - Use subblock gain more (CBR and VBR). + - Fix quantization bug in count1 region, which causes annoying noise in high-freq. + +2005-04-02 07:16 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + supress magic numbers. + +2005-03-29 15:07 takehiro + + * libmp3lame/: machine.h, quantize.c, tables.c, takehiro.c + (takehiro-2002_05_07-experimental): + + supress magic numbers. + +2005-03-28 17:26 takehiro + + * libmp3lame/machine.h (takehiro-2002_05_07-experimental): + + it seems thmath.h decreases spped very much on Alpha system. + +2005-03-28 16:58 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + fix debug/release build is reverted and warnings + +2005-03-28 16:57 takehiro + + * libmp3lame/encoder.h (takehiro-2002_05_07-experimental): + + fix built on 64bit machines (I checked it on Alpha and AMD64) + +2005-03-28 09:44 takehiro + + * frontend/parse.c (takehiro-2002_05_07-experimental): + + adjust message width + +2005-03-28 03:51 takehiro + + * libmp3lame/: quantize.c, takehiro.c + (takehiro-2002_05_07-experimental): + + fix SCALEFAC_ANYTHING_GOES bug finally! now it gains speed improvement arround 15%. + + and fix count1 region quantization. + +2005-03-28 03:50 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + added alignment check when debug build. + +2005-03-27 17:48 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix treatment of scale factor band with "anything goes". + But it seems there're still bugs arround it. + +2005-03-27 16:45 takehiro + + * libmp3lame/: machine.h, quantize.c, quantize_pvt.h, tables.c, + tables.h, takehiro.c (takehiro-2002_05_07-experimental): + + fix it may use preflag on short blocks. + use integer value of quantization adjustments. + +2005-03-27 15:22 takehiro + + * libmp3lame/i386/quantSSE.nas (takehiro-2002_05_07-experimental): + + fix comments one more. + +2005-03-27 11:57 takehiro + + * libmp3lame/i386/quantSSE.nas (takehiro-2002_05_07-experimental): + + fixed comments + +2005-03-27 09:32 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + code clean up. + +2005-03-26 19:58 takehiro + + * libmp3lame/i386/choose_table.nas + (takehiro-2002_05_07-experimental): + + fix comment + +2005-03-26 19:54 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + do not call scale_bitcounter() to check the scalefac values is valid or not. + (spped up arround 1.5%) + +2005-03-26 19:37 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix it recognize (scalefac=SCALEFAC_ANYTHING_GOES) + (subblock gain = 2) as + not an amplified band. + +2005-03-26 10:39 takehiro + + * libmp3lame/: quantize.c, quantize_pvt.h + (takehiro-2002_05_07-experimental): + + suppress magic numbers + +2005-03-26 09:48 takehiro + + * frontend/: main.c, timestatus.c + (takehiro-2002_05_07-experimental): + + reduce calling lame_get_frameNum() + +2005-03-23 03:08 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + use subblock_gain more when VBR. + +2005-03-23 03:06 takehiro + + * libmp3lame/: machine.h, tables.c + (takehiro-2002_05_07-experimental): + + cleanup + +2005-03-22 16:58 takehiro + + * libmp3lame/: tables.c, takehiro.c, tables.h + (takehiro-2002_05_07-experimental): + + make scfsi_band[] as static variable. + +2005-03-22 13:42 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + remove gabages. + oops... + +2005-03-22 13:40 takehiro + + * libmp3lame/: quantize_pvt.h, tables.c + (takehiro-2002_05_07-experimental): + + more precise ROUNDFAC definition. + +2005-03-22 07:13 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix built problem on old (not C99) compilers. + +2005-03-21 16:24 takehiro + + * libmp3lame/: encoder.h, quantize.c, quantize_pvt.h, takehiro.c + (takehiro-2002_05_07-experimental): + + reduce memory copy size. + +2005-03-21 14:38 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + Fix loop variable initialization. + This will fix decreasing bitrate too much on VBR. + + Zerofy "not audible" region at first to increase the speed. + +2005-03-20 17:28 bouvigne + + * libmp3lame/: encoder.c, lame.c, presets.c, quantize.c, + quantize.h: + + allow masking adjustements in ABR/CBR + +2005-03-19 18:34 bouvigne + + * libmp3lame/version.h: + + alpha 10 + +2005-03-19 17:51 bouvigne + + * libmp3lame/presets.c: + + updated vbr 0/1/2/3 presets + +2005-03-19 16:09 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + fix MPEG2/Layer3 encoding. + +2005-03-19 16:05 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + trivial clean up + +2005-03-19 16:04 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + try to use "preflag" more often. + +2005-03-19 15:04 bouvigne + + * libmp3lame/quantize_pvt.c: + + also use nssfb21 in short blocks + +2005-03-19 15:03 bouvigne + + * libmp3lame/quantize.c: + + typo + +2005-03-19 14:44 bouvigne + + * libmp3lame/quantize.c: + + updated psfb21 analog silence detection + +2005-03-19 10:41 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + improve (lossless) scalefactor compression + +2005-03-19 09:43 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + supress magic numbers + +2005-03-19 08:48 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + reduce table size. + +2005-03-19 08:21 takehiro + + * configure (takehiro-2002_05_07-experimental): + + regen + +2005-03-19 08:08 takehiro + + * configure.in (takehiro-2002_05_07-experimental): + + fix CPU specific optimization option. + +2005-03-19 07:33 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + trivial optimization + +2005-03-18 16:31 takehiro + + * libmp3lame/: bitstream.c, machine.h, psymodel.c, quantize.c + (takehiro-2002_05_07-experimental): + + sign bit hack for IEEE754 + +2005-03-18 16:03 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + simplify + +2005-03-18 13:24 takehiro + + * debian/: control, rules (takehiro-2002_05_07-experimental): + + sync with the HEAD. + +2005-03-18 05:26 rbrito + + * debian/changelog, debian/control, debian/rules, doc/man/lame.1: + + Slight modifications to debian packaging (with more to come). + Minor changes to the frontend manpage. + +2005-03-17 16:46 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + added (FLOAT) cast (I hope this is last). + +2005-03-17 16:41 takehiro + + * libmp3lame/: gain_analysis.c, lame.c, psymodel.c, quantize.c, + tags.c (takehiro-2002_05_07-experimental): + + added "(FLOAT)" cast + remove redundant #include + +2005-03-17 15:03 takehiro + + * frontend/rtp.c (takehiro-2002_05_07-experimental): + + fix build problem on cygwin. + +2005-03-17 14:34 takehiro + + * config.h.in, configure (takehiro-2002_05_07-experimental): + + regen + +2005-03-17 14:28 takehiro + + * configure.in (takehiro-2002_05_07-experimental): + + do not check the winsocket. + this is the preparation for fixing bugid #1164417 + +2005-03-16 16:07 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + IEEE754 hack for quantizing 0/1 region. + +2005-03-16 14:53 takehiro + + * config.h.in, configure (takehiro-2002_05_07-experimental): + + regen + +2005-03-16 14:52 takehiro + + * configure.in, libmp3lame/machine.h + (takehiro-2002_05_07-experimental): + + check tgmath.h and use it. + +2005-03-15 16:31 takehiro + + * frontend/brhist.c (takehiro-2002_05_07-experimental): + + do not output error message when with --silent. + +2005-03-15 15:49 takehiro + + * configure (takehiro-2002_05_07-experimental): + + regen. + +2005-03-15 15:48 takehiro + + * configure.in (takehiro-2002_05_07-experimental): + + play with compiler options on G4. I've got 14% gain from it. + +2005-03-15 15:37 takehiro + + * mpglib/interface.c (takehiro-2002_05_07-experimental): + + supress warning. + +2005-03-15 00:26 robert + + * libmp3lame/vbrquantize.c: + + yet another -Y thing: calc_xmin does not compute upto max_nonzero_coeff + in the -Y case. + +2005-03-14 22:32 robert + + * libmp3lame/vbrquantize.c: + + bugfix for vbr-new when sub block gain violates IXMAXVAL constrain in -Y case + +2005-03-14 21:53 robert + + * libmp3lame/quantize_pvt.c: + + removed an assert in calc_noise_core_c + cod_info->count1 == 0 seems to be a common case + +2005-03-14 15:18 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + trivial clean up. + +2005-03-14 14:53 takehiro + + * libmp3lame/: quantize.c, quantize_pvt.h, takehiro.c + (takehiro-2002_05_07-experimental): + + Separate preflag check from scale bit counting. + It changes preflag, but it is undesirable for VBR encoding. + +2005-03-14 14:38 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + IEEE754 hack for quantization in count1 region. + +2005-03-14 13:31 takehiro + + * frontend/brhist.c (takehiro-2002_05_07-experimental): + + display 'LR+i' as '%' character. + +2005-03-13 17:20 robert + + * libmp3lame/presets.c: + + removing placebo -bx from fast presets + it's a placebo with vbr-old too, but keep it that way a little bit longer + +2005-03-13 17:14 takehiro + + * configure.in, configure (takehiro-2002_05_07-experimental): + + yasm needs -m amd64 to output the elf64 objects. + +2005-03-13 17:11 takehiro + + * libmp3lame/i386/: cpua.nas, nasm.h + (takehiro-2002_05_07-experimental): + + now it can be compiled on x86-64 linux (FC3). but still remains lot of work... + +2005-03-13 17:01 robert + + * frontend/mp3x.c: + + forgot to commit this one, removed unused parameter from usage parameter list + +2005-03-13 14:46 robert + + * libmp3lame/: encoder.c, set_get.c, version.c, version.h: + + removing unused ATH auto adjust types. JDs is now the only one + +2005-03-13 14:43 robert + + * ACM/ACM.cpp: + + version + +2005-03-13 14:42 robert + + * frontend/: main.c, parse.c, parse.h: + + print helptext for internal switches only when internal switches are available + +2005-03-13 12:58 takehiro + + * libmp3lame/i386/: Makefile.am, Makefile.in + (takehiro-2002_05_07-experimental): + + changed include path option, -i -> -I + +2005-03-13 12:31 takehiro + + * libmp3lame/: lame.c, i386/Makefile.am, i386/Makefile.in, + i386/cpu_feat.nas, i386/cpua.nas + (takehiro-2002_05_07-experimental): + + changed CPU feature detection code (which is from GOGO3), + because the old one uses pushad/popad which is not supported on x86-64. + +2005-03-13 10:16 takehiro + + * configure (takehiro-2002_05_07-experimental): + + regen + +2005-03-13 10:15 takehiro + + * configure.in (takehiro-2002_05_07-experimental): + + added yasm check, to prepare for asm code on i86_64. + +2005-03-12 23:01 robert + + * libmp3lame/vbrquantize.c: + + vbr-new: fixing the -Y bug, that sfb21 wasn't quantized at all + +2005-03-12 20:41 takehiro + + * libmp3lame/: bitstream.c, encoder.h, takehiro.c + (takehiro-2002_05_07-experimental): + + simplify scfsi[] flag. + +2005-03-12 20:41 takehiro + + * libmp3lame/: machine.h, psymodel.c, quantize.c + (takehiro-2002_05_07-experimental): + + clean up "(double)" cast. + +2005-03-12 18:12 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + oops. too much optimized... gi->scalefac[0] may be lesser than 0. + +2005-03-12 17:39 bouvigne + + * libmp3lame/lame.c: + + fix: q2 and higher were NOT enabling substep shaping 2 + +2005-03-12 17:38 bouvigne + + * mpglib/mpg123.h: + + fix for replaygain-accurate + +2005-03-12 17:17 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + fix "stupid" message when -S + (bugid #1145932) + +2005-03-12 13:58 takehiro + + * frontend/gtkanal.c (takehiro-2002_05_07-experimental): + + follow variable type change + +2005-03-12 13:54 takehiro + + * configure, configure.in, libmp3lame/Makefile.am, + libmp3lame/Makefile.in (takehiro-2002_05_07-experimental): + + added ppc directory + +2005-03-12 12:35 takehiro + + * libmp3lame/: bitstream.c, encoder.h, quantize_pvt.h, tables.c, + tables.h, takehiro.c (takehiro-2002_05_07-experimental): + + reduce variable size and changed these order, to archive better cache performance. + +2005-03-11 19:26 takehiro + + * libmp3lame/: psymodel.c, psymodel.h, quantize.c, quantize_pvt.h + (takehiro-2002_05_07-experimental): + + added "(FLOAT)" cast. + +2005-03-11 17:45 takehiro + + * mpglib/Makefile.in (takehiro-2002_05_07-experimental): + + regen + +2005-03-11 17:44 takehiro + + * mpglib/Makefile.am (takehiro-2002_05_07-experimental): + + added layer[123].h to the distribution. + +2005-03-11 17:18 takehiro + + * Makefile.in, aclocal.m4, ACM/Makefile.in, ACM/ADbg/Makefile.in, + ACM/ddk/Makefile.in, ACM/tinyxml/Makefile.in, Dll/Makefile.in, + debian/Makefile.in, doc/Makefile.in, doc/html/Makefile.in, + doc/man/Makefile.in, dshow/Makefile.in, frontend/Makefile.in, + include/Makefile.in, libmp3lame/Makefile.in, + libmp3lame/i386/Makefile.in, mac/Makefile.in, misc/Makefile.in, + mpglib/Makefile.in (takehiro-2002_05_07-experimental): + + regen with the latest gtk.m4 + +2005-03-11 16:49 takehiro + + * libmp3lame/: psymodel.c, tables.c + (takehiro-2002_05_07-experimental): + + use max value of loudness. + +2005-03-11 16:06 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + fix a comment + +2005-03-11 15:31 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + ATH value should be always same value whatever the value of ATHAdjustLimit is. + +2005-03-11 15:29 takehiro + + * libmp3lame/: psymodel.c, version.h + (takehiro-2002_05_07-experimental): + + implement tonality-aware ATH adjustment. + +2005-03-11 15:28 takehiro + + * libmp3lame/psymodel.h (takehiro-2002_05_07-experimental): + + enlarge ATH adjustment range to clarify the flaw of ATH adjustment algorithm. + +2005-03-11 13:58 takehiro + + * debian/Makefile.in (takehiro-2002_05_07-experimental): + + regen... soryy I made it on cygwin... + +2005-03-11 11:14 takehiro + + * libmp3lame/: bitstream.c, newmdct.c, takehiro.c + (takehiro-2002_05_07-experimental): + + added "(FLOAT)" cast. + +2005-03-11 10:27 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + remove C++ style comments + +2005-03-11 10:18 takehiro + + * libmp3lame/tables.h (takehiro-2002_05_07-experimental): + + make sfBandIndex[] as static. + +2005-03-11 10:11 takehiro + + * libmp3lame/encoder.h (takehiro-2002_05_07-experimental): + + fix build problem when without decoder (--disable-decoder) + +2005-03-11 09:41 takehiro + + * configMS.h (takehiro-2002_05_07-experimental): + + fix build problem with Makefile.unix + +2005-03-11 09:40 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + supress warnings when without decoder (--disable-decoder) + +2005-03-11 09:40 takehiro + + * frontend/: brhist.c, brhist.h (takehiro-2002_05_07-experimental): + + make Console_IO as static. + +2005-03-11 09:38 takehiro + + * Makefile.unix (takehiro-2002_05_07-experimental): + + TAKEHIRO_IEEE754_HACK -> USE_IEEE754_HACK + +2005-03-11 09:29 takehiro + + * libmp3lame/gain_analysis.c (takehiro-2002_05_07-experimental): + + remove redundant pragma. this one is declared in configMS.h + +2005-03-11 03:06 takehiro + + * Makefile.in, ACM/Makefile.in (takehiro-2002_05_07-experimental): + + regen + +2005-03-11 03:05 takehiro + + * ACM/Makefile.am (takehiro-2002_05_07-experimental): + + remove unused file + +2005-03-08 23:07 robert + + * Makefile.unix, frontend/parse.c, libmp3lame/VbrTag.c, + libmp3lame/bitstream.c, libmp3lame/lame.c, + libmp3lame/lame_global_flags.h, libmp3lame/presets.c, + libmp3lame/set_get.c, libmp3lame/util.h: + + removing some unused member of lame_internal_flags structure + +2005-03-06 18:59 bouvigne + + * libmp3lame/takehiro.c: + + faster noquant_count_bits + +2005-03-06 16:56 bouvigne + + * doc/html/history.html: + + history + +2005-03-06 16:17 bouvigne + + * libmp3lame/: presets.c, version.h: + + updated V3 and V2 presets + +2005-03-06 13:17 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + changed 2.0f -> (FLOAT)2.0, for --enable-all-double + +2005-03-05 18:26 bouvigne + + * libmp3lame/: quantize.c, quantize_pvt.h, takehiro.c, + vbrquantize.c: + + slightly faster quantization (not totally sure if it is really faster) + + Also fixed a severe bug in ISO quantization when not using the IEEE hack + +2005-03-05 13:45 bouvigne + + * configMS.h, libmp3lame/lame.c, libmp3lame/quantize.c, + libmp3lame/util.h: + + update of the intrinsics coding style + +2005-03-05 12:40 bouvigne + + * libmp3lame/quantize_pvt.c: + + minor speed increase in calc_noise + +2005-03-03 17:01 takehiro + + * frontend/brhist.c (takehiro-2002_05_07-experimental): + + fix IS ratio display. + +2005-03-03 16:59 takehiro + + * frontend/: main.c, timestatus.c + (takehiro-2002_05_07-experimental): + + print out histgram even when CBR encoding. + +2005-03-02 17:50 takehiro + + * config.h.in (takehiro-2002_05_07-experimental): + + regen + +2005-03-02 17:46 takehiro + + * configure, configure.in (takehiro-2002_05_07-experimental): + + fix --enable-double-float does not work at all. + +2005-03-02 17:01 takehiro + + * config.h.in (takehiro-2002_05_07-experimental): + + the previous one contains gabages... regen. + +2005-03-02 16:59 takehiro + + * libmp3lame/util.c (takehiro-2002_05_07-experimental): + + fix debug build on some non-x86 linux machines. + +2005-03-02 16:58 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + fix for some 64bit machines (ie. Alpha) + +2005-03-02 15:35 takehiro + + * configure, config.h.in (takehiro-2002_05_07-experimental): + + regen + +2005-03-01 16:59 takehiro + + * configure.in (takehiro-2002_05_07-experimental): + + add check for vecLib/vDSP.h, to prepare for Altivec optimization. + +2005-02-28 22:45 bouvigne + + * libmp3lame/: quantize_pvt.c, quantize_pvt.h, util.h: + + calc_noise is back to the C version + +2005-02-28 16:52 takehiro + + * libmp3lame/machine.h (takehiro-2002_05_07-experimental): + + some IEEE754 hack for the CPU with small cache. + +2005-02-27 22:03 bouvigne + + * libmp3lame/quantize_pvt.c: + + calc_noise: + fixed an assertion failure in frames with no big_values + +2005-02-27 20:43 bouvigne + + * libmp3lame/: quantize_pvt.c, quantize_pvt.h, util.h: + + sse version of calc_noise (speedup is very small) + +2005-02-27 17:40 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix it sometimes fail to encode the short block. + +2005-02-27 15:08 bouvigne + + * configMS.h, libmp3lame/quantize.c, libmp3lame/util.h: + + slightly faster init_xrpow_core_sse + +2005-02-27 14:25 takehiro + + * libmp3lame/version.h (takehiro-2002_05_07-experimental): + + now alpha13 + + - replaygain radio/accurate is implemented. + * including replaygain support even when the input is mp3 file. + this is not supported on the current LAME3.x + + - support "TLEN" ID3v2 tag. + + - fix frame # estimation when the input is mp3. + + - fix VBR tag infomation leakage. + + - fix mpeg1 layer1,2 decoder bug. + + - Robert's new eye candy for the frontend. + + - one more reentrant work for the MP3 decoder + + - SSE version of FFT, done by Gilad Raichshtain + + - small optimizations. but replaygain makes it slow down much, + the optimizations are hidden by it... + + - some PPC code added from Robert Stiles and Hans-Peter Dusel. + But not work at all, at least currently. + +2005-02-27 14:16 takehiro + + * frontend/brhist.c (takehiro-2002_05_07-experimental): + + sync with the main branch. + - Robert's new eye candy. + +2005-02-26 14:06 takehiro + + * frontend/: brhist.c, main.c, main.h, parse.c, timestatus.c + (takehiro-2002_05_07-experimental): + + fix duplicated variable of "brhist" + +2005-02-26 09:38 takehiro + + * libmp3lame/tags.c (takehiro-2002_05_07-experimental): + + added TLEN tag when id3v2 tag is used. + (RFE #1064076) + +2005-02-26 06:21 takehiro + + * frontend/get_audio.c: + + fix mp3 frame # estimation (bugid #934072). + +2005-02-26 05:41 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + fix # of mp3 frames estimation (bugid #934072). + +2005-02-25 19:01 bouvigne + + * configMS.h: + + intrinsics support for ICL + +2005-02-25 01:21 robert + + * frontend/: brhist.c, timestatus.c: + + RH_HIST: don't print unused channel modes and block types + +2005-02-24 00:27 robert + + * frontend/brhist.c: + + fix scrolling problem I introduced with the last commit + +2005-02-23 17:58 bouvigne + + * libmp3lame/quantize_pvt.c: + + slightly faster calc_noise + +2005-02-22 02:06 robert + + * libmp3lame/psymodel.c: + + Compile time option to enable GPSYCHO like block type switching in NSPSYTUNE. + Due to differences in convolution, the switching does not happen exactly + as in GPSYCHO. (disabled by default, edit psymodel.c to activate) + +2005-02-19 22:47 robert + + * frontend/: brhist.c, brhist.h, main.c: + + some statistics about block type distribution + +2005-02-19 18:48 bouvigne + + * configMS.h: + + conditionnal intrinsics support for MSVC (probably also works for ICL) + +2005-02-19 15:32 bouvigne + + * libmp3lame/: lame.c, quantize.c, quantize_pvt.c, quantize_pvt.h, + util.h: + + SSE intrinsic version of init_xrpow + It is now using 1% of total time (using 4% in the standard version) + +2005-02-15 06:39 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + fix for old compilers. + +2005-02-14 17:01 takehiro + + * TODO (takehiro-2002_05_07-experimental): + + added MP3 transcoding TODO. + +2005-02-14 15:46 takehiro + + * libmp3lame/tags.c, testcase.mp3 + (takehiro-2002_05_07-experimental): + + fix information leakage when VBR tag write out. + +2005-02-14 15:14 takehiro + + * Makefile.am, Makefile.in, testcase.mp3 + (takehiro-2002_05_07-experimental): + + added tag itself to test when "make test" + +2005-02-14 13:15 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + fix it crashes with floating point exception when without --clipdetect option. + +2005-02-14 13:12 takehiro + + * libmp3lame/: bitstream.c, encoder.h, tags.c + (takehiro-2002_05_07-experimental): + + make the clip detection work. + +2005-02-14 13:11 takehiro + + * libmp3lame/gain_analysis.c (takehiro-2002_05_07-experimental): + + do not use "double" + +2005-02-14 12:58 takehiro + + * TODO (takehiro-2002_05_07-experimental): + + updated + +2005-02-14 12:54 takehiro + + * libmp3lame/gain_analysis.c (takehiro-2002_05_07-experimental): + + clean up. + - remove duplicated pragma. + - do not unroll manually. + +2005-02-13 16:35 takehiro + + * libmp3lame/mpglib_interface.c (takehiro-2002_05_07-experimental): + + make it reentrant. + +2005-02-13 14:42 bouvigne + + * libmp3lame/psymodel.c: + + minor speedup + +2005-02-12 16:51 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + oops, enbugged... + now --replaygain-accurate runs (at least it does not crash). + +2005-02-12 16:31 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + fix decoder initialization when --replaygain-accurate. + +2005-02-12 16:30 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + cleanup + +2005-02-12 15:59 takehiro + + * libmp3lame/set_get.c (takehiro-2002_05_07-experimental): + + prepare for --replaygain-accurate. only preparation. not works. + +2005-02-12 15:58 takehiro + + * include/lame.h (takehiro-2002_05_07-experimental): + + added/cleaned up the replaygain related APIs. + +2005-02-12 08:32 takehiro + + * frontend/main.c, frontend/main.h, frontend/parse.c, + libmp3lame/bitstream.c, libmp3lame/encoder.h, + libmp3lame/gain_analysis.c, libmp3lame/lame.c, + libmp3lame/mpglib_interface.c, libmp3lame/set_get.c + (takehiro-2002_05_07-experimental): + + replaygain support (1) + - fast replaygain now works. + +2005-02-09 01:45 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + code simplification + +2005-02-08 11:06 takehiro + + * libmp3lame/: Makefile.am, Makefile.in + (takehiro-2002_05_07-experimental): + + fix mingw build problem, as is done on the main branch by Robert. + +2005-02-07 22:02 robert + + * configure.in, libmp3lame/Makefile.am, libmp3lame/Makefile.in: + + fixing mingw32 configure problems + +2005-02-07 13:45 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + added (FLOAT) cast to the floating point constants.(one more) + +2005-02-07 12:28 takehiro + + * libmp3lame/: encoder.h, lame.c + (takehiro-2002_05_07-experimental): + + reduce malloc/free as is done in the main branch by Robert. + +2005-02-06 23:05 robert + + * libmp3lame/: quantize.c, vbrquantize.c, vbrquantize.h: + + some MSVC warning level 4 issues resolved + +2005-02-06 20:23 robert + + * libmp3lame/: quantize.c, takehiro.c, vbrquantize.c: + + resolved compiler warnings + +2005-02-06 19:49 robert + + * libmp3lame/: lame.c, machine.h, quantize_pvt.c, util.c, util.h, + vbrquantize.c: + + lame.c: fixed lost break in lame_init_parms + reduced calloc/free calls (where called once per frame, now once per run) + machine.h: removed IIPOW20 + util.c, util.h: removed VBR_t, added in_buffer_[0/1] to lame_internal_flags + vbrquantize.c: fixed some small rounding problem in quantize routines + +2005-02-05 14:14 robert + + * libmp3lame/vbrquantize.c: + + eleminating dead code + expanding preprocessor defines + works probably not with GPsycho anymore, but NSPSYTUNE only (G.not tested) + doesn't try to use 126 bits at minimum per granule anymore, less bloating + on mono like signals where the difference signal is almost zero. + +2005-02-05 13:32 bouvigne + + * libmp3lame/version.h: + + bumped alpha + +2005-02-05 13:31 bouvigne + + * libmp3lame/lame.c: + + enabled ath adjustment for abr/cbr + +2005-02-04 18:34 bouvigne + + * libmp3lame/lame.c: + + sorry, I shouldn't have commited this one + +2005-02-02 04:35 takehiro + + * include/lame.h (takehiro-2002_05_07-experimental): + + remove comma, which is not allowed in C++ (but allowed in C) + +2005-02-02 04:11 takehiro + + * libmp3lame/: psymodel.c, set_get.c + (takehiro-2002_05_07-experimental): + + reduce warning when with "-W" option. + +2005-02-01 10:29 bouvigne + + * libmp3lame/: bitstream.c, lame.c, takehiro.c: + + reduced warnings + +2005-01-30 22:31 robert + + * Makefile.unix, libmp3lame/vbrquantize.c: + + scalefactor allocation should work now as expected + +2005-01-30 22:27 robert + + * libmp3lame/: machine.h, quantize_pvt.c, quantize_pvt.h: + + off by one bug: + we do access iipow20 by values in [0,Q_MAX2] inclusive, + that makes Q_MAX2+1 entries in total + +2005-01-30 19:34 takehiro + + * libmp3lame/set_get.c (takehiro-2002_05_07-experimental): + + there's no GPSYCHO. + +2005-01-30 19:13 takehiro + + * configure (takehiro-2002_05_07-experimental): + + regen + +2005-01-30 19:13 takehiro + + * configure.in (takehiro-2002_05_07-experimental): + + fix automatic CPU specific optimization on cygwin. + +2005-01-30 18:01 takehiro + + * configure (takehiro-2002_05_07-experimental): + + regen. + +2005-01-30 18:00 takehiro + + * configure.in (takehiro-2002_05_07-experimental): + + hope this will fix the build failure on MinGW + NASM + +2005-01-30 16:00 takehiro + + * libmp3lame/: encoder.h, lame.c, tables.c + (takehiro-2002_05_07-experimental): + + optimize the layout of the coefficients for resampling. + +2005-01-30 15:51 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + fix it outputs message even when with --silent. + +2005-01-30 14:49 takehiro + + * libmp3lame/: psymodel.c, quantize.c + (takehiro-2002_05_07-experimental): + + added cast to the floating point constants (one more) + +2005-01-30 14:42 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + added cast to floating point constants. + +2005-01-30 12:31 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + use bit-consumption to estimate the "goodness" of quantization, + as is done in LAME 3.x. + +2005-01-29 19:40 bouvigne + + * libmp3lame/presets.c: + + updated vbr presets 9 to 4 + +2005-01-29 18:42 bouvigne + + * libmp3lame/takehiro.c: + + fixed a crash + +2005-01-29 18:11 bouvigne + + * libmp3lame/: quantize_pvt.c, quantize_pvt.h, takehiro.c: + + quantize_xrpow: also re-use previously computed data in short blocks + +2005-01-25 21:47 bouvigne + + * libmp3lame/quantize.c: + + X9: more bits into reservoir + +2005-01-23 18:07 takehiro + + * frontend/parse.c, include/lame.h, libmp3lame/encoder.h, + libmp3lame/set_get.c (takehiro-2002_05_07-experimental): + + added replaygain/nogap API + added replaygain commandline option. + +2005-01-23 18:07 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + cosmetic + +2005-01-23 18:06 takehiro + + * HACKING (takehiro-2002_05_07-experimental): + + update current state. + +2005-01-23 16:25 bouvigne + + * libmp3lame/takehiro.c: + + oops, quantize_xrpow optimization has been accidentally disabled in november + +2005-01-23 14:27 bouvigne + + * libmp3lame/lame.c: + + reinstated old q1 (increase only 1 sf per iteration) + +2005-01-22 18:15 bouvigne + + * libmp3lame/quantize_pvt.c: + + problem with q1 and q0 finally found. + I am unable to trace it prior to "the big 3.94 merge". + +2005-01-22 09:19 takehiro + + * libmp3lame/: tags.c, tags.h (takehiro-2002_05_07-experimental): + + fix for unsigned/singed comparison warning. + +2005-01-20 17:10 takehiro + + * libmp3lame/libmp3lame_vc6.dsp (takehiro-2002_05_07-experimental): + + added fftsse.nas support + /\\ - \\/ + +2005-01-20 17:07 takehiro + + * Makefile.MSVC, Makefile.unix (takehiro-2002_05_07-experimental): + + support SSE version of FFT. + +2005-01-20 16:38 takehiro + + * libmp3lame/quantize.c: + + to clarify the relationship of "if-then-else" and suppress warnings from gcc, + added braces. + +2005-01-20 16:35 takehiro + + * libmp3lame/i386/: Makefile.am, Makefile.in, choose_table.nas, + fftsse.nas, ffttbl.nas (takehiro-2002_05_07-experimental): + + clean up. remove unused code and tables, and update comments. + +2005-01-20 16:28 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + cosmetic + +2005-01-20 16:28 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + trivial optimization + +2005-01-19 16:08 takehiro + + * libmp3lame/: tables.c, i386/Makefile.am, i386/Makefile.in, + i386/fftsse.nas, i386/ffttbl.nas + (takehiro-2002_05_07-experimental): + + patched version of FHT_SSE (by Gilad Raichshtain). + and support code for it (by me). + +2005-01-18 07:04 takehiro + + * libmp3lame/bitstream.c, frontend/get_audio.c + (takehiro-2002_05_07-experimental): + + suppress warnings on MSVC6 + +2005-01-16 18:19 takehiro + + * libmp3lame/bitstream.c, libmp3lame/lame.c, mpglib/interface.h + (takehiro-2002_05_07-experimental): + + fix for when --disable-decoder + +2005-01-16 18:12 takehiro + + * mpglib/interface.h (takehiro-2002_05_07-experimental): + + added prototype declaration of decode_init_for_replaygain() + +2005-01-16 18:08 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + fix memory leak when RG used. This is enbugged by the previos commit. + +2005-01-16 18:00 takehiro + + * libmp3lame/: bitstream.c, lame.c, mpglib_interface.c + (takehiro-2002_05_07-experimental): + + prepare for ReplayGain merge. + +2005-01-15 18:12 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + to prevent a floating point exception, add a limit to retry. + +2005-01-15 18:10 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + trivial optimization + +2005-01-15 17:15 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + use libsndfile when input is unknown RIFF-wave format + +2005-01-15 14:15 takehiro + + * libmp3lame/libmp3lame_vc6.dsp (takehiro-2002_05_07-experimental): + + libmp3lame/version.c was removed. + +2005-01-15 14:08 takehiro + + * .cvsignore (takehiro-2002_05_07-experimental): + + added configure-stamp + +2005-01-15 14:07 takehiro + + * TODO (takehiro-2002_05_07-experimental): + + update frontend TODO. + +2005-01-15 14:02 takehiro + + * Makefile.MSVC, Makefile.unix (takehiro-2002_05_07-experimental): + + libmp3lame/version.c was removed. + +2005-01-15 12:56 takehiro + + * configure (takehiro-2002_05_07-experimental): + + regen + +2005-01-15 12:56 takehiro + + * configure.in (takehiro-2002_05_07-experimental): + + always use libsndfile if it is found. + +2005-01-15 12:30 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + fix mp3 input....oops. + +2005-01-15 12:27 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + fix endianness of RIFF wave PCM. + +2005-01-15 12:05 takehiro + + * frontend/: get_audio.c, get_audio.h, gtkanal.c, main.c, main.h, + parse.c (takehiro-2002_05_07-experimental): + + cleaning up LIBSNDFILE, part 3. + + use libsndfile only when the frontend does not know how to handle the + input file format. + +2005-01-15 10:54 takehiro + + * frontend/rtp.h (takehiro-2002_05_07-experimental): + + make them static + +2005-01-15 10:53 takehiro + + * frontend/mp3rtp.c (takehiro-2002_05_07-experimental): + + make those which can be static as static. + +2005-01-15 09:43 takehiro + + * frontend/: get_audio.c, parse.c + (takehiro-2002_05_07-experimental): + + clean up arround libsndfile, part 2. + +2005-01-15 09:30 takehiro + + * frontend/: get_audio.c, get_audio.h + (takehiro-2002_05_07-experimental): + + part of cleaning up LIBSNDFILE + +2005-01-15 07:25 takehiro + + * frontend/: get_audio.c, get_audio.h, gtkanal.c, parse.c + (takehiro-2002_05_07-experimental): + + clean up MPEG Layer 1,2,3 input + +2005-01-13 19:18 bouvigne + + * libmp3lame/version.h: + + bump alpha + +2005-01-13 19:17 bouvigne + + * libmp3lame/: quantize.c, quantize_pvt.h: + + use bits in quant_comp + +2005-01-13 18:54 bouvigne + + * libmp3lame/presets.c: + + updated ath values for abr/cbr + +2005-01-13 18:20 bouvigne + + * frontend/gtkanal.c, libmp3lame/lame-analysis.h, + libmp3lame/quantize.c, libmp3lame/quantize_pvt.c, + libmp3lame/quantize_pvt.h: + + Replaced X9 by the former X10 (ssd). + The abr/cbr modes are using this comparison + +2005-01-13 16:28 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + fix rounding of bitrate calculation + +2005-01-12 18:24 takehiro + + * mpglib/: common.c, layer1.c, layer2.c + (takehiro-2002_05_07-experimental): + + patches from the latest debian package, including some boundary check code. + +2005-01-10 17:38 takehiro + + * libmp3lame/: lame.c, quantize.c, quantize.h + (takehiro-2002_05_07-experimental): + + changed one function name, iteration_loop -> CBR_iteration_loop + +2005-01-10 17:11 takehiro + + * frontend/main.c (takehiro-2002_05_07-experimental): + + fix it always output the banner even when with --silent/--quiet. + +2005-01-10 14:48 takehiro + + * testcase.mp3 (takehiro-2002_05_07-experimental): + + testcase for alpha12 + +2005-01-10 13:17 takehiro + + * libmp3lame/quantize_pvt.h (takehiro-2002_05_07-experimental): + + remove outdated comments + +2005-01-10 13:16 takehiro + + * libmp3lame/version.h (takehiro-2002_05_07-experimental): + + update alpha version and psymodel version + - fix too much slow down with higher VBR quality (like -V0) + - changed long/short block switching code. + +2005-01-10 13:13 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + changed VBR strategy to prevent "slow down" when the higher quality (like -V0) + is selected. + + When we cannot encode the frame without noticible distortion with the allowed + bitrate, simply encode the frame with the highest allowed bitrate. + +2005-01-10 13:10 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix it abort when higher VBR. enbug at the previous comit. sorry. + +2005-01-10 12:38 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + for better error message + +2005-01-10 12:21 takehiro + + * libmp3lame/: quantize.c, quantize_pvt.h, takehiro.c + (takehiro-2002_05_07-experimental): + + better use of "anything goes" scalefactor band when VBR. + faster and smaller bitrate without any quality regression (theoretically) + +2005-01-10 10:06 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + changed block switching to use "sum" of energy in subblocks, + instead of their "max". + + and improve comments. + +2005-01-10 09:23 takehiro + + * libmp3lame/quantize_pvt.c: + + seems it cannot build on Linux and some Unix. + to fix this, I changed max() -> Max(). + +2005-01-09 17:31 bouvigne + + * frontend/gtkanal.c, libmp3lame/lame-analysis.h: + + display SSD in mp3x + +2005-01-09 17:31 bouvigne + + * libmp3lame/: quantize.c, quantize_pvt.c, quantize_pvt.h: + + do not compute noise if best quant has no distorted band and current quant + is bigger than the best one + +2005-01-09 09:19 takehiro + + * frontend/: get_audio.h, gtkanal.c, mp3x.c + (takehiro-2002_05_07-experimental): + + cosmetic changes (fix comments and so on) + +2005-01-09 09:14 takehiro + + * frontend/mp3rtp.c (takehiro-2002_05_07-experimental): + + clean up, mainly fixing comments + +2005-01-09 09:06 takehiro + + * libmp3lame/: Makefile.am, Makefile.in, set_get.c, version.c + (takehiro-2002_05_07-experimental): + + merged version.c into set_get.c and fixed comments (there's no GPSYCHO support) + +2005-01-08 11:47 bouvigne + + * libmp3lame/version.h: + + bumped alpha + +2005-01-08 11:46 bouvigne + + * libmp3lame/psymodel.c: + + limited ATH effect in short blocks. + This is fundamentally wrong, but otherwise it produces bad quality + +2005-01-08 10:58 bouvigne + + * libmp3lame/: lame.c, presets.c, quantize.c, quantize_pvt.c, + quantize_pvt.h: + + updated VBR presets to match the cbr/abr changes + (also corrected the --cbr behavior) + +2005-01-08 10:56 bouvigne + + * doc/html/history.html: + + history + +2005-01-05 14:23 takehiro + + * frontend/: main.c, main.h, mp3x.c, parse.c + (takehiro-2002_05_07-experimental): + + remove "lame_XXX" function to separate name space + +2005-01-05 11:08 takehiro + + * TODO (takehiro-2002_05_07-experimental): + + updated. BTW, it seems plusv site is vanished... + +2005-01-01 18:19 takehiro + + * configure, configure.in (takehiro-2002_05_07-experimental): + + adjust spacing + +2004-12-31 14:42 takehiro + + * frontend/: get_audio.c, main.c, main.h, parse.c + (takehiro-2002_05_07-experimental): + + one more clean up arround get_audio + +2004-12-31 14:33 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + simplify + +2004-12-31 12:22 takehiro + + * frontend/.cvsignore (takehiro-2002_05_07-experimental): + + added mp3rtp to ignore + +2004-12-31 12:07 takehiro + + * frontend/main.c: + + merge 1.73.2.34 -> 1.73.2.35 + fix it outputs CR even when --silent/--quiet + (bug #973302) + +2004-12-31 11:56 takehiro + + * frontend/main.c (takehiro-2002_05_07-experimental): + + fix it outputs CR even when --silent/--quiet + (bug #973302) + +2004-12-31 11:26 takehiro + + * frontend/mp3rtp.c: + + fix buffer overrun(same in my experimental branch). + +2004-12-31 11:23 takehiro + + * frontend/mp3rtp.c (takehiro-2002_05_07-experimental): + + fix buffer overrun(related to bug #1036590) + + # but still it does not work correctly + +2004-12-31 07:37 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + adjust ABR quality/bitrate control + +2004-12-27 16:13 bouvigne + + * libmp3lame/lame.c: + + cbr/abr: adjusted lowpass + +2004-12-27 15:32 bouvigne + + * libmp3lame/presets.c: + + abr/cbr: adjusted m/s and short/long + +2004-12-27 10:03 takehiro + + * config.h.in (takehiro-2002_05_07-experimental): + + added for large(>2GB) file support. + +2004-12-19 18:20 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix scalefactor band region... oops. + +2004-12-19 18:14 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix the calculation of scalefactor value when VBR. + + In the band whose allowed noise threshold is very high, we do not need to + encode the quantized values. Now LAME uses it properly. + +2004-12-19 17:16 takehiro + + * libmp3lame/quantize_pvt.h (takehiro-2002_05_07-experimental): + + added parenthis to avoid some side effects. + +2004-12-13 18:16 takehiro + + * libmp3lame/encoder.h (takehiro-2002_05_07-experimental): + + changed the order of members to localize the write access of memory. + +2004-12-13 18:15 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + added hard limits of threshold for ABR, to prevent too much degration + +2004-12-13 17:45 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix it sometimes slows down too much. + +2004-12-13 17:16 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + change threshold for short blocks same as that of long blocks. + +2004-12-13 17:04 takehiro + + * config.h.in (takehiro-2002_05_07-experimental): + + TAKEHIRO_IEEE754 -> USE_IEEE754 + +2004-12-13 15:09 takehiro + + * configure (takehiro-2002_05_07-experimental): + + regen + +2004-12-13 14:01 takehiro + + * DEFINES, Makefile.MSVC, configMS.h, configure.in, + libmp3lame/bitstream.c, libmp3lame/machine.h, + libmp3lame/psymodel.c, libmp3lame/quantize.c, + libmp3lame/tables.c, libmp3lame/tables.h, libmp3lame/takehiro.c + (takehiro-2002_05_07-experimental): + + TAKEHIRO_IEEE754_HACK -> USE_IEEE754_HACK + +2004-12-13 14:01 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + changed a commet. + +2004-12-13 12:40 takehiro + + * mpglib/layer3.c (takehiro-2002_05_07-experimental): + + fix MPEG2 decoding, from foobar2k + +2004-12-12 18:08 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + use MDCT filter in -q5 and the better. + +2004-12-12 17:52 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + fix typo + +2004-12-12 17:52 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + fix table value initialization. + +2004-12-12 17:51 takehiro + + * libmp3lame/newmdct.c (takehiro-2002_05_07-experimental): + + fix filtering not working completely... oops. + +2004-12-12 10:57 takehiro + + * libmp3lame/encoder.h (takehiro-2002_05_07-experimental): + + fix comment + +2004-12-12 10:47 takehiro + + * libmp3lame/: encoder.h, lame.c, newmdct.c, tables.c + (takehiro-2002_05_07-experimental): + + new filtering algorithm. Better resolution (110Hz @ fs=44.1kHz) + and "not" slow much. + + but not enabled by default. + +2004-12-12 08:26 takehiro + + * libmp3lame/i386/ssesub.c (takehiro-2002_05_07-experimental): + + test implementation of SSE support with imtrinsic. + + TODO: + - how to build it and configure support ? + - need more functions to implement. + +2004-12-10 17:56 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + trivial optimization in lossless coding. + +2004-12-10 02:35 takehiro + + * libmp3lame/: encoder.h, lame.c, tables.c, i386/choose_table.nas, + i386/cpu_feat.nas (takehiro-2002_05_07-experimental): + + MMX2 support + +2004-12-10 00:21 takehiro + + * configure (takehiro-2002_05_07-experimental): + + regen + +2004-12-09 17:36 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + cosmetic changes & reduce warnings. + +2004-12-09 17:29 takehiro + + * libmp3lame/: quantize.c, i386/choose_table.nas + (takehiro-2002_05_07-experimental): + + MMX version of xr_max() + make VBR/ABR 1% faster. + +2004-12-09 17:05 takehiro + + * configure.in (takehiro-2002_05_07-experimental): + + merge from main branch. + - changed words; "default: foobar" -> "default=foobar" + - enable bitrate histogram by default + +2004-12-05 18:10 takehiro + + * libmp3lame/: bitstream.c, takehiro.c + (takehiro-2002_05_07-experimental): + + fix encoding failure of velvet.wav with CBR 128 + +2004-12-05 18:09 takehiro + + * libmp3lame/tags.c (takehiro-2002_05_07-experimental): + + cosmetic change + +2004-12-05 17:59 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + considering the shape of window function when long/short block switching. + +2004-12-05 12:18 takehiro + + * testcase.mp3 (takehiro-2002_05_07-experimental): + + regen with "tag fixed" version. + +2004-12-05 12:16 takehiro + + * libmp3lame/tags.c (takehiro-2002_05_07-experimental): + + fix VBR(LAME) tag contains a gabage. + +2004-12-02 16:29 takehiro + + * frontend/.indent.pro, libmp3lame/.indent.pro, misc/.indent.pro + (takehiro-2002_05_07-experimental): + + I think no one uses .indent.pro + so I remove them. + +2004-12-02 16:27 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + better threshold controll for ABR. + +2004-11-30 19:00 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix it may overflow + +2004-11-30 18:57 takehiro + + * libmp3lame/: psymodel.c, quantize.c + (takehiro-2002_05_07-experimental): + + VBR speed optimization + +2004-11-30 18:55 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + fix assertion + +2004-11-30 18:54 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + optimization by changing table values. + +2004-11-30 10:19 takehiro + + * configMS.h (takehiro-2002_05_07-experimental): + + fix for MSVC "inline" keyword + +2004-11-30 09:39 takehiro + + * libmp3lame/: encoder.h, lame.c + (takehiro-2002_05_07-experimental): + + precalculate width information + +2004-11-30 08:58 takehiro + + * libmp3lame/: encoder.h, lame.c, quantize.c, quantize_pvt.h, + takehiro.c (takehiro-2002_05_07-experimental): + + table size reduction + +2004-11-30 08:55 takehiro + + * libmp3lame/newmdct.c (takehiro-2002_05_07-experimental): + + clean up. + +2004-11-30 07:59 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + generalized signbits encoding hack for IEEE754 + +2004-11-30 07:52 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + IEEE754 hack for sign bit. + +2004-11-30 07:41 takehiro + + * frontend/main.c (takehiro-2002_05_07-experimental): + + fix decoding... oops... + +2004-11-30 01:07 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + cleanup + +2004-11-30 01:05 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + tuning VBR scalefactor prediction and fix treatment of almost silent scalefactor. + +2004-11-29 23:41 takehiro + + * libmp3lame/psymodel.c: + + fix ATHlower is always "0". + +2004-11-29 18:01 takehiro + + * libmp3lame/i386/choose_table.nas + (takehiro-2002_05_07-experimental): + + fix comments + +2004-11-29 18:01 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + changed VBR scalefactor prediction method. + use "previous" scalefactor's values as predicted value. + +2004-11-29 16:46 takehiro + + * frontend/main.c (takehiro-2002_05_07-experimental): + + fix for out of memory. + +2004-11-29 04:51 takehiro + + * frontend/parse.c (takehiro-2002_05_07-experimental): + + remove unused definitions + +2004-11-29 04:51 takehiro + + * frontend/main.c (takehiro-2002_05_07-experimental): + + remove console.h + +2004-11-28 19:10 bouvigne + + * libmp3lame/: quantize_pvt.c, quantize_pvt.h, takehiro.c: + + some FLOAT -> int + +2004-11-28 19:09 takehiro + + * frontend/: Makefile.am, Makefile.in, console.c, console.h + (takehiro-2002_05_07-experimental): + + remove unused files. + +2004-11-28 18:21 takehiro + + * Dll/BladeMP3EncDLL.c: + + added brancket to fix bugid#1003342 on sf.net + +2004-11-28 17:15 takehiro + + * frontend/get_audio.c, frontend/parse.c, libmp3lame/lame.c + (takehiro-2002_05_07-experimental): + + "-s" option is now prior to the frequency data in .wav file header. + +2004-11-28 15:21 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + changed double constants into FLOAT type + +2004-11-28 14:47 takehiro + + * libmp3lame/: lame.c, mpglib_interface.c, quantize.c, takehiro.c + (takehiro-2002_05_07-experimental): + + To optimize more, changed sign of gfc->width[] (now they are minus value) + +2004-11-28 14:24 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + trivial optimization + +2004-11-28 14:09 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + trivial optimization + +2004-11-28 14:01 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + now ABR is based on VBR, so the -q setting has no meaning. + +2004-11-28 13:58 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + changed table type int -> char, to avoid cache line conflict. + +2004-11-28 13:40 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + little bit optimizing + +2004-11-28 12:58 takehiro + + * configure (takehiro-2002_05_07-experimental): + + regen + +2004-11-28 12:57 takehiro + + * configure.in (takehiro-2002_05_07-experimental): + + oops... use "-mcpu" and "-mtune" by checking gcc version. + +2004-11-28 11:38 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + use calculation instead of table. + (encoding results may be different from previous versions, but that's "lossless" difference) + +2004-11-28 11:06 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + make them static + +2004-11-28 10:33 takehiro + + * configure, configure.in (takehiro-2002_05_07-experimental): + + changed -mcpu -> -mtune, because newer gcc doesn't like -mcpu. + +2004-11-28 08:47 takehiro + + * configure (takehiro-2002_05_07-experimental): + + regen + +2004-11-28 08:47 takehiro + + * configure.in (takehiro-2002_05_07-experimental): + + changed optimization option + +2004-11-27 19:43 takehiro + + * Makefile.MSVC, Makefile.in, Makefile.unix, aclocal.m4, configure, + ACM/Makefile.in, ACM/ADbg/Makefile.in, ACM/ddk/Makefile.in, + ACM/tinyxml/Makefile.in, Dll/Makefile.in, debian/Makefile.in, + doc/Makefile.in, doc/html/Makefile.in, doc/man/Makefile.in, + dshow/Makefile.in, frontend/Makefile.am, frontend/Makefile.in, + frontend/get_audio.c, frontend/get_audio.h, + frontend/lame_vc6.dsp, frontend/main.c, frontend/mp3rtp.c, + frontend/mp3x_vc6.dsp, frontend/portableio.c, + frontend/portableio.h, include/Makefile.in, + libmp3lame/Makefile.in, libmp3lame/i386/Makefile.in, + mac/Makefile.in, misc/Makefile.in, mpglib/Makefile.in + (takehiro-2002_05_07-experimental): + + remove portableio.[ch] + use automake 1.9.2 to regen the auto* stuffs. + +2004-11-27 17:28 takehiro + + * frontend/: get_audio.c, portableio.c, portableio.h + (takehiro-2002_05_07-experimental): + + remove Read32BitsHighLow() + +2004-11-27 17:21 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + fix file size reading + +2004-11-27 17:21 takehiro + + * frontend/: portableio.c, portableio.h + (takehiro-2002_05_07-experimental): + + remove unused functions. + +2004-11-27 09:57 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + remove AIFF support from LAME standard input code. + if you need an AIFF support, use libsndfile instead. + +2004-11-23 18:38 takehiro + + * configure, configure.in, frontend/get_audio.c + (takehiro-2002_05_07-experimental): + + support libsndfile 1.0.x + (and remove support that of 0.x) + +2004-11-23 15:18 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + trivial optimization. + +2004-11-23 15:18 takehiro + + * libmp3lame/set_get.c (takehiro-2002_05_07-experimental): + + - ABR quality adjustment. + (oops, I forget to commit in the previous one) + +2004-11-23 15:17 takehiro + + * libmp3lame/: quantize.c, encoder.h + (takehiro-2002_05_07-experimental): + + - ABR quality adjustment (little bit). + - manually inlining finish_VBR_coding() + +2004-11-23 09:46 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + supress magic numbers + +2004-11-23 08:27 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + trivial optimization by reducing branch. + +2004-11-21 18:45 takehiro + + * libmp3lame/version.h (takehiro-2002_05_07-experimental): + + now alpha 11, including new ABR + +2004-11-21 18:45 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + clean up + +2004-11-21 18:41 takehiro + + * libmp3lame/: encoder.h, quantize.c + (takehiro-2002_05_07-experimental): + + brand new ABR algorith. + - simply adjust the psycho-threshold by checking (target bitrate) vs. + (current bitrate) + +2004-11-21 18:32 takehiro + + * libmp3lame/tags.c (takehiro-2002_05_07-experimental): + + fix VBR tag is completely messed up! + +2004-11-21 12:28 takehiro + + * libmp3lame/: bitstream.c, encoder.h, lame.c, psymodel.c, + quantize.c, quantize_pvt.h, tables.c + (takehiro-2002_05_07-experimental): + + simplify the initialization of gr_info[][] + +2004-11-21 12:26 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + cosmetic change + +2004-11-21 12:25 takehiro + + * libmp3lame/tables.h (takehiro-2002_05_07-experimental): + + changed comments + +2004-11-21 12:23 takehiro + + * libmp3lame/i386/choose_table.nas + (takehiro-2002_05_07-experimental): + + optimize in the case of width = 2. + +2004-11-21 10:45 takehiro + + * frontend/: get_audio.c, get_audio.h, main.c + (takehiro-2002_05_07-experimental): + + use 32bit input even when MP3 decoding, to prepare better precision mp3 decoder. + remove "get_audio16()" function, because now it is not needed at all. + +2004-11-20 18:43 takehiro + + * frontend/: gtkanal.c, main.c (takehiro-2002_05_07-experimental): + + To make mp3x use 32bit integer encoding interface. + Because it has used 16bit interface, it could not analyze the 32bit input data. + Now it is fixed. + +2004-11-20 11:49 takehiro + + * frontend/gpkplotting.c (takehiro-2002_05_07-experimental): + + merge from main branch. + - more explicit display of noise values + +2004-11-17 19:54 bouvigne + + * libmp3lame/: quantize.c, util.h: + + noise shaping type 3: + amplify bands within 50% of distortion, + then refine by amplifying the most distorted band + +2004-10-24 14:26 bouvigne + + * libmp3lame/version.h: + + bump alpha + +2004-10-24 14:25 bouvigne + + * libmp3lame/lame.c: + + reworked -q values: + noise_shaping_amp 2 removed + full Huffman search removed in q0 + full outer loop search enabled in q0 + +2004-10-24 14:21 bouvigne + + * libmp3lame/: quantize.c, util.h: + + full outer loop search: + allows to search for better quantization until global_gain==255 + +2004-09-18 10:20 takehiro + + * ACM/ACM.cpp (takehiro-2002_05_07-experimental): + + sync with main branch (r1.17) + - fix by Dmitriy Startsev + +2004-09-18 10:09 takehiro + + * Dll/BladeMP3EncDLL.c (takehiro-2002_05_07-experimental): + + fix bug item #1003342 + +2004-08-19 19:49 bouvigne + + * doc/html/history.html: + + added 3.96.1 + +2004-08-19 19:36 bouvigne + + * doc/html/modes.html: + + spelling, clarifications + +2004-07-28 20:33 robert + + * configure, configure.in (RELEASE__3_96-bugfix-branch): + + updating configure to version number 3.96.1 + +2004-07-21 18:59 bouvigne + + * doc/html/: history.html, index.html + (RELEASE__3_96-bugfix-branch): + + updated for 3.96.1 + +2004-07-21 18:52 bouvigne + + * ACM/: ACM.cpp, ACMStream.cpp, acm.rc + (RELEASE__3_96-bugfix-branch): + + sync fixes from main branch + +2004-07-21 18:46 bouvigne + + * ACM/ACM.cpp: + + fix by Dmitriy Startsev + +2004-07-11 18:12 bouvigne + + * ACM/acm.rc: + + updated version number because of recent fixes + +2004-07-11 18:11 bouvigne + + * ACM/ACMStream.cpp: + + fixed a potential crash + +2004-07-11 18:05 bouvigne + + * ACM/ACM.cpp: + + Should fix the display issue under win95 + +2004-07-11 17:11 bouvigne + + * ACM/ACM.cpp: + + fix crash when used through directshow. + It still does not work in this configuration, but at least it does not crash anymore. + +2004-06-27 19:32 robert + + * libmp3lame/psymodel.c (RELEASE__3_96-bugfix-branch): + + fixed short block detection using mid and side channels + +2004-06-27 13:02 bouvigne + + * libmp3lame/psymodel.c: + + fixed short block detection using mid and side channels + +2004-06-26 17:08 robert + + * Makefile.unix, ACM/ACM.cpp, libmp3lame/gain_analysis.c, + libmp3lame/gain_analysis.h, libmp3lame/lame.c, + libmp3lame/psymodel.c, libmp3lame/vbrquantize.c, + libmp3lame/version.c, libmp3lame/version.h + (RELEASE__3_96-bugfix-branch): + + back porting some bug fixes into 3.96 stable branch + + patch by takehiro: + + fix bug id 921798 + http://sourceforge.net/tracker/index.php?func=detail&aid=921798&group_id=290&atid=100290 + + This is reported as bug for "BCC", but it may happen for every compiler. + + patch by olcios: + + A better fix for the FP x86 problem. Provided by Andrew Church. Modified by olcios. + + patch by bouvigne: + + restored use of padding when not using bit reservoir + + patch by robert: + + bug fix for lame crashing occasionally when using --vbr-new + +2004-06-26 15:35 bouvigne + + * libmp3lame/encoder.c: + + lame_encode_frame_init + +2004-06-20 17:28 bouvigne + + * doc/html/history.html, libmp3lame/lame.c: + + restored use of padding when not using bit reservoir + +2004-06-18 19:15 bouvigne + + * libmp3lame/: bitstream.c, encoder.c, l3side.h, lame.c, + mpglib_interface.c, newmdct.c, psymodel.c, quantize.c, + quantize_pvt.c, quantize_pvt.h, reservoir.c, takehiro.c, util.c, + VbrTag.c, util.h, vbrquantize.c, vbrquantize.h, version.h: + + FLOAT8 -> FLOAT + +2004-06-06 15:31 bouvigne + + * frontend/: gpkplotting.c, gtkanal.c: + + more explicit display of noise values + +2004-06-06 14:15 bouvigne + + * frontend/gtkanal.c: + + display more scalefactor band splitting lines. + (as in exp branch) + +2004-06-06 09:48 bouvigne + + * doc/html/history.html: + + history + +2004-06-05 15:46 bouvigne + + * libmp3lame/quantize.c: + + small speedup: init_xrpow only up to max non-zero coeff + +2004-05-31 17:35 bouvigne + + * libmp3lame/takehiro.c: + + reduced the number of calls to quantization function + +2004-05-27 23:55 robert + + * libmp3lame/version.h: + + now at 3.97 alpha 2 + +2004-05-27 23:52 robert + + * libmp3lame/: takehiro.c, vbrquantize.c: + + bug fix for lame crashing occasionally when using --vbr-new + PS: scalefactor allocation is still not optimal + +2004-05-26 21:37 bouvigne + + * libmp3lame/takehiro.c: + + fixed a stupid bug + +2004-05-26 21:04 bouvigne + + * libmp3lame/takehiro.c: + + fixed a bug in quantize_xrpow, but it is still crashing + Oddly, cbr/abr are working fine, and low vbr settings are also working fine. + -V2 is not working + +2004-05-23 13:16 bouvigne + + * libmp3lame/: quantize_pvt.c, quantize_pvt.h, takehiro.c, util.h: + + Use function pointer to select between quantization methods. + This should ease plugin of vectorized versions + +2004-05-23 12:47 bouvigne + + * libmp3lame/takehiro.c: + + factorized code which is selecting which lines to quantize + +2004-05-23 12:43 bouvigne + + * configMS.h: + + version + +2004-05-23 06:23 takehiro + + * libmp3lame/: tables.c, tables.h, takehiro.c + (takehiro-2002_05_07-experimental): + + make some tables as static + +2004-05-23 04:23 takehiro + + * libmp3lame/i386/: choose_table.nas, fft3dn.nas, quantSSE.nas + (takehiro-2002_05_07-experimental): + + fix possible link problem on cygwin + +2004-05-22 16:18 takehiro + + * libmp3lame/i386/choose_table.nas + (takehiro-2002_05_07-experimental): + + fix cygwin build + +2004-05-22 14:26 takehiro + + * libmp3lame/: encoder.h, quantize_pvt.h, tables.c, takehiro.c, + i386/choose_table.nas (takehiro-2002_05_07-experimental): + + reduce MMX code, because C code is faster than asm one :p + and trivial coding tweaks. + +2004-05-22 14:02 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + optimization by reducing conditional jumps + +2004-05-22 13:53 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + optimization by changing multiply -> shift + +2004-05-22 10:54 takehiro + + * libmp3lame/: takehiro.c, i386/choose_table.nas + (takehiro-2002_05_07-experimental): + + faster choose_table_*() implimentation. use cached value of ix_max(). + +2004-05-22 09:14 takehiro + + * libmp3lame/: takehiro.c, i386/choose_table.nas + (takehiro-2002_05_07-experimental): + + changed choose_table_*() API, for further optimizations. + +2004-05-16 16:57 takehiro + + * libmp3lame/i386/choose_table.nas + (takehiro-2002_05_07-experimental): + + choose_from2 is only used when table=1 or 3. + +2004-05-16 16:54 takehiro + + * libmp3lame/tags.c (takehiro-2002_05_07-experimental): + + added ReplayGain tag output. + +2004-05-16 16:49 takehiro + + * include/lame.h, libmp3lame/encoder.h, libmp3lame/lame.c, + libmp3lame/tags.c (takehiro-2002_05_07-experimental): + + Changed API of tag-output function making it possible to return the error code. + and clean up arround tag output code. + +2004-05-16 16:47 takehiro + + * libmp3lame/gain_analysis.c (takehiro-2002_05_07-experimental): + + cosmetic + +2004-05-16 16:46 takehiro + + * frontend/: get_audio.c, main.c, portableio.c, portableio.h + (takehiro-2002_05_07-experimental): + + trivial + +2004-05-16 12:48 takehiro + + * Makefile.unix (takehiro-2002_05_07-experimental): + + to follow that amiga_mpega.c is removed. + +2004-05-16 12:47 takehiro + + * frontend/Makefile.in (takehiro-2002_05_07-experimental): + + regen + +2004-05-15 13:06 takehiro + + * Makefile.MSVC, libmp3lame/libmp3lame_vc6.dsp + (takehiro-2002_05_07-experimental): + + added gain_analysis.[ch] + +2004-05-15 13:04 takehiro + + * ACM/LameACM.inf (takehiro-2002_05_07-experimental): + + (very experimental thing) added "register/unregister program" + +2004-05-15 13:03 takehiro + + * ACM/TODO (takehiro-2002_05_07-experimental): + + it always "preset" so the itmes are removed. + +2004-05-15 12:58 takehiro + + * Makefile.unix (takehiro-2002_05_07-experimental): + + fix testcase + added gain_analysis + +2004-05-15 10:37 takehiro + + * frontend/gtkanal.c (takehiro-2002_05_07-experimental): + + cosmetic + +2004-05-15 10:09 takehiro + + * frontend/: Makefile.am, amiga_mpega.c + (takehiro-2002_05_07-experimental): + + do not use amiga_mpega.c. use mpg123 instead. + +2004-05-15 08:56 takehiro + + * libmp3lame/: bitstream.c, encoder.h, gain_analysis.c + (takehiro-2002_05_07-experimental): + + added replaygain calculation code. + (but not enabled yet) + +2004-05-14 19:29 aleidinger + + * Makefile.in, ACM/Makefile.in, ACM/ADbg/Makefile.in, + ACM/ddk/Makefile.in, ACM/tinyxml/Makefile.in, Dll/Makefile.in, + debian/Makefile.in, doc/Makefile.in, doc/html/Makefile.in, + doc/man/Makefile.in, dshow/Makefile.in, frontend/Makefile.in, + include/Makefile.in, libmp3lame/Makefile.in, + libmp3lame/i386/Makefile.in, mac/Makefile.in, misc/Makefile.in, + mpglib/Makefile.in: + + regen with new auto* version + +2004-05-14 19:26 aleidinger + + * configure: + + regen with new auto* version + +2004-05-14 19:22 aleidinger + + * aclocal.m4: + + regen with new auto* version + +2004-05-14 19:20 aleidinger + + * frontend/depcomp, libmp3lame/depcomp, mpglib/depcomp, depcomp, + install-sh, missing: + + update to a new version + +2004-05-14 19:12 aleidinger + + * testcase.mp3: + + update it to have a more sane number + +2004-05-14 19:11 aleidinger + + * Makefile.am: + + Tell the users that they do not have to care about the output of make test. + +2004-05-14 17:29 takehiro + + * libmp3lame/Makefile.in (takehiro-2002_05_07-experimental): + + regen + +2004-05-14 17:11 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + reduce warning + +2004-05-14 16:55 takehiro + + * libmp3lame/Makefile.am (takehiro-2002_05_07-experimental): + + added gain_analysis.[ch] + +2004-05-05 06:34 takehiro + + * libmp3lame/: lame.c, mpglib_interface.c + (takehiro-2002_05_07-experimental): + + free the decoding work area of replaygain analysis. + +2004-05-05 06:29 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + fix memory leakage when it uses decoding functions. + +2004-05-05 06:29 takehiro + + * libmp3lame/: gain_analysis.c, gain_analysis.h + (takehiro-2002_05_07-experimental): + + sync with the latest version + +2004-05-05 06:27 takehiro + + * libmp3lame/machine.h (takehiro-2002_05_07-experimental): + + fix for the machine without memset() + +2004-05-05 06:23 takehiro + + * frontend/main.c (takehiro-2002_05_07-experimental): + + fix for the machine without memset() + +2004-05-05 06:22 takehiro + + * frontend/: get_audio.c, main.c + (takehiro-2002_05_07-experimental): + + one more AIFF cleanup + +2004-05-05 06:18 takehiro + + * frontend/: get_audio.c, get_audio.h, portableio.h + (takehiro-2002_05_07-experimental): + + clean up AIFF related code. but still it cannot read AIFF file... + +2004-05-05 06:02 takehiro + + * frontend/: get_audio.c, get_audio.h, main.c, mp3rtp.c + (takehiro-2002_05_07-experimental): + + reduce warning + +2004-05-05 05:55 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + remove AMIGA_MPEG support. + use mpg123 instead. + +2004-04-25 13:08 takehiro + + * frontend/gtkanal.c (takehiro-2002_05_07-experimental): + + fix "stop/plot" button working. + Thanx reporting, Gaby. + +2004-04-25 12:42 takehiro + + * frontend/main.c (takehiro-2002_05_07-experimental): + + fix obvious bugs... + +2004-04-25 12:33 bouvigne + + * frontend/gtkanal.c: + + fixed mp3x monopolizing processor in its idle loop + +2004-04-25 10:18 takehiro + + * libmp3lame/encoder.c (takehiro-2002_05_07-experimental): + + merged into lame.c + +2004-04-25 10:07 takehiro + + * libmp3lame/: Makefile.in, libmp3lame_vc6.dsp + (takehiro-2002_05_07-experimental): + + regen + +2004-04-25 09:47 takehiro + + * Makefile.MSVC, Makefile.unix, frontend/brhist.c, include/lame.h, + libmp3lame/Makefile.am, libmp3lame/Makefile.in, + libmp3lame/encoder.h, libmp3lame/lame.c + (takehiro-2002_05_07-experimental): + + merged encoder.c into lame.c. + + remove lame_bitrate_kpbs(). use bitrate_table[][] directly instead of it. + +2004-04-25 09:06 takehiro + + * libmp3lame/: encoder.h, quantize.c + (takehiro-2002_05_07-experimental): + + reduce memory usage by moving maxXR[] from gi to gfc. + +2004-04-25 06:13 takehiro + + * libmp3lame/psymodel.c: + + fix bug id 921798 + http://sourceforge.net/tracker/index.php?func=detail&aid=921798&group_id=290&atid=100290 + + This is reported as bug for "BCC", but it may happen for every compiler. + +2004-04-24 18:29 olcios + + * libmp3lame/gain_analysis.h: + + changed some constants' types to long + +2004-04-24 17:47 olcios + + * libmp3lame/: gain_analysis.c, gain_analysis.h: + + A better fix for the FP x86 problem. Provided by Andrew Church. Modified by olcios. + +2004-04-24 17:02 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + fix it access to the log2tab[LARGE_BITS] + +2004-04-24 16:58 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix it always use the bit pressure algorith for short blocks on long blocks. + +2004-04-24 16:42 takehiro + + * TODO (takehiro-2002_05_07-experimental): + + remove one mp3x TODO item (but still many TODOs about mp3x...) + +2004-04-24 16:33 takehiro + + * testcase.mp3, include/lame.h, libmp3lame/bitstream.c, + libmp3lame/encoder.c, libmp3lame/lame.c, libmp3lame/tags.c + (takehiro-2002_05_07-experimental): + + one more error code clean up. + +2004-04-24 16:31 takehiro + + * mpglib/: interface.c, layer3.c + (takehiro-2002_05_07-experimental): + + cosmetic change and comment style fix. + +2004-04-24 16:30 takehiro + + * mpglib/mpglib.h (takehiro-2002_05_07-experimental): + + patch from Dmitriy Startsev. + (yes, this is from Dmitriy... sorry) + +2004-04-24 16:27 takehiro + + * libmp3lame/mpglib_interface.c (takehiro-2002_05_07-experimental): + + to check the "free-ed memory access" + +2004-04-24 16:26 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + fix mp3x cannot displays short mp3 file (it segfaults). + +2004-04-24 13:36 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + fix flush code + +2004-04-24 13:09 takehiro + + * include/lame.h, libmp3lame/lame.c + (takehiro-2002_05_07-experimental): + + update error code. + +2004-04-24 11:09 takehiro + + * libmp3lame/: bitstream.c, encoder.h, quantize.c + (takehiro-2002_05_07-experimental): + + fix comments and cosmetic change + +2004-04-24 10:44 takehiro + + * libmp3lame/: bitstream.c, lame.c, tags.c, tags.h, util.c + (takehiro-2002_05_07-experimental): + + fix CRC calculation + remove redundant include + added some comments about flushing + +2004-04-24 10:40 takehiro + + * libmp3lame/set_get.c (takehiro-2002_05_07-experimental): + + remove commnts, which are the same as in lame.h + +2004-04-24 10:39 takehiro + + * libmp3lame/psymodel.c, libmp3lame/quantize.c, include/lame.h, + libmp3lame/encoder.c (takehiro-2002_05_07-experimental): + + cosmetic + +2004-04-18 18:11 takehiro + + * libmp3lame/: lame.c, tables.c, tags.c, util.c, util.h + (takehiro-2002_05_07-experimental): + + clean up arround VBR Tag frame size. + clean up arround "POSTDELAY" + +2004-04-18 17:30 takehiro + + * Makefile.MSVC, Makefile.unix (takehiro-2002_05_07-experimental): + + follow the filename changes + +2004-04-18 17:24 takehiro + + * libmp3lame/: util.c, util.h (takehiro-2002_05_07-experimental): + + fix build problem on Linux + +2004-04-18 17:16 takehiro + + * libmp3lame/libmp3lame_vc6.dsp (takehiro-2002_05_07-experimental): + + follow the file name change. + +2004-04-18 17:10 takehiro + + * mpglib/interface.c (takehiro-2002_05_07-experimental): + + remove redundant include + +2004-04-18 17:10 takehiro + + * libmp3lame/Makefile.in (takehiro-2002_05_07-experimental): + + regen + +2004-04-18 17:09 takehiro + + * libmp3lame/: Makefile.am, VbrTag.c, VbrTag.h, bitstream.c, + bitstream.h, encoder.c, id3tag.c, id3tag.h, lame.c, tags.c, + tags.h, util.c, util.h (takehiro-2002_05_07-experimental): + + merged "VbrTag.c" and "id3tag.c" into one (tags.c) + merged "VbrTag.h" and "id3tag.h" into one (tags.h) + simplify the CRC related code. + +2004-04-18 12:59 takehiro + + * mpglib/interface.c (takehiro-2002_05_07-experimental): + + fix mpglib problem. The patch is from Kristian Hermansen. + (forwarded by Dmitriy Startsev) + +2004-04-18 12:43 takehiro + + * libmp3lame/: VbrTag.c, bitstream.c, bitstream.h, encoder.c, + encoder.h, id3tag.c, id3tag.h, lame.c, newmdct.c, psymodel.c, + quantize_pvt.h, tables.c, tables.h + (takehiro-2002_05_07-experimental): + + * large clean up arround Tags and Header. + - directly output the Tags/Headers instead of using add_dummy_byte() + + reduce memory usage by using "union" + +2004-04-18 11:42 takehiro + + * TODO (takehiro-2002_05_07-experimental): + + added MP3X bug as TODO. + +2004-04-18 11:11 takehiro + + * libmp3lame/: VbrTag.c, bitstream.c, encoder.c, encoder.h, lame.c, + newmdct.c, psymodel.c, quantize.c, tables.c, takehiro.c, util.h + (takehiro-2002_05_07-experimental): + + clean up lame_t structure. + +2004-04-18 10:32 takehiro + + * frontend/gtkanal.c (takehiro-2002_05_07-experimental): + + fix MP3X monopolizing the processor in its idle loop. + +2004-04-14 22:15 robert + + * frontend/get_audio.c, mpglib/common.c, mpglib/common.h, + mpglib/dct64_i386.c, mpglib/decode_i386.c, mpglib/interface.c, + mpglib/layer1.c, mpglib/layer2.c, mpglib/layer2.h, + mpglib/layer3.c, mpglib/layer3.h, mpglib/mpg123.h, + mpglib/mpglib.h, mpglib/tabinit.c: + + fixing the decoding issue with the reported "Christmas" song. + I've taken Takehiro's modifications and getting the same output + as he does on his 4.0 branch. Imho this is not the best solution + to the given problem, but it works for now. + +2004-04-14 16:48 takehiro + + * Dll/BladeMP3EncDLL.c (takehiro-2002_05_07-experimental): + + fix build problem reported by PAN-san. + +2004-04-13 17:21 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + fix fatal bug in scalefactor value lossless coding. + +2004-04-12 12:29 aleidinger + + * debian/lame.docs: + + PRESETS.draft does not exists anymore. + +2004-04-11 18:16 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + adjust ATH adjustment. + +2004-04-11 18:15 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + fix "1 sample" delay + +2004-04-11 17:24 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + fix mp3x FFT energy display. + +2004-04-11 15:39 glessard + + * frontend/main.c, include/lame.h, libmp3lame/set_get.c: + + Added two sets of set/get functions to the API. They modify and read the + nogap_total and nogap_current variables of the internal_flags struct. + Added calls to these functions to the gapless-encoding loop of the frontend. + +2004-04-11 15:06 aleidinger + + * ChangeLog: + + update + +2004-04-11 15:04 aleidinger + + * configure: + + regen + +2004-04-11 15:00 aleidinger + + * config.h.in: + + Add some missing LARGEFILE pieces. This patch is also in the generated + lame-3.96 tarball, it just enters the CVS repository for 3.97 for + organizational reasons. + +2004-04-11 14:58 aleidinger + + * configure.in: + + Welcome to lame 3.97. + +2004-04-11 14:27 takehiro + + * libmp3lame/: encoder.c, encoder.h, lame.c, set_get.c, tables.c + (takehiro-2002_05_07-experimental): + + merged gfc->num_channels & gfc->channels_in + some trivial clean up. + +2004-04-11 13:54 takehiro + + * libmp3lame/VbrTag.c, libmp3lame/encoder.h, libmp3lame/lame.c, + libmp3lame/set_get.c, libmp3lame/tables.c, libmp3lame/util.c, + libmp3lame/util.h, include/lame.h + (takehiro-2002_05_07-experimental): + + changed error/debug/normal message output code. + +2004-04-11 13:10 takehiro + + * debian/: changelog, lame.docs, rules + (takehiro-2002_05_07-experimental): + + updated for lame4 + +2004-04-11 13:09 takehiro + + * libmp3lame/: encoder.c, encoder.h, lame.c, mpglib_interface.c, + tables.c (takehiro-2002_05_07-experimental): + + clean up the members of structure lame_t. + +2004-04-11 13:08 takehiro + + * libmp3lame/set_get.c (takehiro-2002_05_07-experimental): + + fix build problem when --disable-analysis-hook + +2004-04-11 13:05 bouvigne + + * libmp3lame/version.h: + + 3.97a1 + +2004-04-11 13:03 bouvigne + + * libmp3lame/version.h: + + release 3.96 + +2004-04-11 13:03 bouvigne + + * doc/html/history.html: + + history + +2004-04-11 13:02 bouvigne + + * debian/changelog: + + updated debian changelog + +2004-04-11 13:01 bouvigne + + * libmp3lame/presets.c: + + use X9 to select abr/cbr quantization, + use sfscale up to 160kbps + +2004-04-11 12:50 bouvigne + + * Makefile.in: + + manually updated Makefile.in + +2004-04-11 12:12 takehiro + + * configure (takehiro-2002_05_07-experimental): + + regen (by hand) + +2004-04-11 12:10 takehiro + + * configure.in (takehiro-2002_05_07-experimental): + + fix confusion arround "decoder" and "decode" + +2004-04-11 11:58 takehiro + + * libmp3lame/lame-analysis.h, frontend/gtkanal.c + (takehiro-2002_05_07-experimental): + + trivial + +2004-04-11 11:57 takehiro + + * libmp3lame/: encoder.c, encoder.h, lame.c + (takehiro-2002_05_07-experimental): + + one more fix for "very the beginig samples" + +2004-04-11 11:55 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix it sometimes goes into infinite loop when with i-stereo. + +2004-04-10 16:58 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix mp3x display delay. + +2004-04-10 16:56 takehiro + + * libmp3lame/encoder.c (takehiro-2002_05_07-experimental): + + remove redandunt code. + +2004-04-10 16:48 takehiro + + * libmp3lame/: encoder.c, encoder.h, lame.c, newmdct.c, psymodel.c, + quantize.c, set_get.c (takehiro-2002_05_07-experimental): + + fix "start" delay and reduce buffer size. + still there's known bugs in mp3x and the tail part encoding. + +2004-04-10 16:15 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + fix trivial bug when stereo input + +2004-04-10 15:43 takehiro + + * frontend/: get_audio.c, get_audio.h, gtkanal.c, lametime.c, + lametime.h, main.c, mp3rtp.c (takehiro-2002_05_07-experimental): + + frontend code fix and clean up. + - fix it cut the beginning 17 samples when input is .wav file. + - fix function names. remove "lame_" prefix from the functions which is not + LAME API. + - and some trivial clean up. + +2004-04-10 13:23 takehiro + + * frontend/gpkplotting.c (takehiro-2002_05_07-experimental): + + remove unused definition + +2004-04-10 12:08 takehiro + + * frontend/main.c (takehiro-2002_05_07-experimental): + + clarify the comment + +2004-04-04 15:13 takehiro + + * libmp3lame/encoder.h (takehiro-2002_05_07-experimental): + + reduce POSTDELAY when MPEG2 layer3 + +2004-04-04 12:49 takehiro + + * frontend/parse.c, include/lame.h, libmp3lame/encoder.h, + libmp3lame/lame.c, libmp3lame/set_get.c, libmp3lame/tables.c + (takehiro-2002_05_07-experimental): + + rename ns-(bass|alto|treble) options and their implementation. + +2004-04-04 12:45 takehiro + + * mpglib/layer3.c (takehiro-2002_05_07-experimental): + + always support MPEG1. + +2004-04-04 12:33 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + trivial + +2004-04-04 11:55 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + trivial optimization + +2004-04-04 11:54 takehiro + + * libmp3lame/: util.c, machine.h + (takehiro-2002_05_07-experimental): + + include file clean up. + +2004-04-04 11:52 takehiro + + * libmp3lame/id3tag.c (takehiro-2002_05_07-experimental): + + replace snprintf() with strncat() and so on, for some old systems. + +2004-04-03 19:30 takehiro + + * libmp3lame/encoder.c (takehiro-2002_05_07-experimental): + + work arround for short blocks with i-stereo bug. + and some simplification of i-stereo code. + +2004-04-03 19:25 takehiro + + * frontend/gtkanal.c (takehiro-2002_05_07-experimental): + + display more scalefactor band splitting lines. + +2004-04-03 17:35 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + fix uninitialized memory access (found by valgrind). + +2004-04-03 17:28 bouvigne + + * frontend/gtkanal.c, libmp3lame/lame-analysis.h, + libmp3lame/quantize.c, libmp3lame/quantize_pvt.c, + libmp3lame/quantize_pvt.h: + + Add X9 quantization selection method. + It increases applaud.wav substancially. + Not enabled by default + +2004-04-03 17:14 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + try to find better scalefactor combination when i-stereo. + +2004-04-03 17:07 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + remove one condition which is always stisfied. + +2004-04-03 13:17 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + better bit allocation when substep noise shaping. + +2004-04-02 16:37 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + fix "all even" hack. + +2004-04-02 15:54 takehiro + + * libmp3lame/: psymodel.c, quantize.c + (takehiro-2002_05_07-experimental): + + better bit allocation for CBR. + - increase bit allocation on start/end blocks, where the effect of + best_huffman_divide() is very weak. + - increase bit allocation when --substep is enabled. + + some trivial clean up. + +2004-03-30 15:49 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + fix it sometimes crashes with -q0 or -q1 + CBR + +2004-03-28 16:14 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + trivial simplification + +2004-03-28 13:11 bouvigne + + * libmp3lame/version.h: + + 3.96 beta 2 + +2004-03-28 13:10 bouvigne + + * doc/html/history.html: + + history + +2004-03-28 13:10 bouvigne + + * libmp3lame/presets.c: + + updated minimal bitrate for V1 and V2 + +2004-03-28 12:41 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + reduce array size + +2004-03-28 12:16 takehiro + + * libmp3lame/: bitstream.c, encoder.c, encoder.h, lame.c, + quantize.c, tables.c, tables.h, takehiro.c + (takehiro-2002_05_07-experimental): + + warning fix, cleanup, and cosmetic change. + +2004-03-28 12:16 takehiro + + * TODO (takehiro-2002_05_07-experimental): + + there is already VC6 project file. We (maybe) need .net project/solution file. + +2004-03-28 11:29 takehiro + + * frontend/mp3x.c, include/lame.h, libmp3lame/lame.c, + libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + remove lame_encode_finish() API + +2004-03-28 11:28 takehiro + + * libmp3lame/encoder.c (takehiro-2002_05_07-experimental): + + fixed mixed block statics + trivial optimization/clean up + +2004-03-27 17:08 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + - use calc_sfb_noise() and calc_sfb_noise_fast() do not return minus value. + - little better CBR_2nd_bitalloc() + +2004-03-27 14:50 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + reduce table size. + +2004-03-27 14:49 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + fix warnings + +2004-03-27 12:38 takehiro + + * libmp3lame/: bitstream.c, quantize.c + (takehiro-2002_05_07-experimental): + + cosmetic + +2004-03-27 11:18 takehiro + + * libmp3lame/: bitstream.c, tables.c, tables.h + (takehiro-2002_05_07-experimental): + + simplification arround huffman code output + +2004-03-27 09:47 takehiro + + * libmp3lame/: bitstream.c, quantize.c, quantize_pvt.h, tables.c, + takehiro.c (takehiro-2002_05_07-experimental): + + clean up. fix warning and trivial optimizations. + +2004-03-27 08:31 takehiro + + * TODO (takehiro-2002_05_07-experimental): + + updated + +2004-03-27 07:48 takehiro + + * libmp3lame/: bitstream.c, tables.c, tables.h, takehiro.c + (takehiro-2002_05_07-experimental): + + simplify the code arround huffman coding with the escape sequence. + +2004-03-23 22:17 robert + + * libmp3lame/vbrquantize.c, Makefile.unix: + + rewritten vbr-new + + the scalefactor allocation functions take into account now, that some + minimal scalefactor has to be used (the less IXMAX_VAL case) + + the output of vbr-new is not bit identical to previous ones, but the + code is much more straight forward now. + +2004-03-23 22:11 robert + + * libmp3lame/util.c: + + patch for resampling code, found by Takehiro + + this patch removes some unneccessary integer rounding + resulting mp3s where bit identical, but resampling is faster now + +2004-03-23 03:07 olcios + + * frontend/parse.c: + + fixed a compile-time issue in --longhelp + +2004-03-23 01:57 olcios + + * USAGE, doc/html/switchs.html, doc/man/lame.1, frontend/main.c, + frontend/parse.c, include/lame.h, libmp3lame/VbrTag.c, + libmp3lame/bitstream.c, libmp3lame/lame.c, + libmp3lame/lame_global_flags.h, libmp3lame/set_get.c, + libmp3lame/util.h: + + 1. added --noreplaygain switch that disables RG 2. added --replaygain-fast switch that complements --replaygain-accurate. The new switch is enabled by default in the frontend. 3. Made RG analysis no longer default in libmp3lib. RG can still be fully controlled via the libmp3lib interface, but for other interfaces, like DLL or ACM, that provide no RG control, RG analysis is now _disabled_. 4. updated documentation + +2004-03-21 17:53 takehiro + + * frontend/parse.c, libmp3lame/VbrTag.c, libmp3lame/VbrTag.h, + libmp3lame/bitstream.c, libmp3lame/bitstream.h, + libmp3lame/lame.c, libmp3lame/version.c, mpglib/interface.c + (takehiro-2002_05_07-experimental): + + more API clean up and cosmetic changes. + +2004-03-21 17:51 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + faster float comparison when FLOAT is float. + some cosmetic changes + +2004-03-21 17:14 takehiro + + * libmp3lame/VbrTag.c, libmp3lame/bitstream.c, + libmp3lame/bitstream.h, libmp3lame/encoder.c, + libmp3lame/encoder.h, libmp3lame/id3tag.c, + libmp3lame/lame-analysis.h, libmp3lame/lame.c, + libmp3lame/machine.h, libmp3lame/newmdct.c, + libmp3lame/psymodel.c, libmp3lame/psymodel.h, + libmp3lame/quantize.c, libmp3lame/quantize.h, + libmp3lame/quantize_pvt.h, libmp3lame/tables.c, + libmp3lame/tables.h, libmp3lame/takehiro.c, mpglib/interface.c + (takehiro-2002_05_07-experimental): + + clean up APIs and variable names (to fix warnings when -Wshadow) + +2004-03-21 16:27 takehiro + + * include/lame.h, libmp3lame/VbrTag.c, libmp3lame/id3tag.c, + libmp3lame/lame-analysis.h, libmp3lame/machine.h, + libmp3lame/mpglib_interface.c, libmp3lame/newmdct.c, + libmp3lame/quantize.c, libmp3lame/set_get.c, + libmp3lame/takehiro.c, libmp3lame/version.h + (takehiro-2002_05_07-experimental): + + cosmetic + +2004-03-21 15:51 takehiro + + * libmp3lame/: machine.h, psymodel.c, quantize_pvt.h + (takehiro-2002_05_07-experimental): + + clean up arround IEEE754 hack. + +2004-03-21 15:47 takehiro + + * libmp3lame/: VbrTag.c, encoder.h + (takehiro-2002_05_07-experimental): + + remove unused "nogap" related variables. + +2004-03-21 15:41 takehiro + + * libmp3lame/: VbrTag.c, encoder.c, encoder.h + (takehiro-2002_05_07-experimental): + + fix invalid vbr header output when ABR. + merge gfc->frameNum and gfc->nVbrNumFrames. + +2004-03-21 14:51 takehiro + + * libmp3lame/: encoder.h, psymodel.c, psymodel.h, quantize.c + (takehiro-2002_05_07-experimental): + + remove magic numbers + +2004-03-21 14:32 takehiro + + * libmp3lame/encoder.h (takehiro-2002_05_07-experimental): + + header file style/comment fix. + +2004-03-21 14:32 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + trivial + +2004-03-21 14:31 takehiro + + * mpglib/: layer3.c, mpg123.h (takehiro-2002_05_07-experimental): + + trivial optimization + +2004-03-21 14:31 takehiro + + * include/lame.h (takehiro-2002_05_07-experimental): + + remove obsolete API. + +2004-03-21 13:51 takehiro + + * ACM/DecodeStream.h, frontend/gtkanal.c, frontend/mp3x.c, + frontend/parse.c, libmp3lame/VbrTag.c, libmp3lame/VbrTag.h, + libmp3lame/bitstream.c, libmp3lame/bitstream.h, + libmp3lame/encoder.c, libmp3lame/encoder.h, libmp3lame/id3tag.c, + libmp3lame/lame-analysis.h, libmp3lame/lame.c, + libmp3lame/mpglib_interface.c, libmp3lame/newmdct.c, + libmp3lame/psymodel.c, libmp3lame/quantize.c, + libmp3lame/quantize.h, libmp3lame/set_get.c, libmp3lame/tables.c, + libmp3lame/tables.h, libmp3lame/takehiro.c, libmp3lame/util.c, + libmp3lame/util.h, libmp3lame/version.c, mpglib/layer3.c, + mpglib/mpglib.h (takehiro-2002_05_07-experimental): + + clean up header files. + +2004-03-21 13:00 takehiro + + * testcase.mp3 (takehiro-2002_05_07-experimental): + + new testcase + +2004-03-21 12:37 takehiro + + * libmp3lame/: encoder.c, quantize.c, quantize.h + (takehiro-2002_05_07-experimental): + + clean up APIs of set_frame_pinfo() + +2004-03-21 12:34 takehiro + + * libmp3lame/: lame.c, set_get.c, util.h + (takehiro-2002_05_07-experimental): + + clean up arround buffer flush. + and remove "mf_samples_to_encode" from lame_t. + +2004-03-21 12:33 takehiro + + * libmp3lame/encoder.c (takehiro-2002_05_07-experimental): + + trivial clean up + +2004-03-21 11:55 takehiro + + * libmp3lame/: encoder.c, lame.c, quantize.c, tables.c, util.h + (takehiro-2002_05_07-experimental): + + clean up and "possible" bug of resampling code. + - calculate resampling value with "sample_t" instead of "int". + - moved resampling initialization code into tables.c + +2004-03-21 10:37 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + oops, remove gabage... + +2004-03-21 10:34 takehiro + + * libmp3lame/: encoder.c, psymodel.c, psymodel.h + (takehiro-2002_05_07-experimental): + + clean up internal APIs + +2004-03-21 10:33 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix prototype declaration, to clarify all the ASM code cannot run when FLOAT!=float + +2004-03-21 07:12 takehiro + + * libmp3lame/: lame.c, util.c (takehiro-2002_05_07-experimental): + + header file clean up (I hope it works...) + +2004-03-21 07:10 takehiro + + * libmp3lame/: encoder.c, lame.c, util.h + (takehiro-2002_05_07-experimental): + + do not use calloc in lame_encode_* functions. + and moved some functions for better conjunctions. + +2004-03-21 07:09 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + trivial + +2004-03-21 05:08 takehiro + + * ACM/main.cpp (takehiro-2002_05_07-experimental): + + fix build problem on mingw + +2004-03-20 17:28 takehiro + + * libmp3lame/: lame.c, util.c, util.h + (takehiro-2002_05_07-experimental): + + move fill_buffer() function and make it static and bit optimizing. + +2004-03-20 16:04 takehiro + + * libmp3lame/: quantize.c, util.h, i386/quantSSE.nas + (takehiro-2002_05_07-experimental): + + Faster quantization code, based on the ideas from the main line (done by Gaby). + about 2% faster on VBR. The same algorithm can be applied to the CBR, but + currently is not. + +2004-03-19 22:09 olcios + + * libmp3lame/gain_analysis.c: + + changed the pre-processor condition related to the x86's extended FP bug when compiled by GCC with optimizations + +2004-03-19 18:18 olcios + + * libmp3lame/gain_analysis.c: + + improved comment + +2004-03-19 13:17 olcios + + * libmp3lame/gain_analysis.c: + + workaround for the gcc ceil() bug when compiled with optimizations + +2004-03-18 22:00 olcios + + * libmp3lame/gain_analysis.h: + + fixed compile-time problem with uint32_t on gcc + +2004-03-18 16:11 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + fix uninitialized memory access. + +2004-03-18 14:27 aleidinger + + * libmp3lame/: gain_analysis.c, gain_analysis.h: + + Replace Uint32_t and Int32_t with uint32_t and int32_t. There are only few + instances of them used, so there's no need to typedef new types for them. + + I hope this fixes problems on OSX reported on lame-dev. + + While I'm here, fix a cast (rgData->sampleWindow is long, not int). + +2004-03-17 18:56 aleidinger + + * libmp3lame/: bitstream.c, gain_analysis.c, gain_analysis.h, + lame.c: + + - remove config.h (prerequisite) include from gain_analysis.h + - make sure prerequisites get included in every file before gain_analysis.h + +2004-03-14 18:22 bouvigne + + * libmp3lame/gain_analysis.h: + + solved the potential data type problem + +2004-03-14 17:13 takehiro + + * frontend/parse.c, include/lame.h, libmp3lame/VbrTag.c, + libmp3lame/VbrTag.h, libmp3lame/bitstream.c, + libmp3lame/encoder.c, libmp3lame/id3tag.c, libmp3lame/lame.c, + libmp3lame/mpglib_interface.c, libmp3lame/psymodel.c, + libmp3lame/quantize.c, libmp3lame/quantize_pvt.h, + libmp3lame/set_get.c, libmp3lame/set_get.h, libmp3lame/tables.c, + libmp3lame/takehiro.c, libmp3lame/util.c, libmp3lame/util.h, + mpglib/layer3.c, mpglib/mpg123.h, mpglib/tabinit.c + (takehiro-2002_05_07-experimental): + + cosmetic changes. + +2004-03-14 16:19 takehiro + + * ACM/readme.txt (takehiro-2002_05_07-experimental): + + sync main branch + +2004-03-14 16:18 takehiro + + * ACM/ACMStream.cpp (takehiro-2002_05_07-experimental): + + sync main branch. + +2004-03-14 16:15 takehiro + + * libmp3lame/libmp3lame_vc6.dsp (takehiro-2002_05_07-experimental): + + fix MSVC6+NASM compilation + +2004-03-14 16:00 takehiro + + * ACM/main.cpp (takehiro-2002_05_07-experimental): + + oops, I removed too much. + +2004-03-14 13:47 takehiro + + * frontend/brhist.h, libmp3lame/bitstream.c, libmp3lame/encoder.c, + libmp3lame/tables.c, libmp3lame/takehiro.c, libmp3lame/util.c + (takehiro-2002_05_07-experimental): + + cosmetic and reduce warnings + +2004-03-14 12:46 takehiro + + * libmp3lame/: bitstream.h, machine.h, psymodel.c, quantize_pvt.h, + tables.c, util.h (takehiro-2002_05_07-experimental): + + fix build problem on vanilla(without ICC) VC6. + better ATH handling for psymodel + and some minor cosmetic change + +2004-03-14 12:44 takehiro + + * libmp3lame/mpglib_interface.c (takehiro-2002_05_07-experimental): + + cosmetic + +2004-03-14 12:43 takehiro + + * libmp3lame/: gain_analysis.c, gain_analysis.h + (takehiro-2002_05_07-experimental): + + backport from the main branch. + (only copied. not working currently). + +2004-03-14 11:50 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + better 8kHz/128kbps bit allocation. + +2004-03-14 06:17 takehiro + + * mpglib/interface.c (takehiro-2002_05_07-experimental): + + sync main branch (fix freeformat decoding bug done by Robert Hegemann) + +2004-03-13 14:06 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + fix a warning. + +2004-03-13 13:00 takehiro + + * Dll/BladeMP3EncDLL.c (takehiro-2002_05_07-experimental): + + fix build problem on VC6+debug mode + +2004-03-13 12:59 takehiro + + * libmp3lame/libmp3lame_vc6.dsp (takehiro-2002_05_07-experimental): + + fix build problem on VC6 + +2004-03-11 23:43 olcios + + * libmp3lame/bitstream.c: + + fixed a bug related to the usage of mpglib when decoding on the fly + +2004-03-11 19:35 olcios + + * libmp3lame/lame.c: + + fixed compile-time problem when mpglib is disabled + +2004-03-10 20:49 robert + + * doc/html/: contributors.html, history.html: + + history + +2004-03-10 00:50 robert + + * mpglib/interface.c: + + patch for freeformat decoding bug + +2004-03-09 19:04 bouvigne + + * libmp3lame/lame.c: + + typo + +2004-03-09 00:35 robert + + * libmp3lame/vbrquantize.c: + + found a sample which did not give bit identical result with the previous + patch. found out why and corrected it, so now the results for + find_scalefac_ave_[x34|ISO] are identical to the original code, + but --preset fast standard is ~7 percent faster now. + +2004-03-08 04:13 takehiro + + * mpglib/layer1.c (takehiro-2002_05_07-experimental): + + fix layer1 compilation problem. + +2004-03-08 04:12 takehiro + + * libmp3lame/i386/choose_table.nas + (takehiro-2002_05_07-experimental): + + remove unused label + +2004-03-08 04:04 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + fix alignment work and build problem with icl(MS-Windows) + +2004-03-08 00:54 robert + + * libmp3lame/vbrquantize.c: + + faster "find_scalefac_ave_[x34|ISO]": + this patch gave bit identical results on all tested samples compared to + previous version, so I'm pretty much confident that I don't introduce + a new bug here. + the speeding up of this functions results in an overall speed increase of + almost 7 percent for --preset fast standard + +2004-03-07 23:55 robert + + * Makefile.unix, Makefile.MSVC: + + in case of single precision (FLOAT8==float) we have to make sure that + the mpglib uses REAL==float too. otherwise the decoder will moan about + too small buffers + +2004-03-07 14:18 takehiro + + * mpglib/interface.c (takehiro-2002_05_07-experimental): + + no Xing-VBR header except layer 3 + +2004-03-06 17:52 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + fix it ignores --scale option. + +2004-03-06 17:37 takehiro + + * libmp3lame/i386/fft3dn.nas (takehiro-2002_05_07-experimental): + + remove Japanese comments. + +2004-03-06 16:32 takehiro + + * libmp3lame/: psymodel.h, tables.c + (takehiro-2002_05_07-experimental): + + revert the last psymodel change, and implement the better way to archive + more precise frequency analysis in the lower frequency region. This is + done by changing frequency -> bark conversion equation. + +2004-03-06 16:02 takehiro + + * libmp3lame/i386/choose_table.nas + (takehiro-2002_05_07-experimental): + + remove Jananese comments. + +2004-03-06 15:36 bouvigne + + * libmp3lame/version.h: + + entering beta stage + +2004-03-06 15:34 bouvigne + + * doc/html/history.html: + + history + +2004-03-01 22:21 robert + + * configMS.h, libmp3lame/version.h: + + we are now at 3.96 alpha 4 + +2004-03-01 22:20 robert + + * libmp3lame/psymodel.c: + + bug fix: the highly optimized loops did an off by one access resulting + in often invalid energy and threshold calculations. (both psy models + affected). added a workaround and some assertions. + +2004-03-01 15:11 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix for testcase... (oops, simple mistake) + +2004-02-29 19:55 robert + + * libmp3lame/: bitstream.c, takehiro.c: + + fixing the "huffman decode overrun" and "mp3x problem" + +2004-02-29 18:20 bouvigne + + * doc/html/: contributors.html, history.html: + + no message + +2004-02-29 18:12 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix for 8kHz with 128kbps. + +2004-02-29 17:58 takehiro + + * libmp3lame/: psymodel.c, psymodel.h, tables.c, util.h + (takehiro-2002_05_07-experimental): + + better partitioning for psymodel calculation (very much experimental!) + +2004-02-29 17:17 takehiro + + * mpglib/layer1.c: + + fix layer1 decoding bug + +2004-02-29 17:16 takehiro + + * mpglib/layer1.c (takehiro-2002_05_07-experimental): + + fix monural file decoding bug in layer1, reported by Goran Markovic. + +2004-02-26 17:20 takehiro + + * frontend/get_audio.c: + + fixed Layer2 decoding bug reported by Goran Markovic + +2004-02-26 16:31 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + fixed Layer2 decoding issue, reported by Goran Markovic. + +2004-02-25 22:10 robert + + * libmp3lame/util.c: + + fixing some aliasing problem in fastlog2 calculation + +2004-02-25 21:46 robert + + * libmp3lame/vbrquantize.c: + + getting rid of a warning about a function being defined but not used + +2004-02-25 21:46 robert + + * libmp3lame/gain_analysis.c: + + fixing code relying on compiler implementation details + +2004-02-25 21:41 robert + + * frontend/parse.c, libmp3lame/lame.c, libmp3lame/psymodel.c, + libmp3lame/quantize.c, libmp3lame/VbrTag.c, libmp3lame/set_get.c, + libmp3lame/util.c: + + getting rid of some compiler warnings: + - about too long string constants + - about C++ stylish comments + there is still a warning about the use of a C99 hexadecimal floating + constant in portableio.c. will this compile on older C-compilers? + +2004-02-24 02:18 takehiro + + * testcase.mp3 (takehiro-2002_05_07-experimental): + + testcase with new huffman coding. + +2004-02-24 01:57 olcios + + * libmp3lame/lame.c: + + fixed a bug with --resample and ReplayGain analysis of input data. With certain parameters the data sent to analysis was mangled (some samples missing, some doubled, some in the wrong order). With most natural music the error wasn't vast (below 1dB), but with e.g. a sine wave the gain error was audible. + +2004-02-23 19:48 bouvigne + + * libmp3lame/gain_analysis.h: + + now works under gcc, but I am not sure about the typedefs on different platforms. + +2004-02-23 18:53 bouvigne + + * libmp3lame/: gain_analysis.h, util.h: + + moved replaygain_t to gain_analysis.h + +2004-02-23 14:50 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + improve lossless coding when all the quantized values in the same scalefactor band are even number. + +2004-02-22 21:17 bouvigne + + * libmp3lame/: bitstream.c, gain_analysis.c, gain_analysis.h, + lame.c, util.c, util.h: + + made ReplayGain reentrant + +2004-02-22 21:16 bouvigne + + * libmp3lame/quantize_pvt.c: + + yet another "usefullsize" bug (found by passing the python tests) + +2004-02-22 21:14 bouvigne + + * test/: CBRABR.op, VBR.op, misc.op, shortCBRABR.op, shortVBR.op: + + Updated test files. + As the cbr/abr and vbr ones are quite long, I also added some short ones. + +2004-02-17 00:37 robert + + * libmp3lame/lame.c: + + bug fix: in mono mode all block type where of short type due to forced + block type coupling + +2004-02-16 21:51 robert + + * libmp3lame/gain_analysis.c: + + bug fix by John Edwards (48 kHz replay gain segmentation fault) + +2004-02-15 21:39 robert + + * libmp3lame/: lame.c, vbrquantize.c: + + standard ISO quantization for vbr-mtrh + +2004-02-15 19:05 robert + + * libmp3lame/: lame.c, takehiro.c: + + bug fix: usefullsize may become negativ due to some optimizations + +2004-02-15 13:09 takehiro + + * libmp3lame/id3tag.c (takehiro-2002_05_07-experimental): + + sprintf -> snprintf and some trivial clean up. + +2004-02-15 01:20 robert + + * libmp3lame/takehiro.c: + + a simple -V9 -f line lets LAME crash, + there seems to be something wrong with scalefactor width + at least my inserted assertions indicate this + +2004-02-10 02:04 robert + + * libmp3lame/vbrquantize.c: + + try to make some use of max_nonzero_coeff in vbr-mtrh + +2004-02-08 21:58 takehiro + + * frontend/: brhist.c, get_audio.c, get_audio.h, gtkanal.c, + lame.dsp, main.c, mp3rtp.c, parse.c, timestatus.c, timestatus.h + (takehiro-2002_05_07-experimental): + + misc clean ups. + - gfp/gfc things + - mp3 decoding patch from Dmitriy Startsev + - remove an old file + +2004-02-08 21:57 takehiro + + * mpglib/interface.c (takehiro-2002_05_07-experimental): + + mp3 decoding patch from Dmitriy Startsev + +2004-02-08 19:00 bouvigne + + * libmp3lame/presets.c: + + reduced the number of short blocks + +2004-02-08 14:08 bouvigne + + * Makefile.am, lame.dsw: + + removed old workspace + +2004-02-08 12:44 bouvigne + + * libmp3lame/: quantize_pvt.c, takehiro.c: + + inverted a while statement, some int ->unsigned. + I hope that they will be safe this time. + +2004-02-08 03:10 robert + + * libmp3lame/takehiro.c: + + sorry Gabriel, reverting your signed->unsigned patch due to exceptions + while encoding awe32_20sec.wav using --preset standard + +2004-02-08 03:06 robert + + * libmp3lame/quantize_pvt.c: + + sorry Gabriel, reverting your signed->unsigned patch because of + exceptions in awe32_20sec.wav using --preset standard + +2004-02-08 03:01 robert + + * libmp3lame/vbrquantize.c: + + bug fix: scalefactors may have been read from uninitialized memory + +2004-02-08 02:12 robert + + * libmp3lame/: takehiro.c, vbrquantize.c: + + calculating xrpow_max for vbr_mtrh too + +2004-02-07 19:38 bouvigne + + * libmp3lame/: quantize_pvt.c, takehiro.c: + + some int -> unsigned int + +2004-02-06 16:56 takehiro + + * frontend/get_audio.c, mpglib/interface.c: + + mp3 decoding patch from Dmitriy Startsev + +2004-02-04 20:17 bouvigne + + * libmp3lame/version.h: + + bump alpha because of the fixed crash + +2004-02-04 20:16 bouvigne + + * libmp3lame/takehiro.c: + + fixed a crash in quantize_xrpow occuring when using low bitrates (32kbps) + +2004-02-02 15:20 olcios + + * USAGE, doc/html/switchs.html: + + reworded the RG part. Discussed with: Alexander Leidinger + +2004-02-02 14:17 olcios + + * testcase.mp3: + + oops, committed an experimental file, reverting back to 1.80 + +2004-02-02 13:28 aleidinger + + * configure: + + regen + +2004-02-02 13:25 aleidinger + + * configure.in: + + Add a check for 64 bit off_t's ("LARGEFILE" support). + + This may not be enough as lame uses ints and longs where other types + may be more correct, but it may work in some cases. + + HOWTO provided by: Dan Nelson + +2004-02-02 13:02 aleidinger + + * doc/man/lame.1: + + - reformatted the replaygain part (less than 80 characters per line) + - reworded some parts + - add a note about the decoder requierement for the --decode, + --replaygain-accurate and --clipdetect options + + Discussed with: Aleksander Korzynski + +2004-02-02 12:58 aleidinger + + * config.h.in, configure: + + regen + +2004-02-02 12:57 aleidinger + + * configMS.h: + + Add the DECODE_ON_THE_FLY define in the HAVE_MPGLIB case. + +2004-02-02 12:57 aleidinger + + * configure.in, include/lame.h: + + - enable bitrate histogram by default + discussed with Gabriel in Sept. 03 + + - define DECODE_ON_THE_FLY for the replaygain feature in the HAVE_MPGLIB + case too (moved from include/lame.h, I think it's cleaner this way) + discussed with Aleksander Korzynski + +2004-02-02 12:38 aleidinger + + * libmp3lame/id3tag.c: + + Patch from Ti Kan : + ---snip--- + Below is a patch to make Lame 3.95.1 compile and run on AIX, HP-UX, + IRIX, Solaris, UnixWare, SCO Open Server and SunOS 4.1.x. + + The change involves the call to snprintf() in libmp3lame/id3tag.c., + but snprintf() is not available on many of these platforms. I know + that in general replacing snprintf() with sprintf() removes a layer + of string buffer overflow protection, but in this case it should + be safe because the size of string is bounded. + ---snip--- + +2004-01-31 20:05 olcios + + * testcase.mp3, frontend/main.c, libmp3lame/lame.c: + + disabled peak sample detection when LAME tag is not written into the file + +2004-01-29 16:39 bouvigne + + * doc/html/history.html: + + history + +2004-01-29 16:31 bouvigne + + * libmp3lame/version.h: + + bump alpha because of the fixed crashes + +2004-01-29 16:26 bouvigne + + * libmp3lame/takehiro.c: + + fixed bug #886989 + +2004-01-26 14:00 olcios + + * USAGE, doc/html/switchs.html, doc/man/lame.1, frontend/parse.c: + + updated documentation and --longhelp on RG + +2004-01-26 12:05 olcios + + * frontend/main.c, frontend/main.h, frontend/parse.c, + include/lame.h, libmp3lame/VbrTag.c, libmp3lame/VbrTag.h, + libmp3lame/bitstream.c, libmp3lame/lame.c, libmp3lame/set_get.c, + libmp3lame/util.h: + + removed ReportLameTagProgress (it is not LAME API). Fixed --replaygain-accurate and --clipdetect. + +2004-01-25 10:12 takehiro + + * libmp3lame/VbrTag.c (takehiro-2002_05_07-experimental): + + fix a bug when the malloc is failed. + +2004-01-25 10:06 takehiro + + * libmp3lame/: lame.c, VbrTag.c (takehiro-2002_05_07-experimental): + + fix id3v2 tag output + +2004-01-25 10:05 takehiro + + * libmp3lame/: VbrTag.h, id3tag.c, id3tag.h, quantize.h + (takehiro-2002_05_07-experimental): + + trivial + +2004-01-25 08:44 takehiro + + * libmp3lame/id3tag.c (takehiro-2002_05_07-experimental): + + fix total track number buffer overrun bug. + +2004-01-25 08:34 takehiro + + * libmp3lame/id3tag.c (takehiro-2002_05_07-experimental): + + remove unused prototype + +2004-01-25 08:33 takehiro + + * frontend/parse.c, libmp3lame/id3tag.c, libmp3lame/util.h + (takehiro-2002_05_07-experimental): + + total track ID3 tag, requested at sf.net (Request ID #630803) + http://sourceforge.net/tracker/index.php?func=detail&aid=630803&group_id=290&atid=350290 + +2004-01-25 08:30 takehiro + + * lame_vc6.dsw (takehiro-2002_05_07-experimental): + + sync with the main branch.(related mp3x projects) + +2004-01-25 08:28 takehiro + + * frontend/lame.dsw (takehiro-2002_05_07-experimental): + + remove old files. + +2004-01-25 05:45 takehiro + + * frontend/parse.c (takehiro-2002_05_07-experimental): + + added message about "--preset medium" + +2004-01-24 17:37 takehiro + + * ACM/: ACM.cpp, ACM.h, ACMStream.cpp, ACMStream.h, + AEncodeProperties.cpp, DecodeStream.cpp, main.cpp + (takehiro-2002_05_07-experimental): + + fix build problem(I hope...) + +2004-01-24 17:31 takehiro + + * frontend/main.h (takehiro-2002_05_07-experimental): + + sync the main branch. + - include limits.h only when there's the header. + +2004-01-24 17:28 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + sync with the main branch. + - remove message output during reading AIFF file. + +2004-01-21 13:50 aleidinger + + * Makefile.in, ACM/Makefile.in, Dll/Makefile.in, + frontend/Makefile.in, libmp3lame/Makefile.in, mpglib/Makefile.in: + + regen + +2004-01-21 13:48 aleidinger + + * frontend/main.h: + + only include limits.h if it is present on the system + +2004-01-21 10:17 bouvigne + + * libmp3lame/quantize.c: + + missing {} in last fix + +2004-01-21 09:41 bouvigne + + * ACM/ACM.dsw, ACM/Makefile.am, ACM/lameACM.dsp, Makefile.B32, + Makefile.DJGPP, Makefile.am, PRESETS.draft, README.B32, + README.DJGPP, Dll/Example.dsp, Dll/Example.dsw, + Dll/MP3EncDll.dsp, Dll/MP3EncDll.dsw, Dll/Makefile.am, + frontend/Makefile.am, frontend/lame.dsp, frontend/lame.dsw, + frontend/mp3x.dsp, frontend/mp3x.dsw, libmp3lame/Makefile.am, + libmp3lame/libmp3lame.dsp, mpglib/Makefile.am, mpglib/mpglib.dsp: + + removed old unmaintained files + +2004-01-20 18:41 bouvigne + + * libmp3lame/quantize.c: + + fixed a crash: + sometimes quantization could overflow because of big xr_pow values + +2004-01-20 17:04 takehiro + + * Dll/Makefile.mingw32 (takehiro-2002_05_07-experimental): + + remove unused include path + +2004-01-20 16:24 takehiro + + * Dll/: BladeMP3EncDLL.c, BladeMP3EncDLL.h, Example.cpp, + Makefile.mingw32 (takehiro-2002_05_07-experimental): + + DLL build and minor message fix. but we may need API fix, too... + +2004-01-20 06:22 takehiro + + * frontend/main.c (takehiro-2002_05_07-experimental): + + do not include "internal" header file. + +2004-01-18 15:54 takehiro + + * configure (takehiro-2002_05_07-experimental): + + regen + +2004-01-18 15:52 takehiro + + * config.h.in, configure.in, mac/Precompile_Common.h + (takehiro-2002_05_07-experimental): + + remove ieee754_float64_t + +2004-01-18 13:51 takehiro + + * frontend/gtkanal.c, libmp3lame/quantize.c + (takehiro-2002_05_07-experimental): + + mp3x: fix mean bits display when mono or mpeg2 + +2004-01-18 13:48 takehiro + + * frontend/parse.c (takehiro-2002_05_07-experimental): + + make it sure not to call "experimental" switches when it is not DEBUG mode or ALPHA version. + +2004-01-18 13:21 takehiro + + * frontend/gtkanal.c (takehiro-2002_05_07-experimental): + + fix typo + +2004-01-18 12:52 takehiro + + * Makefile.am, Makefile.in, PRESETS.draft, lame.dsw, ACM/ACM.dsw, + ACM/Makefile.am, ACM/Makefile.in, ACM/lameACM.dsp, + Dll/Example.dsp, Dll/Example.dsw, Dll/MP3EncDll.dsp, + Dll/MP3EncDll.dsw, Dll/Makefile.am, Dll/Makefile.in, + frontend/Makefile.am, frontend/Makefile.in, frontend/mp3x.dsp, + frontend/mp3x.dsw, frontend/mp3x_vc6.dsp, libmp3lame/Makefile.am, + libmp3lame/Makefile.in, libmp3lame/libmp3lame.dsp, + mpglib/Makefile.am, mpglib/Makefile.in, mpglib/mpglib.dsp + (takehiro-2002_05_07-experimental): + + remove all the outdated files. + copied mp3x_vc6.dsp from main branch. + +2004-01-18 12:51 takehiro + + * libmp3lame/: quantize.c, lame.c + (takehiro-2002_05_07-experimental): + + cosmetic + +2004-01-18 12:47 takehiro + + * configure (takehiro-2002_05_07-experimental): + + regen + +2004-01-18 12:47 takehiro + + * config.h.in, configure.in, libmp3lame/tables.c, + libmp3lame/tables.h, libmp3lame/takehiro.c + (takehiro-2002_05_07-experimental): + + replace "unsigned long long" -> "uint64_t" + +2004-01-18 12:46 takehiro + + * libmp3lame/VbrTag.c (takehiro-2002_05_07-experimental): + + cosmetic + +2004-01-17 18:33 takehiro + + * include/lame.h, libmp3lame/VbrTag.c, libmp3lame/VbrTag.h, + libmp3lame/bitstream.c, mpglib/interface.c + (takehiro-2002_05_07-experimental): + + moved VBR header related code. now the vbr header structure is in lame.h. + This means applications can use the VBR header information via it. + +2004-01-17 18:21 takehiro + + * libmp3lame/lame-analysis.h (takehiro-2002_05_07-experimental): + + remove unused definition + +2004-01-17 18:19 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + cosmetic + +2004-01-17 18:14 takehiro + + * libmp3lame/: bitstream.c, lame.c + (takehiro-2002_05_07-experimental): + + fix assert() condition. + remove unused function. + +2004-01-17 18:08 takehiro + + * frontend/main.c, libmp3lame/VbrTag.c, libmp3lame/VbrTag.h + (takehiro-2002_05_07-experimental): + + remove ReportLameTagProgress(). it is not LAME API at all... + +2004-01-17 18:07 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + cosmetic + +2004-01-17 17:56 takehiro + + * libmp3lame/: encoder.h, lame.c, machine.h, util.h + (takehiro-2002_05_07-experimental): + + include file clean up. + +2004-01-17 17:44 takehiro + + * libmp3lame/mpglib_interface.c, mpglib/interface.c, + mpglib/interface.h, mpglib/mpglib.h + (takehiro-2002_05_07-experimental): + + changed InitMP3() and ExitMP3() API. + +2004-01-17 17:37 takehiro + + * libmp3lame/util.h (takehiro-2002_05_07-experimental): + + remove freegfc() prototype + +2004-01-17 17:35 takehiro + + * libmp3lame/: util.c, lame.c (takehiro-2002_05_07-experimental): + + simplify freegfc() + +2004-01-17 17:04 takehiro + + * frontend/brhist.c, frontend/console.c, frontend/get_audio.c, + frontend/gpkplotting.c, frontend/gtkanal.c, frontend/main.c, + frontend/mp3rtp.c, frontend/rtp.c, include/lame.h, + libmp3lame/lame-analysis.h, libmp3lame/machine.h, + libmp3lame/mpglib_interface.c, mpglib/common.c, + mpglib/decode_i386.c, mpglib/interface.c, mpglib/layer1.c, + mpglib/layer2.c, mpglib/layer3.c, mpglib/mpg123.h + (takehiro-2002_05_07-experimental): + + renamed "stereo" -> "channels" to make things more clear. + remove unused definitions. + +2004-01-17 14:25 takehiro + + * README.B32, README.DJGPP (takehiro-2002_05_07-experimental): + + too much old. removed. + +2004-01-17 14:23 takehiro + + * API, HACKING, ACM/ACMStream.h, ACM/DecodeStream.h, + Dll/BladeMP3EncDLL.c, Dll/Makefile.mingw32, dshow/Encoder.h, + frontend/brhist.c, frontend/brhist.h, frontend/get_audio.c, + frontend/get_audio.h, frontend/gtkanal.c, frontend/gtkanal.h, + frontend/main.c, frontend/mp3rtp.c, frontend/mp3x.c, + frontend/parse.c, frontend/parse.h, frontend/timestatus.c, + frontend/timestatus.h, include/lame.h, libmp3lame/Makefile.am, + libmp3lame/Makefile.in, libmp3lame/VbrTag.c, libmp3lame/VbrTag.h, + libmp3lame/bitstream.c, libmp3lame/bitstream.h, + libmp3lame/encoder.c, libmp3lame/encoder.h, libmp3lame/id3tag.c, + libmp3lame/id3tag.h, libmp3lame/lame.c, + libmp3lame/lame_global_flags.h, libmp3lame/libmp3lame_vc6.dsp, + libmp3lame/mpglib_interface.c, libmp3lame/newmdct.c, + libmp3lame/newmdct.h, libmp3lame/psymodel.c, + libmp3lame/psymodel.h, libmp3lame/quantize.c, + libmp3lame/quantize.h, libmp3lame/quantize_pvt.h, + libmp3lame/set_get.c, libmp3lame/set_get.h, libmp3lame/tables.c, + libmp3lame/takehiro.c, libmp3lame/util.c, libmp3lame/util.h, + mpglib/Makefile.am, mpglib/Makefile.in, mpglib/common.c, + mpglib/common.h, mpglib/dct64_i386.c, mpglib/decode_i386.c, + mpglib/interface.c, mpglib/interface.h, mpglib/layer1.c, + mpglib/layer1.h, mpglib/layer2.c, mpglib/layer2.h, + mpglib/layer3.c, mpglib/layer3.h, mpglib/mpg123.h, + mpglib/mpglib.h (takehiro-2002_05_07-experimental): + + Large API clean up. + To make MP3 decoding function reentrant, we need to replace the all API... + + all the variables are now marked as "INTERNAL" and applications cannot + access them directly. + + "lame_global_flags" structure is removed. Use "lame_t" instead. + +2004-01-17 14:11 takehiro + + * Makefile.B32, Makefile.DJGPP (takehiro-2002_05_07-experimental): + + They are too much outdated. removed. + +2004-01-17 11:34 takehiro + + * config.h.in, configure.in, frontend/brhist.c, + frontend/get_audio.c, frontend/get_audio.h, + frontend/gpkplotting.c, frontend/gtkanal.c, frontend/main.c, + frontend/main.h, frontend/parse.c, frontend/portableio.c, + libmp3lame/mpglib_interface.c, mac/Precompile_Common.h, + mpglib/common.c, mpglib/interface.c, mpglib/layer2.c, + mpglib/layer3.c, mpglib/mpg123.h + (takehiro-2002_05_07-experimental): + + cleanup. remove unused functions/definitions. + +2004-01-17 10:51 takehiro + + * frontend/parse.h (takehiro-2002_05_07-experimental): + + fix warning + +2004-01-17 10:45 takehiro + + * frontend/parse.c (takehiro-2002_05_07-experimental): + + fix usage message of --priority + +2004-01-17 10:17 takehiro + + * frontend/get_audio.c, frontend/main.c, frontend/parse.c, + frontend/portableio.c, frontend/portableio.h, include/lame.h, + libmp3lame/VbrTag.c, libmp3lame/lame.c, libmp3lame/tables.c, + mpglib/common.c, mpglib/common.h, mpglib/tabinit.c + (takehiro-2002_05_07-experimental): + + remove unused code and old APIs. + make some functions/arrays static. + +2004-01-17 09:35 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + fix it does not write id3v2 at all. + make bitrate table static. + +2004-01-15 19:05 aleidinger + + * frontend/parse.c: + + We should not need errno... introduced in the last commit, remove it. + +2004-01-15 19:04 aleidinger + + * frontend/parse.c: + + Different fix for the priority parsing bug, uses less code. + + Tested by: Gabriel + +2004-01-15 13:54 bouvigne + + * doc/html/history.html, ACM/TODO, doc/html/index.html, + doc/html/switchs.html: + + doc, history + +2004-01-15 11:15 bouvigne + + * include/lame.h, libmp3lame/lame.c, + libmp3lame/lame_global_flags.h, libmp3lame/set_get.c: + + made lame.h identical with or without DECODE_ON_THE_FLY. + made gfp identical with or without DECODE_ON_THE_FLY. + +2004-01-15 01:24 olcios + + * USAGE, frontend/parse.c, libmp3lame/lame.c: + + changed the behaviour of --clipdetect to force RG analysis on decoded data (not input data). Updated --longhelp and documentation + +2004-01-14 14:38 bouvigne + + * libmp3lame/psymodel.c: + + minor code change in mask_add + +2004-01-14 14:16 bouvigne + + * libmp3lame/psymodel.c: + + minor code change in mask_add + +2004-01-13 19:23 bouvigne + + * frontend/parse.c: + + isnumber ->is_number + +2004-01-13 18:35 glessard + + * frontend/get_audio.c: + + Removed a spurious fprintf that occurred during AIFF-C decoding. + +2004-01-13 17:36 bouvigne + + * USAGE: + + ReplayGain ->89dB + +2004-01-13 17:30 takehiro + + * frontend/get_audio.c: + + fix mp3 decoding... + +2004-01-13 13:30 bouvigne + + * frontend/parse.c: + + fixed issue when --priority is not followed by a number but by another + argument. + + Btw, the situation is the same with a lot of other settings. + +2004-01-13 12:36 bouvigne + + * libmp3lame/version.h: + + 3.96a1 + +2004-01-12 18:09 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + bit better diveding point of huffman coding. + +2004-01-12 17:23 takehiro + + * TODO (takehiro-2002_05_07-experimental): + + updated + +2004-01-12 16:54 takehiro + + * libmp3lame/: lame.c, quantize.c, set_get.c, util.h + (takehiro-2002_05_07-experimental): + + implement lame_set_maskingadjust() and lame_set_maskingadjust_short() as is in LAME3.x branch. + + get_XX functions are not yet coded. + +2004-01-12 16:50 takehiro + + * libmp3lame/: lame.c, set_get.c, tables.c + (takehiro-2002_05_07-experimental): + + fix it ignores --athlower and --athcurve option (always use default setting) + and clean up ATH related functions. + +2004-01-12 14:49 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + better mp3 file header analysis (and bugfix). + +2004-01-12 13:44 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + consider subblock position when calculating the PE value + (usually, subblock 3 needs more bits than subblock 1) + +2004-01-12 13:40 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + cosmetic + +2004-01-12 09:03 bouvigne + + * doc/html/history.html: + + history + +2004-01-12 08:59 bouvigne + + * libmp3lame/gain_analysis.c: + + changed RG level to 89dB + +2004-01-12 08:42 bouvigne + + * libmp3lame/version.h: + + back into 3.95 because of the fixed crash + +2004-01-12 08:41 bouvigne + + * libmp3lame/takehiro.c: + + fixed a potential crash with fast vbr (introduced by myself) + +2004-01-12 07:17 takehiro + + * frontend/parse.c, include/lame.h, libmp3lame/lame.c, + libmp3lame/lame_global_flags.h, libmp3lame/psymodel.c, + libmp3lame/set_get.c (takehiro-2002_05_07-experimental): + + added "--sameblock" option, to help the playback problems on some buggy decoders.(like some DVD/CD-R mp3 player) + +2004-01-12 06:50 takehiro + + * frontend/parse.c, libmp3lame/set_get.c + (takehiro-2002_05_07-experimental): + + clean up quality setting. + +2004-01-11 15:39 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix for short block i-stereo band mis-selection. + +2004-01-11 15:01 bouvigne + + * libmp3lame/lame.c: + + small cleanup in the lowpass/samplefreq selection code + +2004-01-11 14:39 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + quick fix for i-stereo. it accidentially uses i-stereo on the scalefactor + where we do not want to use (and where we do not set the direction). + +2004-01-11 14:04 takehiro + + * config.h.in, configure (takehiro-2002_05_07-experimental): + + regen + +2004-01-11 13:37 takehiro + + * configure.in, mac/Precompile_Common.h + (takehiro-2002_05_07-experimental): + + remove IEEE854_float80 + +2004-01-11 12:46 takehiro + + * testcase.mp3 (takehiro-2002_05_07-experimental): + + regen + +2004-01-11 12:45 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + fix the fatal reservoir usage bug. + - meaning of "--nores" was opposite. + - it does not use reservoir at all when VBR. + +2004-01-11 12:02 takehiro + + * libmp3lame/VbrTag.c (takehiro-2002_05_07-experimental): + + fix Tag problem when CBR. + +2004-01-11 12:01 takehiro + + * libmp3lame/VbrTag.c (takehiro-2002_05_07-experimental): + + cosmetic + +2004-01-11 11:56 takehiro + + * frontend/mp3rtp.c (takehiro-2002_05_07-experimental): + + rtp cannot send vbr header. + +2004-01-11 11:37 takehiro + + * libmp3lame/: VbrTag.c, VbrTag.h + (takehiro-2002_05_07-experimental): + + make PutLameVBR() as static + +2004-01-11 11:22 aleidinger + + * configure: + + regen + +2004-01-11 11:20 aleidinger + + * configure.in: + + Welcome to 3.96. + +2004-01-11 10:21 bouvigne + + * libmp3lame/version.h: + + We are now in 3.96 + +2004-01-11 10:03 takehiro + + * frontend/: get_audio.c, get_audio.h + (takehiro-2002_05_07-experimental): + + ignore the MPEG header whose layer is not same as the filename. + +2004-01-11 09:56 takehiro + + * frontend/get_audio.h (takehiro-2002_05_07-experimental): + + fix build problem with libsndfile. + +2004-01-11 02:21 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + remove unused tables. + +2004-01-11 01:19 takehiro + + * testcase.mp3, libmp3lame/tables.c, libmp3lame/tables.h, + libmp3lame/takehiro.c, libmp3lame/i386/choose_table.nas + (takehiro-2002_05_07-experimental): + + choose from 4 code table when ixmax = 2, 3, ..., 7 + +2004-01-10 22:47 takehiro + + * libmp3lame/i386/choose_table.nas + (takehiro-2002_05_07-experimental): + + cosmetic + +2004-01-10 21:20 olcios + + * doc/html/history.html: + + cosmetic + +2004-01-10 20:38 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix mp3x sometimes crashes. + +2004-01-10 20:31 takehiro + + * configure (takehiro-2002_05_07-experimental): + + regen by hand + +2004-01-10 20:29 takehiro + + * Makefile.B32, Makefile.unix, config.h.in, configure.in, + frontend/mp3x.dsp (takehiro-2002_05_07-experimental): + + remove symbol HAVE_GTK + +2004-01-10 20:20 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + trivial + +2004-01-10 20:16 takehiro + + * frontend/mp3x.c, libmp3lame/lame.c, libmp3lame/set_get.c, + libmp3lame/set_get.h, mpglib/layer3.c + (takehiro-2002_05_07-experimental): + + clean up and fix analyzer hook related code. + +2004-01-10 20:15 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + trivial + +2004-01-10 19:34 takehiro + + * libmp3lame/: bitstream.c, tables.c, tables.h, takehiro.c, + i386/choose_table.nas (takehiro-2002_05_07-experimental): + + clean up huffman coding tables. + +2004-01-10 19:24 takehiro + + * testcase.mp3, libmp3lame/bitstream.c, libmp3lame/tables.c, + libmp3lame/takehiro.c, libmp3lame/i386/choose_table.nas + (takehiro-2002_05_07-experimental): + + little bit better huffman coding when ix_max = 2 + +2004-01-10 18:25 takehiro + + * testcase.mp3, libmp3lame/tables.c, libmp3lame/tables.h, + libmp3lame/takehiro.c, libmp3lame/i386/choose_table.nas + (takehiro-2002_05_07-experimental): + + little bit better huffman coding when ix_max is 1. + +2004-01-10 17:28 olcios + + * USAGE: + + cosmetic change + +2004-01-10 16:14 takehiro + + * libmp3lame/lame.c: + + fix the display of lowpass fileter config. + +2004-01-10 16:01 takehiro + + * libmp3lame/VbrTag.c (takehiro-2002_05_07-experimental): + + main line merge. + - Gaby's VBRtag fix (do not include the vbr header into the vbr seek table as it breaks a player). + +2004-01-10 15:57 takehiro + + * ACM/ACMStream.cpp (takehiro-2002_05_07-experimental): + + main line merge + - Gaby's buffer size fix. + +2004-01-10 12:59 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + added one more error check. + +2004-01-10 12:31 takehiro + + * TODO (takehiro-2002_05_07-experimental): + + update + +2004-01-10 12:29 aleidinger + + * testcase.mp3: + + testcase for 3.95 + +2004-01-10 12:29 takehiro + + * doc/html/history.html: + + added mpglib fix + +2004-01-10 12:18 aleidinger + + * ChangeLog: + + update CVS history + +2004-01-10 12:13 aleidinger + + * libmp3lame/version.h: + + Preperation for 3.95 RELEASE. + + Please notify me and Gabriel in case you change something from this + point in time upto the 3.96 version bump. + +2004-01-10 12:10 aleidinger + + * doc/html/history.html: + + faster on PPC + +2004-01-10 12:03 aleidinger + + * libmp3lame/util.h: + + do not use FastLog implicitely + +2004-01-10 12:02 aleidinger + + * configMS.h: + + explicit use of FastLog + +2004-01-10 11:42 aleidinger + + * configure: + + regen + +2004-01-10 11:35 aleidinger + + * configure.in: + + - use the IEEE 754 hack and FastLog on x86 and PPC only + - make the use of FastLog explicit + + PPC performance: + 1GHz G4 + "Standard" : 396 s (100%) + FastLog : 371 s ( 93%) + FastLog, 754 : 365 s ( 92%) + 754 : 388 s ( 98%) + + 2GHz G5 (dual), cbr, vbr + "Standard" : 166 s (100%), 328 s (100%) + FastLog : 169 s (102%), 338 s (102%) + FastLog, 754 : 148 s ( 90%), 288 s ( 88%) + 754 : 145 s ( 87%), 279 s ( 85%) + + On a G5 we shouldn't use FastLog (I assume highly optimized for G5 log*() + routines in the standard math library), but configure doesn't know ATM how + do check for a G5. + +2004-01-10 10:38 takehiro + + * frontend/get_audio.c: + + backport from my experimental branch to fix the crash when invalid input. + +2004-01-10 10:27 takehiro + + * mpglib/: common.c, interface.c, layer1.c, layer3.c: + + backport from my experimenhtal branch, to fix the crash when invalid input. + +2004-01-10 09:55 takehiro + + * doc/html/history.html: + + effetc->affect reported at sf.net (BugID #867502) + +2004-01-08 19:55 olcios + + * libmp3lame/gain_analysis.c: + + comment update (clarification) + +2004-01-08 19:14 olcios + + * USAGE: + + Removed --replaygain from USAGE, because it had been defaulted and the option removed from LAME. Updated information on --replaygain-accurate. + +2004-01-08 15:58 bouvigne + + * configMS.h, doc/html/history.html, doc/html/index.html: + + predicted release date: January 11th + +2004-01-07 17:58 aleidinger + + * frontend/Makefile.in: + + regen + +2004-01-07 17:57 aleidinger + + * frontend/Makefile.am: + + Add mp3x_vc6.dsp. + + Requested by: Gabriel + +2004-01-07 17:35 bouvigne + + * README.WINGTK, lame_vc6.dsw, frontend/lame_vc6.dsp, + frontend/mp3x_vc6.dsp, libmp3lame/libmp3lame_vc6.dsp, + mpglib/mpglib_vc6.dsp: + + added back mp3x to the VC6 projects + +2004-01-07 15:57 aleidinger + + * configure: + + regen + +2004-01-07 15:51 aleidinger + + * configure.in: + + - bump version to 3.95 + - disable layer1 decoding by default + - reword the layer options and some option descriptions + - enable the use of the fast log function on every CPU (for x86 this + is implicit by the ieee hack) + +2004-01-07 15:26 aleidinger + + * config.h.in: + + add the fast log option + +2004-01-07 13:26 bouvigne + + * mpglib/mpglib_vc6.dsp: + + disable layer I + +2004-01-06 14:38 bouvigne + + * libmp3lame/version.h: + + bump alpha + +2004-01-06 13:53 bouvigne + + * libmp3lame/VbrTag.c: + + do not include the vbr header into the vbr seek table as it breaks a player + +2004-01-05 18:58 takehiro + + * libmp3lame/: lame.c, quantize.c, tables.c + (takehiro-2002_05_07-experimental): + + fix ABR bitrate + changed VBR quality <-> compression ratio mapping. + changed gfc->masking_lower setting + +2004-01-05 17:51 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + fix a warning. + reduce prefetch length. + +2004-01-05 16:25 bouvigne + + * doc/html/history.html: + + history + +2004-01-05 16:19 bouvigne + + * ACM/ACMStream.cpp: + + fixed a buffer requirement error + +2004-01-05 09:45 bouvigne + + * libmp3lame/: l3side.h, quantize.c, takehiro.c: + + faster count_bits + +2004-01-05 07:35 takehiro + + * mpglib/common.c (takehiro-2002_05_07-experimental): + + one more fix for seg.fault + +2004-01-05 07:30 takehiro + + * mpglib/common.c (takehiro-2002_05_07-experimental): + + fix seg.fault (not good way, indeed) + +2004-01-05 07:16 takehiro + + * configure.in (takehiro-2002_05_07-experimental): + + fix typo and disable LAYER1 decoding by default. + +2004-01-05 07:15 takehiro + + * libmp3lame/i386/Makefile.in, configure + (takehiro-2002_05_07-experimental): + + regen + +2004-01-05 07:14 takehiro + + * libmp3lame/i386/Makefile.am (takehiro-2002_05_07-experimental): + + fix build problem + +2004-01-05 06:47 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + more strict syncword check when no LAYER1/2 support. + +2004-01-04 19:45 takehiro + + * libmp3lame/: lame.c, tables.c, util.h + (takehiro-2002_05_07-experimental): + + finished fixing mono encoding (initialization problem of inter-channel masking value) + remove useless code in stereo->mono mix down. + fix ATH adjustment code initialization. + +2004-01-04 17:35 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + fix mono-mode bitrate selection. + +2004-01-04 15:39 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + fix the condition to use freeformat or not. + +2004-01-04 11:04 bouvigne + + * libmp3lame/lame.c: + + corrected -k + +2004-01-03 17:08 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + trivial clean up and fix comments. + +2004-01-03 16:47 bouvigne + + * doc/html/history.html: + + history + +2004-01-03 16:22 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + fix possible highpass filter display problem. + +2004-01-03 16:17 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + changed short block switching threshold for 8/16 kbps. + +2004-01-03 04:11 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + fix "FATAL" typo. + some code clean up. + +2004-01-03 04:10 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix for mono encoding. + +2004-01-02 19:53 bouvigne + + * libmp3lame/lame.c: + + changed quality mapping + +2004-01-02 19:51 bouvigne + + * libmp3lame/takehiro.c: + + faster count_bits + +2004-01-02 19:49 bouvigne + + * libmp3lame/: quantize.c, quantize_pvt.h, takehiro.c, + vbrquantize.c: + + Faster quantizations + Only 5% speedup when using Takehiro's ieee754 hack, but about 60% + speedup otherwise. (Should please Mac users) + +2004-01-02 09:02 takehiro + + * mpglib/common.c (takehiro-2002_05_07-experimental): + + check emphasis bits in mpeg header. + +2004-01-01 17:52 takehiro + + * libmp3lame/machine.h (takehiro-2002_05_07-experimental): + + fix warning on mingw (and probabry VC) + +2004-01-01 17:51 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + changed function name, lame_decode_fromfile -> decode_fromfile because it is not LAME standard API. + +2004-01-01 17:23 takehiro + + * mpglib/layer1.c (takehiro-2002_05_07-experimental): + + fix stereo value handling. + +2004-01-01 15:22 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + fix location where emphasis is recorded. + +2004-01-01 15:21 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + prepare for better MP3 header detection. + +2003-12-31 19:07 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix assertion condition. + fix i-stereo bit usage counting. + +2003-12-31 04:27 takehiro + + * libmp3lame/: encoder.c, lame.c, psymodel.c, quantize.c + (takehiro-2002_05_07-experimental): + + trivial clean up + +2003-12-30 19:10 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + trivial clean up.(code to check the MAX_BITS is moved) + +2003-12-30 18:52 takehiro + + * libmp3lame/version.h (takehiro-2002_05_07-experimental): + + ok, new years present. + here goes alpha10! + +2003-12-30 18:47 takehiro + + * ACM/ddk/.cvsignore (takehiro-2002_05_07-experimental): + + added to ignore Makefile + +2003-12-30 18:46 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix it makes invalid mp3 file when 320kbps. + +2003-12-30 18:45 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + added one more check. + trivial coding clean up. + +2003-12-30 17:12 takehiro + + * Makefile.in, aclocal.m4, configure, ACM/Makefile.in, + ACM/ADbg/Makefile.in, ACM/ddk/Makefile.in, + ACM/tinyxml/Makefile.in, Dll/Makefile.in, debian/Makefile.in, + doc/Makefile.in, doc/html/Makefile.in, doc/man/Makefile.in, + dshow/Makefile.in, frontend/Makefile.in, include/Makefile.in, + libmp3lame/Makefile.in, libmp3lame/i386/Makefile.in, + mac/Makefile.in, misc/Makefile.in, mpglib/Makefile.in + (takehiro-2002_05_07-experimental): + + regen with automake1.7.9, autoconf 2.59 on cygwin. + +2003-12-30 13:03 takehiro + + * testcase.mp3, libmp3lame/lame.c, libmp3lame/psymodel.c, + libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + trivial clean up. + +2003-12-30 12:28 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + fix masking_lower hadling + +2003-12-30 12:26 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + do not store FFT value when not using analyzer + +2003-12-30 10:23 takehiro + + * configure, ACM/Makefile.in, ACM/ddk/Makefile.in + (takehiro-2002_05_07-experimental): + + regen + +2003-12-30 10:19 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + trivial optimization + +2003-12-29 18:45 takehiro + + * libmp3lame/: lame.c, psymodel.c, quantize.c, tables.c, util.h + (takehiro-2002_05_07-experimental): + + hadling masking_lower is moved to quantize.c from psymodel.c + fix bug in threshold calculation of short block last sfb. + better intensity stereo band selection.(do not use IS at lower frequency) + fix comments + +2003-12-29 18:09 takehiro + + * libmp3lame/newmdct.c (takehiro-2002_05_07-experimental): + + omit MDCT calculation beyond cutoff. + The gain(for MDCT) is arround 15% when 18kHz cutoff. + +2003-12-29 08:05 takehiro + + * libmp3lame/: set_get.c, tables.c + (takehiro-2002_05_07-experimental): + + reservoir size fix for 320kbps over. + +2003-12-29 08:05 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + added one error check. + +2003-12-28 15:41 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + fix reservoir max size configuration. + +2003-12-28 13:57 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + fix free format detection. 320kbps is not always free format. + +2003-12-28 12:48 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + fix MPEG2 scalefactor output. + +2003-12-28 12:47 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + better error detection for debug mode. + +2003-12-28 12:11 takehiro + + * frontend/parse.c, libmp3lame/lame.c + (takehiro-2002_05_07-experimental): + + fix -k option. + +2003-12-28 11:49 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix warning + +2003-12-28 11:48 takehiro + + * libmp3lame/: psymodel.c, psymodel.h, quantize.c, tables.c + (takehiro-2002_05_07-experimental): + + many cosmetic change and clean up. + +2003-12-27 17:45 takehiro + + * libmp3lame/: psymodel.c, tables.c, util.h + (takehiro-2002_05_07-experimental): + + use more fine resolution infomation for block switching. + +2003-12-27 14:55 takehiro + + * testcase.mp3, libmp3lame/psymodel.c + (takehiro-2002_05_07-experimental): + + update testcase + clean up psymodel.c + +2003-12-27 14:24 takehiro + + * frontend/gtkanal.c, libmp3lame/encoder.c, + libmp3lame/lame-analysis.h, libmp3lame/lame.c, + libmp3lame/lame_global_flags.h, libmp3lame/psymodel.c, + libmp3lame/psymodel.h, libmp3lame/quantize.c, + libmp3lame/set_get.c, libmp3lame/tables.c, libmp3lame/util.h, + libmp3lame/version.h (takehiro-2002_05_07-experimental): + + now psymodel version 0.91-3 + - new ATH adjustment. + * ATH adjustment per channel, not per granule. + - display ATH adjustment value in mp3x. + - new long/short block switching code. + * now it is aware of post masking. + * switch to short block when post echo may happen. + - better long->short masking (threshold/energy) conversion. + +2003-12-23 10:29 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + added one comment. + +2003-12-23 10:22 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + trivial clean up. + +2003-12-23 10:13 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + tuning/fixing norm[] values of the spreading function. + +2003-12-22 16:36 bouvigne + + * doc/html/history.html: + + history + +2003-12-22 09:44 bouvigne + + * libmp3lame/quantize_pvt.c: + + reduced warnings + +2003-12-21 18:41 bouvigne + + * frontend/: get_audio.c, main.c, parse.c: + + reduced warnings + +2003-12-21 18:14 bouvigne + + * libmp3lame/: encoder.c, psymodel.c, psymodel.h, quantize.c, + quantize_pvt.c, quantize_pvt.h, util.h: + + FLOAT8 -> FLOAT + +2003-12-21 16:09 takehiro + + * libmp3lame/: psymodel.c, psymodel.h, tables.c + (takehiro-2002_05_07-experimental): + + safer threshold calculation arround attack detected position. + +2003-12-21 15:12 takehiro + + * configure.in, ACM/Makefile.am (takehiro-2002_05_07-experimental): + + added ACM/ddk directory + +2003-12-21 15:06 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + update comment as is done in main line. + +2003-12-21 15:03 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + fix short block ATH scaling and masking threshold. + +2003-12-21 13:30 takehiro + + * libmp3lame/: psymodel.c, lame.c, tables.c + (takehiro-2002_05_07-experimental): + + - temporal masking aware short/long block switching. + - tuning reduce side value. + - fixed long->short block threshold conversion factor. + - fixed array declaration bug in short block threshold calculation. + +2003-12-21 12:46 bouvigne + + * libmp3lame/: encoder.c, lame.c, presets.c, psymodel.c, + psymodel.h, quantize.c, quantize.h, quantize_pvt.c, + quantize_pvt.h, util.h: + + FLOAT8 -> FLOAT + +2003-12-21 12:30 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + remove bval_width[] related code. + +2003-12-21 12:25 takehiro + + * mpglib/layer3.c (takehiro-2002_05_07-experimental): + + fix 8kbps decode bug (backport from main line) + +2003-12-21 10:16 bouvigne + + * libmp3lame/: VbrTag.c, lame.c, psymodel.c, util.c, util.h: + + FLOAT8 -> FLOAT + +2003-12-20 14:48 bouvigne + + * libmp3lame/psymodel.c: + + fixed calc_interchannel_masking when encoding to mono + +2003-12-20 14:33 bouvigne + + * libmp3lame/lame.c: + + fixed lowpass value for high bitrate vbr profiles + +2003-12-20 14:31 bouvigne + + * libmp3lame/version.h: + + Using 3.95 as version number. + We will decide latter what to choose about version numbers + +2003-12-19 13:55 bouvigne + + * libmp3lame/version.h: + + Moved back to 3.94b in order to not have some 3.95b spreading on the web. + We now have to decide if we should go in the 3.94release direction or in the 3.95b direction + +2003-12-18 18:47 bouvigne + + * libmp3lame/version.h: + + welcome in 3.95 + +2003-12-18 17:13 aleidinger + + * ChangeLog: + + ChangeLog for 3.94b. + +2003-12-18 15:46 bouvigne + + * libmp3lame/version.h: + + 3.94b + +2003-12-18 12:54 aleidinger + + * frontend/get_audio.c: + + Takehiro noticed a bug in the pipe fix, it results in a click sound at + the end of the encoding of BlackBirds.wav. + + This fix is a merge from the experimental branch and doesn't seem to be + harmful while encoding over a pipe, but I'm not sure if I was able to + reproduce the situation where the original fix was needed. + + I've tested: + mkfifo pipetest + lame -preset 96 pipetest pipetest.mp3 + other shell: cat wav >pipetest + +2003-12-17 18:45 bouvigne + + * frontend/parse.c: + + help + +2003-12-17 11:52 bouvigne + + * libmp3lame/psymodel.c: + + updated comment regarding spreading function + +2003-12-15 17:07 bouvigne + + * mpglib/layer3.c: + + fixed 8kHz decoding + +2003-12-15 11:48 takehiro + + * ACM/ddk/: Makefile.am, Makefile.in + (takehiro-2002_05_07-experimental): + + sync with main line + +2003-12-14 17:56 takehiro + + * TODO (takehiro-2002_05_07-experimental): + + added some new items. + - highpass filter for psycho-analysis. + - temporal-masking-aware block switching. + +2003-12-14 17:52 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + clean up s3_func() (no results difference) + remove normalization and bark width consideration. + # hehe, it's now obvious to see which frequency makes strong masking :p + +2003-12-12 18:22 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + coding style update. + check the INFO sub-chunk in LIST chunk. + +2003-12-12 18:21 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + fix it treat the chunk after data chunk as part of data chunk. + +2003-12-12 17:24 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + trivial style update (including comment style, etc). + +2003-12-12 16:52 takehiro + + * libmp3lame/: psymodel.c, tables.c, util.h + (takehiro-2002_05_07-experimental): + + remove nb_1 from gfc. + +2003-12-12 16:15 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + fix last change (oops, I checked-in the wrong version...) + +2003-12-12 16:12 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + fix bit reservoir handling when looooooooow bit rate. + +2003-12-12 14:31 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + trivial clean up + +2003-12-12 14:31 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + added error check code. + +2003-12-12 13:29 takehiro + + * frontend/main.c, frontend/main.h, frontend/parse.c, + include/lame.h, libmp3lame/lame.c, + libmp3lame/lame_global_flags.h, libmp3lame/psymodel.c, + libmp3lame/set_get.c, libmp3lame/util.h + (takehiro-2002_05_07-experimental): + + clean up variables in gfc and gfp. + +2003-12-09 17:22 olcios + + * frontend/parse.c: + + Fixed typo. + +2003-12-09 17:19 olcios + + * frontend/parse.c: + + Fixed an error message. + +2003-12-09 16:08 aleidinger + + * ACM/Makefile.in: + + regen + +2003-12-09 16:01 aleidinger + + * configure: + + regen + +2003-12-09 15:51 aleidinger + + * ACM/ddk/Makefile.in: + + Add the autoconf Makefile. + +2003-12-09 15:49 aleidinger + + * configure.in: + + Add the ACM/ddk subdirectory. + +2003-12-09 15:49 aleidinger + + * ACM/Makefile.am: + + Add the ddk subdirectory. + +2003-12-09 15:48 aleidinger + + * ACM/ddk/Makefile.am: + + Add an automake Makefile. + +2003-12-09 15:06 bouvigne + + * libmp3lame/version.h: + + Bump alpha + +2003-12-09 15:05 bouvigne + + * frontend/parse.c: + + do not display --r3mix in help + +2003-12-09 15:03 bouvigne + + * doc/html/history.html: + + 3.94 release date? + +2003-12-09 14:59 bouvigne + + * doc/html/: basic.html, examples.html, history.html, index.html, + modes.html, presets.html, switchs.html: + + 3.94 documentation + +2003-12-08 16:52 bouvigne + + * libmp3lame/VbrTag.c: + + Use integer format for ReplayGain peak value + +2003-12-06 20:54 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + trivial optimization. + +2003-12-06 20:10 takehiro + + * libmp3lame/: quantize.c, quantize_pvt.h, takehiro.c + (takehiro-2002_05_07-experimental): + + make best_huffman_divide() as static. + make it do not call best_huffman_divide() twice when vbr. + +2003-12-06 19:00 takehiro + + * libmp3lame/: quantize.c, quantize_pvt.h, takehiro.c + (takehiro-2002_05_07-experimental): + + fix warning of quantize_sfb_3DN() prototype declaration. + fix pseudo half step bug on 3DNow!/SSE machines. + +2003-12-06 17:17 takehiro + + * frontend/parse.c, libmp3lame/lame.c, + libmp3lame/lame_global_flags.h, libmp3lame/set_get.c + (takehiro-2002_05_07-experimental): + + remove experimental switches from context structure. + +2003-12-06 13:37 takehiro + + * libmp3lame/: psymodel.c, quantize.c, quantize_pvt.h + (takehiro-2002_05_07-experimental): + + trivial clean up + +2003-12-06 11:10 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + reduce subblock gain value. + +2003-12-06 07:01 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + VBR code update. + - fixed sf value range limit(not fatal, but possible quality degrade in higher VBR quality mode). + - adjust the initiail value of scalefactor search for speed up(arround 1 or 2%).CVS: ---------------------------------------------------------------------- + +2003-12-05 12:49 aleidinger + + * libmp3lame/i386/Makefile.in: + + add missing " + +2003-12-04 12:26 aleidinger + + * libmp3lame/i386/Makefile.in: + + nasm -> NASM fix + +2003-12-03 16:35 takehiro + + * testcase.mp3, libmp3lame/quantize.c + (takehiro-2002_05_07-experimental): + + changed short block noise estimation (max noise -> sum noise). + +2003-12-03 15:32 takehiro + + * frontend/rtp.c (takehiro-2002_05_07-experimental): + + sync with main line. + +2003-12-03 03:09 olcios + + * include/lame.h: + + comments / doc + +2003-12-03 02:18 olcios + + * frontend/get_audio.c, libmp3lame/lame.c, + libmp3lame/mpglib_interface.c: + + Brought back the possibility to run lame_decode_init() more than once + +2003-12-03 01:44 olcios + + * frontend/get_audio.c, frontend/parse.c, include/lame.h, + libmp3lame/lame.c, libmp3lame/mpglib_interface.c, + libmp3lame/set_get.c: + + Made it impossible to simultaneously use mp3 input and decoding on the fly. + +2003-12-01 17:45 takehiro + + * configure, Dll/Makefile.in, frontend/Makefile.in, + libmp3lame/Makefile.in, libmp3lame/i386/Makefile.in, + misc/Makefile.in, mpglib/Makefile.in + (takehiro-2002_05_07-experimental): + + regen + +2003-12-01 17:44 takehiro + + * libmp3lame/i386/Makefile.am (takehiro-2002_05_07-experimental): + + backport Alex's dirty hack, which is less dirty than mine :) + +2003-12-01 17:43 takehiro + + * ltmain.sh (takehiro-2002_05_07-experimental): + + replaced the one from libtool 1.5 + +2003-12-01 15:45 takehiro + + * frontend/depcomp, libmp3lame/depcomp, misc/depcomp, + mpglib/depcomp (takehiro-2002_05_07-experimental): + + removed unused file (build system uses ../depcomp) + +2003-11-29 12:14 aleidinger + + * ChangeLog: + + update + +2003-11-29 12:10 aleidinger + + * test/cvscheck.sh: + + add the automated test script which mt used to run every day + +2003-11-29 12:09 aleidinger + + * configure: + + regen with autoconf 2.57 + +2003-11-29 12:06 aleidinger + + * ACM/Makefile.in, ACM/ADbg/Makefile.in, ACM/tinyxml/Makefile.in, + Dll/Makefile.in, Makefile.in, debian/Makefile.in, + doc/Makefile.in, doc/html/Makefile.in, doc/man/Makefile.in, + dshow/Makefile.in, frontend/Makefile.in, include/Makefile.in, + libmp3lame/Makefile.in, libmp3lame/i386/Makefile.in, + mac/Makefile.in, misc/Makefile.in, mpglib/Makefile.in: + + regen with automake 1.7 + +2003-11-29 12:05 aleidinger + + * configure.in: + + - Check for some features a little bit earlier. + - Fix a AC_DEFINE so the newer tools don't moan. + +2003-11-29 12:03 aleidinger + + * libmp3lame/i386/Makefile.am: + + HACK HACK HACK, UGLY UGLY HACK! + + make this work with libtool 1.5 + + If anybody knows how do this in a more sane way, please teach me how to + do it. + +2003-11-29 12:01 aleidinger + + * ltmain.sh: + + update with libtool 1.5 version + +2003-11-29 12:00 aleidinger + + * aclocal.m4: + + update with newer autotools + +2003-11-29 11:59 aleidinger + + * config.h.in: + + add some missing undefs + +2003-11-29 11:16 aleidinger + + * frontend/rtp.c: + + fix some errors which are new with gcc 3.x + +2003-11-29 09:49 aleidinger + + * frontend/depcomp, libmp3lame/depcomp, mpglib/depcomp: + + use the ones provided by automake 1.7 + +2003-11-29 09:45 aleidinger + + * missing, mkinstalldirs, depcomp, install-sh: + + use the ones provided by automake 1.7 + +2003-11-29 09:44 aleidinger + + * config.guess, config.sub: + + use the ones provided with libtool 1.5 + +2003-11-28 18:23 takehiro + + * frontend/brhist.c, include/lame.h, libmp3lame/encoder.c, + libmp3lame/encoder.h, libmp3lame/lame.c, libmp3lame/tables.c, + libmp3lame/util.h (takehiro-2002_05_07-experimental): + + clean up bitrate histgram code. + +2003-11-28 17:53 takehiro + + * libmp3lame/: bitstream.c, lame.c, quantize.c, util.h + (takehiro-2002_05_07-experimental): + + remove unused definition (resample_t) + rename Bit_stream_struct -> bit_stream_t + +2003-11-28 17:30 takehiro + + * libmp3lame/: VbrTag.c, lame.c, lame_global_flags.h, set_get.c, + tables.c, util.h (takehiro-2002_05_07-experimental): + + move and rename "gfp->exp_nspsytune" => "gfc->nsPsy.tune" + +2003-11-28 17:20 takehiro + + * libmp3lame/: psymodel.c, quantize.c, util.h + (takehiro-2002_05_07-experimental): + + remove "ath_over" from III_psy_ratio + +2003-11-28 17:17 takehiro + + * libmp3lame/mpglib_interface.c (takehiro-2002_05_07-experimental): + + make lame_decode1_headersB_clipchoice() as static + +2003-11-28 16:48 takehiro + + * libmp3lame/util.c (takehiro-2002_05_07-experimental): + + remove unused code + +2003-11-28 16:46 takehiro + + * libmp3lame/: util.c, util.h, i386/cpu_feat.nas + (takehiro-2002_05_07-experimental): + + simplify the CPU feature detection code. + +2003-11-28 16:42 takehiro + + * TODO (takehiro-2002_05_07-experimental): + + divide TODO item about encoding quality problem into 2 piece. + +2003-11-28 16:38 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + fix comments. + +2003-11-28 16:24 takehiro + + * libmp3lame/: encoder.c, lame.c + (takehiro-2002_05_07-experimental): + + trivial + +2003-11-28 16:24 takehiro + + * libmp3lame/: quantize.c, quantize.h + (takehiro-2002_05_07-experimental): + + fix warning + simplify the code. + +2003-11-28 16:11 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + sync main branch (lowpass adjustment when mono) + and trivial clean up. + +2003-11-28 16:04 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + remove unused definition + +2003-11-28 16:03 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + do not use reservoir when -q 9 + +2003-11-28 15:58 takehiro + + * USAGE (takehiro-2002_05_07-experimental): + + remove documents about removed options + +2003-11-28 15:53 takehiro + + * frontend/parse.c, include/lame.h, libmp3lame/lame.c, + libmp3lame/lame_global_flags.h, libmp3lame/quantize.c, + libmp3lame/set_get.c (takehiro-2002_05_07-experimental): + + clean up VBR finish code and remove "-F" option. + LAME always use VBR_hard_min now. + + The option is quite "FAQ"ed and hacky/dirty work arround to conceal + the psymodel flaw. + +2003-11-28 15:34 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + changed ResvFrameBegin() arguments. + +2003-11-28 15:29 takehiro + + * libmp3lame/: VbrTag.c, encoder.c, quantize.c, quantize.h + (takehiro-2002_05_07-experimental): + + clean up pinfo setting code (for analyzer) + +2003-11-28 15:16 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + trivial simplification. + +2003-11-28 15:16 takehiro + + * libmp3lame/util.c (takehiro-2002_05_07-experimental): + + make gcd() as static. + +2003-11-28 15:02 takehiro + + * TODO (takehiro-2002_05_07-experimental): + + resampling code bug is fixed. + +2003-11-28 15:01 takehiro + + * libmp3lame/: lame.c, util.c, util.h + (takehiro-2002_05_07-experimental): + + make fill_buffer_resample as static function. + fix the bug in resampling (like from 44099 to 44100) and remove work arround code. + +2003-11-28 14:27 bouvigne + + * libmp3lame/set_get.c: + + Disabled replaygain decode because it crashes when using mp3 input + +2003-11-28 12:22 takehiro + + * libmp3lame/: psymodel.c, tables.c, util.h + (takehiro-2002_05_07-experimental): + + simplify the loudness approx code. + +2003-11-27 12:27 takehiro + + * ACM/ddk/msacmdrv.h (takehiro-2002_05_07-experimental): + + sync with mainline + +2003-11-27 12:20 takehiro + + * libmp3lame/: VbrTag.c, bitstream.c, bitstream.h, tables.c, + takehiro.c (takehiro-2002_05_07-experimental): + + simplify the function interfaces. + remove unused definitions. + trivial style update. + +2003-11-27 08:24 bouvigne + + * ACM/: readme.txt, ddk/msacmdrv.h: + + Allow compilation of ACM codec without Microsoft platform DDK + +2003-11-26 13:06 bouvigne + + * lame_vc6.dsw: + + Updated ACM dependencies + +2003-11-25 17:32 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + trivial + +2003-11-25 17:22 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + loop hoisting: loop for writing sideinfo and loop for writing part2/part2_3 is now integrated. + +2003-11-25 17:14 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + trivial + +2003-11-25 17:13 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix byte/bit confusion. + +2003-11-25 16:53 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + do not write magic strings in the post drain part. + +2003-11-25 16:48 takehiro + + * Makefile.B32, Makefile.DJGPP, Makefile.MSVC, Makefile.unix, + config.h.in, configure, configure.in + (takehiro-2002_05_07-experimental): + + update build-system related files for new asm code. + (I hope they runs correctly) + +2003-11-25 16:43 takehiro + + * frontend/gtkanal.c, libmp3lame/encoder.c, libmp3lame/encoder.h, + libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix mp3x block-type display + +2003-11-25 15:55 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + psymodel.h is not system header file. + +2003-11-25 15:52 takehiro + + * frontend/main.c (takehiro-2002_05_07-experimental): + + remove priority setting code. + we already have a --priority switch on Windows environment, so we do not + need it. + +2003-11-25 15:43 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + one more... + +2003-11-25 15:20 takehiro + + * libmp3lame/: bitstream.c, bitstream.h, quantize.c, tables.c, + util.h (takehiro-2002_05_07-experimental): + + more simplification arround bit stream write out code. + +2003-11-24 18:26 takehiro + + * libmp3lame/: bitstream.c, tables.c, util.h + (takehiro-2002_05_07-experimental): + + clean up bitstream write out code. + - header(side info) output code is now very simplified. + - variable length bitstream output code is now simple and fast. + +2003-11-24 17:05 bouvigne + + * libmp3lame/lame.c: + + Do not compute ReplayGain when not using vbr header + +2003-11-24 16:13 takehiro + + * libmp3lame/: bitstream.c, tables.c, util.h + (takehiro-2002_05_07-experimental): + + simplify the bitstream output code. + +2003-11-24 14:42 takehiro + + * libmp3lame/: quantize.c, i386/quantSSE.nas + (takehiro-2002_05_07-experimental): + + added SSE version of quantize_ISO() + +2003-11-24 13:52 bouvigne + + * libmp3lame/lame.c: + + Reduced bandwith when encoding in mono + +2003-11-24 13:39 bouvigne + + * libmp3lame/lame.c: + + Fixed low bitrates lowpass and sampling rate values + (I probably broke it recently) + +2003-11-23 20:13 takehiro + + * frontend/gtkanal.c, libmp3lame/encoder.c, + libmp3lame/lame-analysis.h (takehiro-2002_05_07-experimental): + + update mp3x display (arround block switching parameter). + +2003-11-23 20:05 takehiro + + * frontend/parse.c, libmp3lame/VbrTag.c, libmp3lame/encoder.c, + libmp3lame/lame.c, libmp3lame/lame_global_flags.h, + libmp3lame/set_get.c, libmp3lame/set_get.h, libmp3lame/tables.c, + libmp3lame/util.h (takehiro-2002_05_07-experimental): + + remvoe unused features and variables + - ms_sparsing() + - tune() + +2003-11-23 19:47 takehiro + + * frontend/parse.c, libmp3lame/lame.c, libmp3lame/psymodel.c, + libmp3lame/psymodel.h, libmp3lame/set_get.c, + libmp3lame/set_get.h, libmp3lame/util.h + (takehiro-2002_05_07-experimental): + + now it always uses same short block switching threshold for L/R/M channel and S channel. + +2003-11-23 19:41 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + trivial clean up + +2003-11-23 19:31 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + short block threshold tuning. + (of course, need more...) + +2003-11-23 11:22 takehiro + + * libmp3lame/: encoder.c, psymodel.c + (takehiro-2002_05_07-experimental): + + clean up mode extension update code. + +2003-11-23 10:45 takehiro + + * libmp3lame/: bitstream.c, tables.c, util.h + (takehiro-2002_05_07-experimental): + + simplify bitstream writing code. + +2003-11-23 10:27 takehiro + + * libmp3lame/: bitstream.c, psymodel.c + (takehiro-2002_05_07-experimental): + + trivial clean up. + +2003-11-23 10:04 takehiro + + * libmp3lame/encoder.h (takehiro-2002_05_07-experimental): + + fix comments and comment out the unused definitions. + +2003-11-23 10:03 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + trivial clean up + +2003-11-23 10:03 takehiro + + * frontend/parse.c (takehiro-2002_05_07-experimental): + + fix and simplify the usage message. + +2003-11-23 09:47 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + clean up block type update code + +2003-11-23 09:46 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + trivial clean up + +2003-11-23 09:14 takehiro + + * libmp3lame/i386/quantSSE.nas (takehiro-2002_05_07-experimental): + + fix for MPEG2.5 (for the case band width = 2) + +2003-11-23 09:09 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + clean up writing table-id code. + +2003-11-23 09:08 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + trivial clean up + +2003-11-23 08:36 takehiro + + * libmp3lame/i386/fft3dn.nas (takehiro-2002_05_07-experimental): + + remove unused code. + +2003-11-22 19:41 takehiro + + * libmp3lame/: bitstream.c, util.h + (takehiro-2002_05_07-experimental): + + optimize bitstream output code. + +2003-11-22 19:14 takehiro + + * libmp3lame/i386/: fft.nas, ffttbl.nas + (takehiro-2002_05_07-experimental): + + remove unused files + +2003-11-22 19:14 takehiro + + * libmp3lame/i386/: Makefile.am, Makefile.in + (takehiro-2002_05_07-experimental): + + remove unused extra-dist files + +2003-11-22 18:58 takehiro + + * libmp3lame/: bitstream.c, util.h + (takehiro-2002_05_07-experimental): + + optimize writeheader() + +2003-11-22 18:39 takehiro + + * ACM/TODO (takehiro-2002_05_07-experimental): + + update + +2003-11-22 18:39 takehiro + + * libmp3lame/: quantize.c, quantize_pvt.h, i386/quantSSE.nas + (takehiro-2002_05_07-experimental): + + 3DNow! version of count1 region quantization + +2003-11-22 18:12 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + fix message. + +2003-11-22 18:11 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + trivial clean up + +2003-11-22 18:09 takehiro + + * libmp3lame/version.c (takehiro-2002_05_07-experimental): + + added version string to SSE and E3DNow. + +2003-11-22 17:43 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix ABR mode sometimes uses 640kbps (!) + +2003-11-22 17:40 takehiro + + * libmp3lame/: lame.c, tables.c, i386/fft3dn.nas + (takehiro-2002_05_07-experimental): + + E3DNow! version of fht() + +2003-11-22 17:39 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + trivial cleanup + +2003-11-22 13:30 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + clean up and merge CBR/ABR code. + +2003-11-22 13:19 takehiro + + * libmp3lame/: quantize.c, quantize_pvt.h, i386/quantSSE.nas + (takehiro-2002_05_07-experimental): + + 3DNow! version of quantize_ISO() + +2003-11-22 13:03 takehiro + + * Dll/Example_vc6.dsw (takehiro-2002_05_07-experimental): + + sync main branch + - Corrected the dll example project + +2003-11-22 09:03 takehiro + + * TODO (takehiro-2002_05_07-experimental): + + updated + +2003-11-22 08:45 takehiro + + * libmp3lame/: quantize_pvt.h, takehiro.c + (takehiro-2002_05_07-experimental): + + fix warning and build problem + +2003-11-22 07:57 takehiro + + * Dll/MP3export.pas (takehiro-2002_05_07-experimental): + + sync main branch. + - fix calling convention + +2003-11-22 07:56 takehiro + + * Dll/BladeMP3EncDLL.def (takehiro-2002_05_07-experimental): + + added some interface. + +2003-11-22 07:55 takehiro + + * Dll/BladeMP3EncDLL.c (takehiro-2002_05_07-experimental): + + sync main branch + - display issue fix. + +2003-11-22 07:51 takehiro + + * Dll/Makefile.am (takehiro-2002_05_07-experimental): + + sync main branch. + - added files for vc6 and mingw. + +2003-11-21 17:07 bouvigne + + * Dll/BladeMP3EncDLL.c: + + Display issues + +2003-11-21 17:03 takehiro + + * libmp3lame/: quantize.c, takehiro.c, i386/quantSSE.nas + (takehiro-2002_05_07-experimental): + + 3DNow! version of quantization. + and some asm code optimization/clean up. + +2003-11-21 16:50 bouvigne + + * Dll/BladeMP3EncDLL.c: + + Minor corrections + +2003-11-20 16:04 bouvigne + + * Dll/MP3export.pas: + + Fixed calling convention + +2003-11-20 13:30 bouvigne + + * Dll/Example_vc6.dsw: + + Corrected the dll example project + +2003-11-20 11:16 bouvigne + + * frontend/get_audio.c, frontend/main.c, frontend/parse.c, + include/lame.h, libmp3lame/set_get.c: + + Changed some Vorbis messages + +2003-11-20 11:08 bouvigne + + * frontend/parse.c, include/lame.h, libmp3lame/VbrTag.c, + libmp3lame/encoder.c, libmp3lame/lame.c, + libmp3lame/lame_global_flags.h, libmp3lame/set_get.c: + + Removed mode_automs + +2003-11-20 10:57 bouvigne + + * libmp3lame/: fft.c, lame.c, util.c, util.h: + + Removed CPU_features.i387 + +2003-11-20 10:46 bouvigne + + * libmp3lame/presets.c: + + Aliased r3mix to vbr-mtrh V3 + +2003-11-19 13:00 bouvigne + + * frontend/parse.c, include/lame.h, libmp3lame/presets.c: + + anihilated streaming/radio/portable named presets, leaving only the -Vx + +2003-11-18 16:18 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix warning + +2003-11-18 16:11 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + new reservoir handling code for ABR. + +2003-11-18 15:37 takehiro + + * testcase.mp3, libmp3lame/bitstream.c + (takehiro-2002_05_07-experimental): + + simplify the sign hadling code. + +2003-11-18 15:29 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + simplify the error check code. + +2003-11-18 15:21 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + optimize self check code. + +2003-11-18 14:03 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + For better/faster encoding, narrowen the frequency region when lower -q. + +2003-11-18 13:59 takehiro + + * TODO (takehiro-2002_05_07-experimental): + + updated + +2003-11-18 13:57 takehiro + + * libmp3lame/: bitstream.c, quantize.c, quantize_pvt.h, takehiro.c + (takehiro-2002_05_07-experimental): + + fix bit overflow when i-stereo + tuning CBR bit allocation (on_pe() function) + clean up finish_iteratio_one(). + +2003-11-18 13:20 bouvigne + + * libmp3lame/presets.c: + + low vbr-mtrh presets + +2003-11-18 12:52 takehiro + + * testcase.mp3 (takehiro-2002_05_07-experimental): + + regen + +2003-11-18 12:51 takehiro + + * libmp3lame/: lame.c, quantize.c, util.h + (takehiro-2002_05_07-experimental): + + fix CBR_2nd_bitalloc() (it may makes invalid mp3 frame). + remapping -q setting. old -q2 is now -q1 + enable CBR_2nd_bitalloc() when -q 0,1 and 2 + +2003-11-18 12:22 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + trivial clean up + +2003-11-18 12:18 takehiro + + * libmp3lame/: psymodel.c, quantize.c + (takehiro-2002_05_07-experimental): + + new CBR bit allocation/reservoir handling code. + still need tuning (there remains some killer samples), + but usually brings better result. + +2003-11-17 02:31 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix substep noise shaping. + +2003-11-16 18:07 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix possible bit counting bug when CBR and higher -q option. + +2003-11-16 18:05 takehiro + + * libmp3lame/: lame.c, util.c, util.h + (takehiro-2002_05_07-experimental): + + do not display the CPU have i387. + +2003-11-16 17:57 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + fix typo + +2003-11-16 17:02 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix mp3x display. + +2003-11-16 16:11 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + fix ID3v2 tag length when --keeptag. + +2003-11-16 12:43 takehiro + + * frontend/: get_audio.c, get_audio.h, main.c + (takehiro-2002_05_07-experimental): + + now --keeptag keeps ID3v2 tag when transcoding. + +2003-11-16 11:04 takehiro + + * libmp3lame/: lame.c, machine.h, psymodel.c, set_get.c, tables.c, + util.c, util.h, version.c (takehiro-2002_05_07-experimental): + + update comment style (// -> /* */) + +2003-11-16 11:04 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + trivial optimization. + +2003-11-16 10:47 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix one more l3_enc initialization + +2003-11-16 10:31 takehiro + + * libmp3lame/i386/quantSSE.nas (takehiro-2002_05_07-experimental): + + fix segmentation fault especially when higher VBR quality like -V0. + +2003-11-16 10:12 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix trivial(but fatal) bug in short block threshold calculation loop... + +2003-11-16 10:08 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix count1 bit-counting (we must zered all zero region because we use 4-stride in count1 region). + +2003-11-16 09:55 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix i-stereo+VBR fails to encode (internal buffer inconsistency). + +2003-11-15 18:15 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + optimize Huffmancode() by dividing it into tableindex > 15 or not. + +2003-11-15 18:14 takehiro + + * testcase.mp3 (takehiro-2002_05_07-experimental): + + regen + +2003-11-15 17:07 takehiro + + * libmp3lame/util.h (takehiro-2002_05_07-experimental): + + fix warning + +2003-11-15 17:05 takehiro + + * libmp3lame/: lame.c, quantize.c, quantize_pvt.h, takehiro.c, + util.h (takehiro-2002_05_07-experimental): + + always use quantize_best() except init_globalgain(). + and some code clean up. + +2003-11-15 11:21 takehiro + + * configure: + + regen + +2003-11-15 11:14 takehiro + + * configure.in: + + fix migw build(as is done in the experimental branch) + +2003-11-15 10:50 takehiro + + * frontend/get_audio.c: + + fix ambiguous message (Bug ID #830035) + +2003-11-14 16:13 bouvigne + + * libmp3lame/lame.c: + + use presets by default when using vbr-mtrh + +2003-11-14 13:24 bouvigne + + * libmp3lame/presets.c: + + vbr-mtrh high vbr presets + +2003-11-12 17:12 takehiro + + * libmp3lame/: lame.c, util.c, util.h + (takehiro-2002_05_07-experimental): + + check and display if the CPU supports Extended 3DNow! + (no E3DNow! code available yet.) + +2003-11-12 15:47 takehiro + + * libmp3lame/i386/quantSSE.nas (takehiro-2002_05_07-experimental): + + fix build problem for newer NASM ... + +2003-11-12 06:43 takehiro + + * libmp3lame/i386/quantSSE.nas (takehiro-2002_05_07-experimental): + + fix build problem (on some old nasm) + +2003-11-12 06:43 takehiro + + * libmp3lame/i386/cpu_feat.nas (takehiro-2002_05_07-experimental): + + fix build problem + +2003-11-11 04:27 takehiro + + * libmp3lame/i386/cpu_feat.nas (takehiro-2002_05_07-experimental): + + added Extended 3DNow! check code. + +2003-11-11 04:26 takehiro + + * libmp3lame/: lame.c, quantize.c, util.c, util.h, + i386/cpu_feat.nas (takehiro-2002_05_07-experimental): + + sync main branch (SIMD->SSE change) + +2003-11-10 15:41 bouvigne + + * libmp3lame/: fft.c, lame.c, util.c, util.h, i386/cpu_feat.nas: + + SIMD->SSE + +2003-11-10 15:31 bouvigne + + * libmp3lame/: lame.c, presets.c: + + Add missing values for vbr_rh -Vx scale + +2003-11-10 15:27 takehiro + + * libmp3lame/i386/fft3dn.nas: + + fix cygwin build (with nasm) + +2003-11-10 15:27 takehiro + + * libmp3lame/i386/fft3dn.nas (takehiro-2002_05_07-experimental): + + fix cygwin build with nasm + +2003-11-10 14:58 bouvigne + + * libmp3lame/: lame.c, presets.c: + + fix lowpass values for low vbr presets + +2003-11-10 12:06 bouvigne + + * libmp3lame/: lame.c, presets.c, set_get.c: + + Use presets by default when using vbr_rh + +2003-11-09 17:40 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + fix warning + +2003-11-09 17:38 takehiro + + * libmp3lame/: quantize.c, tables.c, tables.h, i386/quantSSE.nas + (takehiro-2002_05_07-experimental): + + 3DNow! version of calc_sfb_noise() (for CBR/VBR/ABR) + and simplify the look up table structure. + +2003-11-09 15:28 takehiro + + * libmp3lame/: quantize.c, i386/quantSSE.nas + (takehiro-2002_05_07-experimental): + + 3DNow! version of calc_sfb_noise_fast() (for VBR) + +2003-11-09 14:35 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + do not call CBR_2nd_bitalloc() when -q >= 6. + sometimes it results in an invalid mp3 file. + +2003-11-09 14:34 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + revert some part of 1.110.2.190->1.110.2.191. + +2003-11-09 09:43 takehiro + + * libmp3lame/: quantize.c, i386/quantSSE.nas + (takehiro-2002_05_07-experimental): + + 3DNow! version of calc_noise() + +2003-11-09 09:11 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + trivial clean up + +2003-11-09 07:54 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + remove fftsse, fftfpu related code. + +2003-11-09 06:24 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + always use -q 5 when VBR because VBR mode needs -q 5 + (higher -q setting makes no output change and lower -q setting sometimes makes it to encode invalid mp3 file) + +2003-11-08 17:51 takehiro + + * libmp3lame/: takehiro.c, i386/choose_table.nas + (takehiro-2002_05_07-experimental): + + revert part of last change, because it may seg-faults when -q 6,7,8,9 + +2003-11-08 17:45 takehiro + + * libmp3lame/: quantize.c, takehiro.c, i386/choose_table.nas + (takehiro-2002_05_07-experimental): + + changed quantization code. Now it quantizes >8191+15 values into 8191+15. + +2003-11-08 17:44 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + fix precision problem. + +2003-11-08 16:38 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + VBR code cleanup and fix minor bug + - when there's not enough bits, it may decrease bitrate too much. + +2003-11-08 07:00 takehiro + + * libmp3lame/i386/: fftfpu.nas, fftsse.nas + (takehiro-2002_05_07-experimental): + + I cannot make it work and run faster than compiler output. so I removed. + +2003-11-07 16:52 takehiro + + * libmp3lame/: encoder.c, takehiro.c + (takehiro-2002_05_07-experimental): + + trivial code clean up + +2003-11-07 16:46 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + optimization + - precalc adjusted ATH and use them when mask_add() + +2003-11-07 14:54 takehiro + + * libmp3lame/: quantize.c, i386/quantSSE.nas + (takehiro-2002_05_07-experimental): + + optimize asm code by dirty hack + +2003-11-07 14:53 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + trivial optimization(loop hoist) + +2003-11-07 14:37 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix VBR mode... + +2003-11-06 17:37 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix trivial bug when non-nasm case + +2003-11-06 17:18 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix substep shaping. + +2003-11-06 17:13 takehiro + + * libmp3lame/: psymodel.c, quantize.c, i386/quantSSE.nas + (takehiro-2002_05_07-experimental): + + - prevent "double ATH handling" problem. + - new xr^(3/4) code for 3DNow! (From the latest gogo) + - added multiplication function to sumofsqr_3DN() + +2003-11-05 17:13 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + optimize calc_noise() at "0 or 1" region + +2003-11-05 14:03 bouvigne + + * libmp3lame/: presets.c, psymodel.c: + + Use Vx scale for presets + +2003-11-03 23:15 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix subblock_gain is not used(it ignores the switch). + added ugly optimization arround calc_sfb_noise() and calc_sfb_noise_fast(). + +2003-11-03 22:54 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + clean up substep shaping code bit. + +2003-11-03 18:41 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + use 3DNow! more. + +2003-11-03 18:16 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + trivial bug fix... + +2003-11-03 18:14 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix it always uses substep noise shaping (it ignore the option) when VBR. + +2003-11-03 18:09 takehiro + + * libmp3lame/: quantize.c, i386/quantSSE.nas + (takehiro-2002_05_07-experimental): + + added pow075_3DN (3DNow! version of calculating xr^(3/4)) + added "sum x^2" code for 3DNow! and use it. + +2003-11-03 17:44 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + considering the Fourier analysis limitation, it should estimate loudness + of lower frequency region when ATH adjustment. + +2003-11-03 15:00 bouvigne + + * libmp3lame/: lame.c, presets.c: + + allow vbr presets to not be enforced (preparative work before defaulting) + +2003-11-03 14:04 takehiro + + * testcase.mp3, libmp3lame/quantize.c + (takehiro-2002_05_07-experimental): + + fix infinite loop when short blocks. (oops, trivial bug...) + +2003-11-02 12:10 takehiro + + * libmp3lame/: machine.h, quantize.c, quantize_pvt.h, takehiro.c, + util.h, i386/quantSSE.nas (takehiro-2002_05_07-experimental): + + Precalculate the fabs(xr). + moved xr34[] and absxr[](=fabs(xr)) into gfc. + better alignment work for the compiler not support "align". + +2003-11-01 20:06 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + more comments update and clean up + +2003-11-01 19:50 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + optimize substep noise shaping (trancate_smallspectrums()) + and count_bits() related code. + +2003-11-01 19:30 takehiro + + * libmp3lame/: quantize.c, util.h + (takehiro-2002_05_07-experimental): + + clean up(fix comments and misleading variable names). + +2003-11-01 19:14 takehiro + + * libmp3lame/: quantize.c, takehiro.c + (takehiro-2002_05_07-experimental): + + more clean up. + +2003-11-01 18:47 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + clean up the comments + +2003-11-01 18:33 takehiro + + * libmp3lame/: quantize.c, quantize_pvt.h, takehiro.c + (takehiro-2002_05_07-experimental): + + more coding style and comment clean up. + do not quantize all the band in CBR_2nd_bitalloc(). this increase the speed and fix bug when -q6,7,8 + +2003-11-01 18:16 takehiro + + * libmp3lame/: bitstream.c, quantize.c, tables.c, tables.h, + takehiro.c (takehiro-2002_05_07-experimental): + + general code clean up + reduce division in calc_noise() + +2003-11-01 14:20 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix bug in sfb21 handling code(it mistook dB scale and real scale). + +2003-11-01 12:44 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + coding clean up + +2003-10-30 15:29 takehiro + + * libmp3lame/: quantize.c, takehiro.c + (takehiro-2002_05_07-experimental): + + optimize quantization of "must be quantized to 0 or 1" region. + +2003-10-30 15:28 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + added new setting, "-q 6" + +2003-10-30 14:57 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix small quantization bug in VBR. + +2003-10-30 14:17 takehiro + + * libmp3lame/: encoder.c, quantize.c + (takehiro-2002_05_07-experimental): + + fix low bitrate and intensity stereo. + +2003-10-30 13:09 bouvigne + + * libmp3lame/lame.c: + + Moved replaygain analysis after resampling. It was causing problems when + used with non standard sampling frequencies. + +2003-10-27 15:57 takehiro + + * configure.in, configure (takehiro-2002_05_07-experimental): + + added to use TAKEHIRO_IEEE754_HACK on AMD64 machines. + +2003-10-26 17:58 takehiro + + * testcase.mp3 (takehiro-2002_05_07-experimental): + + regen + +2003-10-26 16:50 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + update -q mapping and comment. + now -q0/-q1 is same as -q2 (-h) + +2003-10-26 16:26 takehiro + + * libmp3lame/: lame.c, util.c, util.h + (takehiro-2002_05_07-experimental): + + more alignment work. + +2003-10-26 16:26 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + optimize calc_noise(). as in main branch, it re-uses the previous + calc_noise result where its scalefactor value is not changed + +2003-10-26 15:22 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + added "SIMD (asm used)" message + +2003-10-26 15:22 takehiro + + * libmp3lame/: quantize.c, machine.h + (takehiro-2002_05_07-experimental): + + more alignment work. + +2003-10-26 14:54 takehiro + + * libmp3lame/: machine.h, util.h + (takehiro-2002_05_07-experimental): + + alignment work + +2003-10-26 14:48 takehiro + + * libmp3lame/: quantize.c, takehiro.c, util.h, i386/Makefile.am, + i386/Makefile.in, i386/nasm.h, i386/quantSSE.nas + (takehiro-2002_05_07-experimental): + + SSE version of calculate xr^(3/4), from gogo-no-coda. + +2003-10-26 14:46 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + trivial optimization. + +2003-10-26 12:44 takehiro + + * frontend/parse.c, libmp3lame/lame.c, libmp3lame/quantize.c, + libmp3lame/tables.c, libmp3lame/takehiro.c + (takehiro-2002_05_07-experimental): + + update substep noise shaping. + - pseudo half step is now default when -q 0 to 4. + - in VBR mode, use substep noise shaping if 320kbps is not enough. + - changed behaivior of --substep option (see the usage message) + +2003-10-26 11:52 takehiro + + * libmp3lame/: encoder.c, quantize.c + (takehiro-2002_05_07-experimental): + + more generalized optimization by using gfc->xrMaxNum. + - we can also use it now with VBR. + +2003-10-26 11:27 takehiro + + * frontend/mp3x.c, include/lame.h + (takehiro-2002_05_07-experimental): + + fix build problem... + +2003-10-26 07:43 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + use adjust_global_gain() function when pseudohalf step noise shaping. + fix it sometimes exceed the global_gain limit. + +2003-10-26 07:38 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + fix build problem when with DECODE_ON_THE_FLY + +2003-10-26 07:14 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix when subblock_gain or scalefactor_scale is used. + +2003-10-25 20:53 takehiro + + * libmp3lame/: quantize.c, takehiro.c + (takehiro-2002_05_07-experimental): + + re-quantizing only on the sfb where "distortion" is found. (faster !) + + revert "double"->"FLOAT" conversion. + - it makes some problems on the machine of which FLOAT is REALLY FLOAT + (only 32it precision) + +2003-10-25 19:54 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + optimize/debug gi->xrNumMax usage. + +2003-10-25 19:45 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + added loop break code by looking the noise in sfb21 because there's no sfb value and we can do nothing with it. + +2003-10-25 19:30 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + off by one of max bitrate in VBR. + +2003-10-25 19:28 takehiro + + * libmp3lame/: bitstream.c, bitstream.h, encoder.c, lame.c, + set_get.c (takehiro-2002_05_07-experimental): + + clean up + +2003-10-25 19:28 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix VBR/ABR with --nores encode. + + and clean up reservoir code. + +2003-10-25 19:27 takehiro + + * libmp3lame/VbrTag.c (takehiro-2002_05_07-experimental): + + fix VbrInit code. + +2003-10-25 18:12 takehiro + + * Makefile.B32, Makefile.DJGPP, Makefile.MSVC, Makefile.unix + (takehiro-2002_05_07-experimental): + + fix dependency (remove reservoir.c) + +2003-10-25 18:10 takehiro + + * libmp3lame/: encoder.c, lame.c, lame_global_flags.h, + mpglib_interface.c, psymodel.c, quantize.c, quantize.h, + set_get.c, util.h (takehiro-2002_05_07-experimental): + + analysis hook code clean up. + +2003-10-25 18:10 takehiro + + * TODO (takehiro-2002_05_07-experimental): + + added decoder thread unsafe problem. + +2003-10-25 18:02 takehiro + + * libmp3lame/machine.h (takehiro-2002_05_07-experimental): + + fix build problem + +2003-10-25 15:52 takehiro + + * configure, configure.in, libmp3lame/machine.h + (takehiro-2002_05_07-experimental): + + remove --enable-all-float option from configure, and make --enable-double-float instead. + +2003-10-25 07:31 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + faster calc_noise() by using max number of xr. + +2003-10-25 07:15 takehiro + + * libmp3lame/: encoder.c, quantize.c, tables.c, takehiro.c, util.h + (takehiro-2002_05_07-experimental): + + precise number of max xr for long blocks. (faster CBR/ABR) + code clean up. + +2003-10-25 06:31 takehiro + + * TODO (takehiro-2002_05_07-experimental): + + added mp3x bug. + +2003-10-23 12:09 bouvigne + + * frontend/parse.c, include/lame.h, libmp3lame/presets.c: + + presets + +2003-10-22 16:22 takehiro + + * libmp3lame/: encoder.c, quantize.c, takehiro.c, util.h + (takehiro-2002_05_07-experimental): + + count bits/quantization optimization. + - do not quantize/search all zero region where obviously all zero region. + (use previous quantization result to determine the region) + +2003-10-22 13:55 takehiro + + * libmp3lame/machine.h (takehiro-2002_05_07-experimental): + + remove unused definition + +2003-10-22 10:21 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + changed "double" -> "FLOAT" + +2003-10-22 10:17 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + fix sometimes preflag does not decrease the bitrate. + +2003-10-22 10:16 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + trivial clean up + +2003-10-22 08:26 takehiro + + * libmp3lame/takehiro.c: + + fix assertion failure reported by Gabriel. + +2003-10-22 07:33 takehiro + + * libmp3lame/bitstream.c: + + better debug message + +2003-10-22 07:11 takehiro + + * libmp3lame/: libmp3lame.dsp, libmp3lame_vc6.dsp + (takehiro-2002_05_07-experimental): + + update for reservoir code clean up. + +2003-10-21 16:31 takehiro + + * libmp3lame/: bitstream.c, bitstream.h, id3tag.c + (takehiro-2002_05_07-experimental): + + one more clean up + +2003-10-21 16:31 takehiro + + * DEFINES, TODO (takehiro-2002_05_07-experimental): + + NEW_DRAIN is now defaulted and it solves wmp6.4 problem + +2003-10-21 16:22 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + remove duplicated error check + make NEW_DRAIN as default + code clean up. + +2003-10-21 09:05 bouvigne + + * libmp3lame/: set_get.c, set_get.h, vbrquantize.c: + + cleanup + +2003-10-20 16:10 olcios + + * doc/html/history.html: + + Added the word "Radio" to the description of the ReplayGain contribution, as it is actually the "Radio" ReplayGain that is computed. + +2003-10-20 15:02 takehiro + + * libmp3lame/: VbrTag.c, VbrTag.h, encoder.c + (takehiro-2002_05_07-experimental): + + clean up VBRTAG related code. + - now the tag is same when --freeformat 128 and when -b 128 + - do not make seek table when CBR + +2003-10-20 13:19 takehiro + + * libmp3lame/: Makefile.am, Makefile.in, VbrTag.c, bitstream.c, + quantize.c, quantize_pvt.h, reservoir.c, reservoir.h, tables.c, + util.h (takehiro-2002_05_07-experimental): + + large clean up arround reservoir related code + +2003-10-20 12:30 bouvigne + + * doc/html/history.html: + + history + +2003-10-20 11:08 bouvigne + + * libmp3lame/version.h: + + bump alpha + +2003-10-20 07:20 bouvigne + + * libmp3lame/quantize_pvt.c: + + fixed build problem + +2003-10-19 23:26 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix comments. + +2003-10-19 17:19 takehiro + + * TODO (takehiro-2002_05_07-experimental): + + updated + +2003-10-19 17:12 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + simplify the short block noise calculation. + +2003-10-19 16:58 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix VBR when i-stereo and completely mono. + +2003-10-19 14:14 takehiro + + * testcase.mp3 (takehiro-2002_05_07-experimental): + + update + +2003-10-19 14:05 takehiro + + * libmp3lame/: machine.h, mpglib_interface.c, newmdct.c, + quantize.c, tables.c, util.c (takehiro-2002_05_07-experimental): + + remove FLOAT8 at all. + +2003-10-19 14:04 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + "floating" scalefactor optimization when preflag is enabled. + +2003-10-19 13:42 takehiro + + * libmp3lame/: bitstream.c, quantize.c, tables.c, takehiro.c + (takehiro-2002_05_07-experimental): + + fix MPEG2 Layer3 scalefactor store code. + - fix i-stereo mode. + - fix preflag usage. + +2003-10-19 13:13 takehiro + + * libmp3lame/util.h (takehiro-2002_05_07-experimental): + + remove unused member + +2003-10-19 12:50 takehiro + + * libmp3lame/encoder.c (takehiro-2002_05_07-experimental): + + Fix subband filtering initialization code. + I hope this solves "very the 1st frame" problem. + +2003-10-19 12:20 takehiro + + * libmp3lame/: bitstream.c, takehiro.c + (takehiro-2002_05_07-experimental): + + use preflag when MPEG2 + added istereo bitstream output code when MPEG2 + (only output code. not support at the bit-allocation). + +2003-10-19 11:41 takehiro + + * libmp3lame/encoder.c (takehiro-2002_05_07-experimental): + + oops, I checked in the wrong version ... + +2003-10-19 11:39 takehiro + + * TODO (takehiro-2002_05_07-experimental): + + update + +2003-10-19 11:37 takehiro + + * libmp3lame/: encoder.c, lame.c, newmdct.c, psymodel.c, psymodel.h + (takehiro-2002_05_07-experimental): + + fix very the 1st frame encoding. + at least MPEG2 Layer3 works, but still there's problem... + +2003-10-19 06:24 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + fix warning when not HAVE_GTK + +2003-10-19 04:45 takehiro + + * TODO (takehiro-2002_05_07-experimental): + + updated and renumbered. + +2003-10-19 04:42 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix max sfb value when preflag+IS + +2003-10-19 04:41 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + update comment + +2003-10-18 18:05 takehiro + + * libmp3lame/: encoder.c, quantize.c, tables.c, util.c, util.h + (takehiro-2002_05_07-experimental): + + small clean ups and remove outdated comments. + +2003-10-18 17:19 takehiro + + * frontend/parse.c, libmp3lame/lame.c, libmp3lame/quantize.c, + libmp3lame/quantize_pvt.h, libmp3lame/set_get.c, + libmp3lame/util.h (takehiro-2002_05_07-experimental): + + use always max_noise as the noise estimation and remove the "quantcomp" selection + +2003-10-18 16:54 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + clean up and simplify bin_search_StepSize(). + +2003-10-18 16:46 takehiro + + * libmp3lame/: bitstream.c, quantize.c, reservoir.c, reservoir.h + (takehiro-2002_05_07-experimental): + + fix for NEW_DRAIN + fix for target bitrate display in mp3x + and code clean up. + +2003-10-18 16:17 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + small clean up + +2003-10-18 16:14 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + widen the scalefactor search range when VBR. + and use previous frame information to find the scalefactor. + +2003-10-18 13:44 takehiro + + * libmp3lame/: VbrTag.c, VbrTag.h, bitstream.c, lame.c, psymodel.c, + quantize.c, util.c, util.h (takehiro-2002_05_07-experimental): + + fix warnings + +2003-10-18 13:43 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + short block threshold tuning. + +2003-10-18 12:38 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix it sometimes drains too much bits into the ancillary. + +2003-10-18 10:42 takehiro + + * TODO (takehiro-2002_05_07-experimental): + + added quality problem. + +2003-10-17 14:39 bouvigne + + * libmp3lame/: quantize_pvt.c, quantize_pvt.h: + + One more speedup in calc_noise, but the function is now a little messy + +2003-10-17 13:50 bouvigne + + * configMS.h: + + updated version number + +2003-10-17 11:49 bouvigne + + * libmp3lame/: quantize.c, quantize_pvt.c, quantize_pvt.h: + + Speedup calc_noise (about 5-10%) by re-using noise values per sfb between + successive calls + +2003-10-16 15:36 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + tuning short block masking threshold calculation. + +2003-10-16 15:12 takehiro + + * libmp3lame/: bitstream.c, encoder.h, newmdct.c, psymodel.c + (takehiro-2002_05_07-experimental): + + simplify the block type update code. + +2003-10-16 15:10 takehiro + + * libmp3lame/: lame.c, quantize.c, tables.c + (takehiro-2002_05_07-experimental): + + trivial coding clean up. + +2003-10-16 13:26 bouvigne + + * libmp3lame/: VbrTag.c, presets.c: + + Put preset used in tag even when just using -b or --abr + +2003-10-16 12:55 bouvigne + + * libmp3lame/VbrTag.c: + + fixed a Lame header bug: + -b xxx --preset yyy was putting xxx as minimum bitrate value in the + tag instead of the value defined in the preset yyy + +2003-10-16 01:32 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + fix warning when not DEBUG mode + +2003-10-16 01:30 takehiro + + * libmp3lame/: encoder.c, lame.c, psymodel.c, tables.c, util.h + (takehiro-2002_05_07-experimental): + + one more cleanup + +2003-10-14 17:56 takehiro + + * libmp3lame/: encoder.c, lame-analysis.h, psymodel.c, util.h + (takehiro-2002_05_07-experimental): + + one more general code clean up. + +2003-10-14 17:37 takehiro + + * testcase.mp3, libmp3lame/VbrTag.c, libmp3lame/bitstream.c, + libmp3lame/quantize.c, libmp3lame/reservoir.c, + libmp3lame/reservoir.h, libmp3lame/tables.c, libmp3lame/util.h + (takehiro-2002_05_07-experimental): + + general clean up. + +2003-10-14 16:57 takehiro + + * libmp3lame/VbrTag.c (takehiro-2002_05_07-experimental): + + write down "i-stereo used or not" to LAME tag. + +2003-10-14 16:56 takehiro + + * libmp3lame/VbrTag.c (takehiro-2002_05_07-experimental): + + remove automs code + +2003-10-14 16:54 takehiro + + * testcase.mp3, frontend/parse.c, include/lame.h, + libmp3lame/encoder.c, libmp3lame/lame.c, + libmp3lame/lame_global_flags.h, libmp3lame/set_get.c, + libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + remove lame_(set|get)_automs + remove "-m a" option + + simplify when no psymodel case (but it has bug in reservoir handling.) + +2003-10-14 16:46 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + compress "floating" scalefactors + +2003-10-14 12:56 takehiro + + * frontend/brhist.c (takehiro-2002_05_07-experimental): + + treat "LR-i" as same as "LR" when display LR/MS history bar. + +2003-10-14 12:23 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + fix MS_MD_LR_LR will never be selected ... + +2003-10-14 12:21 takehiro + + * libmp3lame/: lame.c, psymodel.c + (takehiro-2002_05_07-experimental): + + update mode/block type selection (mode_ext) code. + - now it uses "START-STOP" block type transition. + - istereo selection code is now simplified. + - and small general code clean ups. + +2003-10-13 17:56 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + clean up istereo related code. + +2003-10-13 17:52 takehiro + + * Makefile.am, Makefile.in (takehiro-2002_05_07-experimental): + + fix testcase failure when not HAVE_GTK + +2003-10-13 17:27 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix mp3x sometime assertion failure. + +2003-10-13 17:21 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + fix it forgot to reset the istereo usage sfb when LR_I -> LR_MS + +2003-10-13 15:57 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + widen the sf search range on short block. + some code clean up. + +2003-10-13 15:56 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + tuning tonality estimation of "middle" frequency area. + +2003-10-13 15:25 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + clean up VBR code. + +2003-10-13 13:50 takehiro + + * TODO (takehiro-2002_05_07-experimental): + + update with alpha 9 + +2003-10-13 13:48 takehiro + + * frontend/main.c (takehiro-2002_05_07-experimental): + + nuke ".raw" from output filename. + fix possible buffer overrun. + +2003-10-13 13:26 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + use substep noise shaping even when short block. + do not substep noise shaping on digital silent channel. + +2003-10-13 13:20 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + init code optimization (do not calculate xr^(3/4) beyond cutoff). + +2003-10-13 13:19 takehiro + + * libmp3lame/: lame.c, tables.c (takehiro-2002_05_07-experimental): + + use same ath adjustment code for VBR/CBR/ABR + +2003-10-13 11:05 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + fix LR-i stereo selection on short blocks. (I forgot to commit this in alpha9) + +2003-10-13 11:02 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + fix comment. + +2003-10-13 10:20 takehiro + + * testcase.mp3, libmp3lame/version.h + (takehiro-2002_05_07-experimental): + + here goes alpha9 + +2003-10-13 10:19 takehiro + + * libmp3lame/: encoder.c, lame.c, quantize.c, quantize_pvt.h, + takehiro.c (takehiro-2002_05_07-experimental): + + clean up preflag/istereo code. + +2003-10-13 10:17 takehiro + + * libmp3lame/encoder.c (takehiro-2002_05_07-experimental): + + one more fix about i-stereo aging bug. + +2003-10-13 09:53 takehiro + + * frontend/parse.c (takehiro-2002_05_07-experimental): + + fix --allshort and --shortthreshold + +2003-10-11 20:17 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + changed variable name, cod_info_w -> gi_w + +2003-10-11 20:11 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + use best_scalefac when istereo. + +2003-10-11 19:45 takehiro + + * libmp3lame/: lame.c, tables.c, util.h + (takehiro-2002_05_07-experimental): + + clean up ATH adjustment code. + +2003-10-11 19:45 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + do not use athAdjust() + +2003-10-11 19:36 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + prepare for "START-STOP" sequence. + +2003-10-11 15:11 takehiro + + * libmp3lame/: encoder.c, psymodel.c, tables.c, util.h + (takehiro-2002_05_07-experimental): + + fix i-stereo aging bug. + +2003-10-11 14:11 takehiro + + * libmp3lame/: encoder.c, psymodel.c, psymodel.h, quantize.c, + quantize.h, util.h (takehiro-2002_05_07-experimental): + + trivial optimization (more and more) + +2003-10-11 13:42 takehiro + + * libmp3lame/: psymodel.c, tables.c + (takehiro-2002_05_07-experimental): + + trivial optimization + +2003-10-11 13:39 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + trivial clean up + +2003-10-11 13:19 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + use subblock_gain and scalefac_scale when i-stereo and CBR/ABR. + +2003-10-11 13:13 takehiro + + * libmp3lame/: quantize.c, tables.c + (takehiro-2002_05_07-experimental): + + i-stereo with VBR. + +2003-10-11 11:21 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + work arround for mono-input problem when istereo. + +2003-10-11 11:09 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + fix cutoff when i-stereo enabled but not using istereo frame. + +2003-10-11 11:05 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + make check_istereo() to be aware of the cutoff. + +2003-10-11 10:34 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix off by one bug in loop_break() + +2003-10-11 10:29 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + fix off by one bug in PE calculation (and some code clean up). + +2003-10-06 05:09 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + istereo selection code optimization + +2003-10-06 04:20 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix scalefactor breakage when istereo case + +2003-10-05 18:08 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + reduce istereo usage ratio. + +2003-10-05 18:04 takehiro + + * libmp3lame/encoder.c (takehiro-2002_05_07-experimental): + + small clean up + +2003-10-05 17:59 takehiro + + * libmp3lame/VbrTag.c (takehiro-2002_05_07-experimental): + + sync with main branch + - Gaby's freeformat vbrtag fix(rev 1.67->1.68). + +2003-10-05 17:48 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + fix LR-i mode selection. + +2003-10-05 17:05 takehiro + + * testcase.mp3, frontend/gtkanal.c, libmp3lame/encoder.c, + libmp3lame/quantize.c, libmp3lame/quantize.h + (takehiro-2002_05_07-experimental): + + general mp3x cleanup. + +2003-10-05 16:36 takehiro + + * frontend/gtkanal.c (takehiro-2002_05_07-experimental): + + remove magic numbers + +2003-10-05 14:17 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + pe -> bit-allocation update.(revert old one) + +2003-10-05 13:59 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix when almost mono input. + +2003-10-05 13:29 takehiro + + * libmp3lame/: quantize.c, tables.c + (takehiro-2002_05_07-experimental): + + one more --athonly hack. + +2003-10-05 13:21 takehiro + + * libmp3lame/: quantize.c, tables.c + (takehiro-2002_05_07-experimental): + + simplify calc_xmin when "ATH only". + +2003-10-05 12:15 takehiro + + * libmp3lame/encoder.c (takehiro-2002_05_07-experimental): + + fix sfb buffer overrun when i-stereo. + +2003-10-05 11:54 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + update the algorithm to select the sfb where it uses i-stereo. + +2003-10-05 10:37 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + fix short block cutoff sfb calculation. + +2003-10-04 18:27 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + small optimization + - noise calculation in "all zero" region. + - sfb21 shaping aware loop_break() + +2003-10-04 18:26 takehiro + + * libmp3lame/encoder.c (takehiro-2002_05_07-experimental): + + small clean up + +2003-10-04 16:57 takehiro + + * frontend/parse.c, libmp3lame/lame.c, libmp3lame/set_get.c + (takehiro-2002_05_07-experimental): + + VBR quality over 9 (not tuned yet at all). + +2003-10-04 16:52 takehiro + + * libmp3lame/: tables.c, util.h, encoder.c, psymodel.c + (takehiro-2002_05_07-experimental): + + make it default to do noise shaping in sfb21. + cutoff-aware PE(perceptual entropy) calculation. + +2003-10-02 09:25 takehiro + + * frontend/parse.c: + + fix build problem.(I made a mistake when back porting ...) + +2003-10-01 16:13 takehiro + + * mpglib/layer3.c (takehiro-2002_05_07-experimental): + + fix build problem + +2003-09-29 17:47 takehiro + + * libmp3lame/: psymodel.c, tables.c + (takehiro-2002_05_07-experimental): + + tonality estimation tuning ... still need more. + +2003-09-29 14:00 takehiro + + * configure (takehiro-2002_05_07-experimental): + + regen + +2003-09-29 00:35 takehiro + + * configure.in (takehiro-2002_05_07-experimental): + + fix typo + +2003-09-28 16:44 takehiro + + * configMS.h (takehiro-2002_05_07-experimental): + + fix version + +2003-09-28 16:42 takehiro + + * USAGE (takehiro-2002_05_07-experimental): + + small update. + +2003-09-28 16:32 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + re-enable scfsi usage. + +2003-09-28 16:30 takehiro + + * libmp3lame/: quantize.c, quantize_pvt.h, takehiro.c + (takehiro-2002_05_07-experimental): + + use scalefactor() macro more. + +2003-09-28 16:19 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + tonality estimation fix #1 + - safer tonality estimation at lower frequency. + - tuned sine wave (arround 20Hz) with the option "-v --substep 1" + + - we still need tuning sine wave arround 1kHz. + +2003-09-27 18:39 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + "smoothing" the istereo/narrow-stereo/reduce-side values for default setting. + and code clean up. + +2003-09-27 18:11 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + many small clean up. + + and mp3x update. + - display number of scalefactor bands with a distortion. + - display total noise. + +2003-09-27 17:15 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + fix display of istereo-ratio and reduce-side factor + +2003-09-27 17:14 takehiro + + * libmp3lame/lame-analysis.h (takehiro-2002_05_07-experimental): + + remove unused definition + +2003-09-27 17:14 takehiro + + * INSTALL (takehiro-2002_05_07-experimental): + + updated for LAME4 + - remove outdated compile time options including configure option. + +2003-09-27 15:50 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + fix narrow stereo default setting bug. + +2003-09-27 13:13 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + It assumes the noise is monotonic function of the scalefactor, but it is not true. + To fix it, I added CBR_2nd_bitalloc() function. + +2003-09-27 13:05 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + fix "%" display. + +2003-09-27 09:58 takehiro + + * frontend/parse.c, libmp3lame/lame.c + (takehiro-2002_05_07-experimental): + + added --reduce-side option + + added to display side-channel pe reduction factor and narrowen stereo factor, + when --verbose. + +2003-09-27 08:24 takehiro + + * libmp3lame/: lame.c, psymodel.c, quantize.c, set_get.c, + set_get.h, util.h (takehiro-2002_05_07-experimental): + + reduce_ratio option to control MS/LR ratio. + need more tuning. + +2003-09-27 06:16 takehiro + + * frontend/parse.c: + + added priority control on WIN32, backport from experimental branch. + +2003-09-26 13:52 takehiro + + * libmp3lame/VbrTag.c (takehiro-2002_05_07-experimental): + + remove outdated comment. + +2003-09-26 03:50 takehiro + + * TODO (takehiro-2002_05_07-experimental): + + updated + +2003-09-25 16:27 takehiro + + * frontend/parse.c, libmp3lame/encoder.c, libmp3lame/lame.c, + libmp3lame/quantize.c, libmp3lame/set_get.c, + libmp3lame/set_get.h, libmp3lame/util.h + (takehiro-2002_05_07-experimental): + + - added --narrowen-stereo option + - use narrowen stereo default when lower than 90kbps. + +2003-09-25 15:54 takehiro + + * frontend/parse.c (takehiro-2002_05_07-experimental): + + added priority control option on MS-Windows. + (request #649324 @ sf.net) + +2003-09-25 13:21 takehiro + + * configure (takehiro-2002_05_07-experimental): + + regen by hand. + +2003-09-25 13:21 takehiro + + * configure.in (takehiro-2002_05_07-experimental): + + fix typo + +2003-09-25 13:15 takehiro + + * libmp3lame/i386/Makefile.in (takehiro-2002_05_07-experimental): + + fix automake bug by hand (work arround) + +2003-09-24 23:18 takehiro + + * Makefile.in, aclocal.m4, config.guess, config.sub, configure, + depcomp, install-sh, missing, mkinstalldirs, ACM/Makefile.in, + ACM/ADbg/Makefile.in, ACM/tinyxml/Makefile.in, Dll/Makefile.in, + debian/Makefile.in, doc/Makefile.in, doc/html/Makefile.in, + doc/man/Makefile.in, dshow/Makefile.in, frontend/Makefile.in, + frontend/rtp.c, include/Makefile.in, libmp3lame/Makefile.in, + libmp3lame/i386/Makefile.in, mac/Makefile.in, misc/Makefile.in, + mpglib/Makefile.in (takehiro-2002_05_07-experimental): + + regen with aclocl-1.7, automake-1.7, autoconf-2.57 + +2003-09-24 23:15 takehiro + + * configure.in (takehiro-2002_05_07-experimental): + + fixed mingw build. + - socket patch from leighsmith, patch ID #809315 @ sf.net + + socket function is not mandatory when mp3rtp is not built. + - bug report from gadibergman, Bug ID #809678 @ sf.net + +2003-09-23 18:29 takehiro + + * DEFINES (takehiro-2002_05_07-experimental): + + updated + +2003-09-23 18:04 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + it sometime goes into infinite loop when imcomplete wave file... + +2003-09-23 17:28 takehiro + + * libmp3lame/: encoder.c, quantize.c + (takehiro-2002_05_07-experimental): + + added "narrow stereo image" function. + I will add new "right" switch to enable it, but till then, + use -X n (0 + +2003-08-10 12:48 bouvigne + + * include/lame.h, libmp3lame/lame.c, libmp3lame/presets.c, + libmp3lame/psymodel.h, libmp3lame/set_get.c, + libmp3lame/set_get.h: + + use presets by default for abr/cbr + +2003-08-10 10:11 takehiro + + * libmp3lame/Makefile.in (takehiro-2002_05_07-experimental): + + regen + +2003-08-10 10:09 takehiro + + * libmp3lame/: libmp3lame.dsp, libmp3lame_vc6.dsp + (takehiro-2002_05_07-experimental): + + new interface to change internal flags + +2003-08-10 10:06 takehiro + + * libmp3lame/Makefile.am (takehiro-2002_05_07-experimental): + + new interface to change internal flags. + +2003-08-10 10:05 takehiro + + * libmp3lame/lame.c, libmp3lame/set_get.c, frontend/parse.c, + include/lame.h, libmp3lame/set_get.h + (takehiro-2002_05_07-experimental): + + sync with main branch and fix comments. + - changed API name + - hidden "internal" flags when stable release (when it will be...) + +2003-08-10 10:03 takehiro + + * frontend/brhist.c (takehiro-2002_05_07-experimental): + + fix comment. + +2003-08-10 10:03 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + fix it may use i-stereo at sfb21. + +2003-08-10 10:00 takehiro + + * debian/: control, copyright, lame.docs, lame.files, rules + (takehiro-2002_05_07-experimental): + + sync with main branch, except changelog itself. + +2003-08-09 18:55 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + fix for when there's no LIST chunk. + +2003-08-09 12:54 takehiro + + * libmp3lame/util.h (takehiro-2002_05_07-experimental): + + fix warning one more. + +2003-08-09 12:00 takehiro + + * libmp3lame/util.h (takehiro-2002_05_07-experimental): + + fix aliasing warning + +2003-08-09 11:30 takehiro + + * libmp3lame/id3tag.c (takehiro-2002_05_07-experimental): + + added definition for MSVC (as Gabriel did in main branch) + +2003-07-16 01:29 rbrito + + * debian/: changelog, control, copyright, lame.docs, lame.files, + rules: + + Updated debian packaging. + +2003-07-13 10:11 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + RIFF->ID3Tag conversion patch from Charlie Lenahan + +2003-07-11 16:35 aleidinger + + * doc/html/id3.html, doc/man/lame.1, frontend/parse.c: + + Add --ignore-tag-errors, mostly submitted by Adam Luter + . + +2003-06-29 15:43 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + revert the latest psymodel update... + +2003-06-15 16:52 takehiro + + * libmp3lame/encoder.c (takehiro-2002_05_07-experimental): + + trivial coding style update (comment style change, // ... -> /* ... */ ) + +2003-06-15 16:48 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + do not output unused information to avoid any confusion. + +2003-06-15 15:28 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix almost all the VBR infinite loop problem (I hope) + + general code simplification + +2003-06-14 17:52 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + simplified VBR code. + +2003-06-14 17:36 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + simplify the VBR code. + + fix more infinite loop in VBR, but still .... + +2003-06-14 14:34 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix method 2 of substep shaping. + added VBR_3rd_bitalloc() to reduce bitrate little bit. + +2003-06-14 14:33 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + one more safer tonality estimation in lower frequency, especially for human voice. + +2003-06-14 14:32 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + trivial simplification + +2003-06-14 09:32 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + fix compilation problem on MSVC reported by Yaroslav Efimov + +2003-06-14 07:40 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix possible VBR infinite loop... but there are still problems. + +2003-06-08 18:19 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix VBR code assumes noise<->scalefactor is a monotonic function. + + some trivial style update + +2003-06-08 17:05 takehiro + + * include/lame.h, frontend/parse.c, libmp3lame/lame.c, + libmp3lame/lame_global_flags.h, libmp3lame/psymodel.c, + libmp3lame/set_get.c, libmp3lame/util.h + (takehiro-2002_05_07-experimental): + + remove nspsytune2 + +2003-06-08 16:58 takehiro + + * include/lame.h, frontend/parse.c, libmp3lame/lame.c, + libmp3lame/lame_global_flags.h, libmp3lame/psymodel.c, + libmp3lame/set_get.c (takehiro-2002_05_07-experimental): + + always use ATH adaptive adjustment + +2003-06-08 16:56 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + trivial clean up + +2003-06-08 16:40 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + experimental LR-i check code (not enabled yet) + +2003-06-04 17:47 takehiro + + * Dll/BladeMP3EncDLL.c (takehiro-2002_05_07-experimental): + + sync main branch + +2003-06-04 17:42 takehiro + + * Dll/BladeMP3EncDLL.c: + + fix quality setting API(patch for BugID 746439 at sf.net, reported by mikokong). + +2003-06-01 18:22 aleidinger + + * libmp3lame/Makefile.in: + + regen + +2003-06-01 18:22 aleidinger + + * libmp3lame/Makefile.am: + + add new private header + +2003-06-01 17:20 bouvigne + + * frontend/parse.c, include/lame.h, libmp3lame/libmp3lame_vc6.dsp, + libmp3lame/presets.c, libmp3lame/set_get.c, libmp3lame/set_get.h: + + private header for internal set/get interfaces + +2003-06-01 16:12 bouvigne + + * libmp3lame/id3tag.c: + + let's use snprintf, with a define for msvc + +2003-06-01 12:34 takehiro + + * libmp3lame/: lame.c, takehiro.c + (takehiro-2002_05_07-experimental): + + trivial simplification + +2003-06-01 12:25 takehiro + + * frontend/parse.c (takehiro-2002_05_07-experimental): + + added --is-ratio switches to set the is-ratio. + + remove descriptions about -X,-Y and -Z. + +2003-06-01 12:24 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + added istereo-ratio to display. + +2003-06-01 12:19 takehiro + + * TODO (takehiro-2002_05_07-experimental): + + update TODOs and categorize them. + +2003-06-01 09:16 takehiro + + * libmp3lame/: lame.c, quantize.c + (takehiro-2002_05_07-experimental): + + tuning lower bitrate (arround 64kbps). + - improve pe -> bit allocation + - changed cutoff, short-threshold. + +2003-06-01 09:14 bouvigne + + * libmp3lame/VbrTag.c: + + fix seek table for freeformat + + There is still something strange because with + -b128 and + -b128 --freeformat + I do not get the same seek table + +2003-06-01 09:06 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + scfsi debug. + - it forgot to initialize scfsi flag when it changes "not istereo" frame to "istereo" frame. + - when scfsi is not used at all, do not re-calculate the how many bits are needed to store the scalefactors. + +2003-05-31 18:28 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + initialize gfc->l3_side.is_start_sfb_l/s in case not using istereo. + +2003-05-31 18:19 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + do not do the istereo related processes when dual stereo mode. + +2003-05-31 14:05 bouvigne + + * libmp3lame/id3tag.c: + + ID3 TAG of "Encoder name", backported from experimental branch. + Btw snprintf does not exist under msvc, so I used sprintf. + +2003-05-31 13:52 takehiro + + * libmp3lame/VbrTag.c (takehiro-2002_05_07-experimental): + + sync with the main branch (fix VBR tag when freeformat by Gabriel) + +2003-05-31 13:30 takehiro + + * libmp3lame/id3tag.c (takehiro-2002_05_07-experimental): + + ID3 TAG of "Encoder name". + This is based on the patch from danchr, at http://www.hydrogenaudio.org/index.php?act=ST&f=15&t=9858& + +2003-05-31 13:16 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + do not use istereo when "analog-monaural". + +2003-05-25 17:00 takehiro + + * libmp3lame/: encoder.c, psymodel.c, tables.c, util.h + (takehiro-2002_05_07-experimental): + + fix i-stereo frame timing delay. + + do not use i-stereo when completely mono. + +2003-05-25 15:34 bouvigne + + * libmp3lame/VbrTag.c: + + corrected the bitrate index of LAME tag in case of freeformat, + but the seek table is still wrong + +2003-05-25 13:21 takehiro + + * Makefile.in, debian/Makefile.in + (takehiro-2002_05_07-experimental): + + regen + +2003-05-25 13:14 takehiro + + * Makefile.am, debian/Makefile.am + (takehiro-2002_05_07-experimental): + + moved dist-hook, as is in the head branch. + +2003-05-25 13:09 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + fix initialization of "istereo used band" when istereo is not used at all. + +2003-05-25 13:04 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix istereo stereo image bug when mono. + +2003-05-25 12:28 takehiro + + * include/lame.h, libmp3lame/lame.c, libmp3lame/psymodel.c, + libmp3lame/set_get.c, libmp3lame/tables.c, libmp3lame/util.h + (takehiro-2002_05_07-experimental): + + psymodel for i-stereo. + determine which sfb to use i-stereo by checking similarity of the masking/energy ratios. + +2003-05-25 07:31 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + optimize CBR/VBR mode pe<->bit allocation + + trivial simplification arround VBR. + +2003-05-25 03:25 takehiro + + * libmp3lame/: encoder.c, psymodel.c + (takehiro-2002_05_07-experimental): + + i-stereo improvement. + - auto switching LR-i <=> MS-i + - i-stereo aware pe calculation + +2003-05-25 01:19 takehiro + + * frontend/brhist.c (takehiro-2002_05_07-experimental): + + added i-stereo frame count display. + +2003-05-25 00:59 takehiro + + * TODO (takehiro-2002_05_07-experimental): + + slightly updated about i-stereo. + +2003-05-20 12:19 aleidinger + + * debian/Makefile.in, configure: + + regen + +2003-05-20 12:17 aleidinger + + * aclocal.m4: + + remove gtk12-config + +2003-05-20 12:14 aleidinger + + * Makefile.am, debian/Makefile.am: + + move the dist-hook into the directory where the action happens + +2003-05-20 12:13 aleidinger + + * configure.in: + + some enhancements for compiler problems and detection of the right size of some types + +2003-05-19 04:20 takehiro + + * configure (takehiro-2002_05_07-experimental): + + regen + +2003-05-19 04:19 takehiro + + * Makefile.in, aclocal.m4, config.guess, config.sub, ltmain.sh, + ACM/Makefile.in, ACM/ADbg/Makefile.in, ACM/tinyxml/Makefile.in, + Dll/Makefile.in, debian/Makefile.in, doc/Makefile.in, + doc/html/Makefile.in, doc/man/Makefile.in, dshow/Makefile.in, + frontend/Makefile.in, include/Makefile.in, + libmp3lame/Makefile.in, libmp3lame/i386/Makefile.in, + mac/Makefile.in, misc/Makefile.in, mpglib/Makefile.in + (takehiro-2002_05_07-experimental): + + regen with libtool-1.4.2/automake-1.5 to fix nasm enabled build + +2003-05-19 04:17 takehiro + + * libmp3lame/encoder.c (takehiro-2002_05_07-experimental): + + fix compilation problem on "old" compilers + +2003-05-19 04:09 takehiro + + * .cvsignore (takehiro-2002_05_07-experimental): + + added stamp-h?, remove stamp-h1 + +2003-05-18 17:20 takehiro + + * libmp3lame/: bitstream.c, encoder.c, lame.c, lame_global_flags.h, + psymodel.c, quantize.c, tables.c, takehiro.c, util.h, version.h + (takehiro-2002_05_07-experimental): + + initial support of intensity stereo for lower bitrate + it will be enabled when 64-112kbps by default. + + now bump up the alpha7. + +2003-05-18 16:13 takehiro + + * libmp3lame/version.c (takehiro-2002_05_07-experimental): + + when NASM is not enabled, do not print message about "MMX" or "3dNow!" + +2003-05-18 15:05 takehiro + + * Makefile.am: + + added chmod +x debian/rules when make dist. + +2003-05-18 15:03 takehiro + + * Makefile.am, Makefile.in, misc/Makefile.am, misc/Makefile.in + (takehiro-2002_05_07-experimental): + + moved lame.bat + added "chmod +x debian/rules" when "make dist" to resolve BugID #578129 + +2003-05-18 14:15 takehiro + + * Dll/BladeMP3EncDLL.h: + + patch from sf.net, Dll compile with gcc. + +2003-05-18 07:04 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + fix for the environment which "long" is 64bit. + +2003-05-18 03:45 takehiro + + * frontend/parse.c, libmp3lame/lame.c + (takehiro-2002_05_07-experimental): + + simplify the opening message + +2003-05-18 02:35 takehiro + + * frontend/: main.h, parse.c (takehiro-2002_05_07-experimental): + + trivial change and fix warnings + +2003-05-18 02:34 takehiro + + * config.guess (takehiro-2002_05_07-experimental): + + oops, I overwrote the older file. revert. + +2003-05-18 02:31 takehiro + + * config.sub (takehiro-2002_05_07-experimental): + + oops, I overwrite the older file. + +2003-05-18 02:27 takehiro + + * stamp-h.in (takehiro-2002_05_07-experimental): + + removed + +2003-05-18 02:21 takehiro + + * USAGE (takehiro-2002_05_07-experimental): + + remove -d and --voice + changed recommended setting + +2003-05-17 18:49 takehiro + + * frontend/: main.c, mp3x.c, parse.c + (takehiro-2002_05_07-experimental): + + simplify the startup messages + fix typo in warning mesage + +2003-05-17 18:35 takehiro + + * frontend/parse.c, include/lame.h, libmp3lame/set_get.c + (takehiro-2002_05_07-experimental): + + remove all the presets + +2003-05-17 17:55 takehiro + + * acconfig.h, ltconfig (takehiro-2002_05_07-experimental): + + removed + +2003-05-17 17:51 takehiro + + * configure (takehiro-2002_05_07-experimental): + + regen + +2003-05-17 17:50 takehiro + + * Makefile.in, aclocal.m4, config.guess, config.h.in, config.sub, + configure.in, ltmain.sh, ACM/Makefile.in, Dll/Makefile.in, + debian/Makefile.in, doc/Makefile.in, dshow/Makefile.in, + frontend/Makefile.in, include/Makefile.in, + libmp3lame/Makefile.in, ACM/ADbg/Makefile.in, + ACM/tinyxml/Makefile.in, mac/Makefile.in, misc/Makefile.in, + mpglib/Makefile.in, doc/html/Makefile.in, doc/man/Makefile.in, + libmp3lame/i386/Makefile.in (takehiro-2002_05_07-experimental): + + regen with autoconf-2.54, automake-1.6, libtool-1.4 + +2003-05-17 17:22 takehiro + + * Dll/BladeMP3EncDLL.h (takehiro-2002_05_07-experimental): + + BladeMP3EncDLL.h patch for GCC from sf.net + +2003-05-15 17:04 takehiro + + * frontend/lametime.c (takehiro-2002_05_07-experimental): + + Fix for SunOS 4, reported by Ti Kan. + +2003-05-15 17:02 takehiro + + * frontend/main.c (takehiro-2002_05_07-experimental): + + fix for sunos 4.x, reported by Ti Kan. + +2003-05-15 16:57 takehiro + + * configure.in, frontend/brhist.c + (takehiro-2002_05_07-experimental): + + fix for BSDI, which does not have term.h (reported by Ti Kan) + +2003-05-15 16:55 takehiro + + * lame.bat, misc/lame.bat (takehiro-2002_05_07-experimental): + + moved lame.bat into misc directory + +2003-05-15 15:09 takehiro + + * libmp3lame/: psymodel.c, psymodel.h, tables.c + (takehiro-2002_05_07-experimental): + + trivial clean up. + +2003-05-15 15:08 takehiro + + * include/lame.h, libmp3lame/set_get.c + (takehiro-2002_05_07-experimental): + + remove set_preset_* functions public. + +2003-05-15 15:07 takehiro + + * libmp3lame/encoder.c (takehiro-2002_05_07-experimental): + + new pseudo sfb21 ath handling code (of course, experimental) + +2003-05-15 14:58 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + Partial fix of VBR code assuming the qunatizing noise always increase + when the scalefactor increase. This makes reduce bitrate arround 40kbps + with bloat_test.wav. + + This fix is not perfect, because it still assumes the qunatizing noise always + decrease when the scalefactor decrease. + +2003-05-15 12:48 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + update default short block threshold + +2003-05-15 12:04 takehiro + + * libmp3lame/: psymodel.c, psymodel.h + (takehiro-2002_05_07-experimental): + + tuning MSFIX value with creaking.wav + simplified and ATH aware msfix() routine. + +2003-05-11 15:03 bouvigne + + * libmp3lame/presets.c: + + updated low bitrate presets. + Considering quality, we have: + ns1 comp1 > ns1 comp3 >ns2 comp3 >ns2 comp1 + +2003-05-11 13:15 bouvigne + + * libmp3lame/lame.c, frontend/parse.c, include/lame.h, + libmp3lame/lame_global_flags.h, libmp3lame/set_get.c: + + --sfscale, inhibited -Z + +2003-05-11 11:33 takehiro + + * libmp3lame/: quantize.c, quantize_pvt.h, lame.c + (takehiro-2002_05_07-experimental): + + simplified calc_noise() and better_quant(). + + update comments. + + tuning ABR/CBR 64/80/192/224 kbps. + +2003-05-11 10:18 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + added comments on vbr code (from main branch). + + trivial simplification in find_scalefac() + + prepare for fixing VBR code assumes "quantize noise always decrease when + scalefactor decrease". + +2003-05-11 09:49 bouvigne + + * libmp3lame/lame.c, libmp3lame/quantize.c, libmp3lame/set_get.c, + frontend/parse.c, include/lame.h, libmp3lame/util.h: + + --sbgain + +2003-05-10 17:56 takehiro + + * testcase.mp3, frontend/parse.c, libmp3lame/lame.c + (takehiro-2002_05_07-experimental): + + fix for -k option (reported by Robert. thanx) + +2003-05-09 14:06 aleidinger + + * frontend/: main.c, lametime.c: + + Fix on SunOs 4, Submitted by: Ti Kan + +2003-05-09 13:44 aleidinger + + * frontend/brhist.c: + + fix on BSD/OS 3.x, Submitted by: Ti Kan + +2003-05-09 13:14 bouvigne + + * libmp3lame/quantize.c: + + re-enabling the psfb12 analog silence detection. This time, the coeffs should + be correct. + However, the coding gain is now quite small + +2003-05-08 12:58 bouvigne + + * libmp3lame/quantize.c: + + I am disabling the code for psfb12 analog + silence detection, as it produces some kind of + dropouts. It probably means that there is a bug + somewhere inside. + +2003-05-04 15:36 bouvigne + + * libmp3lame/version.h: + + bump alpha + +2003-05-04 15:35 bouvigne + + * frontend/parse.c, include/lame.h, libmp3lame/presets.c: + + working on presets + +2003-05-03 14:34 bouvigne + + * frontend/parse.c, include/lame.h, libmp3lame/lame.c, + libmp3lame/lame_global_flags.h, libmp3lame/set_get.c: + + ability to set vbr smooth (for vbr-mtrh) + +2003-05-02 17:38 bouvigne + + * frontend/parse.c: + + internal command line options only available in debug or in alpha. + + This way we should not be worried again by users using non docummented options: + they will not be available for them + +2003-05-02 16:18 bouvigne + + * libmp3lame/vbrquantize.c: + + comments based on some mails exchanged with Robert + +2003-05-01 15:23 bouvigne + + * libmp3lame/lame.c: + + maskingadjust/maskingadjust_short available for vbr-mtrh + +2003-04-27 15:18 bouvigne + + * libmp3lame/: encoder.h, l3side.h, lame.c, quantize.c, + quantize_pvt.c, util.h: + + Analog silence detection in partitionned sfb21 or sfb12 for short blocks + +2003-04-20 17:32 bouvigne + + * libmp3lame/presets.c: + + changed short block quantization comparison to method 0 + for abr/cbr on medium bitrates (because of spahm, fatboy and the likes) , + as suggested by Takehiro. + +2003-04-20 17:03 bouvigne + + * libmp3lame/version.h: + + bump alpha + +2003-04-20 16:56 bouvigne + + * libmp3lame/quantize.c: + + trivial coding change in psfb21_analogsilence + +2003-04-20 16:25 takehiro + + * libmp3lame/version.h (takehiro-2002_05_07-experimental): + + bump up alpha version + +2003-04-20 16:25 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + safer tonality estimation for lower frequency, for better human voice encoding. + + prevent frequent much MS/LR switching. + +2003-04-20 16:22 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + tuning ATH scaling. + +2003-04-20 15:57 bouvigne + + * include/lame.h, frontend/parse.c, libmp3lame/presets.c: + + presets (testing) + +2003-04-20 13:28 bouvigne + + * libmp3lame/: lame.c, util.c, util.h: + + simplified prototype of FindNearestBitrate + +2003-04-20 12:58 bouvigne + + * libmp3lame/presets.c: + + preset insane is now aliased to preset 320 + +2003-04-20 12:53 bouvigne + + * include/lame.h, frontend/parse.c, libmp3lame/presets.c: + + removed some old experimental presets + +2003-04-20 12:33 bouvigne + + * libmp3lame/encoder.c, libmp3lame/lame.c, libmp3lame/presets.c, + frontend/parse.c, libmp3lame/psymodel.c, libmp3lame/quantize.c, + libmp3lame/set_get.c, libmp3lame/util.h, + libmp3lame/vbrquantize.c: + + removed presetTune struct + +2003-04-19 16:34 bouvigne + + * libmp3lame/presets.c: + + fixed medium bitrates cbr/abr presets + +2003-04-19 10:19 bouvigne + + * TODO: + + updated the TODO file + +2003-04-12 13:47 bouvigne + + * doc/html/: contributors.html, history.html: + + history + +2003-04-12 10:20 bouvigne + + * libmp3lame/lame.c, include/lame.h, frontend/parse.c: + + enable fast replaygain analysis by default + define DECODE_ON_THE_FLY if compiled with mpglib + +2003-04-07 10:14 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + fix build problem + +2003-04-07 00:57 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + trivial simplification + +2003-04-06 12:03 takehiro + + * libmp3lame/: lame.c, set_get.c + (takehiro-2002_05_07-experimental): + + fix higher bitrate CBR/ABR preset + first attempt of tuning VBR preset + + fix athaa_sensitivity display and code (there was some confusion arround dB/power) + fix warning of some compare. + +2003-04-06 12:00 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + fix masking handling code for pre-echo prevention works too much aggressively. + +2003-04-06 11:59 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + tuning ATH value of MDCT region. + +2003-04-05 17:56 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + added ATHlower to display when verbose mode. + +2003-04-05 17:20 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + improve short block "pre-surge" masking control. + and simplify the code. + +2003-04-05 17:19 takehiro + + * libmp3lame/encoder.c (takehiro-2002_05_07-experimental): + + fix 1st frame psycho analysis. + +2003-04-05 16:03 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + update lower bitrate ABR/CBR preset. + remove outdated comments + +2003-03-31 16:32 takehiro + + * libmp3lame/: psymodel.c, tables.c, util.h + (takehiro-2002_05_07-experimental): + + - remove long block pre-echo handling code (we don't need it when nspsytune). + - fix the lowpass filter index to determine L/R channnel long/short block switching. + - lower the lowpass filter index to determine long/short block. + +2003-03-30 15:11 bouvigne + + * include/lame.h, frontend/parse.c, libmp3lame/presets.c: + + presets portable/portable1 + +2003-03-24 21:21 bouvigne + + * libmp3lame/version.h: + + bump alpha + +2003-03-24 21:19 bouvigne + + * include/lame.h, frontend/parse.c, libmp3lame/presets.c: + + presets + +2003-03-24 20:32 bouvigne + + * libmp3lame/lame.c, libmp3lame/lame_global_flags.h, + libmp3lame/quantize.c, libmp3lame/set_get.c, libmp3lame/util.h, + include/lame.h, frontend/parse.c: + + maskingadjust/maskingadjustshort for vbr-rh + +2003-03-18 15:56 takehiro + + * libmp3lame/: VbrTag.c, encoder.c, util.c + (takehiro-2002_05_07-experimental): + + trivial coding change + +2003-03-16 18:02 takehiro + + * libmp3lame/util.h (takehiro-2002_05_07-experimental): + + update comments and clean up. + +2003-03-16 17:53 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + new bs.totbit overflow handling strategy + +2003-03-16 17:53 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + remove quantize cmpare method 3 and 10. + update comments of over_noise and tot_noise. + +2003-03-16 17:51 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + trivial coding style update + +2003-03-08 13:56 takehiro + + * libmp3lame/: util.c, lame.c (takehiro-2002_05_07-experimental): + + - fix to work --quantcomp/--shortthreshold(it was ignored and LAME uses always the default) + - bit clean up resample. + +2003-03-08 10:28 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + simplify the inc_subblock_gain() by using table. + +2003-03-04 18:00 takehiro + + * libmp3lame/: bitstream.c, encoder.c, tables.c, tables.h, + takehiro.c, util.h (takehiro-2002_05_07-experimental): + + large clean up arround bit stream code. much simple, faster and small. + + fix and optimize MPEG2/2.5 scalefactor value recoding code + there's still some problem using table 1 and sometime makes invalid bitstream... + +2003-03-03 18:54 takehiro + + * libmp3lame/: bitstream.c, tables.c, tables.h, takehiro.c + (takehiro-2002_05_07-experimental): + + MPEG2/2.5 scalefactor bit recording optimization. + - now it try to use table 1 + - much simplified code. + +2003-03-03 18:01 takehiro + + * libmp3lame/encoder.c (takehiro-2002_05_07-experimental): + + fix gr_info initilization when MPEG2/2.5, short blocks. + +2003-03-03 17:59 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + fix best_huffman_divide() sometime fails the assertion. + do not use "extra" preflag when MPEG2/2.5 (it fails to record scalefactors) + simplify the scale_bitcount_lsf() + +2003-03-03 17:13 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + large clean up and simplification.(result is not changed) + +2003-03-03 17:08 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + general clean up and simplification. + +2003-03-03 17:04 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + trivial optimization (use shift instead of division) + +2003-03-03 10:02 takehiro + + * libmp3lame/: util.h, tables.c, psymodel.c + (takehiro-2002_05_07-experimental): + + first attempt of block switching for not 44.1kHz. + - use "variable" lowpass index for "constant" lowpass frequency. + +2003-03-03 04:14 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + tuning long/short threshold for arround 128kbps. + clean up scaling related code. + +2003-03-03 04:12 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + trivial optimization + +2003-03-03 02:48 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + revert substep=2 tuning. + +2003-03-02 18:08 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + comment style update. + some code simplification + +2003-03-02 17:56 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + trivial style change + +2003-03-02 17:53 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + all "cod_info" are changed "gi" + precisely change the scalefactor when substep = 2 + simplify the pinfo calculation(for mp3x) + +2003-03-02 17:50 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + all "cod_info" is changed to "gi" + optimized best_huffman_divide() little. + update comments. + +2003-03-02 16:40 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + comment update + +2003-03-02 16:40 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + tuning trancation threshold used in pseudo half step method. + more simplication and comment updation. + +2003-03-02 16:03 takehiro + + * libmp3lame/: quantize.c, quantize_pvt.h, takehiro.c + (takehiro-2002_05_07-experimental): + + update comments and simplification. + teration_finish_one() is moved from quantize.c to takehiro.c for better conjunction. + +2003-03-02 16:01 takehiro + + * libmp3lame/: tables.c, machine.h, tables.h + (takehiro-2002_05_07-experimental): + + remove IIPOW20() related macro/arrays, all of which are not used. + +2003-03-02 15:08 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + more clean up and simplification. + +2003-03-02 15:06 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + fix warning. + +2003-03-02 15:05 takehiro + + * libmp3lame/util.h (takehiro-2002_05_07-experimental): + + fix prototype. + +2003-03-02 14:53 takehiro + + * libmp3lame/: lame.c, quantize.c, quantize_pvt.h, takehiro.c, + util.h (takehiro-2002_05_07-experimental): + + large simplification mainly arround scale_bitcount() + +2003-03-02 11:39 takehiro + + * libmp3lame/: reservoir.c, reservoir.h + (takehiro-2002_05_07-experimental): + + changed ResvAdjust() as macro. + +2003-03-02 11:35 takehiro + + * libmp3lame/: VbrTag.c, id3tag.h, util.h + (takehiro-2002_05_07-experimental): + + simplify the tag related header files. + +2003-03-02 11:20 takehiro + + * libmp3lame/: tables.c, takehiro.c, version.c + (takehiro-2002_05_07-experimental): + + build problem fix when NASM is not enabled + +2003-03-02 11:19 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + one more initialization simplification. + +2003-03-02 11:13 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + simplify the default setting choosing method. + - use optimum_samplefreq() to determine the output sampling rate, as suggested + by Gabriel. + - use MMX_choose_table always if it uses NASM. + +2003-02-27 17:57 bouvigne + + * libmp3lame/libmp3lame_vc6.dsp: + + fix MSVC build (replay gain) + +2003-02-27 17:46 bouvigne + + * libmp3lame/: encoder.h, l3side.h, lame.c, quantize.c, + quantize_pvt.c, quantize_pvt.h, util.c, util.h: + + analog silence detection in partitionned sfb21 + +2003-02-27 03:55 takehiro + + * libmp3lame/: lame.c, quantize.c + (takehiro-2002_05_07-experimental): + + some substep=2 optimization. + - only do substep-shaping in the last quantization step. + +2003-02-27 03:45 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix amp_scalefac_bands loop exit condition. + +2003-02-27 03:38 takehiro + + * libmp3lame/: psymodel.c, util.h, tables.c, takehiro.c + (takehiro-2002_05_07-experimental): + + optimized little on the case not NASM enabled. + +2003-02-24 03:21 takehiro + + * include/lame.h, libmp3lame/lame.c, libmp3lame/set_get.c + (takehiro-2002_05_07-experimental): + + more ABR/CBR default mode setting (use ABR/CBR preset) + +2003-02-23 18:32 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + sync with the mainline (average compression ratio of VBR mode). + +2003-02-23 18:30 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + fix quantize_xrpow_ISO() as same as in quantize_xrpow() + +2003-02-23 18:22 takehiro + + * libmp3lame/encoder.c (takehiro-2002_05_07-experimental): + + fix short block window ID initialization. + +2003-02-23 17:16 takehiro + + * libmp3lame/: set_get.c, lame.c + (takehiro-2002_05_07-experimental): + + always uses abr/cbr preset, when abr/cbr coding. + The cutoff frequency is changed as is in the main branch. + +2003-02-23 16:30 olcios + + * libmp3lame/lame.c: + + fixed bug with --resample and --replaygain (input data analysis) + +2003-02-23 16:27 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + simplify amp_scalefac_bands() + +2003-02-23 16:14 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + simplify inc_subblock_gain() + +2003-02-23 16:07 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + fix sfb21 does not quantize if some case. + +2003-02-23 10:29 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + general clean up and optimization. + - amplify band selection cleanup + - skip amplify-method 1 when the max_noise is already lesser than 1.0 + - clean up substep shaping in VBR mode + +2003-02-22 19:06 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + new optimized noise shaping strategy. + start with "sparse" noise_shaping_amp method and retry with the finer method, + when we continuously failed. + + This makes CBR/ABR coding quite faster. + + comment style update.(// -> /* */) + +2003-02-22 19:03 takehiro + + * libmp3lame/encoder.c (takehiro-2002_05_07-experimental): + + clean up init_gr_info + +2003-02-22 17:20 takehiro + + * config.guess, config.sub (takehiro-2002_05_07-experimental): + + sync with the mainline. + - update config files (by CISC) + +2003-02-22 17:01 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix VBR code for new quantize strategy. + +2003-02-22 02:21 olcios + + * Makefile.B32, Makefile.DJGPP, Makefile.MSVC, Makefile.unix, + USAGE, configMS.h, frontend/parse.c, include/lame.h, + libmp3lame/Makefile.am, libmp3lame/Makefile.in, + libmp3lame/VbrTag.c, libmp3lame/bitstream.c, + libmp3lame/gain_analysis.c, libmp3lame/gain_analysis.h, + libmp3lame/lame.c, libmp3lame/lame_global_flags.h, + libmp3lame/set_get.c, libmp3lame/util.h: + + ReplayGain analysis of a single file (RadioGain) + +2003-02-21 15:54 cisc + + * config.guess, config.sub: + + Update to latest config files to support more hosts/targets. + +2003-02-21 04:53 takehiro + + * libmp3lame/: machine.h, quantize.c, tables.c, tables.h, + takehiro.c (takehiro-2002_05_07-experimental): + + new quantization strategy. + - the code handling quantization factor moved to quantize_xrpow() and + quantize_xrpow_ISO(). This is preparing for "quantizing only the scalefactor + band whose q-factor is changed" and so on. + - now xrpow[] is constant. + +2003-02-21 04:50 takehiro + + * libmp3lame/encoder.c (takehiro-2002_05_07-experimental): + + clean up initialization + +2003-02-21 01:36 takehiro + + * libmp3lame/: mpglib_interface.c, util.h + (takehiro-2002_05_07-experimental): + + sync mainline. + - changed comment style (// -> /* */) by Robert. + - Extending mpglib by the option to return unclipped floating-point values of samples by olcios. + +2003-02-20 23:13 takehiro + + * libmp3lame/: takehiro.c, quantize_pvt.h + (takehiro-2002_05_07-experimental): + + optimized quantization + - remove QUANTFAC() macro. + - check the max value in quantization routine (loop hoisting) + +2003-02-20 22:43 takehiro + + * mpglib/: common.c, decode_i386.c, decode_i386.h, huffman.h, + interface.c, interface.h, l2tables.h, layer1.c, layer2.c, + layer2.h, layer3.c, layer3.h (takehiro-2002_05_07-experimental): + + sync mainline. + - changed comment style (// -> /* */) by Robert. + - Extending mpglib by the option to return unclipped floating-point values of samples by olcios. + +2003-02-19 19:46 olcios + + * libmp3lame/mpglib_interface.c, libmp3lame/util.h, + mpglib/decode_i386.c, mpglib/decode_i386.h, mpglib/interface.c, + mpglib/interface.h, mpglib/layer3.c, mpglib/layer3.h: + + Extending mpglib by the option to return unclipped floating-point values of samples. + +2003-02-19 16:40 takehiro + + * libmp3lame/: quantize.c, set_get.c + (takehiro-2002_05_07-experimental): + + ATH related tuning for ABR/CBR preset. + + ABR bit-allocation tuning on short blocks + +2003-02-19 12:14 takehiro + + * libmp3lame/presets.c: + + fix comment style. ( // -> /* */ ) + +2003-02-19 12:10 takehiro + + * libmp3lame/set_get.c (takehiro-2002_05_07-experimental): + + cleanup and ABR 128-160kbps shortthreshold change. + +2003-02-19 10:05 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + fix comments + +2003-02-19 09:48 takehiro + + * libmp3lame/: encoder.c, tables.c, util.h + (takehiro-2002_05_07-experimental): + + remove PE FIR filter. It does not work now. + +2003-02-18 14:49 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + on short blocks, use subblock gain first, instead of scalefac_scale + +2003-02-18 14:46 takehiro + + * libmp3lame/: psymodel.c, quantize.c + (takehiro-2002_05_07-experimental): + + update PE calculation and pe based bit allocation(CBR,ABR) + do not spend too much on short blocks. + +2003-02-18 14:41 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + remove SNR parameter (attack position aware masking calculation code will replace this). + +2003-02-18 01:11 olcios + + * Makefile.DJGPP: + + Workaround for a problem with make clean, regarding long filenames on some systems. + +2003-02-17 01:02 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + fix threshold at [SBMAX_s-1] of short blocks + +2003-02-16 19:07 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + one and one more brand-new S(L-R) channel short block switching strategy + +2003-02-16 18:53 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + trivial clean up in bitpressure_strategy() + +2003-02-16 18:53 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + fix overflow in pulse-like signal detection. + +2003-02-16 18:46 bouvigne + + * libmp3lame/presets.c: + + cbr/abr presets (still not finished?) + +2003-02-16 18:40 takehiro + + * libmp3lame/: psymodel.c, tables.c + (takehiro-2002_05_07-experimental): + + ATH value scaling clean up and one more revert short block strategy... + +2003-02-16 18:07 takehiro + + * libmp3lame/encoder.c (takehiro-2002_05_07-experimental): + + clean up arround initialization of short blocks. + +2003-02-16 18:06 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + trivial clean up in inc_scalefac_scale() + +2003-02-16 18:05 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + better verbose mode printing + +2003-02-16 13:23 takehiro + + * libmp3lame/version.h (takehiro-2002_05_07-experimental): + + bump up alpha5 + +2003-02-16 13:22 takehiro + + * testcase.mp3 (takehiro-2002_05_07-experimental): + + update testcase + +2003-02-16 13:20 takehiro + + * frontend/parse.c, include/lame.h, libmp3lame/VbrTag.c, + libmp3lame/lame.c, libmp3lame/lame_global_flags.h, + libmp3lame/psymodel.c, libmp3lame/set_get.c, libmp3lame/tables.c + (takehiro-2002_05_07-experimental): + + ATH related code clean up (always use ATH type 4). + +2003-02-16 13:15 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + better noise estimation + +2003-02-16 13:14 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + optimized calc_xmin() + +2003-02-16 08:38 takehiro + + * libmp3lame/psymodel.c: + + PE calculation improvement (backported from experimental branch). + Better pe calculation for nspsytune. This brings + - better MS/LR switching + - better reservoir handling (brings better ABR/CBR result) + + I hope the trouble on "SeriousTrouble.wav" is partially fixed (not perfect ?). + +2003-02-16 08:25 takehiro + + * libmp3lame/quantize_pvt.h: + + fix build problem (calc_xmin() prototype fix) + +2003-02-16 08:22 takehiro + + * libmp3lame/quantize.c: + + fix one more subblock_gain handling code. + +2003-02-15 14:07 bouvigne + + * libmp3lame/quantize.c: + + init max_nonzero_coeff to 575 instead of 0 + +2003-02-14 17:41 bouvigne + + * libmp3lame/: l3side.h, quantize.c, quantize_pvt.c, takehiro.c: + + do not calc noise in upper 0 part + +2003-02-10 03:26 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + fix long->short masking threshold conversion (still experimental). + revert S(L-R) channel blocktype switching strategy. + 1st attempt of short block pre-echo prevention code(lessen masking before the surge on shortblocks, for preecho prevention). + +2003-02-10 03:21 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + verbose mode:added if it uses subblock gain or not. + +2003-02-09 18:01 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + one more tuning short block noise calculation + - max_noise handling fix. + + changed quantcomp_s and quamtcomp + - use quantcomp_s only for short blocks. (do not use for start/end) + +2003-02-09 17:43 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + reduce memory copy in best_huffman_divide() + +2003-02-09 16:46 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + oops, fix short block noise calculation... + +2003-02-09 16:41 takehiro + + * frontend/gtkanal.c, libmp3lame/lame-analysis.h, + libmp3lame/psymodel.c, libmp3lame/util.h + (takehiro-2002_05_07-experimental): + + changed mp3x "surge intensity" display. + + fix psymodel mis-enables the short blocks when MS stereo. + + changed short blcok setting strategy on the S(L-R) channel. + Although this brings better LR/MS handling for fatboy.wav et.al., this is not true idea but work arround. we should get better ns_msfix(). + + simplify the surge detection in psymodel.c + + added comments on psymodel.c for mp3x display and the window position. + +2003-02-09 16:36 takehiro + + * libmp3lame/encoder.c (takehiro-2002_05_07-experimental): + + trivial simplification + +2003-02-09 16:35 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + new calc noise for short blocks. + it calculates the sum of noise in 3 subblocks at same frequency region. + + I hope this makes --quantcomp hack obsolete. + +2003-02-09 15:19 takehiro + + * include/lame.h (takehiro-2002_05_07-experimental): + + sync main: comments update by Mark. + +2003-02-09 12:36 bouvigne + + * libmp3lame/quantize_pvt.c: + + revert speedup + +2003-02-09 01:25 markt + + * include/lame.h: + + added a comment about reading the file API + +2003-02-08 17:46 bouvigne + + * libmp3lame/: presets.c, version.h: + + presets + +2003-02-08 13:53 bouvigne + + * libmp3lame/quantize_pvt.c: + + small speedup + +2003-02-08 09:51 takehiro + + * frontend/main.c: + + trivial simplification + +2003-02-08 07:22 takehiro + + * include/lame.h (takehiro-2002_05_07-experimental): + + sync main line: comments about lame_init() + +2003-02-07 18:17 bouvigne + + * DEFINES: + + KLEMM_44 + +2003-02-06 20:04 markt + + * include/lame.h: + + updated comments about lame_init() from Kendrick Hamilton + +2003-02-06 06:29 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + fix analog silence detection + +2003-02-05 09:27 takehiro + + * testcase.mp3 (takehiro-2002_05_07-experimental): + + regen + +2003-02-05 09:26 takehiro + + * libmp3lame/encoder.c (takehiro-2002_05_07-experimental): + + fix subband filtering (always mono...) + +2003-02-04 18:27 takehiro + + * frontend/main.c (takehiro-2002_05_07-experimental): + + fix --keeptag option + +2003-02-04 17:16 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + oops, trivial mistake... + +2003-02-04 17:11 takehiro + + * libmp3lame/set_get.c (takehiro-2002_05_07-experimental): + + some tuning arround attack threshold. not so far from good... + +2003-02-04 17:10 takehiro + + * libmp3lame/: psymodel.c, psymodel.h + (takehiro-2002_05_07-experimental): + + update comment and remove unused lines. + +2003-02-04 17:01 takehiro + + * testcase.mp3, libmp3lame/psymodel.c, libmp3lame/psymodel.h, + libmp3lame/tables.c, libmp3lame/util.h + (takehiro-2002_05_07-experimental): + + use subband filter sample to determine block type. + it still remains parameter tuning, but it works. + +2003-02-04 16:11 takehiro + + * libmp3lame/: encoder.c, newmdct.c, newmdct.h, psymodel.c, + psymodel.h, tables.c, tables.h, util.h + (takehiro-2002_05_07-experimental): + + prepare for using subband filtered samples to determine block switching. + This will archive faster, and better block switching. + + And using this, we can get more precise short block threshold calculation, I hope. + +2003-02-04 16:00 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix comment and trivial optimization. + +2003-02-04 15:59 takehiro + + * configure.in (takehiro-2002_05_07-experimental): + + regen + +2003-02-04 15:59 takehiro + + * configure (takehiro-2002_05_07-experimental): + + to avoid confusion, make version 4.00 + +2003-02-04 15:01 takehiro + + * frontend/: brhist.c, console.c, gtkanal.c, main.c, parse.c, + rtp.c, timestatus.c (takehiro-2002_05_07-experimental): + + sync with main + - comment fix // -> /* */ + - nogap related updates + +2003-02-04 13:18 takehiro + + * libmp3lame/lame.c, libmp3lame/util.h, include/lame.h + (takehiro-2002_05_07-experimental): + + sync main. + - remove coding_t + - update comment + +2003-02-03 18:41 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + remove unused code + +2003-02-03 18:40 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + sync with the head. + +2003-02-03 18:29 takehiro + + * frontend/: get_audio.c, main.h, parse.c + (takehiro-2002_05_07-experimental): + + added --keeptag option and clean up tag copy code. + currently it works only with ID3v1. + +2003-02-02 18:51 bouvigne + + * libmp3lame/version.h: + + bump alpha + +2003-02-02 18:50 bouvigne + + * libmp3lame/lame.c, libmp3lame/lame_global_flags.h, + include/lame.h, libmp3lame/presets.c, libmp3lame/set_get.c, + frontend/parse.c: + + preset medium + +2003-02-02 17:30 takehiro + + * frontend/main.c (takehiro-2002_05_07-experimental): + + keep id3tag when reencoding mp3(experimental). + 1. it sometimes mis-recognize the tag. (but this is the same behavior of madplay) + 2. we should add some option to enable/disable this function. + + after 2 is solved, I will backport it to the head branch. + +2003-02-02 17:15 takehiro + + * frontend/: get_audio.c, gtkanal.c + (takehiro-2002_05_07-experimental): + + trivial comment/style update + +2003-02-02 17:10 bouvigne + + * libmp3lame/: lame.c, util.c, util.h: + + removed KLEMM_44 + +2003-02-02 15:50 bouvigne + + * libmp3lame/: lame.c, util.h: + + removed useless structure (coding_t) + +2003-02-02 14:45 bouvigne + + * frontend/parse.c, include/lame.h, libmp3lame/presets.c: + + presets: standard should be fine, working on medium + +2003-02-02 10:15 bouvigne + + * libmp3lame/psymodel.c: + + comments regarding TMN and NMT (thank you Takehiro) + +2003-02-01 21:59 takehiro + + * libmp3lame/: encoder.c, lame.c, newmdct.c, util.h + (takehiro-2002_05_07-experimental): + + prepare for subband filter output to determine long/short block switching. + - subband filtering in next frame. + - encode delay setting + +2003-02-01 20:06 takehiro + + * frontend/parse.c (takehiro-2002_05_07-experimental): + + precise error message about nspsytune2 + +2003-02-01 11:49 takehiro + + * libmp3lame/newmdct.c (takehiro-2002_05_07-experimental): + + clean up and optimization. + +2003-01-30 12:13 takehiro + + * frontend/get_audio.c: + + bit better mp3 input file sync. but we need one more for Chris.mp3.... + +2003-01-30 08:48 markt + + * libmp3lame/: encoder.c, lame.c: + + + + Formula for the amount of data that had to be in the buffer + before it could be encoded was incorrect. Old formula + (for the polyphase filterbank) was: + + old formula: 286+576*(1+gfc->mode_gr) = 2014 (MPEG1) + + Correct formula is: 512+framesize -32 = 1632 + + Best way to see this is to go through window_subband() in newmdct.c + It access samples x[32*i] through x[510+32*i] for i=0..17. + + So our old condition was too conservative. + + However, the FFT still requires 1904 samples, so the + net change is just to lower the requirement from 2014 to 1904. + +2003-01-28 03:12 takehiro + + * libmp3lame/lame-analysis.h (takehiro-2002_05_07-experimental): + + fix build problem on not HAVE_GTK environment + +2003-01-28 00:29 markt + + * libmp3lame/lame.c: + + short blocks are coupled, even in regular stereo mode. + This is to fix bugs reported in several different hardware decoders. + see comments in lame.c + +2003-01-27 12:22 takehiro + + * libmp3lame/mpglib_interface.c (takehiro-2002_05_07-experimental): + + added comments ... + +2003-01-27 11:39 takehiro + + * libmp3lame/VbrTag.c: + + fix warning(added return value) + +2003-01-26 17:37 takehiro + + * frontend/get_audio.c: + + added ID3tag v2 skipping function. + +2003-01-26 12:37 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + tuned long block PE calculation parameter. + +2003-01-26 12:09 bouvigne + + * libmp3lame/version.h: + + bumped alpha + +2003-01-26 12:08 bouvigne + + * frontend/parse.c, include/lame.h, libmp3lame/presets.c: + + presets (under testing) + +2003-01-26 12:02 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + tuned short block PE calculation parameter. + +2003-01-26 11:31 bouvigne + + * libmp3lame/lame.c: + + verbose + +2003-01-26 10:04 takehiro + + * libmp3lame/: takehiro.c, quantize_pvt.h + (takehiro-2002_05_07-experimental): + + fix wrong "const" declaration. + +2003-01-25 11:02 bouvigne + + * libmp3lame/: lame.c, quantize.c: + + changed -q mapping + +2003-01-24 19:26 bouvigne + + * doc/html/history.html: + + history + +2003-01-22 17:15 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + fix best_huffman_divide MPEG2 short block treatment. + This is the same bug in count_bits(). + +2003-01-22 15:38 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + remove inner loop iteration limit (age) and some simple optimization. + +2003-01-21 02:45 takehiro + + * frontend/: parse.c (takehiro-2002_05_07-experimental), parse.c: + + added \n in --preset help + +2003-01-20 18:09 bouvigne + + * frontend/parse.c, include/lame.h, libmp3lame/presets.c: + + presets (under testing) + +2003-01-19 15:55 bouvigne + + * frontend/parse.c, include/lame.h, libmp3lame/presets.c: + + presets (under testing) + +2003-01-19 09:13 takehiro + + * libmp3lame/: encoder.c, quantize_pvt.h, takehiro.c + (takehiro-2002_05_07-experimental): + + fix fatal bit-counting bug in MPEG2/2.5 short block. + +2003-01-19 06:30 takehiro + + * frontend/parse.c (takehiro-2002_05_07-experimental): + + oops, type mismatch... + +2003-01-18 14:44 takehiro + + * include/lame.h (takehiro-2002_05_07-experimental): + + added new API, lame_set_use_subblockgain() to set if it uses subblock gain or not. + +2003-01-18 14:42 takehiro + + * frontend/parse.c, libmp3lame/quantize.c, libmp3lame/set_get.c, + libmp3lame/util.h (takehiro-2002_05_07-experimental): + + added "--sfscale" and "--sbgain" options. + This is replacement of old ambiguous "-Z" option. + +2003-01-13 16:34 takehiro + + * libmp3lame/set_get.c (takehiro-2002_05_07-experimental): + + use --preset insane when --preset 320 + +2003-01-13 13:19 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + 10th quantcomp method, based on 3rd method, but uses over_noise instead of tot_noise. + +2003-01-13 13:11 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + fix fatal bug which happens when the last partition is wider than the last scalefactor band. + +2003-01-13 11:46 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + fix "off by one" in short block masking calculation. + +2003-01-13 11:45 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + use automatic resample even when ABR. + +2003-01-13 11:34 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + changed DEBUGF -> printf (to fix debug build). + vorbis removing related fix. + +2003-01-13 08:53 takehiro + + * libmp3lame/set_get.c (takehiro-2002_05_07-experimental): + + oops... fix auto short block switching threshold adjustment. + +2003-01-13 08:43 takehiro + + * frontend/parse.c (takehiro-2002_05_07-experimental): + + oops... fix --quantcomp option. + +2003-01-13 00:49 glessard + + * frontend/: get_audio.c, main.c, main.h, parse.c: + + NOGAP-related changes. + - added '-T' option to force VBR/INFO tag inclusion. + - moved a VBR/INFO tag inclusion decision to parse.c, eliminating the use + of a global variable across modules. + - fixed reading of multiple little-endian AIFF-C files in get_audio.c. For + those files, 'swapbytes' was getting toggled for each file opened in the + sequence, so only every other output file was correct. + +2003-01-12 15:18 takehiro + + * frontend/parse.c, include/lame.h, libmp3lame/set_get.c + (takehiro-2002_05_07-experimental): + + added --quantcomp option. + +2003-01-12 12:37 takehiro + + * libmp3lame/: VbrTag.c, lame_global_flags.h, util.c + (takehiro-2002_05_07-experimental): + + sync with the head arround VbrTag. + +2003-01-12 12:35 takehiro + + * libmp3lame/set_get.c (takehiro-2002_05_07-experimental): + + ABR/CBR preset sync with the head branch. + +2003-01-12 12:33 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + trivial cleanup + +2003-01-11 18:40 bouvigne + + * libmp3lame/presets.c: + + low bitrates presets + +2003-01-11 17:56 markt + + * libmp3lame/: VbrTag.c, lame_global_flags.h, util.c: + + reorganized VBR tag initialization code so that it + could be reset/initialized several times + (for use when encoding in nogap mode) + +2003-01-11 17:42 markt + + * libmp3lame/lame_global_flags.h: + + removed comment within comment delimiter + +2003-01-11 17:41 markt + + * include/lame.h, libmp3lame/VbrTag.c, + libmp3lame/lame_global_flags.h: + + cleaned up some comments about VBR tags being written + to the mp3 file after internal data structures are free + (this has not been true for a long time) + + na + +2003-01-11 15:43 bouvigne + + * libmp3lame/presets.c: + + low bitrates presets + +2003-01-11 13:05 takehiro + + * libmp3lame/: encoder.c, quantize.c, quantize.h + (takehiro-2002_05_07-experimental): + + remove an unused argument of VBR_iteration() + +2003-01-11 12:55 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + fix mono ABR/VBR encoding + +2003-01-11 12:46 takehiro + + * libmp3lame/lame.c: + + fix ath curve initialization. + +2003-01-11 12:25 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + fix config print code + +2003-01-11 11:10 takehiro + + * frontend/rtp.c (takehiro-2002_05_07-experimental): + + sync with the head branch + - Include alloca.h if neccessary. (by Alex) + +2003-01-11 11:09 takehiro + + * frontend/parse.c, include/lame.h, libmp3lame/lame.c, + libmp3lame/lame_global_flags.h, libmp3lame/set_get.c, + libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + sync with the head branch + - GB's Ability to change ath4 shape independantly from vbr_q + +2003-01-11 11:08 takehiro + + * libmp3lame/VbrTag.c (takehiro-2002_05_07-experimental): + + sync with the head branch (GB's change, "Add the Info frame to the number of frames reported by the Info/vbr tag") + +2003-01-11 11:07 takehiro + + * USAGE (takehiro-2002_05_07-experimental): + + update bit. + +2003-01-11 11:06 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + use "safe" way of short block long->short threshold conversion + better ns_msfix by using the fatc that noise in sfb couldn't exceed its energy. + do not use ns_msfix when we used msfix. + do not long block msfix when the block IS short. + +2003-01-11 04:16 markt + + * frontend/main.c, libmp3lame/VbrTag.c: + + in nogap mode, with VBR tags, we were calling init_bitstream() + (which resets VBR tag data) before writing the VBR tag data. + This is now fixed, but there is still a bug when initializing the + VBR data for the 2nd (or more) encoding in the nogap series. + +2003-01-10 21:22 markt + + * frontend/parse.c: + + forgot a \n in the --longhelp documentation + +2003-01-10 20:18 markt + + * USAGE: + + note that --voice option is obsolete + +2003-01-10 20:12 markt + + * frontend/: main.c, main.h, parse.c: + + added the "--nogaptags" option. + + this will allow VBR tags even for gapless encoding. + The default behavoir is to disable tags for gapless encoding. + +2003-01-10 20:07 markt + + * frontend/parse.c, libmp3lame/VbrTag.c: + + Updated the TOC calculation in the VBR tag to also count + the size of the VBR tag itself. + + This is to make the VBR tag consistent with the recent change + in the VBR frame count (changed so that it also counts the + VBR tag as a frame) + +2003-01-10 19:06 takehiro + + * frontend/parse.c (takehiro-2002_05_07-experimental): + + fix usage message arround ns(-bass|-alto|-treble|-sfb21|msfix). + +2003-01-10 18:58 takehiro + + * libmp3lame/encoder.c (takehiro-2002_05_07-experimental): + + trivial cleanup (when JOINT_STEREO and no-psymodel, it is always MS stereo) + +2003-01-10 18:57 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + fix some initilization when ABR. + (It seems ATH-adjust type 3 does not works fine with ABR mode ...) + +2003-01-05 16:49 takehiro + + * libmp3lame/version.c (takehiro-2002_05_07-experimental): + + fix compiling error(oops, trivial mistake...) + +2003-01-05 16:36 takehiro + + * libmp3lame/: lame.c, psymodel.c, quantize.c, tables.c, util.h + (takehiro-2002_05_07-experimental): + + - use ns-(bass|alto|treble|sfb21) in psymodel. And now ATH values are not + affected by these values. + + - sfb21 aware pe(perceptual entropy) calculation. I hope it brings + better LR/MS switching, but CBR/ABR is now not good as it was because of this. + I'm afraid it needs overhaul.... + + - analog silence detection code is moved to pecalc_[ls] functions. + +2003-01-05 14:56 takehiro + + * libmp3lame/version.c (takehiro-2002_05_07-experimental): + + removed unused code + +2003-01-05 08:15 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + one more fix for inc_subblock_gain(). + and some clean up. + +2003-01-05 08:14 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + pe calculation of over 16kHz region. + +2003-01-05 07:22 takehiro + + * libmp3lame/: lame-analysis.h, quantize.h + (takehiro-2002_05_07-experimental): + + move set_frame_pinfo() definition to fix mp3x built + +2003-01-05 07:21 takehiro + + * frontend/gtkanal.c (takehiro-2002_05_07-experimental): + + remove unused code to fix mp3x built + +2003-01-05 04:28 takehiro + + * DEFINES (takehiro-2002_05_07-experimental): + + completely updated (from Alex's comment). + +2003-01-05 04:11 takehiro + + * libmp3lame/: bitstream.c, encoder.c, quantize.c, reservoir.c, + reservoir.h (takehiro-2002_05_07-experimental): + + - general clean up mainly arround reservoir. + - use faster and not exact quantizing method for the 1st step of VBR. + (It estimates scalefactor step roughly and not needed exactness) + +2003-01-05 03:36 takehiro + + * libmp3lame/machine.h (takehiro-2002_05_07-experimental): + + remove u_char definition (sync head branch) + +2003-01-02 18:42 bouvigne + + * libmp3lame/psymodel.c: + + In psymodel_init set blocktype_old to NORM_TYPE because the VBR header is long blocks. This might be the problem encountered in some WMP 6.4 + +2003-01-02 18:37 bouvigne + + * libmp3lame/VbrTag.c: + + Add the Info frame to the number of frames reported by the Info/vbr tag + +2003-01-02 18:30 bouvigne + + * libmp3lame/: quantize.c, quantize_pvt.c, quantize_pvt.h, + vbrquantize.c: + + reduced 63 warnings to 55 under visual c++. Those were mainly differences between function prototypes in declarations and implementations. + +2003-01-02 18:27 bouvigne + + * libmp3lame/encoder.c, libmp3lame/lame.c, + libmp3lame/lame_global_flags.h, libmp3lame/set_get.c, + libmp3lame/util.c, libmp3lame/util.h, frontend/parse.c, + include/lame.h: + + Ability to change ath4 shape independantly from vbr_q + +2003-01-01 16:14 aleidinger + + * libmp3lame/machine.h: + + Removed u_char typedefs, u_char is not used in the tree (according to grep -r u_char). + +2003-01-01 16:12 aleidinger + + * frontend/rtp.c: + + Include alloca.h if neccessary. + + Noticed by: Tomi Vainio + +2002-12-31 14:00 takehiro + + * Makefile.B32, Makefile.DJGPP, Makefile.MSVC, Makefile.unix, + libmp3lame/Makefile.am, libmp3lame/Makefile.in, + libmp3lame/libmp3lame.dsp, libmp3lame/libmp3lame_vc6.dsp + (takehiro-2002_05_07-experimental): + + vbrquantize.[ch] and quantize_pvt.c is merged into quantize.c + +2002-12-31 13:58 takehiro + + * libmp3lame/: bitstream.c, encoder.c, lame.c, lame_global_flags.h, + reservoir.c, tables.c, util.c, util.h, version.h + (takehiro-2002_05_07-experimental): + + general cleanup + gfp->VBR_mean_bitrate_kbps and gfp->brate is merged. + + init_bit_stream_w is moved to lame.c from bitstream.c + + FindNearestBitrate(), map2MP3Frequency(), SmpFrqIndex() + are moved to lame.c from util.c + + fix VBR lowest/highest bitrate in mono-mode + + now alpha 4 + +2002-12-31 13:56 takehiro + + * libmp3lame/: quantize.c, vbrquantize.c, vbrquantize.h, + quantize.h, quantize_pvt.c, quantize_pvt.h + (takehiro-2002_05_07-experimental): + + removed analog silence related code in calc_xmin(). + + ABR/CBR code integration. + caller of init_outer_loop() and calc_xmin() is moved to outer_loop() + + off by one fix of global_gain (from the mainline), in outer_loop() + + new vbr code. but still needs more fix. + remove unused code in VBR_prepare() + + vbrquantize.[ch] and quantize_pvt.c is merged into quantize.c + + one more inc_subblock_gain() fix. + +2002-12-31 13:53 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + some cleanup arround pointer. + + analog silence detection in psymodel.c. + + skip short block FFT calculation of joint stereo, if it is not needed. + +2002-12-29 16:48 takehiro + + * frontend/main.c, include/lame.h, libmp3lame/VbrTag.c, + libmp3lame/bitstream.c, libmp3lame/bitstream.h, + libmp3lame/encoder.c, libmp3lame/lame.c, + libmp3lame/lame_global_flags.h, libmp3lame/psymodel.c, + libmp3lame/quantize.c, libmp3lame/reservoir.c, + libmp3lame/set_get.c, libmp3lame/tables.c + (takehiro-2002_05_07-experimental): + + cleanups + - all vbr modes are into one. + - more initilization code organization + + experimental tuning of short block switching threshold in ABR presets. + +2002-12-29 16:44 takehiro + + * testcase.mp3 (takehiro-2002_05_07-experimental): + + update mainly due to long->short threshold convertion + +2002-12-29 09:09 takehiro + + * include/lame.h (takehiro-2002_05_07-experimental): + + follow new APIs + +2002-12-29 08:57 takehiro + + * libmp3lame/: VbrTag.c, bitstream.c, encoder.c, lame.c, + lame_global_flags.h, machine.h, psymodel.c, psymodel.h, tables.c, + tables.h, util.c, util.h, version.h + (takehiro-2002_05_07-experimental): + + general cleanups + - removed KLEMM_44 (I plan to replace the resampling code with ssrc) + - VBR/CBR/ABR related initialization cleanup + - moved initialization related code in lame.c/util.c -> tables.c + - most of "preset" settings are defaulted. + + experimenal tuning + - substep method and use_scalefac_scale setting are removed + from -q option mapping + +2002-12-29 08:51 takehiro + + * libmp3lame/vbrquantize.c (takehiro-2002_05_07-experimental): + + - simplify/removed not needed VBR code. + *** There is still problem which it assumes the quantization noise is + *** monotone function of the scalefactor(quantization factor). + +2002-12-29 08:49 takehiro + + * libmp3lame/: lame-analysis.h, quantize.c, quantize_pvt.c, + quantize_pvt.h, takehiro.c (takehiro-2002_05_07-experimental): + + - use athAdjust() always (in quantize.c) + - removed unused quantcomp_method + +2002-12-29 08:43 takehiro + + * frontend/parse.c (takehiro-2002_05_07-experimental): + + * follow API changes. + * clean up options. + added options + --shortthreshold + removed options + --r3mix, --phone, --voice, --radio, --tape, --cd, --studio, + --cwlimit, --nspsytune, + --vbr-old, --vbr-new, --vbr-mrth + --short + changed options + --allshort, --noshort (implemented by shortthreshold API) + +2002-12-29 08:40 takehiro + + * libmp3lame/Makefile.am, libmp3lame/Makefile.in, + libmp3lame/libmp3lame_vc6.dsp, libmp3lame/presets.c, + libmp3lame/set_get.c, Makefile.DJGPP, Makefile.MSVC, + Makefile.unix (takehiro-2002_05_07-experimental): + + presets.c is merged into set_get.c + API change + - CHANGED: expX -> "quantocomp_method" + - CHANGED: expZ -> "use_large_scalefac" + - REMOVED: cwlimit related APIs + - REMOVED: short blocks on/off/forced APIs + - NEW: short blocks switching threshold API + +2002-12-27 04:42 takehiro + + * libmp3lame/psymodel.c: + + use ATH value as short block masking lower limit. + +2002-12-27 04:21 takehiro + + * frontend/parse.c, include/lame.h, libmp3lame/set_get.c, + libmp3lame/version.h: + + new option --shortthreshold and bump up version number(alpha 8) + and new psymodel version(0.90) for ATHadjust aware psymodel + +2002-12-27 04:17 takehiro + + * libmp3lame/psymodel.c: + + fix assertion failure (oops, my mistake in ATH handling change) + +2002-12-26 05:43 takehiro + + * libmp3lame/: lame.c, psymodel.c, psymodel.h: + + cleanup psymodel initialization preparing for --shortthreshold option. + +2002-12-25 12:13 takehiro + + * libmp3lame/: psymodel.c, quantize.c, set_get.c, util.h, + vbrquantize.c: + + ATH handling fix and simplification. + - use ATH adjust in ns_msfix(), mask_add(), and masking lower limit calculation. + - all ATH adjust related thresholding(ns_msfix, quantcompare and scalefac_scale) is removed. + +2002-12-21 07:12 takehiro + + * libmp3lame/: psymodel.c, quantize.c, quantize_pvt.c, tables.c + (takehiro-2002_05_07-experimental): + + masking_lower related fix for shortblock ATH handling and clean up. + +2002-12-21 07:10 takehiro + + * libmp3lame/vbrquantize.c (takehiro-2002_05_07-experimental): + + trivial style change + +2002-12-21 05:52 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + trivial optimization (when joint stereo, it is always STEREO and channels_out = 2) + +2002-12-21 05:51 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + fix it uses LR threshold for MS when -m f + +2002-12-21 05:45 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + zero prevention (adding 1e-37) is not needed. + +2002-12-21 04:55 takehiro + + * Makefile.B32, Makefile.DJGPP, Makefile.MSVC, Makefile.unix + (takehiro-2002_05_07-experimental): + + fix for removing vorbis support + +2002-12-21 04:53 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + short block ATH scaling fix. + +2002-12-18 16:29 takehiro + + * libmp3lame/libmp3lame_vc6.dsp: + + removed tools.h + +2002-12-18 16:27 takehiro + + * libmp3lame/: Makefile.am, Makefile.in, debugscalefac.c, tools.c, + tools.h: + + remove unused files and regen Makefile + +2002-12-16 19:02 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix inc_subblock_gain() to properly handle sfb12 (16kHz over region) MDCT coefs. + +2002-12-16 18:46 takehiro + + * libmp3lame/quantize.c: + + oops, I checked in the wrong version... + +2002-12-16 18:45 takehiro + + * libmp3lame/quantize.c: + + fix inc_subblock_gain() to properly handle sfb12 (16kHz over region) MDCT coefs. + +2002-12-16 18:14 takehiro + + * libmp3lame/: psymodel.c, tables.c, util.h + (takehiro-2002_05_07-experimental): + + initial attempt to long->short masking threshold conversion + fix FFT routine selection code. + + adjust masking threshold scaling for VBR. + + fix ATH handling for long block masking threshold. + +2002-12-16 18:10 takehiro + + * libmp3lame/: encoder.c, lame-analysis.h + (takehiro-2002_05_07-experimental): + + mp3x displays MS/LR masking pe difference + +2002-12-15 17:46 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + cleanup related removing vbr-old + +2002-12-15 17:39 takehiro + + * libmp3lame/set_get.c (takehiro-2002_05_07-experimental): + + cleanup related removing vbr-old + +2002-12-15 17:37 takehiro + + * libmp3lame/lame_global_flags.h + (takehiro-2002_05_07-experimental): + + remove an unused variable + +2002-12-15 17:36 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + fix short block scaling for ATH handling + +2002-12-15 16:25 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + fix fatal short block ATH handling... + +2002-12-15 12:56 bouvigne + + * libmp3lame/lame.c, frontend/parse.c: + + warning about alpha versions + +2002-12-15 11:59 takehiro + + * ACM/ACMStream.cpp: + + fix access violation when LAME failed to initilize. + I hope this fixes BUG ID 646894 (at sf.net). + +2002-12-15 11:11 takehiro + + * libmp3lame/lame.c: + + fix warning (reported at sf.net by krick.) + +2002-12-15 11:10 takehiro + + * libmp3lame/: util.h, takehiro.c: + + fix warning (reported at sf.net by krick. + +2002-12-15 10:07 takehiro + + * libmp3lame/: presets.c, quantize.c + (takehiro-2002_05_07-experimental): + + remove vbr-old and its presets + +2002-12-15 09:47 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + adjust masking threshold for new mask_add() strategy. + +2002-12-15 09:11 takehiro + + * libmp3lame/lame.c: + + fix -q0 convined with --substep x option. + +2002-12-15 08:56 takehiro + + * Makefile.B32, Makefile.DJGPP, Makefile.MSVC, Makefile.unix: + + fix for vorbis support remove (I hope) + +2002-12-14 19:19 robert + + * ChangeLog, Makefile.MSVC, lame.bat, libmp3lame/encoder.c, + libmp3lame/lame.c, libmp3lame/quantize.c, libmp3lame/util.c, + misc/lame4dos.bat, misc/mlame: + + removed my email address + +2002-12-14 18:56 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + fix for ATH handling and short block VBR threshold. + +2002-12-14 17:38 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + more fix for msfix and its comment. + +2002-12-14 11:08 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + fix better ns_msfix (and better MS/LR switching). + +2002-12-14 08:01 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + fix msfix for symmetric L/R treatment. + +2002-12-13 17:48 takehiro + + * libmp3lame/quantize.c: + + off by one fix for global_gain. + +2002-12-13 17:42 takehiro + + * libmp3lame/: encoder.h, psymodel.c, quantize.c, set_get.c, + tables.c, util.h, vbrquantize.c + (takehiro-2002_05_07-experimental): + + ATH adjustment related code cleanup (for mostly preset). + and possible fix for "global_gain > 255" (backport from mainline). + +2002-12-13 16:58 takehiro + + * configure, frontend/main.h, libmp3lame/Makefile.in: + + remove vorbis support and regen. + +2002-12-13 16:54 takehiro + + * configure.in, config.h.in, frontend/get_audio.c, frontend/main.c, + frontend/parse.c, libmp3lame/Makefile.am, libmp3lame/lame.c, + libmp3lame/lame_global_flags.h, libmp3lame/set_get.c, + libmp3lame/vorbis_interface.c: + + remove vorbis support. + +2002-12-13 14:34 takehiro + + * libmp3lame/lame.c: + + fix for 64bit environment, reported by Tomi Vainio + +2002-12-09 19:00 bouvigne + + * libmp3lame/: quantize.c, version.h: + + fixed the quant_comp problem (probably introduced by me) + so bump the alpha version number + +2002-12-08 17:40 takehiro + + * libmp3lame/version.h: + + now 3.94 alpha 6 + - changed default block switching threshold + - fixed mpglib crash. + +2002-12-08 17:35 takehiro + + * libmp3lame/psymodel.c: + + changed long/short block switching threshold. + +2002-12-08 17:23 takehiro + + * testcase.mp3: + + new testcase for the new default cutoff frequency. + +2002-12-08 17:07 takehiro + + * mpglib/interface.c: + + null pointer check patch from Peter Pawlowski , to prevent the random crash. + +2002-12-08 17:02 takehiro + + * Makefile.B32, Makefile.DJGPP, Makefile.MSVC, Makefile.am, + Makefile.in, Makefile.unix, configMS.h, configure, configure.in, + testcase.mp3, frontend/brhist.c, frontend/brhist.h, + frontend/console.c, frontend/console.h, frontend/get_audio.c, + frontend/get_audio.h, frontend/gpkplotting.h, frontend/gtkanal.c, + frontend/gtkanal.h, frontend/lametime.c, frontend/lametime.h, + frontend/main.c, frontend/main.h, frontend/parse.c, + frontend/parse.h, frontend/portableio.h, frontend/rtp.c, + frontend/rtp.h, frontend/timestatus.c, frontend/timestatus.h, + include/lame.h, libmp3lame/Makefile.am, libmp3lame/Makefile.in, + libmp3lame/VbrTag.c, libmp3lame/VbrTag.h, libmp3lame/bitstream.c, + libmp3lame/bitstream.h, libmp3lame/encoder.c, + libmp3lame/encoder.h, libmp3lame/fft.c, libmp3lame/fft.h, + libmp3lame/gain_analysis.c, libmp3lame/gain_analysis.h, + libmp3lame/id3tag.h, libmp3lame/l3side.h, + libmp3lame/lame-analysis.h, libmp3lame/lame.c, + libmp3lame/lame_global_flags.h, libmp3lame/libmp3lame.dsp, + libmp3lame/machine.h, libmp3lame/mpglib_interface.c, + libmp3lame/newmdct.c, libmp3lame/newmdct.h, libmp3lame/presets.c, + libmp3lame/psymodel.c, libmp3lame/psymodel.h, + libmp3lame/quantize.c, libmp3lame/quantize.h, + libmp3lame/quantize_pvt.c, libmp3lame/quantize_pvt.h, + libmp3lame/reservoir.c, libmp3lame/reservoir.h, + libmp3lame/set_get.c, libmp3lame/tables.c, libmp3lame/tables.h, + libmp3lame/takehiro.c, libmp3lame/util.c, libmp3lame/util.h, + libmp3lame/vbrquantize.c, libmp3lame/vbrquantize.h, + libmp3lame/version.c, libmp3lame/version.h, + libmp3lame/vorbis_interface.c, libmp3lame/i386/Makefile.am, + libmp3lame/i386/Makefile.in, mpglib/common.c, mpglib/common.h, + mpglib/dct64_i386.h, mpglib/decode_i386.h, mpglib/huffman.h, + mpglib/interface.c, mpglib/interface.h, mpglib/l2tables.h, + mpglib/layer1.c, mpglib/layer1.h, mpglib/layer2.c, + mpglib/layer2.h, mpglib/layer3.c, mpglib/layer3.h, + mpglib/mpg123.h, mpglib/mpglib.h, mpglib/tabinit.h: + + overwrite by takehiro_stable branch. + +2002-12-08 16:59 takehiro + + * mac/.cvsignore: + + added + +2002-12-02 20:26 bouvigne + + * libmp3lame/lame.c, libmp3lame/lame_global_flags.h, + libmp3lame/presets.c, libmp3lame/quantize.c, + libmp3lame/set_get.c, libmp3lame/util.h, + libmp3lame/vbrquantize.c, include/lame.h, frontend/parse.c + (takehiro-stable-2002_10_15): + + quant_comp and quant_comp_short + +2002-12-01 17:47 takehiro + + * libmp3lame/version.h (takehiro-stable-2002_10_15): + + now alpha4 + - fix -q0 and -q1 + - -X and -Z option update + + I think we should "-X1,0" as default for ABR/CBR/VBR-old, including all presets. (except fast presets) + please test and tell your result. + +2002-12-01 17:43 takehiro + + * frontend/parse.c, libmp3lame/lame.c, libmp3lame/quantize.c + (takehiro-stable-2002_10_15): + + added "-Z -1" to enable scalefactor scale only(disable subblock gain) + +2002-12-01 16:32 aleidinger + + * ChangeLog: + + update for 3.93.1 + +2002-12-01 16:18 aleidinger + + * configure: + + regen + +2002-12-01 16:15 aleidinger + + * configure.in: + + change version to 3.93.1 + +2002-12-01 16:12 aleidinger + + * configure: + + regen + +2002-12-01 16:10 aleidinger + + * doc/html/history.html: + + sync with webpages + +2002-12-01 16:06 aleidinger + + * configure.in: + + Check for socket() in libsocket if it isn't in libc so rtp can get compiled + on Solaris. + + Noticed by: "Niki W. Waibel" + + While I'm here, bail out if some other functions aren't there. + +2002-12-01 15:42 takehiro + + * libmp3lame/lame.c (takehiro-stable-2002_10_15): + + fix -q0 and -q1. This makes -q0 very very slow. + +2002-12-01 15:36 takehiro + + * frontend/parse.c, include/lame.h, libmp3lame/quantize.c, + libmp3lame/set_get.c, libmp3lame/vbrquantize.c + (takehiro-stable-2002_10_15): + + now you can specify the method how to compare the quantization + for long/short block independently by -X option.(-X n,m) + +2002-12-01 13:18 takehiro + + * libmp3lame/set_get.c (takehiro-stable-2002_10_15): + + fix comment + +2002-11-30 18:18 bouvigne + + * libmp3lame/version.h: + + version + +2002-11-29 17:07 bouvigne + + * Dll/BladeMP3EncDLL.def: + + dll exports + +2002-11-28 21:05 bouvigne + + * doc/html/: history.html, index.html: + + docs + +2002-11-28 18:06 bouvigne + + * libmp3lame/version.h: + + go back to 3.93 + +2002-11-28 18:04 bouvigne + + * libmp3lame/lame.c: + + revert back q0 to q1 state (due to reports about quality problems) + +2002-11-26 15:45 takehiro + + * libmp3lame/version.h (takehiro-stable-2002_10_15): + + alpha4 solves the fatal error in outer_loop(). it should not select the + data whose global_gain is greater than 255. + +2002-11-25 18:00 bouvigne + + * Dll/: BladeMP3EncDLL.c, BladeMP3EncDLL.h: + + sync presets with the executable front-end and libmp3lame + +2002-11-25 01:36 takehiro + + * libmp3lame/: Makefile.am, Makefile.in + (takehiro-stable-2002_10_15): + + fix build problem + +2002-11-24 18:37 takehiro + + * libmp3lame/quantize.c (takehiro-stable-2002_10_15): + + Fix not to select the data whose global_gain is greater than 255. + and inner_loop() manual inlining. + This fix is based on the R.A.F.'s bug report at HA. Thanx R.A.F. + +2002-11-23 18:54 bouvigne + + * libmp3lame/psymodel.c: + + quick fix of nspsytune + +2002-11-17 16:39 takehiro + + * libmp3lame/.indent.pro (takehiro-stable-2002_10_15): + + I forgot to sync this with the head branch. + +2002-11-17 16:34 takehiro + + * Makefile.in, configure, Dll/Makefile.in, libmp3lame/Makefile.in + (takehiro-stable-2002_10_15): + + regen (by hand :p) + +2002-11-17 16:33 takehiro + + * ChangeLog, ChangeLog.header, Makefile.am, configure.in, + Dll/Makefile.am, libmp3lame/Makefile.am + (takehiro-stable-2002_10_15): + + sync with head branch (releasing 3.93 related things). + +2002-11-17 15:59 takehiro + + * doc/html/history.html (takehiro-stable-2002_10_15): + + copy from webpage/history.html + +2002-11-17 11:11 aleidinger + + * configure.in, libmp3lame/version.h: + + We are now at 3.94alpha... + +2002-11-17 10:41 aleidinger + + * doc/html/history.html: + + Copy history from webpage. + +2002-11-17 10:29 aleidinger + + * ChangeLog: + + ChangeLog for 3.93. + +2002-11-17 10:25 aleidinger + + * Dll/Makefile.in, Makefile.in: + + regen + +2002-11-17 10:24 aleidinger + + * Makefile.am: + + Add lame.dsw. + +2002-11-17 10:23 aleidinger + + * Dll/Makefile.am: + + Oops... add missing backslash. + +2002-11-17 10:18 aleidinger + + * Dll/Makefile.in, libmp3lame/Makefile.in: + + regen + +2002-11-17 10:16 aleidinger + + * libmp3lame/Makefile.am: + + Add gain_analysis.[ch] to the distributed files. + +2002-11-17 10:11 aleidinger + + * Dll/Makefile.am: + + Add some missing files. + +2002-11-17 10:09 aleidinger + + * configure: + + gtk12-config -> gtk-config + +2002-11-17 10:05 aleidinger + + * testcase.mp3: + + "Official" testcase.mp3 for this release. + +2002-11-17 09:51 aleidinger + + * ChangeLog.header: + + Add some information about branches. + +2002-11-17 09:46 aleidinger + + * libmp3lame/version.h: + + We are at 3.93-RELEASE now... + +2002-11-17 09:45 aleidinger + + * doc/man/lame.1, frontend/parse.c: + + Warn about fast presets. + +2002-11-16 13:07 takehiro + + * configure (takehiro-2002_05_07-experimental): + + remove vorbis related things + +2002-11-16 12:44 takehiro + + * configure.in (takehiro-2002_05_07-experimental): + + removed vorbis related thing + +2002-11-16 10:07 bouvigne + + * doc/html/presets.html: + + warning about fast presets + +2002-11-13 20:56 bouvigne + + * libmp3lame/: lame.c, presets.c, util.c, util.h + (takehiro-stable-2002_10_15): + + change of the default lowpass values (will break testcases) + +2002-11-13 20:24 bouvigne + + * libmp3lame/: lame.c, presets.c: + + rollback of lowpass change before release + +2002-11-10 12:41 takehiro + + * libmp3lame/: encoder.c, psymodel.c, quantize.c + (takehiro-2002_05_07-experimental): + + prepare for intensity-stereo. + +2002-11-10 12:40 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + some trivial optimizations and make some functions static. + +2002-11-10 12:39 takehiro + + * libmp3lame/machine.h (takehiro-2002_05_07-experimental): + + trivial macro fix + +2002-11-10 12:38 takehiro + + * libmp3lame/newmdct.c (takehiro-2002_05_07-experimental): + + optimize subband filter (lowpass/highpass). + +2002-11-10 12:36 takehiro + + * libmp3lame/i386/: choose_table.nas, fft3dn.nas + (takehiro-2002_05_07-experimental): + + align -> loopalign + better labeling + +2002-11-10 08:24 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + - more db2pow() macro use + - remove traditional code(which do nothing) + +2002-11-10 08:23 takehiro + + * libmp3lame/psymodel.h (takehiro-2002_05_07-experimental): + + fix warning + +2002-11-10 07:55 takehiro + + * frontend/main.c, frontend/parse.c, libmp3lame/Makefile.am, + libmp3lame/Makefile.in, libmp3lame/lame.c, + libmp3lame/lame_global_flags.h, libmp3lame/set_get.c, + libmp3lame/util.h, libmp3lame/vorbis_interface.c + (takehiro-2002_05_07-experimental): + + remove vorbis support, which is too much outdated. + +2002-11-10 07:53 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + trivial optimization + +2002-11-09 18:45 takehiro + + * libmp3lame/: psymodel.c, tables.c + (takehiro-2002_05_07-experimental): + + - optimize ATH handling in mask_add() by changing ATH.cb[] scaling. + - more faster long block masking threshold calculation. + +2002-11-09 18:43 takehiro + + * libmp3lame/: encoder.c, takehiro.c + (takehiro-2002_05_07-experimental): + + cleanup START/STOP type bit calculation + +2002-11-09 18:42 takehiro + + * libmp3lame/i386/: choose_table.nas, nasm.h + (takehiro-2002_05_07-experimental): + + some sync with GOGO. + +2002-11-09 12:34 takehiro + + * libmp3lame/: encoder.c, machine.h, quantize.c, set_get.c, + tables.c (takehiro-2002_05_07-experimental): + + clean up decibel -> power conversion + +2002-11-09 12:33 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + clean up FFT related code. + more acculate condition check whether we need short block masking calculation. + FIR filter loop unrolling + +2002-11-07 18:47 bouvigne + + * libmp3lame/: lame.c, presets.c, util.c, util.h: + + change of the default lowpass values (will break testcases) + +2002-11-04 16:59 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + optimize long block masking ratio calculation (partition -> scalefactor band transformation) + +2002-11-04 16:49 takehiro + + * testcase.mp3, libmp3lame/psymodel.c + (takehiro-2002_05_07-experimental): + + fix short block masking calcultion(patition to scalefactor band transformation) + and trivial cleanups, as is always :) + +2002-11-04 16:00 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + fix mp3x FFT display. + +2002-11-04 15:56 takehiro + + * testcase.mp3, libmp3lame/encoder.c, libmp3lame/psymodel.c, + libmp3lame/reservoir.c, libmp3lame/version.h + (takehiro-2002_05_07-experimental): + + now here goes alpha 2. + - some trivial optimizaions and cleanups on psymodel. + - cleanup mp3x arround + +2002-11-04 13:53 takehiro + + * libmp3lame/: VbrTag.h, encoder.c, lame-analysis.h, machine.h, + psymodel.c, psymodel.h, quantize.c, quantize.h, quantize_pvt.c, + quantize_pvt.h, set_get.c, tables.c, takehiro.c, util.h + (takehiro-2002_05_07-experimental): + + large cleanup mainly arround psymodel (continue) + - removed all temporary masking related code, because now I found all the + temporal masking code is completely messed up. + + - do not calculate short block masking ratio when it is not needed. + + - mp3x FFT energy display fix. + + - better perceptual entropy calculation, by using ATH. + + - some include file clean up. + + - some trivial code cleanup arround quantize/bit counting. + +2002-11-04 13:49 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + fix -q 4 setting. + +2002-11-04 13:48 takehiro + + * frontend/gtkanal.c (takehiro-2002_05_07-experimental): + + fix FFT energy display. + +2002-11-03 17:56 takehiro + + * testcase.mp3 (takehiro-2002_05_07-experimental): + + regen with new psymodel, which increases encode delay. + +2002-11-03 17:30 takehiro + + * libmp3lame/: Makefile.am, Makefile.in, encoder.c, encoder.h, + l3side.h, lame-analysis.h, lame.c, lame_global_flags.h, + newmdct.c, psymodel.c, psymodel.h, quantize.c, quantize_pvt.h, + set_get.c, tables.c, takehiro.c, util.c, util.h, vbrquantize.c + (takehiro-2002_05_07-experimental): + + large cleanup, mainly on PSYMODEL calculation. + - it calculates masking ratio/pe/tot_energy/block_type/frame_type next FRAME, + not next GRANULE. it increases the encoding delay, but code is very simple. + + - "allow different block_type in each channel (L/R)" could be archived even + when joint stereo. + + - l3side.h is merged into util.h + + - MPEG2/2.5, mp3x's display may corrupt (not tested much). + +2002-11-03 17:23 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + trivial + +2002-11-03 17:22 takehiro + + * frontend/: gpkplotting.c, gpkplotting.h, gtkanal.c + (takehiro-2002_05_07-experimental): + + fix for mp3x MDCT original value display + +2002-11-03 17:00 takehiro + + * libmp3lame/set_get.c (takehiro-2002_05_07-experimental): + + fix abr preset + +2002-11-03 16:55 takehiro + + * libmp3lame/util.c (takehiro-2002_05_07-experimental): + + fix for not --enable-all-float + +2002-11-02 17:47 takehiro + + * libmp3lame/: lame.c, util.h (takehiro-2002_05_07-experimental): + + trivial cleanup + +2002-11-02 17:30 takehiro + + * libmp3lame/: encoder.c, lame.c, presets.c, psymodel.c, + quantize.c, quantize_pvt.h, set_get.c, tables.c, util.h, + vbrquantize.c (takehiro-2002_05_07-experimental): + + cleanup arround preset. + - merged adaptive ATH and msfix parameter into "normal" setting. + - simplified how to compare the quantization/scalefactor. + +2002-11-02 17:26 takehiro + + * frontend/parse.c (takehiro-2002_05_07-experimental): + + remove unused prototype. + +2002-11-02 15:50 takehiro + + * libmp3lame/: encoder.c, set_get.c, util.h, vbrquantize.c + (takehiro-2002_05_07-experimental): + + remove meaningless variables in preset modes. + +2002-11-02 12:26 takehiro + + * libmp3lame/: VbrTag.c, lame.c, presets.c, quantize.c, tables.c, + util.c, util.h, vbrquantize.c (takehiro-2002_05_07-experimental): + + - -q option remapping. + new very old(-3.92) old(3.93) + 9 8,9 8,9 + 8 7 7 + 7 5,6 5,6 + 5,6 2,3,4 3,4 + 4 2 + --substep 5 3 + --substep 5 + 3 2 + --substep 7 3 + --substep 7 + 2 cannot emulate 2 + --substep 7 + 1 cannot emulate 1 + --substep 7 + 0 cannot emulate 0 + --substep 7 + + - fast_log2() optimization and cleanup. + +2002-11-02 12:18 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + ATH adjustment aware masking calculation in mask_add() and ms_fix(). + +2002-10-31 14:56 takehiro + + * libmp3lame/tables.c (takehiro-2002_05_07-experimental): + + trivial cleanup + +2002-10-31 14:27 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + some precision fix(maybe) + +2002-10-31 14:26 takehiro + + * doc/html/presets.html (takehiro-2002_05_07-experimental): + + sync with mainline and added some DM presets. + +2002-10-28 11:25 takehiro + + * libmp3lame/: encoder.c, psymodel.h, psymodel.c + (takehiro-2002_05_07-experimental): + + now psymodel never return error. + +2002-10-28 11:15 takehiro + + * testcase.mp3, libmp3lame/bitstream.c, libmp3lame/encoder.c, + libmp3lame/l3side.h, libmp3lame/lame.c, libmp3lame/machine.h, + libmp3lame/newmdct.c, libmp3lame/psymodel.c, + libmp3lame/psymodel.h, libmp3lame/quantize.c, + libmp3lame/quantize.h, libmp3lame/quantize_pvt.c, + libmp3lame/quantize_pvt.h, libmp3lame/reservoir.c, + libmp3lame/tables.c, libmp3lame/tables.h, libmp3lame/takehiro.c, + libmp3lame/util.h, libmp3lame/vbrquantize.c, + libmp3lame/vbrquantize.h (takehiro-2002_05_07-experimental): + + changed FLOAT8 -> FLOAT (except one subband filter coefs, which is defined + as "double" in spec). + +2002-10-28 11:12 takehiro + + * mpglib/layer3.c (takehiro-2002_05_07-experimental): + + fix mpglib crash bug, from Mathew Hendry. + +2002-10-28 11:09 takehiro + + * frontend/portableio.h (takehiro-2002_05_07-experimental): + + remove cvs log. + +2002-10-28 10:43 takehiro + + * libmp3lame/: encoder.c, psymodel.c, psymodel.h, tables.c, util.h + (takehiro-2002_05_07-experimental): + + remove unused variables + +2002-10-28 10:01 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + fix long/short typo. + +2002-10-28 10:00 takehiro + + * include/lame.h (takehiro-2002_05_07-experimental): + + added new preset definition + +2002-10-27 14:37 aleidinger + + * configure: + + regen + +2002-10-27 14:36 aleidinger + + * configure.in: + + Forced commit: last commit was - remove -funroll-loops as suggested in the nearby comment Noticed by: takehiro + +2002-10-27 14:32 aleidinger + + * configure.in: + + remove options as suggested in the nearby comment; Noticed by: takehiro + +2002-10-27 13:38 takehiro + + * libmp3lame/: encoder.c, lame.c, lame_global_flags.h, machine.h, + newmdct.c, newmdct.h, presets.c, psymodel.c, psymodel.h, + quantize.c, set_get.c, tables.c, util.h + (takehiro-2002_05_07-experimental): + + large update. + - sync mainline, + * side channel sparsing + * new presets, dm-radio and so on. + * blocktype histgram + * fix arround FLOAT_MAX + * tuning substep noise shaping start frequency + + - large code simplification + * cod_info initialization code is moved to encoder.c + * faster psymodel calculation. + +2002-10-27 13:33 takehiro + + * libmp3lame/vbrquantize.c (takehiro-2002_05_07-experimental): + + sync mainline + - fix arround sfb21 and smoothing method 2 + +2002-10-27 13:32 takehiro + + * libmp3lame/version.h (takehiro-2002_05_07-experimental): + + To avoid confusing, named it as lame4.0 + +2002-10-27 13:30 takehiro + + * frontend/: get_audio.c, get_audio.h, main.c, main.h, mp3rtp.c, + mp3x.c, parse.c, parse.h, timestatus.h + (takehiro-2002_05_07-experimental): + + sync mainline + - fix arround PATHNAMELEN + - new presets + - fix warnings + - fix --silent option + - new option "side channel sparsing" + +2002-10-27 13:29 takehiro + + * frontend/brhist.c (takehiro-2002_05_07-experimental): + + - sync mainline (block type histgram, build fix for cygwin) + +2002-10-27 13:26 takehiro + + * configure (takehiro-2002_05_07-experimental): + + regen + +2002-10-27 13:26 takehiro + + * configure.in, doc/html/Makefile.am, doc/html/Makefile.in, + doc/html/contributors.html, doc/html/index.html, doc/man/lame.1 + (takehiro-2002_05_07-experimental): + + sync mainline + +2002-10-27 12:19 robert + + * frontend/portableio.h (takehiro-stable-2002_10_15): + + do we need logging of cvs commits in source files? + small fixes in comments due to cvs log entries + +2002-10-27 08:17 takehiro + + * libmp3lame/version.h (takehiro-stable-2002_10_15): + + bump up version number. alpha3 contains + - tuning substep noise shpaing (by me, Takehiro) + - added side channel sparsing (by Robert) + +2002-10-26 20:41 robert + + * configMS.h, frontend/amiga_mpega.c, frontend/brhist.c, + frontend/brhist.h, frontend/console.c, frontend/console.h, + frontend/get_audio.c, frontend/get_audio.h, + frontend/gpkplotting.c, frontend/gpkplotting.h, + frontend/gtkanal.c, frontend/gtkanal.h, frontend/lametime.c, + frontend/lametime.h, frontend/main.c, frontend/main.h, + frontend/mp3rtp.c, frontend/mp3x.c, frontend/parse.c, + frontend/parse.h, frontend/portableio.c, frontend/portableio.h, + frontend/rtp.c, frontend/rtp.h, frontend/timestatus.c, + frontend/timestatus.h, include/lame.h, libmp3lame/VbrTag.c, + libmp3lame/VbrTag.h, libmp3lame/bitstream.c, + libmp3lame/bitstream.h, libmp3lame/debugscalefac.c, + libmp3lame/encoder.c, libmp3lame/encoder.h, libmp3lame/fft.c, + libmp3lame/fft.h, libmp3lame/gain_analysis.c, + libmp3lame/gain_analysis.h, libmp3lame/id3tag.c, + libmp3lame/id3tag.h, libmp3lame/l3side.h, + libmp3lame/lame-analysis.h, libmp3lame/lame.c, + libmp3lame/lame_global_flags.h, libmp3lame/machine.h, + libmp3lame/mpglib_interface.c, libmp3lame/newmdct.c, + libmp3lame/newmdct.h, libmp3lame/presets.c, + libmp3lame/psymodel.c, libmp3lame/psymodel.h, + libmp3lame/quantize.c, libmp3lame/quantize.h, + libmp3lame/quantize_pvt.c, libmp3lame/quantize_pvt.h, + libmp3lame/reservoir.c, libmp3lame/reservoir.h, + libmp3lame/set_get.c, libmp3lame/tables.c, libmp3lame/tables.h, + libmp3lame/takehiro.c, libmp3lame/util.c, libmp3lame/util.h, + libmp3lame/vbrquantize.c, libmp3lame/vbrquantize.h, + libmp3lame/version.c, libmp3lame/version.h, + libmp3lame/vorbis_interface.c, mpglib/common.c, mpglib/common.h, + mpglib/dct64_i386.c, mpglib/dct64_i386.h, mpglib/decode_i386.c, + mpglib/decode_i386.h, mpglib/huffman.h, mpglib/interface.c, + mpglib/interface.h, mpglib/l2tables.h, mpglib/layer1.c, + mpglib/layer1.h, mpglib/layer2.c, mpglib/layer2.h, + mpglib/layer3.c, mpglib/layer3.h, mpglib/mpg123.h, + mpglib/mpglib.h, mpglib/tabinit.c, mpglib/tabinit.h + (takehiro-stable-2002_10_15): + + changed C++ comments into C style comments for + configMS.h + include/*.h + frontend/*.[ch] + mpglib/*.[ch] + libmp3lame/*.[ch] + +2002-10-26 18:53 takehiro + + * libmp3lame/Makefile.in (takehiro-2002_05_07-experimental): + + regen + +2002-10-26 18:52 takehiro + + * libmp3lame/: Makefile.am, debugscalefac.c + (takehiro-2002_05_07-experimental): + + remove unused debugscalefac.c + +2002-10-26 18:51 takehiro + + * libmp3lame/Makefile.in (takehiro-2002_05_07-experimental): + + fix build problem + +2002-10-26 16:48 takehiro + + * libmp3lame/presets.c (takehiro-stable-2002_10_15): + + added interchannel masking to dm-radio-fast preset, too. + +2002-10-26 16:47 takehiro + + * libmp3lame/presets.c (takehiro-stable-2002_10_15): + + lower bitrate adjustment and added inter-channel masking for dm-radio preset. + +2002-10-26 16:32 takehiro + + * libmp3lame/quantize.c (takehiro-stable-2002_10_15): + + tuned substep-noise-shaping start frequency of short block (--substep 5). + +2002-10-26 12:31 takehiro + + * libmp3lame/quantize.c (takehiro-stable-2002_10_15): + + fix for not C99 C compiler + +2002-10-26 12:29 takehiro + + * configure (takehiro-stable-2002_10_15): + + regen + +2002-10-26 12:29 takehiro + + * configure.in (takehiro-stable-2002_10_15): + + sync with mainline and added fix for "-funroll-loops" bug on gcc3.0.* + +2002-10-26 12:20 takehiro + + * frontend/parse.c (takehiro-stable-2002_10_15): + + sync mainline... --silent + input from stdin fix. + +2002-10-24 00:04 robert + + * libmp3lame/: vbrquantize.c (takehiro-stable-2002_10_15), + vbrquantize.c: + + bug fix in vbr-new + possible division by zero + +2002-10-23 23:43 robert + + * frontend/parse.c, libmp3lame/lame.c, + libmp3lame/lame_global_flags.h, libmp3lame/quantize.c, + libmp3lame/set_get.c, libmp3lame/util.h + (takehiro-stable-2002_10_15): + + added mid/side channel sparsing + --ms-sparsing n | n=0 disable / n=1 mode 1 / n=2 mode 2 + --ms-sparse_low x | default 9 dB + --ms-sparse_high x | default 3 dB + +2002-10-21 01:27 markt + + * frontend/parse.c: + + truely silent when input is stdin patch committed + +2002-10-20 15:38 takehiro + + * libmp3lame/psymodel.c (takehiro-stable-2002_10_15): + + fix possible float exception + +2002-10-20 15:36 takehiro + + * libmp3lame/version.h (takehiro-stable-2002_10_15): + + bump up the alpha2 + +2002-10-20 15:35 takehiro + + * libmp3lame/psymodel.c (takehiro-stable-2002_10_15): + + fix minor boundary check and remove unused variable. + +2002-10-20 13:42 takehiro + + * doc/: html/Makefile.am, html/Makefile.in, html/contributors.html, + html/index.html, html/presets.html, man/lame.1 + (takehiro-stable-2002_10_15): + + sync with mainline + +2002-10-20 13:31 takehiro + + * libmp3lame/quantize.c (takehiro-stable-2002_10_15): + + work arround of --substep for Tom's Diner. + +2002-10-20 13:09 takehiro + + * libmp3lame/psymodel.c (takehiro-stable-2002_10_15): + + faster mask_add() + +2002-10-20 12:31 takehiro + + * libmp3lame/: psymodel.c, quantize_pvt.c, util.h + (takehiro-stable-2002_10_15): + + more optimized usage of FAST_LOG(). + +2002-10-20 11:39 takehiro + + * frontend/parse.c, include/lame.h, libmp3lame/encoder.c, + libmp3lame/lame_global_flags.h, libmp3lame/psymodel.c, + libmp3lame/set_get.c (takehiro-stable-2002_10_15): + + removed mixed block related switches, which is "not" as stable as releasing. + fix block type decision code when LR/MS change occurs. + +2002-10-20 08:41 takehiro + + * libmp3lame/machine.h (takehiro-stable-2002_10_15): + + float max should be arround 1e38 or so. + +2002-10-20 08:39 takehiro + + * include/lame.h, libmp3lame/set_get.c + (takehiro-stable-2002_10_15): + + re-introduce the padding related functions/definitions for backward compatibility. + +2002-10-20 08:38 takehiro + + * frontend/: get_audio.c, get_audio.h, main.c, main.h, mp3rtp.c, + mp3x.c, parse.c, parse.h, timestatus.h + (takehiro-stable-2002_10_15): + + sync mainline. + - PATHLEN related fix. + - reduce warning. + +2002-10-20 08:37 takehiro + + * frontend/brhist.c (takehiro-stable-2002_10_15): + + fix for cygwin build. + +2002-10-20 07:34 takehiro + + * libmp3lame/psymodel.c (takehiro-stable-2002_10_15): + + improve attack detection and added release detection for L/S switching. + +2002-10-20 07:27 takehiro + + * libmp3lame/psymodel.c (takehiro-stable-2002_10_15): + + fix warning. + +2002-10-20 07:21 takehiro + + * frontend/parse.c, include/lame.h, libmp3lame/presets.c + (takehiro-stable-2002_10_15): + + added some presetes for syncing DM series. + fix --preset medium to use -q3, not -q2. + +2002-10-20 07:18 takehiro + + * libmp3lame/vbrquantize.c (takehiro-stable-2002_10_15): + + sync mainline. XXL is defaulted. + +2002-10-19 02:11 robert + + * frontend/brhist.c: + + little bit prettier printing of block types stats + +2002-10-19 02:10 robert + + * frontend/brhist.c (takehiro-stable-2002_10_15): + + little bit prettier printing of block type stats + +2002-10-18 23:54 robert + + * frontend/brhist.c, frontend/parse.c, include/lame.h, + libmp3lame/encoder.c, libmp3lame/lame.c, libmp3lame/util.h + (takehiro-stable-2002_10_15): + + merger from main branch: + simple statistics of block types used (seeing with --brief / --verbose) + +2002-10-18 22:54 robert + + * frontend/brhist.c, frontend/parse.c, include/lame.h, + libmp3lame/lame.c, libmp3lame/util.c, libmp3lame/util.h: + + added some simple statistics about block types used: + added lame_block_type_hist() and lame_bitrate_block_type_hist() to API + using new switch --brief will show one line of percentage types used + using switch --verbose will show in more detail used block types + +2002-10-17 17:05 bouvigne + + * frontend/parse.c: + + removed some unused functions + +2002-10-17 13:03 aleidinger + + * include/lame.h: + + correct comment about *_bWriteVbrTag() + +2002-10-16 21:13 robert + + * libmp3lame/vbrquantize.c: + + fixing compiler warnings (unused code removed), some clean up + +2002-10-16 18:01 bouvigne + + * frontend/get_audio.c, frontend/get_audio.h, frontend/parse.c, + frontend/parse.h, frontend/timestatus.h, include/lame.h, + libmp3lame/set_get.c, libmp3lame/takehiro.c: + + minor code cleanups in order to reduce warnings + +2002-10-15 22:45 robert + + * frontend/main.h, libmp3lame/machine.h + (takehiro-stable-2002_10_15): + + fixing Win32 issues + +2002-10-15 22:02 robert + + * libmp3lame/: encoder.c, version.h (takehiro-stable-2002_10_15): + + Takehiro I hope you don't mind, but I bump the version to 94 alpha 1 + to avoid confusions if binaries are shown up at HA + +2002-10-15 21:29 robert + + * libmp3lame/vbrquantize.c (takehiro-stable-2002_10_15): + + fix for --vbr-new -Y crash + we have to calc xr34 for the whole range, for sfb21 too + +2002-10-15 19:16 robert + + * Makefile.unix, libmp3lame/psymodel.c, libmp3lame/util.h: + + reenentrant fix for loudness approx. + +2002-10-15 17:07 takehiro + + * libmp3lame/vbrquantize.c (takehiro-2002_05_07-experimental): + + fix short block with -X 0(vbr smooth method 1), especially for --r3mix. + +2002-10-15 16:35 takehiro + + * libmp3lame/vbrquantize.c (takehiro-stable-2002_10_15): + + fix short block with -X 0(vbr smooth method 1), especially for --r3mix. + +2002-10-15 15:39 takehiro + + * frontend/main.h, libmp3lame/lame.c + (takehiro-2002_05_07-experimental): + + fix for no-GTK, and on windows (same as what I've done mainline). + +2002-10-15 15:37 takehiro + + * frontend/main.h (takehiro-stable-2002_10_15): + + ooops, I missed "n". + +2002-10-15 15:35 takehiro + + * libmp3lame/lame.c (takehiro-stable-2002_10_15): + + fix for no-GTK environment. + +2002-10-15 15:30 takehiro + + * libmp3lame/machine.h (takehiro-2002_05_07-experimental): + + fix arround FLT_MAX/FLOAT_MAX (I hope) + +2002-10-15 15:24 aleidinger + + * configure.in: + + different way of specifying the gcc version in the sparc section, the did not worked because autoconf does some nasty things with [ and ] + +2002-10-15 11:30 aleidinger + + * doc/man/lame.1: + + catch up with HTML docs + +2002-10-15 09:54 aleidinger + + * doc/html/Makefile.in: + + regen + +2002-10-15 09:54 aleidinger + + * doc/html/Makefile.am: + + add presets.html + +2002-10-15 09:53 aleidinger + + * doc/html/presets.html: + + typo fix + +2002-10-15 09:50 aleidinger + + * configure: + + regen + +2002-10-15 09:49 aleidinger + + * configure.in: + + Use sparc optimization on gcc 3.[123456]. + + Submitted by: "Spud McDuck" + +2002-10-15 09:33 aleidinger + + * frontend/: brhist.c, main.c, main.h, mp3rtp.c, mp3x.c, parse.c: + + PATH_MAX is in POSIX.1 (does not include the trailing NUL, so add +1), not MAXPATHLEN + +2002-10-14 20:06 bouvigne + + * doc/html/: contributors.html, index.html, presets.html: + + html docs + +2002-10-14 16:28 takehiro + + * testcase.mp3 (takehiro-stable-2002_10_15): + + update testcase. + +2002-10-14 16:25 takehiro + + * libmp3lame/: psymodel.c, util.h (takehiro-stable-2002_10_15): + + reenentrant fix for loudness approx. + +2002-10-14 16:06 takehiro + + * Makefile.B32, Makefile.DJGPP, libmp3lame/libmp3lame.dsp + (takehiro-stable-2002_10_15): + + build environment related file update. + I could not test them, but I hope it works. + +2002-10-14 15:53 takehiro + + * frontend/parse.c (takehiro-2002_05_07-experimental): + + obsoleted --cwlimit option. + +2002-10-14 15:53 takehiro + + * Makefile.B32, Makefile.DJGPP, Makefile.MSVC, Makefile.unix + (takehiro-2002_05_07-experimental): + + update Makefiles sync with Makefile.am + +2002-10-13 20:35 takehiro + + * libmp3lame/: Makefile.am, Makefile.in, encoder.c, fft.c, fft.h, + lame.c, lame_global_flags.h, libmp3lame.dsp, libmp3lame_vc6.dsp, + psymodel.c, psymodel.h, quantize.c, quantize_pvt.c, + quantize_pvt.h, set_get.c, tables.c, tables.h, takehiro.c, + util.c, util.h, vbrquantize.c (takehiro-2002_05_07-experimental): + + bunch of cleanup for next generation LAME :) + - goodbye gpsycho. only nspsy is supported. + - functions related the initilization are moved to tables.c + - some functions in quantize_pvt.c are moved to quantize.c + - functions in fft.c moved to psymodel.c and fft.[ch] are removed + - fix ATH-adjust to reentrant. + +2002-10-13 17:30 takehiro + + * libmp3lame/: VbrTag.c, lame.c, lame_global_flags.h, set_get.c + (takehiro-2002_05_07-experimental): + + sync the head. record preset parameter in LAME tag. + +2002-10-13 15:52 takehiro + + * frontend/main.h (takehiro-2002_05_07-experimental): + + sync with the head branch. + +2002-10-13 15:48 takehiro + + * libmp3lame/: lame.c, psymodel.c, quantize_pvt.c, set_get.c, + util.h (takehiro-2002_05_07-experimental): + + - tuned impulse like signal detection of threshold calculation. + + - block switching tuning, for impulse like signal by using maximum of filtered + signal, not by sum of its energy. + + - MP3X: print block switching factor(attack_intensity) instead of mx, + for nspsytune mode. + + - small optimization for ns_firfilter + + - prepare for faster nspsy. calculate the blocktype first, and after it, + only calculate the threshold for that blocktype. + + - clean up nspsy variables (remove unused variables). + + - calc_noise optimization for nspsy. + +2002-10-13 11:36 robert + + * Makefile.MSVC, Makefile.unix (takehiro-2002_05_07-experimental): + + removed scalar.obj from targets + +2002-10-13 08:10 takehiro + + * libmp3lame/: encoder.c, lame.c + (takehiro-2002_05_07-experimental): + + oops, I mis-check in th one older version ;( + +2002-10-13 07:58 takehiro + + * libmp3lame/: encoder.c, lame.c, quantize.c, quantize_pvt.c, + quantize_pvt.h, tables.h (takehiro-2002_05_07-experimental): + + trivial changes. + - cleanup initilization code. + - better conjunctions of functions. + +2002-10-09 17:27 takehiro + + * libmp3lame/encoder.c, libmp3lame/lame.c, frontend/parse.c, + include/lame.h, libmp3lame/lame_global_flags.h, + libmp3lame/set_get.c (takehiro-2002_05_07-experimental): + + large cleanup arround padding + - padding mode is always set by suitable one. + - gfp->padding_type and the functions to set/get it are removed. + + unused function optimum_samplefreq() is removed. + +2002-10-09 17:24 takehiro + + * libmp3lame/i386/: Makefile.am, Makefile.in, scalar.nas + (takehiro-2002_05_07-experimental): + + remove scalar.nas + +2002-10-09 17:22 takehiro + + * configure (takehiro-2002_05_07-experimental): + + regen + +2002-10-09 17:22 takehiro + + * configure.in (takehiro-2002_05_07-experimental): + + fix extopt for gcc 3.1/3.2 + +2002-10-08 19:30 bouvigne + + * libmp3lame/: VbrTag.c, lame.c, lame_global_flags.h, set_get.c: + + preset info stored into Info tag + +2002-10-08 17:43 bouvigne + + * frontend/main.h: + + win32 build fix + +2002-10-08 13:59 takehiro + + * libmp3lame/Makefile.in (takehiro-2002_05_07-experimental): + + regen + +2002-10-08 13:59 takehiro + + * libmp3lame/: Makefile.am, tools.c, tools.h, util.c + (takehiro-2002_05_07-experimental): + + removed unused tools.[hc] + +2002-10-08 13:38 takehiro + + * configure (takehiro-2002_05_07-experimental): + + regen once more :( + +2002-10-08 13:35 takehiro + + * configure (takehiro-2002_05_07-experimental): + + regen + +2002-10-08 13:34 takehiro + + * ltconfig, acinclude.m4, configure.in + (takehiro-2002_05_07-experimental): + + sync the head branch. + fix gcc options for gcc3.1 after and 3.0.x + +2002-10-08 13:30 takehiro + + * libmp3lame/Makefile.in (takehiro-2002_05_07-experimental): + + regen + +2002-10-08 13:19 takehiro + + * frontend/: main.c, main.h, mp3rtp.c, mp3x.c, parse.c + (takehiro-2002_05_07-experimental): + + sync the head branch. + - MAXPATHLEN related fix. + - sizeof(short) related fix. + +2002-10-08 13:18 takehiro + + * libmp3lame/lameerror.h, include/lame.h, libmp3lame/Makefile.am + (takehiro-2002_05_07-experimental): + + moved error code definitions into lame.h + +2002-10-08 12:58 takehiro + + * frontend/main.c: + + sync my branch: fix warning of ReportLameTagProgress() definition + +2002-10-08 12:51 takehiro + + * libmp3lame/VbrTag.c (takehiro-2002_05_07-experimental): + + remove unneeded include + +2002-10-08 12:50 takehiro + + * libmp3lame/encoder.c (takehiro-2002_05_07-experimental): + + fix NO_PAD + +2002-10-08 09:09 aleidinger + + * configure: + + regen + +2002-10-08 08:59 aleidinger + + * ChangeLog: + + update with uptodate data + +2002-10-08 08:57 aleidinger + + * ChangeLog.header: + + add info how to show the branches in the ChangeLog + +2002-10-08 08:53 aleidinger + + * libmp3lame/version.h: + + bump alpha version + +2002-10-08 08:51 aleidinger + + * configure.in: + + replace the -pipe hack for mips-sgi-irix with a test for GNU ld + (sorry, I forgot who submitted it) + +2002-10-08 08:50 aleidinger + + * acinclude.m4: + + actually commit the generated file with the alignment fix for 64 bit architectures + +2002-10-08 08:50 aleidinger + + * ltconfig: + + improved "deplibs_check_method" for freebsd-elf + +2002-10-08 08:44 aleidinger + + * frontend/: main.c, main.h, mp3rtp.c, mp3x.c, parse.c: + + - spell MAX_NAME_LEN the POSIX way (MAXPATHLEN) and make sure we have + a fallback if it doesn't get defined (please test this on Windows) + - fix for sizeof(short int) != sizeof(int) in mp3rtp.c + + Patches based upon bugreport from Greg Lehey and fixes + in the FreeBSD ports collection from Mikhail Teterin . + +2002-10-07 16:47 takehiro + + * libmp3lame/: encoder.c, lame.c, psymodel.c + (takehiro-2002_05_07-experimental): + + fix warnings + +2002-10-07 16:46 takehiro + + * frontend/main.c (takehiro-2002_05_07-experimental): + + fix warning + +2002-10-07 14:24 takehiro + + * libmp3lame/: lame.c, psymodel.c, set_get.c, util.h + (takehiro-2002_05_07-experimental): + + more nspsytune optimization. + + - use FAST_LOG10 instead of log. this may change the result little bit, + but I think that is rare case and no problem about the quality. + + - presetTune.athadjust_msfix is moved to nsPsy.athadjust_msfix + + - nsPsy.safejoint is removed. + +2002-10-07 13:41 takehiro + + * libmp3lame/: psymodel.c, util.h + (takehiro-2002_05_07-experimental): + + more cleanup of perceptual entropy calculation. + - it calculates only one of the long/short block pe, + after the block type is detemined. + +2002-10-07 13:38 takehiro + + * libmp3lame/quantize_pvt.c (takehiro-2002_05_07-experimental): + + fix warning + +2002-10-07 12:49 takehiro + + * libmp3lame/: psymodel.c, quantize_pvt.c, set_get.c, util.h + (takehiro-2002_05_07-experimental): + + trivial code optimizations, no result changes. + - gfp->ATHlower is now stored the number multiplied by -0.1. + + - nspsytune optimization + * precalculate the 1.0/numlines_l[] + * cleanup perceptual entropy storing method and loop hoisting. + * unrolling tonality calculation loop. + +2002-10-07 09:13 takehiro + + * frontend/brhist.c (takehiro-2002_05_07-experimental): + + oops, fix build when BRHIST is enabled. + +2002-10-07 09:11 takehiro + + * frontend/brhist.c, libmp3lame/encoder.c, libmp3lame/lame.c, + libmp3lame/util.h (takehiro-2002_05_07-experimental): + + clean up bitrate histgram. + And do not compile the brhist-related code when "./configure --without-brhist" + +2002-10-07 09:09 takehiro + + * frontend/get_audio.c (takehiro-2002_05_07-experimental): + + fix warning + +2002-10-07 08:57 takehiro + + * libmp3lame/: encoder.c, fft.c, presets.c, psymodel.c, set_get.c, + util.c, util.h, vbrquantize.c (takehiro-2002_05_07-experimental): + + small code cleanups. all of them does not change the result. + - better conjunctions. + * updateStats() is moved from util.c to encoder.c + * select_kth_int() is moved from util.c to vbrquantize.c + - fft window function table is moved from gfc to static variable in fft.c. + once apon a time, the window function is differed from nspsy/gpsy, so the + table should be stored separetedly for each encoding entity. but now, it + is unified and we can unify the table function. + - presetTune.attackthre and presetTune.attackthre_s are moved to nsPsy. + +2002-10-06 18:14 takehiro + + * libmp3lame/: psymodel.c, quantize.c, util.h, vbrquantize.c + (takehiro-2002_05_07-experimental): + + preset clean up. + - use the current block_type itself to determine the quantization result + comparing method. + - remove presetTune.quantcomp_current. + - changed presetTune.attackthresh and presetTune.attackthresh_s type (int -> FLOAT). + + I think the 1st one is BUG of preset, affected all preset modes. + It determines how to compare the quantized spectrums by the blocktype of 1st + granule of the next frames, last channel (R or S), for all the channel and + all the granule. + +2002-10-06 18:06 takehiro + + * libmp3lame/set_get.c (takehiro-2002_05_07-experimental): + + due to the nspsy long/short switching mode fix, attack threshold should be + tuned again.I used awe32, fatboy, DEATH2, and other "normal" samples to + determine the threshold. + + now awe32 is not killer sample of --preset standard, I think. + # but the bitrate is increased, of course. + + and it seems vangelis1.wav needs some more tuning, but I am so sleeeeeeepy. + +2002-10-06 16:46 takehiro + + * libmp3lame/: encoder.c, psymodel.c + (takehiro-2002_05_07-experimental): + + - make adjust_ATH() static and cleanup + (include Gabriel's clean up in the head branch) + - padding code clean up + - block type code cleanup + - ATH related initialization code is moved to psymodel.c + +2002-10-06 16:43 takehiro + + * libmp3lame/util.c (takehiro-2002_05_07-experimental): + + sync with the head branch (Gabriel's code cleanup... remove "historical" code) + +2002-10-06 16:40 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + sync with head.(code cleanup by Gabriel) + +2002-09-30 16:58 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + moved substep shaping position. bit slower but better quality for higher bitrate (especially for the case 320kbps is not enough). + +2002-09-30 16:57 takehiro + + * libmp3lame/vbrquantize.c (takehiro-2002_05_07-experimental): + + fix substep 2, 3, 6, and 7. (working area allocation) + +2002-09-30 16:49 bouvigne + + * libmp3lame/: encoder.c, quantize.c, util.c: + + some code cleanups + +2002-09-30 16:28 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + fix mdct filter coefs, for -k option(thanx reporting, Robert). + +2002-09-29 15:38 takehiro + + * frontend/brhist.c (takehiro-2002_05_07-experimental): + + fix cygwin build + +2002-09-29 06:02 takehiro + + * libmp3lame/reservoir.c (takehiro-2002_05_07-experimental): + + sync with the head branch. + - bit reservoir handling of freeformat. + +2002-09-28 16:12 takehiro + + * libmp3lame/: util.h, vbrquantize.c + (takehiro-2002_05_07-experimental): + + small optimizations for --vbr-new + - gfc->VBR->scratch is moved to the local variable. + - remove quality mapping(directly switch statement) + - code clean up. + +2002-09-28 13:27 takehiro + + * libmp3lame/: quantize.c, vbrquantize.c + (takehiro-2002_05_07-experimental): + + - sync --vbr-new with the head branch. + - better substep shaping for --vbr-new. + - the meaning of best huffman coding with --vbr-new is bit different from + that of head tree. + +2002-09-28 10:36 takehiro + + * frontend/get_audio.c, frontend/parse.c, include/lame.h + (takehiro-2002_05_07-experimental): + + fix warnings. + +2002-09-28 10:36 takehiro + + * libmp3lame/vbrquantize.c (takehiro-2002_05_07-experimental): + + make select_kth() static function. + +2002-09-28 10:26 takehiro + + * Makefile.DJGPP, Makefile.MSVC, Makefile.am, Makefile.in, + README.DJGPP, configure, configure.in, testcase.mp3, + ACM/ACMStream.cpp, ACM/Makefile.in, ACM/ADbg/Makefile.in, + ACM/tinyxml/Makefile.in, Dll/BladeMP3EncDLL.c, + Dll/BladeMP3EncDLL.def, Dll/BladeMP3EncDLL.h, Dll/Example.cpp, + Dll/Example_vc6.dsp, Dll/Example_vc6.dsw, + Dll/LameDLLInterface.htm, Dll/LameDll_vc6.dsp, Dll/Makefile.in, + debian/Makefile.in, debian/changelog, debian/rules, + doc/Makefile.in, doc/html/Makefile.in, + doc/html/contributors.html, doc/html/history.html, + doc/html/index.html, doc/html/switchs.html, doc/man/Makefile.in, + doc/man/lame.1, dshow/Encoder.cpp, dshow/Makefile.in, + frontend/get_audio.c, frontend/parse.c, include/Makefile.in, + include/lame.h, libmp3lame/Makefile.am, libmp3lame/Makefile.in, + libmp3lame/encoder.c, libmp3lame/lame.c, libmp3lame/presets.c, + libmp3lame/set_get.c, libmp3lame/util.h, + libmp3lame/i386/Makefile.in, misc/Makefile.in, mpglib/Makefile.in + (takehiro-2002_05_07-experimental): + + large sync with the head branch. almost all the code is now synced with the head. + +2002-09-28 09:30 takehiro + + * libmp3lame/VbrTag.c: + + remove some #include (these header files are included from VbrTag.h.) + +2002-09-28 09:23 takehiro + + * libmp3lame/: encoder.c, lame.c, psymodel.c + (takehiro-2002_05_07-experimental): + + fix all known problems on my tree (I hope). + - fix mishandling of long/short block type when storing pe[]. + - fix psymodel initialization (array index initialization), which fixes + floating exception in psymodel.c. + - one more preecho prevention code fix. + - sync with my psymodel patch in the head branch + + and small improvement. + - implement better block type restriction + (when MS, both channels should be same block type, but when LR, it is not needed). + - faster FIR filter for pe[] adjustment in encoder.c. + +2002-09-28 09:16 takehiro + + * libmp3lame/bitstream.c (takehiro-2002_05_07-experimental): + + zeroed all ancillary area, when the debug mode. + +2002-09-23 07:00 bouvigne + + * include/lame.h: + + presets (sorry, this part was missing) + +2002-09-22 16:53 bouvigne + + * frontend/parse.c, libmp3lame/presets.c: + + presets + +2002-09-21 00:31 markt + + * libmp3lame/quantize_pvt.c: + + fixed bug which was causing the calc_noise assert failure. + +2002-09-19 20:39 robert + + * libmp3lame/: encoder.c, lame.c, quantize.c, util.h + (takehiro-2002_05_07-experimental): + + merger from mainline: + undo of broken VBR min fill patch + padding code clean up + +2002-09-16 16:28 takehiro + + * configure, configure.in: + + we don't want to run the X :) + +2002-09-16 07:43 takehiro + + * frontend/: brhist.c, console.c + (takehiro-2002_05_07-experimental): + + sync with head branch. + - Mark's compilation fix. + - Alex's warning fix on 64bit environment. + +2002-09-16 07:25 takehiro + + * aclocal.m4 (takehiro-2002_05_07-experimental): + + sync with the head branch. + - prevent unaligned access on some 64 bit arches, by Alexander (and Ti.) + +2002-09-15 17:47 bouvigne + + * libmp3lame/: reservoir.c, set_get.c: + + Relax of freeformat reservoir after discussion with Robert + +2002-09-13 20:04 markt + + * frontend/brhist.c: + + This code: + + #if defined(HAVE_TERMCAP_H) + # include + #elif defined(HAVE_NCURSES_TERMCAP_H) + # include + #endif + + changed to: + + #if defined(HAVE_NCURSES_TERMCAP_H) + # include + #elif defined(HAVE_TERMCAP_H) + # include + #endif + + because on my system, both TERMCAP and NCURSES_TERMCAP were + defined by configure, but term.h and termcap.h have conflicts, + whileterm.h and ncurses/termcap.h works fine. + +2002-09-09 21:43 robert + + * frontend/parse.c, libmp3lame/encoder.c, libmp3lame/lame.c, + libmp3lame/psymodel.c: + + lame.c, encoder.c: fix padding oddities + psymodel.c: fix nspsy code for all/no short blocks + parse.c: -d now obsolete + +2002-09-08 06:36 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + one more sync with head branch (ms energy ratio). + +2002-09-07 12:39 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + sync with the head branch psymodel fix. + +2002-09-06 11:11 aleidinger + + * configure: + + regen + +2002-09-06 10:53 aleidinger + + * configure.in: + + - no opts if non empty cflags and no expopt + - accumulate-outgoing-args is x86 only + Noticed by: Atro Tossavainen + - IRIX-gcc doesn't like '-pipe' + Noticed by: Atro Tossavainen + +2002-09-06 09:24 aleidinger + + * frontend/: brhist.c, console.c: + + try to include the right headers for the tgetstr prototype; + should fix problems on 64bit arches + Noticed by: Atro Tossavainen + Ti Kan + Tested by: Ti Kan + +2002-09-06 09:22 aleidinger + + * aclocal.m4: + + prevent unaligned access on some 64 bit arches + Noticed by: Ti Kan + Tested by: Ti Kan + +2002-09-05 16:53 bouvigne + + * libmp3lame/: reservoir.c, set_get.c: + + free format fix + +2002-09-03 11:34 aleidinger + + * frontend/parse.c: + + 1 argument too much for fprintf + +2002-09-03 11:18 aleidinger + + * doc/man/lame.1: + + add --noasm + +2002-09-02 12:02 takehiro + + * doc/html/history.html: + + added my psymodel change, and so on. + +2002-09-02 11:56 takehiro + + * testcase.mp3: + + regen with the latest LAME after psymodel was fixed. + This is produced by the LAME with ./configure --enable-nasm --enable-debug --enable-mp3x, compiled gcc 3.1.1, on linux2.4.19, glibc2.2.2, Duron 1GHz(3DNow! is enabled). + +2002-09-02 11:51 takehiro + + * libmp3lame/lame.c: + + fix for Tru64 UNIX build, reported by Ti Kan. + +2002-09-01 16:08 bouvigne + + * doc/html/contributors.html, doc/html/history.html, + doc/html/index.html, doc/html/switchs.html, frontend/parse.c: + + docs + +2002-09-01 16:03 takehiro + + * libmp3lame/psymodel.c: + + fix small psymodel bugs since long time ago(some of them are since 3.70 era...) + - highpass filter of MS energy calculation to neglect the DC. + - always do the Robert's short block pre-echo prevention and + fix its initialization (the fix is only for nspsy). + - fix energy and threshold of DC and the highest freq. element are halven. + - fix nspsytune FIR filter length + +2002-08-30 20:52 robert + + * Makefile.MSVC: + + MSVC: fix "-GX" typo + ICL: allow special compiles for PII and PIII + +2002-08-27 22:43 rbrito + + * debian/: changelog, rules: + + Update Debian packaging. More changes to come. + +2002-08-26 20:38 robert + + * libmp3lame/: lame.c, quantize.c, util.h: + + undo of VBR bitres min fill patch + +2002-08-25 20:17 bouvigne + + * frontend/parse.c: + + merge of alt presets + +2002-08-25 15:09 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + do substep noise shaping in ABR mode, including bitrate compensation. + +2002-08-25 15:08 takehiro + + * libmp3lame/util.c (takehiro-2002_05_07-experimental): + + trivial coding optimization of fast_log2 + +2002-08-25 15:08 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + revert some FAST_LOG usage. It sometime happens SIGFPE(overflow). + +2002-08-25 10:54 takehiro + + * libmp3lame/: quantize.c, reservoir.c + (takehiro-2002_05_07-experimental): + + Tuning the bit reservoir filling rate when substep noise shaping method 1, + and do not substep noise shaping if the bit reservoir is almost full. + +2002-08-24 19:20 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + minor fix for global_gain limitation. + +2002-08-24 17:28 takehiro + + * libmp3lame/: VbrTag.c, lame.c (takehiro-2002_05_07-experimental): + + sync main tree. + - portability fix for sunos 4.x by Alexander Leidinger. + +2002-08-24 17:25 takehiro + + * libmp3lame/set_get.c (takehiro-2002_05_07-experimental): + + quick fix of warning. + +2002-08-24 17:23 takehiro + + * libmp3lame/: quantize.c, set_get.c + (takehiro-2002_05_07-experimental): + + do not do the substep noise shaping when the block type is SHORT, + because it seems short block threshold calculation is very buggy + (both of ns/gpsycho). + + new option: --substep 4,5,6,7 + force substep shaping even on the SHORT block. + +2002-08-24 17:12 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + use FAST_LOG() more. + minimize the ns_hpfsmpl[] array. + better ns_hpfsmpl[] calculation. + +2002-08-24 17:10 takehiro + + * libmp3lame/quantize_pvt.c (takehiro-2002_05_07-experimental): + + use of FAST_LOG() more for faster encoding + +2002-08-24 17:09 takehiro + + * libmp3lame/presets.c (takehiro-2002_05_07-experimental): + + I forgot to change the default quality setting of abr mode, + when I remap the quality <-> actual setting. + +2002-08-24 16:08 takehiro + + * libmp3lame/encoder.c (takehiro-2002_05_07-experimental): + + revert some GTK change to fix the mp3x spectrum display of short block. + +2002-08-20 16:59 takehiro + + * libmp3lame/encoder.c (takehiro-2002_05_07-experimental): + + fix mp3x spectrum display + +2002-08-20 16:51 takehiro + + * libmp3lame/: psymodel.c, util.h + (takehiro-2002_05_07-experimental): + + fix mp3x pe[] display. + +2002-08-20 16:28 takehiro + + * libmp3lame/encoder.c: + + fix mp3x spectrum display + +2002-08-20 16:09 takehiro + + * libmp3lame/lame.c (takehiro-2002_05_07-experimental): + + fix SIGFPE (divided by 0) of filter init. + +2002-08-20 13:03 takehiro + + * libmp3lame/: lame.c, newmdct.c, util.h + (takehiro-2002_05_07-experimental): + + cleanup polyphase filtering. + - highpass/lowpass coefs. are integrated into one array. + - reordered gfc members to get better cache performance. + - remove gfc->is_mpeg1 + +2002-08-20 12:59 takehiro + + * libmp3lame/vbrquantize.c (takehiro-2002_05_07-experimental): + + remove gfc->is_mpeg1 + +2002-08-20 12:58 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + cleanup arround cw_lower_index + +2002-08-20 12:58 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + remove some debug code. + remove gfc->is_mpeg1 + +2002-08-20 12:45 takehiro + + * libmp3lame/: bitstream.c, tables.c, tables.h + (takehiro-2002_05_07-experimental): + + moved scfsi_band[] into tables.c + +2002-08-19 15:09 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + better preflag use by using "all zero" band. + this breaks testcase little bit(make test). + +2002-08-19 04:57 takehiro + + * libmp3lame/: psymodel.c, util.h + (takehiro-2002_05_07-experimental): + + psymodel.c cleanup (2) + - remove some constants (bu_?, npart_?_orig, SNR_s, w1_?, w2_?) from gfc. + - do always short block preecho prevention. this makes some breaks for + testcase(make test). + - do always normalize the s3_ss by SNR_s[] for faster calculation for gpsycho. + - optimize tonality computation for gpsycho. + - FFT/energy computation code of [g|ns]psy are integrated. + - GTK code cleanup + - make a new constants bm_?, band middle position table in gfc. + - cleranup table initialization code. + +2002-08-19 04:47 takehiro + + * libmp3lame/encoder.c (takehiro-2002_05_07-experimental): + + trivial cleanup arround joint stereo/GTK code + +2002-08-17 16:41 takehiro + + * libmp3lame/: psymodel.c, util.h + (takehiro-2002_05_07-experimental): + + more psymodel cleanup. + - GTK compilation fix + - fix mistake of wsamp_l and wsamp_L + - little block_type_set() cleanup + - gfc->energy[] and energy_s[] are removed. + +2002-08-17 16:37 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + trivial + +2002-08-17 07:09 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + divide psymodel.c into manageable pieces (1) + and some optimization/simplification. + +2002-08-14 04:02 takehiro + + * libmp3lame/encoder.c (takehiro-2002_05_07-experimental): + + small fixes. + - variable type change of PE calculation. + - make it allow the mixed block limitation of MP3 + - cleanup the block type code. + +2002-08-14 03:59 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + ci to avoid losing works. + - short block detection cleanup and bug fix, for nspsytune (1st attempt) + - preliminal mixed block detection code. + +2002-08-14 03:57 takehiro + + * libmp3lame/quantize_pvt.c (takehiro-2002_05_07-experimental): + + optimize calc_xmin() and changed ATH normalization for it. + +2002-08-08 09:03 aleidinger + + * Makefile.in: + + regen + +2002-08-08 09:00 aleidinger + + * Makefile.am: + + Add lame.spec to the distribution tarball, as suggested in bug #580586 + +2002-08-08 08:48 aleidinger + + * README.DJGPP, Makefile.DJGPP: + + Fix from Peder Hedlund, see bug #590981. + +2002-08-05 18:04 afaber + + * Dll/BladeMP3EncDLL.c: + + Fixed crashing problem when the INFO TAG was written while it should not + +2002-08-02 20:53 afaber + + * Dll/BladeMP3EncDLL.c: + + Some code clarifications (remarks from Martin Ruckert) + +2002-08-02 20:52 afaber + + * Dll/LameDLLInterface.htm: + + Small textual changes (remarks from Martin Ruckert) + +2002-07-30 20:24 aleidinger + + * frontend/get_audio.c, libmp3lame/VbrTag.c, libmp3lame/lame.c: + + Portability fixes for SunOS 4.x. + +2002-07-30 08:28 takehiro + + * libmp3lame/vbrquantize.c (takehiro-2002_05_07-experimental): + + merge short/long block code (preparing mixed block support) + +2002-07-28 09:56 takehiro + + * Makefile.am, Makefile.in, aclocal.m4, config.h.in, configure, + configure.in, libmp3lame/VbrTag.h + (takehiro-2002_05_07-experimental): + + more sync. arround configure stuff. + +2002-07-28 09:52 takehiro + + * mac/.cvsignore (takehiro-2002_05_07-experimental): + + ignore Makefile et al. + +2002-07-28 09:24 takehiro + + * frontend/get_audio.c, include/lame.h, + libmp3lame/mpglib_interface.c (takehiro-2002_05_07-experimental): + + syncing. + - fix mpeg decoding memory leak. + - lame.h comment fix. + +2002-07-28 09:18 takehiro + + * include/lame.h: + + fix unclosed comment + fix typo + +2002-07-28 09:08 takehiro + + * libmp3lame/: presets.c, set_get.c + (takehiro-2002_05_07-experimental): + + more sync with main tree about preset API. + +2002-07-28 09:07 takehiro + + * include/lame.h (takehiro-2002_05_07-experimental): + + fix warning + +2002-07-28 09:06 takehiro + + * libmp3lame/vbrquantize.c (takehiro-2002_05_07-experimental): + + simplify the code. + disabled substep method 2 and 3 for vbr-new (forced to change method 1) + +2002-07-28 06:59 rbrito + + * debian/changelog: + + Updating debian/changelog's reported version. + +2002-07-27 10:35 afaber + + * Dll/: Example.cpp, Example_vc6.dsp, Example_vc6.dsw: + + Added example VC6 project files, updated Example.cpp file + +2002-07-27 07:41 takehiro + + * API, DEFINES, INSTALL, Makefile.am, Makefile.unix, lame.spec.in, + ltmain.sh (takehiro-2002_05_07-experimental): + + sync with main tree. no effects the quality. + +2002-07-27 07:39 takehiro + + * frontend/: Makefile.in, timestatus.c + (takehiro-2002_05_07-experimental): + + sync with main tree. time status rollback and newly regened Makefile.in + +2002-07-27 07:03 takehiro + + * include/lame.h (takehiro-2002_05_07-experimental): + + sync with main tree. changed comment style, // to /* */ + +2002-07-27 06:59 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + fix cygwin/vc compilation problem. + some speed improvement for --substep. + +2002-07-27 06:54 takehiro + + * libmp3lame/presets.c (takehiro-2002_05_07-experimental): + + sync with main tree. + +2002-07-26 22:27 afaber + + * Dll/: BladeMP3EncDLL.c, BladeMP3EncDLL.def, BladeMP3EncDLL.h: + + changes to support encoding of multiple streams + +2002-07-26 18:56 markt + + * frontend/get_audio.c, include/lame.h, + libmp3lame/mpglib_interface.c: + + memory leak in multiple decodes fixed. + +2002-07-26 08:18 takehiro + + * mac/: LAME Carbon Debug.pch, LAME Carbon Final.pch, LAME Classic + Debug.pch, LAME Classic Final.pch, LAME_Carbon_Debug.pch, + LAME_Carbon_Final.pch, LAME_Classic_Debug.pch, + LAME_Classic_Final.pch, Makefile.am + (takehiro-2002_05_07-experimental): + + sync with main tree. (changed file name) + +2002-07-21 22:11 takehiro + + * libmp3lame/: Makefile.am, quantize.c + (takehiro-2002_05_07-experimental): + + fix and cleanup of "pseudo substep" method 1 and 3. + revert Robert's change of VBR bitresevoir handling code. + +2002-07-21 15:15 aleidinger + + * include/lame.h: + + ANSIfy comments. Requested by Ti Kan for xmcd + +2002-07-21 12:17 takehiro + + * libmp3lame/: quantize.c, quantize_pvt.h, set_get.c, takehiro.c + (takehiro-2002_05_07-experimental): + + implement pseudo substep noise shaping method 1 and 3. + - it reduces about 3% of bitrate without losing any quality (theoretically), + for vbr mode. + - fix "off by one" bug of IPOW[] + - fix comment and substep method range check in set_get.c + + WARNING:there's some bug in the combination of --vbr-new and --substep. + +2002-07-21 12:11 takehiro + + * libmp3lame/: lame.c, util.c (takehiro-2002_05_07-experimental): + + sync with main tree: scaling bug fix. + +2002-07-21 12:10 takehiro + + * mac/: Makefile.am, Makefile.in + (takehiro-2002_05_07-experimental): + + sync with main tree: added Makefile.* + +2002-07-21 12:09 takehiro + + * libmp3lame/util.h (takehiro-2002_05_07-experimental): + + sync with main tree: use FASTLOG as defaulted. + +2002-07-19 17:20 afaber + + * Dll/LameDll_vc6.dsp: + + added ,HAVE_NASM,MMX_choose_table defines to project file, + since beGetBersion did not report that the DLL was compiled with + MMX enabled + +2002-07-15 21:22 markt + + * libmp3lame/: util.c, util.h: + + enabled domd's fast_log code + +2002-07-15 00:52 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + one more fix for pe[] calculation of nspsytune. + +2002-07-14 10:41 takehiro + + * frontend/gtkanal.c (takehiro-2002_05_07-experimental): + + fix mp3x "bit assumption(of frame)" display imcompatibility of main tree. + +2002-07-14 10:36 takehiro + + * libmp3lame/quantize_pvt.c (takehiro-2002_05_07-experimental): + + fix mp3x "bit assumption" display imcompatibility of main tree. + +2002-07-14 10:19 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + fix enbug of pe[] calculation for nspsytune. + prepare for nspsytune cleanup. + +2002-07-13 08:10 aleidinger + + * configure, libmp3lame/Makefile.in: + + regen + +2002-07-13 08:09 aleidinger + + * configure.in: + + Some fixes in the compiler options, removed superfluous BeOS section. + +2002-07-13 08:08 aleidinger + + * libmp3lame/Makefile.am: + + Fixes for BeOS (and perhaps other arches) to allow the build of a + shared lib. + + Submitted by: Andrew Bachmann + +2002-07-05 15:17 afaber + + * Dll/LameDLLInterface.htm: + + fixe a couple of typos' + +2002-07-03 22:28 afaber + + * Dll/BladeMP3EncDLL.c: + + fixed minor problems with the ALT-PRESET CBR/ABR modes + +2002-07-03 21:14 afaber + + * Dll/: BladeMP3EncDLL.c, BladeMP3EncDLL.h: + + avoid crash in beWriteVbrTag when gfp is not allocated, fixed return value of beWriteVbrTag in *.h file + +2002-06-29 12:29 aleidinger + + * libmp3lame/: lame.c, util.c: + + Patch from Simon Blandford : + ---snip--- + The problem: + When in MONO mode, LAME merges the two channels before the left/right + scaling. The left scale acts on the remaining signal and the right scale + is ignored. + + The solution: + The scaling operation is simply moved before the channel merge + operation. Also, all these operations are moved before the re-sample + operation otherwise the signal would have be re-sampled on two channels + even in MONO mode which would be a waste of CPU time. + ---snip--- + +2002-06-23 16:07 takehiro + + * libmp3lame/quantize_pvt.c (takehiro-2002_05_07-experimental): + + fix mp3x display of threshold level (blue/green bar in FFT window). + use FAST_LOG10 in klemm's penalties() function. + trivial fix of max_noise initialization (do not effect anything but for the consistency of comment). + +2002-06-23 16:04 takehiro + + * libmp3lame/Makefile.in (takehiro-2002_05_07-experimental): + + regen + +2002-06-23 14:40 takehiro + + * libmp3lame/quantize_pvt.c (takehiro-2002_05_07-experimental): + + fix max_noise initilization + and trivial coding style change + +2002-06-23 12:56 takehiro + + * libmp3lame/quantize_pvt.c (takehiro-2002_05_07-experimental): + + fix mp3x display of max_noise, tot_noise, over_noise + +2002-06-23 12:56 takehiro + + * libmp3lame/quantize_pvt.c (takehiro-2002_05_07-experimental): + + trivial + +2002-06-23 08:30 takehiro + + * libmp3lame/: lame.c, psymodel.c, quantize_pvt.c, util.c, util.h + (takehiro-2002_05_07-experimental): + + more faster pe[] calculation on nspsy. + + sync with main tree: + - domd's faster LOG and psymodel_ns optimization + +2002-06-23 06:19 takehiro + + * include/lame.h, libmp3lame/set_get.c + (takehiro-2002_05_07-experimental): + + sync with main tree. + - fixed return type of lame_get_interChRation() + +2002-06-23 05:53 takehiro + + * libmp3lame/: Makefile.am, Makefile.in, libmp3lame_vc6.dsp, pcm.c, + pcm.h (takehiro-2002_05_07-experimental): + + sync with main tree. + - remove pcm.[ch] + +2002-06-17 17:19 domd + + * DEFINES: + + added USE_FAST_LOG define + +2002-06-16 20:16 domd + + * libmp3lame/psymodel.c: + + optimizations on mask_add and L3psycho_anal_ns + +2002-06-16 20:14 domd + + * libmp3lame/quantize_pvt.c: + + optimization : use of FAST_LOG10 macro in calc_noise + +2002-06-16 20:13 domd + + * libmp3lame/: lame.c, util.c, util.h: + + added the FAST_LOG10 and FAST_LOG macros + +2002-06-15 17:56 markt + + * Dll/BladeMP3EncDLL.c: + + added missing ")" + +2002-06-12 18:41 markt + + * dshow/Encoder.cpp: + + directshow, like ACM, cannot support INFO tag. + INFO tag disabled in dshow code. + +2002-06-12 18:36 markt + + * ACM/ACMStream.cpp: + + added note about INFO tag not possible when using ACM codec, + since ACM has no mechanism to rewind output stream when + encoding is finished. + +2002-06-12 18:27 markt + + * API, Dll/BladeMP3EncDLL.c, Dll/Example.cpp, + Dll/LameDLLInterface.htm: + + updated documentation (API and DLL) + to clarify that INFO tag must be written + unless explicitly disabled. + +2002-06-11 09:21 aleidinger + + * configure: + + gtk-config fix (oops... sorry) + +2002-06-09 16:01 takehiro + + * include/lame.h, libmp3lame/set_get.c: + + fix return type of lame_get_interChRatio() + +2002-06-04 19:16 bouvigne + + * libmp3lame/psymodel.c: + + merged little part of Dom's speed optimization + +2002-06-04 15:04 aleidinger + + * configure: + + regen + +2002-06-04 15:03 aleidinger + + * configure.in: + + -maccumulate-outgoing-args is x86 only + + Reported by: "Spud McDuck" + +2002-06-02 19:09 aleidinger + + * configure: + + regen + +2002-06-02 19:08 aleidinger + + * config.h.in, configure.in: + + damn autoconf, hopefully this version works as intended + +2002-06-02 17:02 aleidinger + + * configure: + + regen + +2002-06-02 17:00 aleidinger + + * configure.in: + + use "else if ... fi" instead of "elif ..." + +2002-06-02 17:00 aleidinger + + * libmp3lame/Makefile.in: + + regen (removal of pcm.[ch]) + +2002-06-02 14:50 robert + + * libmp3lame/: Makefile.in, libmp3lame_vc6.dsp: + + moved unused code pcm.[ch] into the Attic + interested parties will find it there + +2002-06-02 14:45 robert + + * libmp3lame/: Makefile.am, pcm.c, pcm.h: + + moved unused code pcm.[ch] into the Attic + interested parties will find it there + +2002-06-02 14:20 aleidinger + + * configure: + + regen + perl -pi -e 's:--no-verify::' configure + + Does anyone know how to do this with autoconf directly? + +2002-06-02 14:17 aleidinger + + * aclocal.m4: + + undo last commit, wrong file and wrong commit message + +2002-06-02 14:16 aleidinger + + * acconfig.h: + + not needed anymore + +2002-06-02 14:15 aleidinger + + * Makefile.in: + + regen after removal of aclocal.m4 + +2002-06-02 14:13 aleidinger + + * config.h.in: + + regen + +2002-06-02 14:13 aleidinger + + * configure.in: + + - redo {,u}int{8,16,32,64}_t stuff with new autoconf 2.53 macros + - fix code which sets experimental options + Thanks to: Akos Maroy + - fix GCC_version for 3.1 + Thanks to: Akos Maroy + - further autoconf 2.53 updates + - minor fixes + +2002-06-02 14:10 aleidinger + + * aclocal.m4: + + is not needed anymore + +2002-06-02 12:21 aleidinger + + * aclocal.m4: + + update to autoconf 2.53 + +2002-06-02 12:17 aleidinger + + * libmp3lame/: VbrTag.c, VbrTag.h, pcm.c, pcm.h, util.h: + + add some includes + +2002-05-28 08:28 aleidinger + + * configure: + + regen + +2002-05-28 08:24 aleidinger + + * ACM/Makefile.in, Dll/Makefile.in, debian/Makefile.in, + doc/Makefile.in, dshow/Makefile.in, frontend/Makefile.in, + include/Makefile.in, libmp3lame/Makefile.in, misc/Makefile.in, + mpglib/Makefile.in, ACM/ADbg/Makefile.in, + ACM/tinyxml/Makefile.in, doc/html/Makefile.in, + doc/man/Makefile.in, libmp3lame/i386/Makefile.in: + + regen + +2002-05-28 08:07 aleidinger + + * configure.in: + + - update to autoconf 2.53 + - add ultrasparc detection and compiler switches in case of gcc 3.1 + +2002-05-28 08:04 aleidinger + + * Makefile.in: + + regen + +2002-05-28 08:04 aleidinger + + * Makefile.am: + + add mac subdir + +2002-05-28 08:03 aleidinger + + * mac/Makefile.in: + + generated Makefile.in + +2002-05-28 07:52 aleidinger + + * mac/Makefile.am: + + add automake clue + +2002-05-28 07:48 aleidinger + + * mac/: LAME Carbon Debug.pch, LAME Carbon Final.pch, LAME Classic + Debug.pch, LAME Classic Final.pch, LAME_Carbon_Debug.pch, + LAME_Carbon_Final.pch, LAME_Classic_Debug.pch, + LAME_Classic_Final.pch: + + rename files because of automake (space to underscore conversation) + +2002-05-26 15:52 takehiro + + * libmp3lame/: lame.c, quantize.c, takehiro.c, util.h + (takehiro-2002_05_07-experimental): + + sync with main tree, except arround vbrquantize.c. + - it calls best_huffman_divide() twice. + - *_block_sf() are out of sync. + +2002-05-25 23:30 markt + + * libmp3lame/lame.c: + + fixed a mono encoding bug found by Justin Schoeman + + For single channel input, the 2nd channel was still required + to exit and have as much data as the 1st channel becaus of + memcpy's (even though this data was never used) + +2002-05-24 17:28 markt + + * Dll/BladeMP3EncDLL.c, libmp3lame/lame.c: + + removed all references to "sample_t" from the DLL. + + someone put in a call to lame_encode_buffer_sample_t + (not a public interface to libmp3lame) + when they should have used lame_encode_buffer_float(), + since they were assuming 'sample_t' was a float. + +2002-05-20 22:21 robert + + * libmp3lame/: lame.c, quantize.c, util.h: + + VBR bitreservoir minimum filling depending on back pointer from largest frame allowed + +2002-05-20 18:22 robert + + * Makefile.unix, libmp3lame/lame.c, libmp3lame/quantize.c, + libmp3lame/vbrquantize.c: + + Makefile.unix: + -malign-double enabled, helps memcpy + + lame.c: + new experimental -X{5,9} settings for --vbr-new + + quantize.c: + build up bit reservoir for VBR, allows to limit max frame size with -Bxxx + without a too large quality impact + + vbrquantize.c: + fixing sfb21 issues: -Y did not show the wanted effect + xxx_block_xr34: replaced copy loop by memcpy, not faster but makes things + more obvious + some very minor speed ups + +2002-05-19 22:11 markt + + * frontend/timestatus.c: + + initialize ellapsed time counter to 0. + +2002-05-19 22:03 robert + + * libmp3lame/: quantize.c, vbrquantize.c: + + avoid calling best_huffman_divide twice for vbr-new + +2002-05-19 16:43 takehiro + + * frontend/parse.c, include/lame.h, libmp3lame/encoder.c, + libmp3lame/lame_global_flags.h, libmp3lame/presets.c, + libmp3lame/set_get.c (takehiro-2002_05_07-experimental): + + experimental mixed block support. + "--mixedblock" option to use it. + + currently, it uses mixed blocks on all short/start/end blocks. + + this is very bad idea. we need a proper psymodel. + till we make it, this option is used only for the testing purpose. + +2002-05-19 16:38 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + trivial optimization arround nspsytune + +2002-05-19 15:13 takehiro + + * libmp3lame/psymodel.c (takehiro-2002_05_07-experimental): + + merged little part of Dom's speed optimization. + +2002-05-18 17:39 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + preparing for mixed block of bitpressure_strategy() + +2002-05-18 17:33 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + remove magic numbers and prepare for mixed block. + +2002-05-18 16:54 takehiro + + * libmp3lame/: machine.h, newmdct.c, vbrquantize.c + (takehiro-2002_05_07-experimental): + + fully cosmetic... changed INLINE -> inline + +2002-05-18 16:53 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + prepare for the substep noise shaping method 1 and 3. + +2002-05-18 16:15 takehiro + + * libmp3lame/: quantize.c, takehiro.c + (takehiro-2002_05_07-experimental): + + trivial optimizations + +2002-05-18 16:08 takehiro + + * libmp3lame/: machine.h, quantize_pvt.c, quantize_pvt.h + (takehiro-2002_05_07-experimental): + + clean up table initialization and bit size optimization. + - remove magic number "128". (and changed 116) + - we don't need to prepare the both of adj43[] and adj43asm[]. + prepare only one of them, if we use asm code or not. + +2002-05-18 16:00 takehiro + + * libmp3lame/: bitstream.c, takehiro.c + (takehiro-2002_05_07-experimental): + + use scfsi more. + if all quantized value is 0, we can use scalefactor with not only 0 but + also any number and in such a situation, we can use the scfsi. + +2002-05-18 15:09 takehiro + + * libmp3lame/quantize_pvt.c (takehiro-2002_05_07-experimental): + + don't compile some code if analyzer is not needed. + +2002-05-18 15:07 takehiro + + * libmp3lame/: machine.h, quantize_pvt.c, quantize_pvt.h, + vbrquantize.c (takehiro-2002_05_07-experimental): + + optimization arround vbr_new with the new data structure. + - merged short_block_xr34() and long_block_xr34() into block_xr34() and clean up + - changed IIPOW20[] and remove some condition code. + +2002-05-18 13:59 takehiro + + * libmp3lame/: quantize.c, set_get.c, util.h + (takehiro-2002_05_07-experimental): + + arroud substep noise shaping. + - prepare for "method 3". + - start with "pseudo half shaped" state, if we use the method 2 or 3. + +2002-05-18 13:50 takehiro + + * libmp3lame/: quantize.c, quantize_pvt.c, set_get.c + (takehiro-2002_05_07-experimental): + + simple calc_noise() optimization (remove one log()) + fix quatn_compare() when alt-preset. + +2002-05-18 12:11 takehiro + + * libmp3lame/quantize_pvt.c (takehiro-2002_05_07-experimental): + + oops, fix calc_noise() bugfix :) + +2002-05-18 12:10 takehiro + + * libmp3lame/: quantize.c, quantize_pvt.c, quantize_pvt.h + (takehiro-2002_05_07-experimental): + + trivial optimization by loop unrolling + +2002-05-18 11:38 takehiro + + * libmp3lame/: machine.h, quantize.c, quantize_pvt.c, + quantize_pvt.h (takehiro-2002_05_07-experimental): + + quick fix for "calc_noise_bug" reported by Mark. + +2002-05-18 11:09 takehiro + + * libmp3lame/: lame.c, presets.c, set_get.c + (takehiro-2002_05_07-experimental): + + changed alt-preset-* and comments to follow the change of quality setting. + +2002-05-18 11:07 takehiro + + * libmp3lame/: machine.h, quantize.c + (takehiro-2002_05_07-experimental): + + fix floating exception when global_gain > 255u. + it frequently happens when best_huffman == 2 + +2002-05-18 10:25 takehiro + + * libmp3lame/: lame-analysis.h, lame.c, quantize.c, util.h + (takehiro-2002_05_07-experimental): + + sync with main tree. + - uped READ_AHEAD from 10 to 40 for the frame analyzer (By Mark) + - removed warning when using -Y (By Robert) + - removed unused bitpressure strategie 2 (VBR) (By Robert) + +2002-05-14 21:32 robert + + * libmp3lame/: lame.c, quantize.c, util.h, vbrquantize.c, + vbrquantize.h: + + removed warning when using -Y + removed unused bitpressure strategie 2 (VBR) + +2002-05-14 21:02 robert + + * libmp3lame/.indent.pro: + + changing max line length from 80 to 100 chars + +2002-05-14 16:23 markt + + * frontend/timestatus.c: + + added comment about clock rollover check + +2002-05-14 16:19 markt + + * frontend/: lametime.c, timestatus.c: + + put in rollover check in frontend cpu/wall clock timing routines. + + didn't we used to have this? + + user reported (on a 35min encode) that the output of clock() + (of type clock_t) was rolling over and becoming negative. + On his system, clock_t is a signed 32 bit int. + +2002-05-12 18:47 markt + + * INSTALL: + + removed info about vorbis encoding from INSTALL + +2002-05-12 18:01 markt + + * ltmain.sh: + + applied patch to ltmain.sh + from sourceforge.net bug report. it passes LDFLAGS on to the + linker? + + *** ltmain.sh.org Sun Oct 22 14:06:32 2000 + --- ltmain.sh Sun Apr 28 11:56:54 2002 + *************** + *** 818,824 **** + convenience= + old_convenience= + deplibs= + ! linkopts= + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + --- 818,824 ---- + convenience= + old_convenience= + deplibs= + ! linkopts="$LDFLAGS" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + +2002-05-12 17:20 markt + + * include/lame.h, libmp3lame/lame-analysis.h: + + added documentation to lame.h for lame_decode* functions + + uped READ_AHEAD from 10 to 40 for the frame analyzer + +2002-05-12 13:52 takehiro + + * libmp3lame/: bitstream.c, l3side.h, quantize.c, quantize_pvt.c, + quantize_pvt.h, takehiro.c, util.h, vbrquantize.c, vbrquantize.h + (takehiro-2002_05_07-experimental): + + big data structure update (2) + - this is very alpha. check is not done yet, but I should have sleep tonight :p + - "make test" runs fine. but mp3x, vbr-new needs more test. abr mode aborts floating exception. + - almost all the structured data, like l3_xmin, scalefac, distort, ... are now simple FLOAT8/integer array. + - calc_noise() and so on is very simple code and very fast, because we can handle the long/short block by same code, + - new member "window" and "width" are added to gr_info. + +2002-05-12 09:30 takehiro + + * libmp3lame/quantize.c: + + fix inc_scalefac_scale() ignoring preflag. + +2002-05-12 08:29 takehiro + + * Makefile.in (takehiro-2002_05_07-experimental): + + regen(forgot to check in) + +2002-05-12 08:02 takehiro + + * libmp3lame/vbrquantize.c (takehiro-2002_05_07-experimental): + + trivial cleanup + +2002-05-12 08:02 takehiro + + * libmp3lame/reservoir.c (takehiro-2002_05_07-experimental): + + because #define NORES is not working as it was, I remove it. + +2002-05-12 07:48 takehiro + + * libmp3lame/: quantize.c, quantize_pvt.c, quantize_pvt.h + (takehiro-2002_05_07-experimental): + + fix mp3x scalefactor display when scfsi used and cleanup on set_pinfo(). + fix warning arround calc_klemm_noise(). + +2002-05-12 07:30 takehiro + + * libmp3lame/: quantize.c, quantize_pvt.c, quantize_pvt.h + (takehiro-2002_05_07-experimental): + + noise calculation cleanup. + - delayed calculation of klemm_noise and it is shared to store in max_noise. + - max_noise, tot_noise and over_noise are now "B" order, not "dB". + +2002-05-11 18:49 markt + + * lame.spec.in: + + new lame.spec.in file from Yosi. + +2002-05-11 18:29 markt + + * libmp3lame/: quantize.c, quantize_pvt.c: + + applied Takehiro's bug fix for single channel bit reservoir usage + for pre-echo control. + +2002-05-11 18:28 takehiro + + * Makefile.am, libmp3lame/bitstream.c, libmp3lame/lame.c, + libmp3lame/quantize.c, libmp3lame/reservoir.c, + libmp3lame/takehiro.c, libmp3lame/vbrquantize.c + (takehiro-2002_05_07-experimental): + + not testing much, but I think now best_huffman_divide==2 works. + - default quality setting is changed to 3, and "make test" is done with that. + - quality setting 0,1, and 2 with CBR/ABR/VBR-old mode uses best_huffman_divide==2. + - best_scalefac_store() is not called in inner loop. + - "lame -q 2 foo.wav foo.mp3" runs about half or more slower speed than that of "lame -q 3 ..." + +2002-05-11 17:26 takehiro + + * libmp3lame/: quantize_pvt.c, quantize_pvt.h, takehiro.c + (takehiro-2002_05_07-experimental): + + combination of small patches mainly to get more tight coupling/inlining + optimization. + - in quantize_pvt.c, some functions are now static. + - some "char" type table is now "int" + - quantize_xrpow*() are moved from quantize_pvt.c to takehiro.c, and they are static function. + - slen1_tab[] and slen2_tab[] are moved to takehiro.c + +2002-05-11 16:42 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + oops, checked in the older one. fix CBR bit allocation. + +2002-05-11 16:28 takehiro + + * libmp3lame/: quantize.c, quantize_pvt.c, quantize_pvt.h, + reservoir.c, reservoir.h (takehiro-2002_05_07-experimental): + + fix --vbr-old for newer resovoir handling code. + now it produces bit-by-bit identical from the main branch with my "limited test". + +2002-05-11 14:39 takehiro + + * libmp3lame/vbrquantize.c (takehiro-2002_05_07-experimental): + + sync with main tree + - Robert's modification, 'more time consuming strategy to handle the case when more bits used than available' + +2002-05-11 14:12 takehiro + + * libmp3lame/: quantize.c, vbrquantize.c + (takehiro-2002_05_07-experimental): + + fix vbr-new arround bin_search_stepsize(). + it ignores part2_length to calculate cod_info->part2_3_length. + + consider part2_length inside of bin_search_stepsize(), not caller side. + +2002-05-11 13:49 takehiro + + * libmp3lame/vbrquantize.c (takehiro-2002_05_07-experimental): + + fix for vbr-new to work with new bin_search_stepsize() + +2002-05-09 23:25 robert + + * libmp3lame/vbrquantize.c: + + vbr-new: + more time consuming strategy to handle the case when more bits used than available + +2002-05-08 22:28 takehiro + + * libmp3lame/quantize_pvt.h (takehiro-2002_05_07-experimental): + + oops I missed the merging. + +2002-05-08 22:27 takehiro + + * libmp3lame/: lame.c, quantize.c, quantize_pvt.h, util.h + (takehiro-2002_05_07-experimental): + + bin_stepsearch() hack. + separete stepsize for each channel that we will use next frame + little bit faster. + +2002-05-08 21:30 takehiro + + * libmp3lame/takehiro.c (takehiro-2002_05_07-experimental): + + fix warning + +2002-05-08 21:07 takehiro + + * libmp3lame/: quantize.c, quantize_pvt.c, vbrquantize.c + (takehiro-2002_05_07-experimental): + + sync with robert's latest patch on mainline. + - allow best huffman divide to be used in vbr-new + - moved ms_convert() + +2002-05-08 21:00 takehiro + + * libmp3lame/quantize.c (takehiro-2002_05_07-experimental): + + monoraul bitallocation patch. + + thanx Robert to revert. and sorry for the trouble. + I made my own branch and check the code on this. + if I get the "bit-by-bit identical" output, I will merge the branch. + I will follow the main line changes as possible. + + till then, bye for now. see you later, at the merging time. + +2002-05-07 23:08 robert + + * libmp3lame/: quantize_pvt.h, vbrquantize.c: + + allow best huffman divide to be used in vbr-new + +2002-05-07 21:24 robert + + * libmp3lame/: quantize.c, quantize_pvt.c, quantize_pvt.h: + + moved the tiny function ms_convert from quantize_pvt.c to quantize.c--the + only client for it--giving a little speed increase + +2002-05-07 21:11 robert + + * libmp3lame/: quantize.c, quantize_pvt.h, vbrquantize.c: + + better decoupling of vbrquantize.c and quantice.c + +2002-05-07 20:21 robert + + * libmp3lame/: bitstream.h, quantize_pvt.h, reservoir.h, util.h: + + sorry Takehiro, we are back to the last known working version from Sunday + 13:35 UTC now + +2002-05-07 20:15 robert + + * libmp3lame/: bitstream.c, encoder.c, quantize.c, quantize_pvt.c, + reservoir.c, takehiro.c, util.c, vbrquantize.c: + + sorry Takehiro, we are back to the last known working version from Sunday + 13:35 UTC now + +2002-05-06 16:03 takehiro + + * libmp3lame/quantize.c: + + fix for new reservoir handling code with my ABR patch. + we don't need the totbits, because the reservoir size is reduced in + ResvAdjust() in gr/ch loop and reservoir handler uses it. + +2002-05-06 15:49 takehiro + + * ACM/: .cvsignore, ADbg/.cvsignore, tinyxml/.cvsignore: + + added cvsignore to ignore Makefile, etc. + +2002-05-06 15:30 takehiro + + * include/lame.h, libmp3lame/bitstream.c, libmp3lame/encoder.c, + libmp3lame/quantize.c, libmp3lame/reservoir.c: + + cleanup. remove a compiling problem and some warnings. + +2002-05-05 18:34 takehiro + + * libmp3lame/quantize.c: + + one more outer_loop() fix for VBR. + +2002-05-05 18:18 takehiro + + * libmp3lame/quantize.c: + + outer_loop() fix for vbr_rh and vbr_mtrh + +2002-05-05 17:37 takehiro + + * libmp3lame/quantize_pvt.c: + + update comment + +2002-05-05 17:17 takehiro + + * libmp3lame/: bitstream.c, bitstream.h, encoder.c, quantize.c, + reservoir.c, util.c, util.h: + + cleanup arround getframebits(). + +2002-05-05 16:50 takehiro + + * libmp3lame/: quantize.c, reservoir.c: + + fix NORES_TEST. and works not only for CBR (don't tell me that's useful :p) + +2002-05-05 16:40 takehiro + + * libmp3lame/: quantize.c, reservoir.c, reservoir.h: + + oops, I mis-checked in the old files. this is real one. + +2002-05-05 16:29 takehiro + + * libmp3lame/: quantize_pvt.c, reservoir.c, reservoir.h: + + clean up arround reservoir. + +2002-05-05 15:47 takehiro + + * libmp3lame/: quantize.c, reservoir.c, reservoir.h: + + trivial cleanup of arround resvoir. + +2002-05-05 15:34 takehiro + + * libmp3lame/quantize.c: + + cleanup arround inc_scalefac_scale() with new cod_info strcture. + +2002-05-05 14:35 takehiro + + * libmp3lame/: quantize.c, quantize_pvt.c, quantize_pvt.h: + + cleanup arround calc_noise() with new cod_info strcture. + +2002-05-05 13:59 takehiro + + * libmp3lame/: quantize.c, quantize_pvt.h, takehiro.c, + vbrquantize.c: + + more cleanup of new cod_info structure, arround count_bits() + +2002-05-05 13:48 takehiro + + * libmp3lame/: quantize.c, quantize_pvt.h: + + inner_loop() is now static function. + +2002-05-05 13:43 takehiro + + * libmp3lame/: quantize.c, vbrquantize.c: + + changed outer_loop() algorithm. it needs lesser copy and runs faster. + - try with new scalefactor combination on work area, and if we get the better result, copy it to the returning area. + - make bin_search_StepSize() return the global_gain which assures targ_bits > found_bits. + +2002-05-05 13:33 robert + + * libmp3lame/: quantize.c, vbrquantize.c, vbrquantize.h: + + some clean-up in parameter passings due to recent change in cod_info structure + +2002-05-05 13:01 robert + + * libmp3lame/: encoder.c, quantize.c, quantize.h, vbrquantize.c, + vbrquantize.h: + + removed again some unused code I thought that was removed some long time ago + +2002-05-05 11:58 takehiro + + * libmp3lame/: bitstream.c, encoder.c, l3side.h, quantize.c: + + bit cleanup. removed window_switching_flag in l3side. + +2002-05-05 11:53 takehiro + + * libmp3lame/: quantize.c, quantize.h, vbrquantize.c: + + To fix it does not call the "freorder" and to support for mixed block, + the vbrquantize.c uses init_outer_loop()/init_xrpow() in quantize.c to + initializatoin. this may fix the MPEG2 problem (but not tested). + +2002-05-04 22:49 markt + + * configure, testcase.mp3: + + updated testcase.mp3 + +2002-05-04 15:48 takehiro + + * libmp3lame/: encoder.c, quantize.c, util.c, util.h: + + clean up and speed up (optimize for new data structure). + - devided init_outer_loop() into init_outer_loop() and init_xrpow(). This makes it easy to use GOGO-no-coda's xrpow calculation routine. + # thanx Robert, your fix makes me aware my mistake in VBR mode. + + - restoring duplicated data of VBR loop are removed. + + more mixed_block prepare. freorder() in util.c and its caller in encoder.c are moved into init_outer_loop() in quantize_pvt.c + +2002-05-04 15:36 takehiro + + * libmp3lame/quantize.c: + + trivial optimization + +2002-05-04 14:54 takehiro + + * libmp3lame/: bitstream.c, quantize.c, quantize_pvt.c, + vbrquantize.c: + + the signess process of l3_enc[] are moved from quantize*.c to bistream.c. bit faster, much simpler. + +2002-05-04 13:58 takehiro + + * libmp3lame/quantize_pvt.c: + + removed unused variables. + +2002-05-04 13:55 takehiro + + * libmp3lame/: quantize.c, quantize_pvt.c: + + removed log calculation of klemm_noise in main loop + +2002-05-04 09:30 afaber + + * ChangeLog, Dll/BladeMP3EncDLL.c, Dll/BladeMP3EncDLL.h: + + Added quality setting to lame_enc.dll interface + +2002-04-30 22:20 robert + + * libmp3lame/version.h: + + 3.93 alpha 1 -> 3.93 alpha 2 + +2002-04-30 22:00 robert + + * libmp3lame/: quantize.c, quantize_pvt.c: + + fixing latest floating point exceptions I got for some days + within the calc noise routine + +2002-04-28 08:15 takehiro + + * libmp3lame/quantize_pvt.c: + + Mark, because max_noise is initialized with 1E-20 and refreshes Max(max_noise, sfb_noise), so it will never lesser than 1e-20. + +2002-04-27 21:15 takehiro + + * libmp3lame/takehiro.c: + + bit faster best_huffman_divide(). + - use the pointer to the structure, not structure itself. + +2002-04-27 20:58 takehiro + + * configure, libmp3lame/bitstream.c, libmp3lame/bitstream.h, + libmp3lame/encoder.c, libmp3lame/l3side.h, libmp3lame/newmdct.c, + libmp3lame/newmdct.h, libmp3lame/quantize.c, + libmp3lame/quantize.h, libmp3lame/quantize_pvt.c, + libmp3lame/quantize_pvt.h, libmp3lame/takehiro.c, + libmp3lame/vbrquantize.c, libmp3lame/vbrquantize.h: + + large data structure update (1) + - mdct values (xr), encoded values (l3_enc), and scalefactors (scalefac) are in the gr_info structure. + - it runs faster. + - reduce stack size but require large III_side_info_t and lame_global_flags. + +2002-04-27 20:41 takehiro + + * libmp3lame/machine.h: + + fix --enable-all-float. when it enabled, FLOAT8_MAX should be FLT_MAX about 1e37, not 1e99. + +2002-04-27 18:24 takehiro + + * libmp3lame/bitstream.c: + + trivial + +2002-04-24 11:10 aleidinger + + * Makefile.unix: + + add a mingw comment from Hubert Hanghofer + +2002-04-22 17:51 markt + + * libmp3lame/quantize_pvt.c: + + Takehiro, when you changed this code: + + res->max_noise = 10.*log10(Max(1e-20,max_noise )); + res->klemm_noise = 10.*log10(Max(1e-20,klemm_noise)); + + to: + + res->max_noise = 10.*log10(max_noise); + res->klemm_noise = 10.*log10(klemm_noise); + + I started getting FPE (I always compile with --enable-debug + which aborts on FPE). I went ahead and changed it back- it should + have little effect. + +2002-04-21 20:31 afaber + + * Dll/BladeMP3EncDLL.c: + + Added additional debug flags + +2002-04-21 18:10 takehiro + + * libmp3lame/l3side.h: + + remove unused definition + +2002-04-21 18:05 takehiro + + * libmp3lame/lame.c: + + fix typo + +2002-04-21 17:33 takehiro + + * libmp3lame/lame.c: + + trivial(reduce magic number) + +2002-04-21 17:03 afaber + + * Dll/BladeMP3EncDLL.c: + + Avoid the VBR Tag space was written when VBR method was disabled + (caused empty frame in fornt of MPEG stream for certain CBR settings) + +2002-04-21 16:56 takehiro + + * frontend/parse.c, include/lame.h, libmp3lame/bitstream.c, + libmp3lame/quantize.c, libmp3lame/set_get.c, + libmp3lame/takehiro.c, libmp3lame/util.h: + + new option, --substep, pseudo substep noise shaping now works. + - new set_get function, lame_set_substep(), lame_get_substep() + - final fix of "do substep" region of selected scalefactor. + - noise_shaping_amp == 3 is removed and the method of how to use substep is selecte by the new member "substep" in structure "lame_internal_flags". + +2002-04-21 13:57 takehiro + + * libmp3lame/bitstream.c: + + trivial optimization: gfp/gfc cleanup + +2002-04-20 22:31 robert + + * Makefile.unix: + + [no log message] + +2002-04-20 20:40 takehiro + + * libmp3lame/: bitstream.c, encoder.c, l3side.h, newmdct.c, + quantize.c, quantize_pvt.c, takehiro.c, vbrquantize.c: + + simplify the structure. + l3_side->gr[gr].ch[ch].tt is now known as l3_side->tt[gr][ch]. + +2002-04-20 20:31 takehiro + + * libmp3lame/l3side.h: + + fix misleading indent + +2002-04-20 20:28 takehiro + + * libmp3lame/takehiro.c: + + prepare for mixed block support: count_bits() and best_scalefac_store(). + fix bug of noise_shaping_amp==3 on a long block. + +2002-04-20 20:17 takehiro + + * libmp3lame/quantize.c: + + more mixed_block preparation: inc_scalefac_scale(), amp_scalefac_bands() + +2002-04-20 20:16 takehiro + + * libmp3lame/quantize_pvt.c: + + for better mixed_blcok support, make calc_xmin() use cod_info->sfb_lmax, etc. + +2002-04-20 19:54 takehiro + + * libmp3lame/quantize.c: + + fix mixed mode (long block max sfb) + +2002-04-20 19:50 takehiro + + * libmp3lame/: l3side.h, quantize.c, quantize_pvt.c: + + more generalized mixed_block support and considering in MPEG2/2.5 + - added new members to cod_info. psy_lmax and psy_smax. + +2002-04-20 19:39 takehiro + + * libmp3lame/quantize.c: + + we don't need two elements of l3_xmin. + +2002-04-20 19:34 takehiro + + * libmp3lame/quantize_pvt.c: + + - calc_xmin() supports mixed_block noise calculation. + - mixed_block parameter(long block end point and short block start point) fix for calc_noise() + +2002-04-20 18:51 takehiro + + * libmp3lame/quantize_pvt.c: + + calc_noise() supports mixed_block noise calculation. + +2002-04-20 18:40 takehiro + + * libmp3lame/quantize_pvt.c: + + remove out-of-date comments + +2002-04-20 18:37 takehiro + + * libmp3lame/: machine.h, quantize_pvt.c: + + first step of clean up calc_noise() for preparing mixed block support. + - removed unused variables + - make the two loops (long and short) same structure. + +2002-04-20 11:49 robux4 + + * ACM/lameACM.dsp: + + Added the preset to compile the project (not used... yet) + +2002-04-19 14:51 bouvigne + + * Dll/BladeMP3EncDLL.c: + + Now the dll should properly applying mono and resampling settings even if presets are used + +2002-04-19 11:23 bouvigne + + * Dll/: BladeMP3EncDLL.c, BladeMP3EncDLL.h: + + alt-presets now used from inside libmp3lame + +2002-04-17 22:13 robert + + * Makefile.unix: + + missing presets.c added + +2002-04-17 08:11 aleidinger + + * configure: + + regen + +2002-04-17 08:08 aleidinger + + * configure.in: + + bump version + +2002-04-16 19:47 markt + + * testcase.mp3: + + updated testcases (just because CVS version bumped up to 3.93alpha) + +2002-04-15 18:36 markt + + * libmp3lame/version.h: + + updated version to 3.93 alpha 1 + +2002-04-15 16:42 bouvigne + + * frontend/parse.c, libmp3lame/presets.c: + + abr presets now into libmp3lame + +2002-04-15 11:51 bouvigne + + * frontend/parse.c: + + --cbr + +2002-04-15 11:42 bouvigne + + * libmp3lame/lame.c: + + 3dnow identification + +2002-04-15 08:16 aleidinger + + * Makefile.in, configure: + + regen + +2002-04-15 06:58 markt + + * Makefile.in, configure, debian/Makefile.in: + + got automake 1.5 and ran it: + +2002-04-15 06:57 markt + + * debian/Makefile.am: + + updated debian/Makefile.am but my version of automake + is too old: + + debian/Makefile.am:5: require version 1.5, but have 1.4-p5 + +2002-04-15 06:47 markt + + * testcase.mp3, doc/html/history.html, libmp3lame/version.h: + + bumped up version number to 3.92 for release + +2002-04-15 06:46 markt + + * ChangeLog: + + ran cvs2cl.pl + +2002-04-14 12:21 afaber + + * Dll/: BladeMP3EncDLL.c, BladeMP3EncDLL.def, BladeMP3EncDLL.h: + + Added strict-iso option to the interface, added output samplerate parameter to the debug log file + +2002-04-12 19:44 markt + + * libmp3lame/bitstream.c: + + added message regarding "internal buffer inconsistency error" to printout: + + ERRORF(gfc,"This is a fatal error. It has several possible causes:"); + ERRORF(gfc,"90% LAME compiled with buggy version of gcc using advanced optimizations"); + ERRORF(gfc," 9% Your system is overclocked"); + ERRORF(gfc," 1% bug in LAME encoding library"); + +2002-04-10 12:55 bouvigne + + * frontend/parse.c, include/lame.h, libmp3lame/lame.c, + libmp3lame/lame_global_flags.h, libmp3lame/set_get.c: + + --noasm option + +2002-04-10 06:37 bouvigne + + * Makefile.MSVC: + + presets.c + +2002-04-09 15:43 bouvigne + + * Dll/BladeMP3EncDLL.c: + + dm presets in the dll are now used from initialized from inside libmp3lame + +2002-04-09 15:28 aleidinger + + * libmp3lame/Makefile.in: + + regen + +2002-04-09 14:46 bouvigne + + * frontend/parse.c, include/lame.h, libmp3lame/Makefile.am, + libmp3lame/libmp3lame_vc6.dsp, libmp3lame/presets.c, + libmp3lame/set_get.c: + + vbr presets are now part of libmp3lame + +2002-04-09 11:56 bouvigne + + * frontend/parse.c: + + --cbr switch + +2002-04-08 20:30 robux4 + + * ACM/acm.rc: + + minor change on the DLL versioning + +2002-04-08 18:43 robux4 + + * ACM/: ACM.cpp, AEncodeProperties.cpp: + + Added some new defines that might not be in all platform DDKs + (just in case) + +2002-04-08 18:41 aleidinger + + * Makefile.in, ACM/Makefile.in: + + regen + +2002-04-08 18:41 aleidinger + + * Makefile.am, ACM/Makefile.am: + + add new vc6 file + +2002-04-08 12:43 bouvigne + + * lame_vc6.dsw, ACM/lameACM_vc6.dsp: + + added ACM codec to vc6 workspace + +2002-04-08 09:56 bouvigne + + * lame_projects_vc6.dsp, lame_vc6.dsw: + + dummy project to generate all lame projects (select lame_projects in the workspace) + +2002-04-07 14:09 robux4 + + * ACM/TODO: + + Removed the things already done + +2002-04-07 14:07 robux4 + + * ACM/: ACM.cpp, AEncodeProperties.cpp, lameACM.dsp: + + Clicking on the LAME URL will open the default browser + +2002-04-07 13:31 robux4 + + * ACM/: AEncodeProperties.cpp, AEncodeProperties.h: + + Added tool-tips to the configuration dialog + +2002-04-07 12:28 robux4 + + * ACM/: ACM.cpp, acm.rc: + + Improved LAME version display + +2002-04-07 10:17 robux4 + + * ACM/: AEncodeProperties.cpp, AEncodeProperties.h, acm.rc, + lame_acm.xml, resource.h: + + ABR support now complete + +2002-04-06 14:12 aleidinger + + * lame.bat: + + bugfix, sorry, lost the mail for it + +2002-04-06 14:10 aleidinger + + * Makefile.in, ACM/Makefile.in, ACM/tinyxml/Makefile.in, + Dll/Makefile.in, frontend/Makefile.in, libmp3lame/Makefile.in, + mpglib/Makefile.in, configure: + + regen + +2002-04-06 14:09 aleidinger + + * configure.in: + + add tinyxml directory + +2002-04-06 14:08 aleidinger + + * Makefile.am, ACM/Makefile.am, ACM/tinyxml/Makefile.am, + Dll/Makefile.am, frontend/Makefile.am, libmp3lame/Makefile.am, + mpglib/Makefile.am: + + add new files + +2002-04-06 14:01 robux4 + + * ACM/: ACM.cpp, ACM.h, ACMStream.cpp, ACMStream.h: + + Encoding in ABR is starting to work + the different format strings are sorted correctly + +2002-04-06 11:34 robux4 + + * ACM/: ACM.cpp, ACM.h, AEncodeProperties.cpp, AEncodeProperties.h, + acm.rc, resource.h: + + First part of the ABR support + (missing use ABR settings on encoding when applied, configuration of ABR params) + +2002-04-06 11:32 robux4 + + * ACM/tinyxml/: readme.txt, tinyxml.cpp, tinyxml.dsp, tinyxml.h, + tinyxmlparser.cpp, xmltest.cpp: + + Updated with version 2.0 beta + +2002-04-04 13:35 bouvigne + + * lame_vc6.dsw, Dll/LameDll_vc6.dsp, frontend/lame_vc6.dsp, + libmp3lame/libmp3lame_vc6.dsp, mpglib/mpglib_vc6.dsp: + + I was annoyed to not be able to open the VC projects in vc6, so I added vc6 ones + +2002-03-22 18:29 afaber + + * Dll/: BladeMP3EncDLL.c, BladeMP3EncDLL.h: + + Added lame presets to DLL interface + +2002-03-16 00:26 robert + + * Makefile.MSVC: + + no fast float to int conversion (Intel compiler) + +2002-03-16 00:21 robert + + * Makefile.MSVC, frontend/parse.c: + + fix for Win2k path seperator issue + found by Peter Hartley + +2002-03-15 23:16 robert + + * libmp3lame/quantize.c: + + bugfix, confusion about sideinfo length + found by "Kei Ishida" + +2002-03-06 00:02 robert + + * lame.dsw: + + VC Workspace for all(?) targets + +2002-03-03 18:57 aleidinger + + * libmp3lame/psymodel.c: + + remove /* withhin comment + +2002-03-03 18:38 markt + + * TODO: + + msvc6 notes + +2002-02-22 11:53 shibatch + + * libmp3lame/quantize_pvt.c: + + mp3x now displays quantization noise correctly when using nspsytune. + +2002-02-21 00:54 rbrito + + * debian/: changelog, control, copyright, lame-dev.docs, + lame-dev.files, lame-extras.files, lame.docs, liblame0-dev.docs, + liblame0-dev.files, liblame0.files, rules: + + Reorganization of the lame/debian directory for generating packages closer + to what the Debian Policy specifies. Still not there (the liblame0 package + still has a dreaded -rpath and thus, is not lintian clean). + +2002-02-17 15:24 takehiro + + * doc/html/: history.html, switchs.html: + + fix option description, and changed & to & + +2002-02-17 14:22 takehiro + + * libmp3lame/psymodel.c: + + now inter-channel masking works even when without --nspsytune or with -m s + +2002-02-17 13:59 takehiro + + * libmp3lame/psymodel.c: + + fix for --enable-all-float. + +2002-02-17 13:55 takehiro + + * frontend/parse.c, include/lame.h, libmp3lame/lame.c, + libmp3lame/lame_global_flags.h, libmp3lame/psymodel.c, + libmp3lame/set_get.c, libmp3lame/util.h: + + added inter channel masking effect. + gfp->interChRatio is the ratio of inter-channel masking effect, which could + be indicated by --interch X option. + The default value is 0.0, which means there's no inter-channel masking effect. + + I think ratio = 0.01 is OK for lower bitrates (like under 128kbps), + for like old days songs by the Beatles. + +2002-02-17 13:30 bouvigne + + * frontend/parse.c: + + presets down to 8kbps + +2002-02-17 08:12 takehiro + + * libmp3lame/util.h: + + prepare for the interchannel masking and substep noise shaping. + +2002-02-16 17:19 robux4 + + * ACM/tinyxml/: Makefile.tinyxml, changes.txt, dox, makedistlinux, + makedistwin.bat, readme.txt, tinyxml.cpp, tinyxml.dsp, tinyxml.h, + tinyxmlerror.cpp, tinyxmlparser.cpp, xmltest.cpp: + + Update with newer version of TinyXML + +2002-02-15 11:42 shibatch + + * frontend/parse.c, libmp3lame/psymodel.c: + + Now, nspsytune2 should work, maybe... + +2002-02-14 15:38 shibatch + + * libmp3lame/: lame.c, psymodel.c, util.h: + + Preparation work for nspsytune2. + +2002-02-13 16:30 aleidinger + + * frontend/rtp.h: + + compile fix for gcc 3.x from Len Walter + +2002-02-09 18:51 markt + + * frontend/gtkanal.c: + + added preflag count to statics window in mp3x + +2002-02-07 11:58 shibatch + + * libmp3lame/lame.c, libmp3lame/lame_global_flags.h, + frontend/parse.c, include/lame.h, libmp3lame/set_get.c: + + preparation work for nspsytune2 + +2002-02-04 17:10 markt + + * TODO, libmp3lame/util.c: + + temporary fix for resampling code. downsampling from 44101 to 44100 causes + a seg fault. Workaround in place for now: resampling disabled + if input/output samplerates agree to 4 digits. + +2002-02-01 18:58 markt + + * INSTALL, TODO: + + minor edits + +2002-02-01 17:41 markt + + * TODO: + + added notes about building a working, all encompasing MSVC6 + workspace to TODO list + +2002-02-01 17:37 markt + + * INSTALL: + + added nots about the ACM codec and directshow filter + to INSTALL + +2002-02-01 17:08 robux4 + + * ACM/ACM.cpp: + + Correct a problem when more than 2 channels are involved + +2002-01-31 21:17 robux4 + + * libmp3lame/lame.c: + + Less memory copying on interleaved buffer + +2002-01-31 21:03 uid32249 + + * ACM/tinyxml/: Makefile, Makefile.tinyxml: + + replace Makefile with Makefile.tinyxml + +2002-01-30 23:25 robux4 + + * ACM/: ACM.cpp, acm.rc: + + resolved FhG incompatibility, first beta version (can go public), no decoding yet + +2002-01-29 21:20 robux4 + + * ACM/: ACM.cpp, TODO, acm.rc: + + update version and removed unused buffers + +2002-01-29 20:51 robux4 + + * ACM/lameACM.dsp: + + build with special dynamic memory handling for ACM + +2002-01-29 20:37 robux4 + + * configMS.h, ACM/ACM.cpp, ACM/ACMStream.cpp, ACM/main.cpp: + + More debugging, special dynamic memory handling for ACM + +2002-01-28 22:33 ivanski + + * mac/LAME.mcp: + + CW6 Project File + +2002-01-28 22:13 ivanski + + * mac/: .DS_Store, LAME Carbon Debug.pch, LAME Carbon Final.pch, + LAME Classic Debug.pch, LAME Classic Final.pch, MacDLLMain.c, + Precompile_Common.h: + + Initial revision + +2002-01-28 22:13 ivanski + + * mac/: .DS_Store, LAME Carbon Debug.pch, LAME Carbon Final.pch, + LAME Classic Debug.pch, LAME Classic Final.pch, MacDLLMain.c, + Precompile_Common.h: + + Mac support + +2002-01-28 20:12 robux4 + + * ACM/: TODO, acm.rc: + + more TODO, added icon credit + +2002-01-28 18:18 markt + + * libmp3lame/lame.c, test/CBRABR.op: + + set devault qval to 2 for CBR and ABR. + +2002-01-25 18:18 robux4 + + * ACM/: TODO, lame.ico: + + new icon, more to do + +2002-01-25 17:51 robux4 + + * ACM/: ACM.cpp, ACM.h, AEncodeProperties.cpp, DecodeStream.cpp, + acm.rc: + + version 0.7.6, improved the smart output mode, corrected a config saving bug + +2002-01-25 17:47 robux4 + + * ACM/ADbg/: ADbg.cpp, ADbg.h: + + more explicit cast + +2002-01-25 11:27 aleidinger + + * misc/Makefile.in: + + regen + +2002-01-25 11:23 aleidinger + + * misc/Makefile.am: + + add lameid3.pl + +2002-01-25 11:22 aleidinger + + * doc/man/lame.1: + + some fixes + +2002-01-24 19:38 robux4 + + * ACM/: ACM.cpp, ACM.h, ACMStream.cpp, AEncodeProperties.cpp, + AEncodeProperties.h, TODO, acm.rc, lameACM.dsp, lame_acm.xml, + main.cpp, resource.h: + + introducing smart output mode, clean dialog boxes, config saving/loading now works + +2002-01-23 20:51 robux4 + + * ACM/DecodeStream.cpp: + + correct a build problem when ENABLE_DECODING is not defined + +2002-01-23 20:45 robux4 + + * ACM/readme.txt: + + More doc on the release files + +2002-01-23 20:40 robux4 + + * ACM/ADbg/ADbg.dsp: + + removed a minor build problem + +2002-01-23 20:39 robux4 + + * ACM/: ACM.cpp, ACM.dsw, ACM.h, ACMStream.cpp, ACMStream.h, + AEncodeProperties.cpp, AEncodeProperties.h, DecodeStream.cpp, + DecodeStream.h, LameACM.inf, TODO, acm.rc, lameACM.dsp, + lame_acm.xml, readme.txt, resource.h, tinyxml/Makefile, + tinyxml/changes.txt, tinyxml/readme.txt, tinyxml/test.dsp, + tinyxml/test.dsw, tinyxml/tinyxml.cpp, tinyxml/tinyxml.dsp, + tinyxml/tinyxml.h, tinyxml/tinyxmlerror.cpp, + tinyxml/tinyxmlparser.cpp, tinyxml/xmltest.cpp: + + Initial configuration dialog and XML config saving, initial decoding support (not working yet) + +2002-01-23 20:32 robux4 + + * mpglib/interface.h: + + better handling of C++ include + +2002-01-23 01:23 markt + + * lame.spec.in: + + commiting Yosi's new lame.spec.in file + +2002-01-22 19:45 robux4 + + * ACM/: ACM.cpp, ACM.dsw, ACM.h, ACMStream.cpp, ACMStream.h, + LameACM.inf, TODO, acm.rc, adebug.h, lameACM.def, lameACM.dsp, + main.cpp, readme.txt: + + clean the code, put LGPL license, add mpglib to the build + +2002-01-21 21:33 markt + + * TODO, configure, configure.in: + + added MAX OSX patch from sf bugtrack page + +2002-01-21 20:24 markt + + * USAGE, misc/lameid3.pl: + + added lameid3.pl script to misc directory. + (use to reencode mp3's and preserve id3 tags) + +2002-01-20 19:29 robux4 + + * libmp3lame/util.h: + + Better C++ handling + +2002-01-20 19:25 robux4 + + * Dll/BladeMP3EncDLL.h: + + Better C++ handling + +2002-01-20 15:05 aleidinger + + * configure: + + regen (ACM) + +2002-01-20 15:05 aleidinger + + * configure.in: + + Add ACM directory + +2002-01-20 15:04 aleidinger + + * ACM/Makefile.in: + + Add generated autoconf glue + +2002-01-20 14:59 aleidinger + + * ACM/ADbg/Makefile.in: + + Add generated autoconf glueACM/Makefile.in + +2002-01-20 14:58 aleidinger + + * ACM/: Makefile.am, ADbg/Makefile.am: + + Add automake clue (for make dist) + +2002-01-20 14:56 robux4 + + * ACM/lameACM.dsp: + + Eanble correct nasm support + +2002-01-20 14:03 robux4 + + * ACM/: ADbg/ADbg.cpp, ADbg/ADbg.dsp, ADbg/ADbg.h, ACM.cpp, + ACM.dsw, ACM.h, ACMStream.cpp, ACMStream.h, LameACM.inf, acm.rc, + adebug.h, lame.ico, lameACM.def, lameACM.dsp, main.cpp, + readme.txt, resource.h: + + Initial ACM support + +2002-01-19 11:52 bouvigne + + * README, TODO: + + updated TODO + +2002-01-17 16:43 aleidinger + + * Makefile.unix: + + NASM for Windows fixes (Hubert Hanghofer) + +2002-01-17 13:42 aleidinger + + * configure: + + regen + +2002-01-17 13:42 aleidinger + + * configure.in: + + - Update gcc 3.x and --enable-expopt=full flags based upon suggestions + and benchmarks from Hubert Hanghofer and + Craig Okruhlica . + - Remove gcc flags which are marked 'experimental' in the gcc 3.0.3 + documentation (noticed by Hubert Hanghofer). + - Add comment what "expopt" means, and what it doesn't mean. + +2002-01-17 13:42 aleidinger + + * Makefile.unix: + + - Update MINGW part pased upon patches and comments from + Hubert Hanghofer . + - Some minor changes for consistency. + + Note: this file is superseded by configure, except for systems where + configure didn't work, so if something is broken you have to send + patches. + +2002-01-17 05:08 takehiro + + * libmp3lame/i386/.cvsignore: + + added *.lo + +2002-01-09 12:09 takehiro + + * debian/.cvsignore, dshow/.cvsignore: + + added autogen Makefile to ignore + +2002-01-09 12:09 takehiro + + * frontend/.cvsignore, libmp3lame/.cvsignore, mpglib/.cvsignore: + + added *.il, for the intel compiler with ipo option + +2002-01-07 15:51 aleidinger + + * configure: + + oops, forgot to s/gtk12-config/gtk-config/ + +2002-01-07 15:48 aleidinger + + * configure: + + regen + +2002-01-07 15:48 aleidinger + + * configure.in: + + add gcc 3 specific optimizations, based upon suggestions by S�bastien FORESTIER + +2002-01-07 10:35 aleidinger + + * configure, frontend/Makefile.in: + + regen: Fix Cygwin and HPUX problems. + +2002-01-07 10:34 aleidinger + + * configure.in, frontend/Makefile.am: + + Fix Cygwin and HPUX problems. + +2002-01-01 16:55 robert + + * misc/lame4dos.bat: + + modified some remark + +2001-12-30 23:54 markt + + * doc/html/history.html: + + updated hostory.html from master copy in webpages project + +2001-12-29 17:36 takehiro + + * doc/html/history.html: + + fix option for pseudo-half step quantization + +2001-12-29 16:23 aleidinger + + * configure: + + regen: Welcome to 3.92 + +2001-12-29 16:21 aleidinger + + * configMS.h, configure.in, libmp3lame/version.h: + + Welcome to 3.92 + +2001-12-29 15:45 aleidinger + + * doc/html/history.html: + + sync with webpages/history.html + +2001-12-28 18:55 takehiro + + * .cvsignore: + + added stamp-h1 + +2001-12-28 12:47 aleidinger + + * Dll/Example.dsp, Dll/MP3EncDll.dsp, dshow/dshow.dsp, + frontend/lame.dsp, libmp3lame/libmp3lame.dsp, dshow/dshow.dsw, + mpglib/mpglib.dsp: + + unix->dos + +2001-12-27 16:12 aleidinger + + * doc/man/lame.1: + + add --alt-preset + +2001-12-27 12:50 aleidinger + + * misc/Makefile.in: + + regen: add missing files to the distribution + +2001-12-27 12:49 aleidinger + + * misc/Makefile.am: + + add missing files to the distribution + +2001-12-23 20:19 dibrom + + * libmp3lame/set_get.c: + + disable noise shaping 2 for "fast" extreme mode also + +2001-12-23 20:11 dibrom + + * libmp3lame/: set_get.c, vbrquantize.c: + + fix small bug and completely disable noise_shaping 2 with "fast" mode until a better solution can be found. + +2001-12-23 12:25 aleidinger + + * misc/Makefile.in: + + regen: add some files to the distribution + +2001-12-23 12:22 aleidinger + + * misc/Makefile.am: + + add auenc, mugeco,sh and mlame to distrib + +2001-12-22 13:32 aleidinger + + * DEFINES: + + document NON_LINEAR_PSYMODEL, remove KLEMM_43 + +2001-12-22 13:29 aleidinger + + * libmp3lame/psymodel.c: + + non linear psymodel (disabled by default) for GPSYCHO (nspsytune is untouched) + +2001-12-22 13:27 aleidinger + + * configure: + + regen: Welcome to v3.91 + +2001-12-22 13:26 aleidinger + + * configMS.h, configure.in, libmp3lame/version.h: + + Welcome to v3.91 + +2001-12-21 15:09 aleidinger + + * libmp3lame/machine.h: + + add icc check + +2001-12-21 15:05 aleidinger + + * libmp3lame/Makefile.in: + + regen: (add vbrquantize.h) + +2001-12-21 15:05 aleidinger + + * libmp3lame/Makefile.am: + + add vbrquantize.h + +2001-12-21 11:58 jd- + + * Dll/: BladeMP3EncDLL.c, BladeMP3EncDLL.def, BladeMP3EncDLL.h: + + Added DLL interface function beEncodeChunkFloatS16NI for floating point audio + Samples are input within the range +/- 32768, in non-interleaved channels + +2001-12-21 03:29 markt + + * testcase.mp3: + + updated testcase + +2001-12-21 03:29 markt + + * libmp3lame/: version.c, version.h: + + updated version to lame 3.90 + +2001-12-20 23:11 markt + + * ChangeLog: + + update changelog + +2001-12-20 08:44 dibrom + + * libmp3lame/encoder.c: + + no message + +2001-12-20 08:33 dibrom + + * libmp3lame/: encoder.c, set_get.c, util.h, vbrquantize.c: + + improved quality of "fast" modes in certain situations + +2001-12-18 17:44 dibrom + + * frontend/parse.c: + + removed bitrate compensation stuff for the abr bitrates since it appears no longer necessary + +2001-12-18 17:28 dibrom + + * doc/html/switchs.html: + + added --alt-preset to the list of switches + +2001-12-18 17:13 dibrom + + * doc/html/history.html: + + documented many changes which have been made over 3.90 + +2001-12-18 16:27 dibrom + + * frontend/parse.c: + + small tweak to "standard" preset + +2001-12-18 16:14 dibrom + + * libmp3lame/: psymodel.c, quantize.c, set_get.c, util.h, + vbrquantize.c: + + small quality improvement for "extreme" and "insane", more bitrate tunings for "extreme" -- should average to 256kbps more often + +2001-12-18 11:16 aleidinger + + * configure: + + regen: vorbis changes + +2001-12-18 11:14 aleidinger + + * configure.in: + + - Change vorbis default to disabled + - Added -logg in the vorbis case (seems to be needed, I haven't tested it) + +2001-12-18 11:13 aleidinger + + * libmp3lame/vorbis_interface.c: + + Try to unbreak vorbis support (it can't get worser). + You may need the vorbis source and add -I/path/to/vorbis_src/includes/ to + CFLAGS prior to running configure + + Tested by: Jonathan Ryshpan on RedHat 7.2 + Submitted by: Cyrille Lefevre via FreeBSD problem report + +2001-12-17 04:40 markt + + * libmp3lame/quantize.c: + + Minor changes to Gabriel's adjustment for ABR bitrate. + Updated testcases. + + Added the following comments: + + /* + res_factor is the percentage of the target bitrate that should + be used on average. the remaining bits are added to the + bitreservoir and used for difficult to encode frames. + + Since we are tracking the average bitrate, we should adjust + res_factor "on the fly", increasing it if the average bitrate + is greater than the requested bitrate, and decreasing it + otherwise. Reasonable ranges are from .9 to 1.0 + + Until we get the above suggestion working, we use the following + tuning: + compression ratio res_factor + 5.5 (256kbps) 1.0 no need for bitreservoir + 11 (128kbps) .93 7% held for reservoir + + with linear interpolation for other values. + + */ + res_factor = .93 + .07 * (11.0 - gfp->compression_ratio) / (11.0 - 5.5); + +2001-12-16 16:00 bouvigne + + * libmp3lame/quantize.c: + + better abr bitrate approximation (will break abr testcases) + +2001-12-15 07:31 dibrom + + * libmp3lame/: psymodel.c, set_get.c, util.h, vbrquantize.c: + + More tunings for "fast" options for "standard" and "extreme" modes. + +2001-12-14 16:27 dibrom + + * libmp3lame/set_get.c: + + small tweak to "extreme" mode + +2001-12-14 07:00 dibrom + + * frontend/parse.c, libmp3lame/lame.c, + libmp3lame/lame_global_flags.h, libmp3lame/psymodel.c, + libmp3lame/quantize.c, libmp3lame/set_get.c, libmp3lame/util.h, + libmp3lame/vbrquantize.c: + + - changed --dm-presets to --alt-presets + - modified preset system + - applied tunings to vbr and psymodel, especially with --alt-preset standard, improves many difficult clips over the default vbr modes/presets (even those such as --r3mix) such as impulse cases (fatboy, spahm, them, gbtinc, ravebase, etc), pre-echo cases (castanets, death2, florida_seq, etc), tonality/js cases (2nd_vent, serioustrouble, bloodline, etc), low volume clips (piano, rach_original), many clips with problems with noise shaping 2, and much much more. Practically all cases should be equal or improved in quality. + - added --no-preset-tune to disable tunings for --alt-preset "modes" + +2001-12-03 18:15 markt + + * USAGE, frontend/parse.c: + + updated descriptions of some command line options, as per Dmitry + +2001-11-30 18:35 markt + + * lame.spec.in: + + patch from lassauge@mail.dotcom.fr for lame.spec.in file. + +2001-11-30 18:05 markt + + * include/lame.h, libmp3lame/lame.c: + + added lame_encode_buffer_long2(), since lame_encode_buffer_long() had + a scaling which restricted the precision of the input to the same + as if the input was 'short int' + + decided to leave the original routine, on the off chance there + is some program out there which uses it. + +2001-11-28 12:30 aleidinger + + * Makefile.in: + + regen + +2001-11-28 12:29 aleidinger + + * Makefile.am: + + change description of make test + +2001-11-26 15:21 takehiro + + * libmp3lame/takehiro.c: + + tuning of "pseudo half step noise shaping" with listening test. + and it works now even when scalefac_scale == 1 + +2001-11-26 15:19 takehiro + + * libmp3lame/: psymodel.c, VbrTag.c: + + fix warning + +2001-11-26 11:00 aleidinger + + * libmp3lame/version.h: + + Bump alpha version. + +2001-11-25 15:24 takehiro + + * libmp3lame/: lame.c, quantize.c, quantize_pvt.c, takehiro.c, + util.h: + + new noise shaping algorithm(pseudo half step noise shaping) + it brings slow but more accurate noise shaping. + enables with -q0 when CBR + +2001-11-19 21:26 markt + + * frontend/parse.c, libmp3lame/encoder.c, + libmp3lame/lame_global_flags.h, libmp3lame/set_get.c: + + Reverted CVS back to before "gglower" option was added. + + --scale is a better way to do this, and contrary to Hans' claims, + --scale is also lossless. + +2001-11-18 22:44 robert + + * frontend/parse.c, libmp3lame/encoder.c, + libmp3lame/lame_global_flags.h, libmp3lame/set_get.c: + + patch by Hans van der Heijden, original email: + + Datum: Sun, 18 Nov 2001 20:13:11 +0100 + Von: "Hans van der Heijden" + An: + + Hi Robert, + + For the first time, I compiled Lame, being a non-programmer (well, my work + involves programming, but that's a world apart with logic symbols, not C + language). + Because sometimes I have the urge to try something with the sourcecode. + + I'd like to add a switch to avoid the use of --scale for preventing + clipping. It manipulates global_gain, similar as the mp3gain tool does, but + this would be much more convenient of course (and better quality-wise, being + 'lossless'). + + Since I have no programming experience, can you take a look if I implemented + it correctly? The switch is called --gglower x, where each x-step stands for + 1,5 dB. gg is short for global gain. So for example, --gglower 1 will + decrease the output volume with 1,5 dB (0,841). I would probably use this by + default, it will be enough to prevent clipping for all but the oddest + samples/settings. + + I did a lot of copy/pasting from the --athlower switch, otherwise I probably + couldn't figure it all out! + Files involved are parse.c, lame_global_flags.h, set_get.c, lame.h and + bitstream.c. + I attached these files, if you search in each for 'gglower' you'll find the + added code. + Files came from the 11 Nov CVS. + + Also attached is a cygwin lame.exe if you like to play with it. + + Let's add it to CVS if it's OK (don't know how to do that myself, have to + tell Mark?). + + Bye, + Hans + +2001-11-17 11:17 aleidinger + + * Dll/Example.cpp, Makefile.unix, Dll/Makefile.mingw32: + + some mingw fixes from Vladislav Naumov + +2001-11-14 16:25 aleidinger + + * include/lame.h: + + fixes in comments + +2001-11-12 21:58 robert + + * libmp3lame/lame.c: + + [no log message] + +2001-11-12 17:36 aleidinger + + * include/lame.h: + + spelling fixes in comments + +2001-11-11 22:13 afaber + + * Dll/BladeMP3EncDLL.c: + + fixed bugs: 451879 and 438835 + +2001-11-11 15:08 aleidinger + + * doc/man/Makefile.in, configure: + + regen + +2001-11-11 15:06 aleidinger + + * libmp3lame/bitstream.c: + + add CVS Id + +2001-11-11 14:57 aleidinger + + * Makefile.in, Dll/Makefile.in, debian/Makefile.in, + doc/Makefile.in, doc/html/Makefile.in, doc/man/Makefile.in, + dshow/Makefile.in, frontend/Makefile.in, include/Makefile.in, + libmp3lame/Makefile.in, libmp3lame/i386/Makefile.in, + misc/Makefile.in, mpglib/Makefile.in: + + regen + +2001-11-11 14:53 aleidinger + + * configure.in, frontend/Makefile.am: + + bugfix: --disable-{mp3x,mp3rtp} had build them + add: --disable-fontend + +2001-11-11 14:48 aleidinger + + * include/lame.h, libmp3lame/version.c, libmp3lame/version.h: + + remove mp3x version, it doesn't belong into the lib + (this breaks every app which uses the function, but mp3x should + be the only app which uses it, so this is ok because I moved it + into gtkanal.c) + +2001-11-11 14:47 aleidinger + + * frontend/gtkanal.c: + + move mp3x version here (from libmp3lame/version.[ch]) + +2001-11-11 11:31 aleidinger + + * libmp3lame/Makefile.in: + + regen + +2001-11-11 11:30 aleidinger + + * libmp3lame/Makefile.am: + + add missing headers + +2001-11-10 14:25 aleidinger + + * libmp3lame/VbrTag.c: + + at least fix the bus error on SPARC until Roel or someone else decides if we should fix it in another way + +2001-11-06 14:43 aleidinger + + * doc/html/switchs.html: + + resample only for encoding + +2001-11-06 12:41 aleidinger + + * doc/man/lame.1: + + athaa fixes, resample only for encoding + +2001-11-06 01:31 jd- + + * frontend/parse.c: + + Cleaned up preset help; send explicitly requested help to stdout, not stderr. + Modularized original presets, with aliases to preserve the original behavior. + +2001-11-05 15:26 dibrom + + * frontend/parse.c: + + modify lowpass values for dm-preset abr mode + +2001-11-05 05:46 dibrom + + * frontend/parse.c: + + Updated dm-presets + +2001-11-05 05:20 markt + + * testcase.mp3, libmp3lame/encoder.h: + + updated padding at end of MP3 to be 1152 samples. + So the last frame containing real data will always be followed + by a frame containing silence. (since most decoders will only + decode the second to last frame) + +2001-11-04 23:42 robert + + * Makefile.MSVC: + + lost i added + +2001-11-04 23:39 robert + + * Makefile.MSVC: + + optimizing some intel compile flags + +2001-11-04 18:51 robert + + * configMS.h: + + moved MSVC specific #pragma into MSVC section + +2001-11-04 18:50 robert + + * libmp3lame/quantize.h, DEFINES: + + removed MAXQUANTERROR precompiler define + +2001-11-04 18:48 robert + + * frontend/parse.c, include/lame.h: + + we don't want to make Naoki's msfix part of the API at this time, removed + from lame.h again. + parse.c compilation was broken by JD's presets_alias function. + +2001-11-04 18:31 robert + + * libmp3lame/: encoder.c, quantize.c, vbrquantize.c, vbrquantize.h: + + removed MAXQUANTERROR precompiler define + +2001-11-04 18:20 dibrom + + * frontend/parse.c: + + update dm-presets.. more to come shortly + +2001-11-04 18:19 dibrom + + * include/lame.h: + + added msfix + +2001-11-04 17:28 robert + + * include/lame.h, libmp3lame/lame.c: + + --vbr-mtrh is now known as --vbr-new + +2001-11-04 17:22 robert + + * Dll/BladeMP3EncDLL.c: + + --vbr-mtrh is now known as --vbr-new + +2001-11-04 13:39 aleidinger + + * libmp3lame/set_get.c: + + some fixes in the comments + +2001-11-04 13:39 aleidinger + + * frontend/parse.c: + + mark --{voice,radio,cd,studio,phone} as deprecated + +2001-11-04 13:33 aleidinger + + * doc/man/lame.1: + + remove --voice (deprecated) + +2001-11-04 13:01 jd- + + * frontend/parse.c: + + Moved "--dm-preset *" preset profiles to "--preset dm-*". + Added code for aliasing presets to multiple broad or narrow purpose labels. + +2001-11-04 08:37 jd- + + * frontend/parse.c: + + Allow specifying the r3mix preset with "--preset r3mix" for consistency + +2001-11-03 10:51 jd- + + * frontend/parse.c, include/lame.h, libmp3lame/lame.c, + libmp3lame/lame_global_flags.h, libmp3lame/set_get.c: + + Renamed experimental switch "--ath-adjust" to "--athaa-type" for consistency. + All switches directly affecting ATH auto-adjustment begin with "--athaa-*". + +2001-11-03 09:31 jd- + + * frontend/parse.c, include/lame.h, libmp3lame/encoder.c, + libmp3lame/lame.c, libmp3lame/lame_global_flags.h, + libmp3lame/psymodel.c, libmp3lame/set_get.c, libmp3lame/util.h: + + Added a bit of documentation to the long help. + To better reflect purpose, renamed adapt-thres-type and adapt-thres-level + to athaa-loudapprox and athaa-sensitivity, respectively. + +2001-10-30 20:31 markt + + * libmp3lame/VbrTag.c: + + When determining enc_delay and enc_padding from VBR header, check + for reasonable values. + +2001-10-29 22:00 markt + + * frontend/get_audio.c, frontend/main.c, frontend/main.h, + frontend/parse.c, include/lame.h, libmp3lame/VbrTag.c, + libmp3lame/VbrTag.h, libmp3lame/lame.c, + libmp3lame/mpglib_interface.c, mpglib/interface.c, + mpglib/mpglib.h: + + VbrTag.c: GetVBRTag() updated to parse enc_delay, enc_padding fields + enc_delay is used by 'lame --decode' to determine how many samples + to skip at the beginning during decoding. + +2001-10-29 20:01 markt + + * frontend/main.c: + + for --nogap option, do not allow Xing VBR tag. + + We should also not allow id3 tags and --nogap, but the are not turned on by + default, and it is more than a 3 line fix :-) + +2001-10-29 08:41 bouvigne + + * libmp3lame/: gain_analysis.c, gain_analysis.h: + + adding gain analysis files + +2001-10-29 06:08 markt + + * frontend/main.c, libmp3lame/VbrTag.c, + libmp3lame/lame_global_flags.h, mpglib/interface.c: + + --nogap and --nogapout fixed in frontend. didn't check + if output is really gapless - hopefully no bugs have crept into + that while --nogap was broken. + +2001-10-28 22:24 markt + + * libmp3lame/VbrTag.c, libmp3lame/bitstream.c, + libmp3lame/lame_global_flags.h, libmp3lame/tables.c, + libmp3lame/util.c, mpglib/interface.c: + + Fixed bug in VbrTag.c which is why Xing tag was broken for MPEG2 + files. + + This code: + + if( h_id == 0 ) + pTagData->samprate >>= 1; + + was, for unknown reasons, cutting the samplrate down by + a factor of two for MPEG2, causing the framesize of the Xing + header to be too large, causing it to overwrite the first + valid MP3 frame. + +2001-10-25 11:54 roelvdb + + * libmp3lame/VbrTag.c: + + undo previous edit, misunderstanding + +2001-10-24 23:59 roelvdb + + * libmp3lame/VbrTag.c: + + if ABR, {store bitrate <=255} else { use 4 low bits to store bitrateindex so "-b" for VBR(/CBR) is known. 0F for freeformat} + +2001-10-24 20:45 markt + + * testcase.mp3: + + updated testcases + +2001-10-24 16:33 aleidinger + + * doc/man/lame.1: + + sync with HTML + +2001-10-24 12:44 bouvigne + + * doc/html/: basic.html, examples.html, history.html, node6.html, + switchs.html: + + doc fixes + +2001-10-24 12:32 bouvigne + + * doc/html/switchs.html: + + a small athtype doc modif + +2001-10-23 16:35 bouvigne + + * doc/html/switchs.html: + + fixes from Dmitry + +2001-10-23 16:17 bouvigne + + * doc/html/switchs.html: + + fixes from Alexander + +2001-10-23 14:06 aleidinger + + * doc/man/lame.1: + + add line breaks, expand examples section, add ID3 section, fixes + +2001-10-23 14:06 aleidinger + + * frontend/main.c: + + fix for cygwin/mingw from egor duda + +2001-10-22 21:31 roelvdb + + * libmp3lame/VbrTag.c: + + no message + +2001-10-22 13:25 aleidinger + + * doc/man/lame.1: + + update based on HTML version + +2001-10-21 17:00 bouvigne + + * doc/html/: basic.html, switchs.html: + + doc + +2001-10-20 16:32 aleidinger + + * Makefile.unix: + + Submitted by: "Vladislav Naumov" + + I canged number 2 of his fixes to be equal to configure.in + (-O3 is the highest official supportes optimization option, some of + the options are superfluous (because they are included in -O3), some may + perhaps change the ABI (ABI, not API!), e.g. -malign-*). + + Quote: + 1. NOUNIXCMD = YES (don't use shell & sed) + 2. CC_OPTS are set to produce optimized code. Somewhat faster. + 3. frontend_sources & lib_sources are now fixed. + GNU Make version 3.79.1 croaked about recursive variable. + 4. ASFLAGS are correctly set, 'make -fMakefile.unix UNAME=MSDOS HAVE_NASM=YES' + works smoothly (if you have nasm.exe, of course :)) + +2001-10-20 16:28 aleidinger + + * Dll/Makefile.mingw32: + + Submitted by: "Vladislav Naumov" + + Quote: + This makefile compiles lame_enc.dll with mingw32 (and possibly cygwin) + Of course, you must first build ../libmp3lame/libmp3lame.a. + liblame_enc.a can be used to link the lame_enc.dll to your programs. + Tested with EAC 0.9pb9 (my own favorite, http://www.exactaudiocopy.de/). + +2001-10-19 17:39 bouvigne + + * libmp3lame/VbrTag.c: + + headering... + +2001-10-18 19:55 bouvigne + + * doc/html/switchs.html, frontend/parse.c: + + documenting...hopefully nearly finished + +2001-10-17 19:29 robert + + * frontend/main.c: + + patch by Gian-Carlo Pascutto + + I saw someone reported a problem with my --nogapout + switch on the mailinglist. I have done a quick attempt + to fix the problems (and address another potential one). + + I haven't actually tested the fixes, but I'm reasonably + sure they are correct, or at least they show how to + address the problem. + +2001-10-17 13:23 roelvdb + + * libmp3lame/VbrTag.c: + + after discussing with Gabriel added some more AQ flag refinements (--athonly,--noath,--scale-*, free format) + + and + + made #define MAXFRAMESIZE 2880, because LAME used to fill the freeformat 640 LAME Tag with junk at the end. + +2001-10-17 11:31 aleidinger + + * configMS.h: + + fix VERSION after last commit + +2001-10-17 01:41 roelvdb + + * libmp3lame/VbrTag.c: + + added overflow protection to that lowpass field in the LAME Tag, just in case someone enters a very high lowpass value. + +2001-10-17 01:18 roelvdb + + * libmp3lame/lame.c: + + 44.1kHz: + instead of "transition band: 22228 Hz - 22761 Hz" lowpass filter, + "-b320 -a" (mono) will now give "transition band: 21517 Hz - 22050 Hz" + (as in the stereo case) + + likewise on other samplerates. I can imagine this can be done in a much more intelligent fashion. + + also commented out a bit of similar code that seems obsolete now? + +2001-10-16 18:49 bouvigne + + * doc/html/switchs.html: + + documenting - not finished + +2001-10-16 18:07 afaber + + * configMS.h, include/lame.h, libmp3lame/VbrTag.h, + libmp3lame/bitstream.c, libmp3lame/fft.c, libmp3lame/fft.h, + libmp3lame/lame.c, libmp3lame/psymodel.c, libmp3lame/quantize.h, + libmp3lame/quantize_pvt.c, libmp3lame/quantize_pvt.h, + libmp3lame/util.h: + + Fixed some compiler warnings (mainly differences between function declaration and definition) + +2001-10-16 15:00 roelvdb + + * libmp3lame/VbrTag.c: + + added the needed "else", fixed lowpass, added -V0/V1, --nores, -k, ... + +2001-10-16 10:35 bouvigne + + * doc/html/history.html: + + history + +2001-10-15 13:44 roelvdb + + * libmp3lame/VbrTag.c: + + fixed a wrong bracket causing >=256 CBR not to be AQ + added ABR>=256 S as AQ, consistent with CBR >=256S + +2001-10-13 19:00 markt + + * testcase.mp3: + + updated testcases + +2001-10-13 14:02 aleidinger + + * include/lame.h, frontend/parse.c, libmp3lame/lame.c, + libmp3lame/lame_global_flags.h, libmp3lame/set_get.c, + libmp3lame/util.c: + + add --scale-l and --scale-r options + + Requested by: fasttimes@mochamail.com + Written by: mp3gain@hotmail.com + +2001-10-13 14:00 aleidinger + + * doc/man/lame.1: + + update from "lame --longhelp" + +2001-10-13 14:00 aleidinger + + * USAGE, doc/html/switchs.html: + + add --scale-l, --scale-r + +2001-10-12 18:39 bouvigne + + * doc/html/: index.html, switchs.html: + + a few doc updates - not yet finished + +2001-10-11 20:06 bouvigne + + * USAGE, doc/html/basic.html, doc/html/examples.html, + doc/html/history.html, doc/html/id3.html, doc/html/modes.html, + doc/html/node6.html, doc/html/switchs.html: + + [no log message] + +2001-10-11 12:21 aleidinger + + * libmp3lame/: encoder.c, util.h: + + fix misunderstanding of gfc->padding + +2001-10-10 02:17 roelvdb + + * libmp3lame/: VbrTag.c, lame.c: + + consequence, it's "LAME Tag", longhelp said Xing header + +2001-10-10 02:15 roelvdb + + * frontend/parse.c: + + consequence, it's "LAME Tag" + +2001-10-10 02:00 roelvdb + + * frontend/main.c: + + added 13 " if (silent < 10) "s to make "lame --decode --quiet" really silent. there's still a LF I can't locate though... + +2001-10-10 01:42 roelvdb + + * Dll/BladeMP3EncDLL.c: + + removed experimental X from --r3mix + +2001-10-09 23:09 roelvdb + + * libmp3lame/VbrTag.c: + + adds delays/padding to tag, no range check and tested exclusively on windows + +2001-10-09 22:34 roelvdb + + * frontend/parse.c: + + test commit CVS to fix --r3mix size increase (robert identified is as -X being used) + +2001-10-09 14:30 aleidinger + + * libmp3lame/version.h: + + bump alpha version + +2001-10-09 14:26 aleidinger + + * Dll/BladeMP3EncDLL.c, frontend/parse.c, libmp3lame/VbrTag.c, + libmp3lame/encoder.c, libmp3lame/lame.c, + libmp3lame/lame_global_flags.h, libmp3lame/util.h: + + Use the official enum names from lame.h instead of numbers or defines. + +2001-10-08 12:54 bouvigne + + * libmp3lame/util.c: + + athtype fix + +2001-10-06 19:25 markt + + * include/lame.h: + + added notes about scaling. there are some inconsistencies in + the API: + + lame_encode_buffer() takes short int as input, range +/- 32768 + lame_encode_float() takes float, but data must be in the range + +/- 32768 + lame_encode_double() takes double, but data must be in the range + +/- 32768 + + lame_encode_int() takes int, but data must be in the range of 'int' + for 32bit ints, this is +/- 2147483684 + +2001-10-06 19:17 markt + + * frontend/get_audio.c: + + updated error messages we now support 8,16,24 and 32 bit input + +2001-10-06 19:05 markt + + * frontend/get_audio.c, frontend/gtkanal.c, frontend/parse.c, + include/lame.h, libmp3lame/lame.c: + + added support for 24 and 32 bit when not using libsndfile. + jd had already added the code to do this, just had to make + the libsndfile --bitwidth option available when not using + libsndfile. Also updated unpack_read_samples to support 32bit. + + Could not test this since I dont have any 24 bit files, and + sox cant seem to create them. + +2001-10-05 22:43 robert + + * libmp3lame/: lame.c, machine.h, quantize_pvt.c, quantize_pvt.h, + vbrquantize.c: + + using -Xn similar to the old code to select different noise measurings with + the newer VBR code. the actual mapping is not final yet. + +2001-10-05 13:00 bouvigne + + * libmp3lame/util.c: + + ath 4 switches to ath 2 in cbr mode + +2001-10-05 12:59 bouvigne + + * libmp3lame/lame.c: + + made NsPsytune stopping using ath0 as default, as everyone is overriding the athwhen using nspsytune + +2001-10-05 12:20 bouvigne + + * Makefile.MSVC, libmp3lame/libmp3lame.dsp: + + makefile.msvc and projects on par? + +2001-10-04 10:01 aleidinger + + * libmp3lame/: VbrTag.c, VbrTag.h: + + fixes for Solaris 8 / add missing include + +2001-10-02 16:02 markt + + * frontend/: main.c, parse.c: + + added nogap patch from Gian-Carlo Pascutto. + + lame --nogapout --nogap file1.wav file2.wav file3.wav ... + + untested. + +2001-10-02 03:54 markt + + * configure: + + ran autoconf to make a new configure script + +2001-10-02 03:53 markt + + * INSTALL, configure.in, frontend/main.c, frontend/parse.c, + libmp3lame/lame.c, libmp3lame/vorbis_interface.c: + + split Vorbis support into two pieces: + + 1. + HAVE_VORBIS (decoding support). This code still works! + (at least it compiles - I have't actually run it). + Can be enabled with ./configure --with-vorbis. Changed the + default in configure.in to define HAVE_VORBIS + + 2. + HAVE_VORBIS_ENCODER + This is the code which hasn't compiled since Vorbis beta1. + Mainly because how you specify varous encoding "modes" has been + changed. It's probably not to much work to get this working, + but there is no reason for this to be in LAME. + +2001-10-02 00:00 markt + + * libmp3lame/: VbrTag.c, bitstream.c, bitstream.h, encoder.c, + lame.c: + + Music CRC computed on the fly. Code stubs in place for + decoding on the fly. + +2001-10-01 23:02 markt + + * libmp3lame/: VbrTag.c, bitstream.c, bitstream.h, encoder.c, + lame.c, util.h: + + started work to put in the ability to compute MusicCRC on + the fly, as well as decoding on the fly. + +2001-09-30 20:36 robert + + * frontend/parse.c, libmp3lame/bitstream.c, libmp3lame/bitstream.h, + libmp3lame/lame.c, libmp3lame/quantize.c, + libmp3lame/quantize_pvt.c, libmp3lame/quantize_pvt.h, + libmp3lame/set_get.c, libmp3lame/util.c, libmp3lame/util.h, + libmp3lame/vbrquantize.c: + + removed some unused variable + +2001-09-28 21:29 markt + + * frontend/main.c: + + cpu affinity back to #define _WIN32 + +2001-09-28 21:13 markt + + * frontend/main.c: + + process affinity patch is back + +2001-09-28 20:46 markt + + * USAGE: + + more small updated to USAGE + +2001-09-28 20:38 markt + + * USAGE: + + updated USAGE to reflect Dmitry's -B comments + +2001-09-28 12:04 bouvigne + + * Makefile.MSVC: + + harmonization between makefile and project + +2001-09-27 13:33 bouvigne + + * libmp3lame/libmp3lame.dsp: + + 3dnow fft assembly + +2001-09-21 04:50 markt + + * testcase.mp3, frontend/main.c: + + updated testcases (lowpass added to Info tag?) + +2001-09-21 04:03 markt + + * frontend/main.c: + + disabled CPU affinity code. + should only be in a #ifdef NT-system, but I dont know what + the ifdef should be. + +2001-09-20 08:38 bouvigne + + * libmp3lame/libmp3lame.dsp, mpglib/mpglib.dsp: + + corrected dsp files for VC++. Should work also under VC5, but not tested. Please report success/error + +2001-09-20 07:15 bouvigne + + * libmp3lame/: VbrTag.c, lame.c: + + default lowpass stored in info tag + +2001-09-19 14:32 markt + + * testcase.mp3: + + updated testcase.mp3 + +2001-09-18 13:37 aleidinger + + * libmp3lame/util.c: + + Fix memory hole (allocation from psymodel_init()). + Found by: Michael Fink + +2001-09-17 23:54 markt + + * libmp3lame/: VbrTag.c, util.c: + + moved a 1M array from stack to heap in VbrTag.c + + Some OS, when launching LAME on a seperate thread, + allocate a tine (128K?) stack. moving this to the heap + is an ugly solution (requires a malloc() and free()) + but lets see if it fixes the reported segfaults. + +2001-09-17 21:17 markt + + * frontend/main.c, include/lame.h, libmp3lame/VbrTag.c, + libmp3lame/lame.c, libmp3lame/util.c: + + more code related to putting encoder padding into VBR tag + +2001-09-17 20:05 markt + + * include/lame.h, libmp3lame/VbrTag.c, libmp3lame/encoder.h, + libmp3lame/lame.c, libmp3lame/lame_global_flags.h, + libmp3lame/set_get.c: + + added new call to API, + lame_get_encoder_padding() + which returns the amount of padding appended to the input + during encoding. + +2001-09-17 19:15 markt + + * libmp3lame/util.c: + + moved MSVC cpu affinity code to the top of disable_FPE() + +2001-09-15 09:57 aleidinger + + * configure: + + regen + +2001-09-15 09:49 aleidinger + + * configure.in: + + Bugfix for libffm (Alpha architecture). + Submitted by: Simon Burge + +2001-09-14 17:37 markt + + * HACKING, README: + + added a note about LAME being threadsave to the HACKING file. + +2001-09-14 17:18 markt + + * libmp3lame/util.c: + + put Todd Richmond's EAC/lame SMP fix in util.c, + with all the messy code for setting floating point exceptions. + I put this in the + #if defined(_MSC_VER) + block, so it should only affect people using MSVC. + +2001-09-11 07:47 potsticker + + * libmp3lame/VbrTag.c: + + Changed id string from 'Xing' to 'Info' for CBR files only + +2001-09-08 18:39 potsticker + + * libmp3lame/VbrTag.h, frontend/main.c: + + Don't write Lame Tag status message if --quiet + +2001-09-08 18:35 potsticker + + * libmp3lame/VbrTag.c: + + Don't write Lame Tag status message if --quiet + +2001-09-08 18:27 potsticker + + * libmp3lame/: VbrTag.c, VbrTag.h: + + Don't write Lame Tag status message if --quiet + +2001-09-07 23:42 potsticker + + * libmp3lame/VbrTag.c, libmp3lame/lame.c, frontend/parse.c: + + Write Lame Tag for all files (unless -t switch used) + +2001-09-04 00:06 potsticker + + * libmp3lame/VbrTag.c: + + Implemented most of Lame Tag rev 0 (but no 'replay gain' yet) + +2001-09-03 23:45 potsticker + + * libmp3lame/: VbrTag.c, VbrTag.h: + + Implemented most of Lame Tag rev 0 (but no 'replay gain' yet) + +2001-09-03 23:43 potsticker + + * libmp3lame/id3tag.h: + + Moved some macro definitions into id3tag.h (referenced in VbrTag.c) + +2001-09-03 20:56 robert + + * libmp3lame/id3tag.c: + + cr/lf patch + +2001-09-02 20:07 potsticker + + * libmp3lame/: id3tag.h, id3tag.c: + + Moved some macro definitions into id3tag.h (referenced in VbrTag.c) + +2001-08-31 18:41 markt + + * libmp3lame/util.c: + + lowered tolerence in an assert() in the lowpass filtering + routine. + +2001-08-31 08:17 bouvigne + + * libmp3lame/: VbrTag.c, util.h: + + I hope it's fixed now + +2001-08-29 20:08 bouvigne + + * Dll/BladeMP3EncDLL.c, include/lame.h, libmp3lame/VbrTag.c, + libmp3lame/VbrTag.h, libmp3lame/version.c: + + first implementation of lame Xvbr tag from J Dee + +2001-08-28 18:51 markt + + * API, HACKING, frontend/parse.c, libmp3lame/lame_global_flags.h, + libmp3lame/psymodel.c, libmp3lame/set_get.c: + + msfix changes. forgot to commit them yesterday + +2001-08-28 17:06 aleidinger + + * Makefile.unix: + + OS/2 mods from slaughter@malaconet.org (in principle, I had to apply them by hand and modified it a little bit) + +2001-08-28 15:41 aleidinger + + * configure: + + oops... wrong gtk-config + +2001-08-27 21:06 aleidinger + + * configure: + + regen (+update to automake 1.5) + +2001-08-27 21:04 aleidinger + + * aclocal.m4, Makefile.in, Dll/Makefile.in, debian/Makefile.in, + doc/Makefile.in, doc/html/Makefile.in, doc/man/Makefile.in, + dshow/Makefile.in, frontend/Makefile.in, include/Makefile.in, + libmp3lame/Makefile.in, libmp3lame/i386/Makefile.in, + misc/Makefile.in, mpglib/Makefile.am, mpglib/Makefile.in: + + update to automake 1.5 + +2001-08-27 21:04 aleidinger + + * Makefile.unix: + + USE_FFT3DN died some time ago + +2001-08-27 21:03 aleidinger + + * Makefile.am: + + fixes for the update and diff target if you build in a seperate directory + +2001-08-27 21:01 aleidinger + + * frontend/main.c: + + Bump MAX_NOGAP from 20 to 40, I wanted to make 34 gapless mp3s. + +2001-08-27 20:59 aleidinger + + * Makefile.am.global, config.guess, config.sub, depcomp, missing, + mkinstalldirs, misc/depcomp, mpglib/depcomp: + + update to automake 1.5 + +2001-08-27 20:56 aleidinger + + * DEFINES, Makefile.B32, Makefile.MSVC, Dll/MP3EncDll.dsp, + libmp3lame/libmp3lame.dsp, libmp3lame/vorbis_interface.c: + + remove USE_FFT3DN, this define died some time ago + +2001-08-27 20:55 aleidinger + + * configure.in: + + remove --malign-double completely + +2001-08-27 20:52 aleidinger + + * libmp3lame/fft.c: + + USE_FFT3DN -> HAVE_NASM + +2001-08-27 20:50 aleidinger + + * lame.spec.in: + + - Build and include docs and libs correctly + - Build extra programs + + Submitted by: Markus Linnala + + Note: + I didn't have a rpm based system, if this breaks feel free + to revert my commit, I'm at a "commit what isn't obviously + broken and seems to be a good idea" run at the moment. + +2001-08-27 20:49 aleidinger + + * doc/html/switchs.html, frontend/parse.c, USAGE: + + - OS/2 priority control + Submitted by: "DoC" (with minor changes by me) + +2001-08-27 16:40 markt + + * doc/man/lame.1, misc/Lame.vbs: + + typo in man page fixed, new Lame.vbs from + "Ralf Kempkens" + +2001-08-26 19:01 markt + + * configure.in: + + removed -malign-double, based on Klemm's email. + +2001-08-26 18:59 markt + + * configure.in: + + some missing quotes for AmigaOS section of configure.in, + submitted by Fredrik Mellstrom + + (I cant beieve there are still people out there using + an amiga :-) + +2001-08-26 18:38 markt + + * mpglib/: interface.c, mpglib.h: + + replaced "look_for_xing" variable with more descriptive name + "sync_bitstream". + +2001-08-21 19:48 bouvigne + + * frontend/parse.c: + + switching --vbr-new to mtrh + +2001-08-21 08:57 viral + + * debian/: changelog, control, lame-dev.docs, lame.docs, rules: + + Debian packaging modifications. + +2001-08-20 22:26 afaber + + * Dll/: BladeMP3EncDLL.c, MP3EncDll.dsp: + + Updated new R3Mix settings, use lame get/set function and version info + so I got rid of the version.h and lame_global_flag.h include files + +2001-08-20 20:54 robert + + * doc/html/contributors.html: + + adding Darin Morrison (author of dm presets) + +2001-08-16 08:21 robert + + * misc/abx.c: + + update of abx.c by Frank Klemm + +2001-08-15 21:58 robert + + * frontend/parse.c, libmp3lame/lame.c: + + making -Z a truely toggling switch + reordering the longhelp options list + dropping --extrahelp + +2001-08-15 00:37 robert + + * libmp3lame/lame.c: + + dropped a nagging message for --vbr-mtrh (nspsytune tuned for ...) + +2001-08-15 00:12 robert + + * frontend/parse.c, libmp3lame/util.c: + + update for --r3mix by Roel + +2001-08-14 21:46 robert + + * frontend/parse.c, libmp3lame/lame.c, libmp3lame/quantize_pvt.c, + libmp3lame/util.h, libmp3lame/version.h: + + some good presets tuned by Dibrom after die hard listening tests + --dm-preset {standard,xtreme,insane,metal} + and a switch to modify the --ns-treble setting for sfb21 by + --ns-sfb21 x + +2001-08-08 10:52 aleidinger + + * configure: + + regen + +2001-08-08 10:51 aleidinger + + * configure.in: + + - remove optimizations which get already switched on by -O2 or better + - new experimental optimizations + - bump version to 3.90 + +2001-08-08 10:50 aleidinger + + * configMS.h: + + bump version to 3.90 + +2001-08-07 20:41 afaber + + * libmp3lame/libmp3lame.dsp: + + Added NASM release build option + +2001-08-02 18:42 afaber + + * Dll/: BladeMP3EncDLL.c, BladeMP3EncDLL.h, Example.cpp, + MP3EncDll.dsp: + + Added NASM build option, added Very High Quality option + +2001-08-01 21:45 robert + + * frontend/parse.c, libmp3lame/lame.c, + libmp3lame/lame_global_flags.h, libmp3lame/quantize_pvt.c, + libmp3lame/set_get.c, libmp3lame/version.h: + + BUG fix in "on_pe", was allocating often more than the absolute limit of 4095 bits per granule + attention: testcases are most likely broken now! + +2001-07-26 23:05 robert + + * libmp3lame/: lame.c, psymodel.c, vbrquantize.c, version.h: + + VBR mtrh related, bring --remix near to --r3mix bitrate wise + +2001-07-25 20:19 robert + + * frontend/main.c: + + Michel SUCH, wildcard expansion for nogap using the OS/2 shell + +2001-07-24 12:13 aleidinger + + * configure: + + regen + +2001-07-24 12:12 aleidinger + + * configure.in: + + gcc 3.0 fix from Daniel T. Chen + +2001-07-23 08:11 aleidinger + + * aclocal.m4, configure: + + update to automake 1.4-p5 + +2001-07-23 08:08 aleidinger + + * Makefile.in, Dll/Makefile.in, debian/Makefile.in, + doc/Makefile.in, doc/html/Makefile.in, doc/man/Makefile.in, + dshow/Makefile.in, frontend/Makefile.in, include/Makefile.in, + libmp3lame/Makefile.in, libmp3lame/i386/Makefile.in, + misc/Makefile.in, mpglib/Makefile.in, config.guess, config.sub: + + update to automake 1.4-p5 + +2001-07-23 08:05 aleidinger + + * Makefile.am.global: + + update to automake 1.4-p5 + +2001-07-22 19:24 robert + + * libmp3lame/: quantize.c, vbrquantize.c: + + small fixes + +2001-07-22 06:37 jd- + + * libmp3lame/encoder.c: + + Pushed the maximum auto-level adjustment of the ATH from 20 dB to 32 dB + +2001-07-20 23:56 robert + + * libmp3lame/quantize.c: + + small speed up for --vbr-old + +2001-07-20 01:01 robert + + * libmp3lame/: lame.c, quantize.c, quantize_pvt.c, vbrquantize.c, + version.h: + + 1) defaulted the old -Y code for --vbr-old + 2) new behaviour of -Y: turns off sfb21 noise shaping (VBR) + 3) some more tunings for --vbr-old + +2001-07-19 11:36 aleidinger + + * configure: + + regen + +2001-07-19 11:35 aleidinger + + * configure.in: + + - removed useless (because already handled by Cygwin) MS-DOS case + - bug fixes for alpha*-dec-osf*, *sgi-irix* and sparc*-sunos4* + - print a "please contact us" message for sparc*-sunos4* and *beos + (theses parts of configure.in are perhaps not neccessary) + +2001-07-18 20:16 robert + + * frontend/parse.c, libmp3lame/vbrquantize.c: + + vbr-mtrh related: encode sfb21, may bloat on heavy metal music + +2001-07-18 20:14 robert + + * misc/abx.c: + + update by Frank + +2001-07-16 19:35 robert + + * Dll/BladeMP3EncDLL.c, frontend/parse.c, include/lame.h, + libmp3lame/lame.c, libmp3lame/lame_global_flags.h, + libmp3lame/psymodel.c, libmp3lame/set_get.c, libmp3lame/util.h, + libmp3lame/version.h: + + adding a new switch --allshort + this one forces LAME to use short blocks on every granule + useful for testing the short block masking abilities + +2001-07-13 22:37 robert + + * libmp3lame/: psymodel.c, quantize.c, util.h, version.h: + + first try to fix the short block threshold calculation BUG + this patch tries to resolve the shortcommings for the short block + threshold calculation using VBR. Applying this patch for CBR/ABR + would break the testcases. It should not affect the vanilla --nspsy... + too, maybe later. + +2001-07-07 19:54 bouvigne + + * libmp3lame/reservoir.c: + + maxmp3buf was beeing ignored + +2001-07-05 21:25 robert + + * libmp3lame/quantize.c: + + fixing the assertion failures mentioned by Albert Faber + +2001-07-05 15:56 markt + + * configure: + + regenerated configure + +2001-07-05 15:55 markt + + * configure.in: + + updated gcc 2.96 check to use -O instead of -O1 + +2001-07-05 15:55 markt + + * configure: + + [no log message] + +2001-07-05 15:54 markt + + * configure.in: + + gcc 2.96 check + +2001-07-05 15:53 markt + + * libmp3lame/version.h: + + updated repository to 3.90alpha + +2001-07-05 15:35 markt + + * doc/html/history.html: + + updateded history file from web page cvs repository + +2001-07-05 15:32 markt + + * ChangeLog: + + update + +2001-07-05 15:27 markt + + * libmp3lame/version.h: + + updated to 3.89beta + +2001-07-02 21:45 robert + + * libmp3lame/quantize.c: + + bug fix for --nspsytune + minimum bits allocated was too low, resulting in assertion failures + +2001-07-02 21:08 robert + + * libmp3lame/lame.c: + + changing --vbr-new noise measuring back to its usual one + +2001-07-01 20:36 markt + + * libmp3lame/psymodel.c: + + unbreak CBR testcases. + +2001-07-01 20:04 markt + + * frontend/: get_audio.c, main.h, parse.c: + + patch from Nick Duffek + for signed/unsigned and bitwidth options. + +2001-07-01 16:48 robert + + * libmp3lame/lame.c: + + defaulting --vbr-mtrh to -q2 = -h + +2001-07-01 13:11 robert + + * libmp3lame/lame.c: + + allow --vbr-{old,new} to select between different ATH autoadjust types too + +2001-07-01 11:50 robert + + * libmp3lame/: lame.c, set_get.c: + + nspsytune related: + now it is possible to turn the scalefac_feature off again giving + --nspsytune -Z + the change was necessary, because of the hard coded -Z + +2001-07-01 05:24 jd- + + * libmp3lame/: encoder.c, lame.c, psymodel.c, util.h: + + Restructured ATH auto-leveling code to fix bug for "--adapt-thres-type 1"; + relaxed tuning for "--adapt-thres-type 2" for compromise with "--athtype 3" + (the previous bit rate is still available with "--adapt-thres-level -1.25") + +2001-06-30 16:45 robert + + * Makefile.MSVC: + + fix for compiling mp3x on windows using Makefile.MSVC + +2001-06-30 16:40 robert + + * frontend/parse.c: + + fix for compiling mp3x on windows using Makefile.MSVC + +2001-06-30 00:26 robert + + * frontend/parse.c, libmp3lame/lame.c, libmp3lame/psymodel.c, + libmp3lame/util.h, libmp3lame/vbrquantize.c: + + 2 new modes for --vbr-mtrh available by different -q n selections: + -q0 truely max noise + -q1 almost max noise + +2001-06-29 20:58 robert + + * libmp3lame/set_get.c: + + revive --nssafejoint --ns-{alto,treble,bass} + lame_set_exp_nspsytune is *not an on/off switch* + +2001-06-29 15:23 markt + + * configure, configure.in, libmp3lame/lame.c: + + patch for configure.in, replaced a bash specific loop, + from Oswald Buddenhagen + +2001-06-27 15:47 aleidinger + + * configure: + + regen + +2001-06-27 15:46 aleidinger + + * configure.in: + + some hardware specific optimization options for gcc + +2001-06-27 14:53 aleidinger + + * libmp3lame/i386/Makefile.in: + + regen + +2001-06-27 14:53 aleidinger + + * libmp3lame/i386/Makefile.am: + + this is nasty, I want native nasm support in libtool, at least it works for me (sort of) + +2001-06-27 14:11 aleidinger + + * libmp3lame/: Makefile.in, i386/Makefile.in: + + regen + +2001-06-27 14:11 aleidinger + + * libmp3lame/: Makefile.am, i386/Makefile.am: + + go back to let libtool compile liblameasmroutines, the static case was broken, now the libtool v1.4 case may be broken + +2001-06-26 11:38 aleidinger + + * configure: + + regen + +2001-06-26 11:36 aleidinger + + * configure.in: + + make the use of nasm a configure option + +2001-06-25 02:14 cisc + + * frontend/main.c: + + Include portableio.h for the WriteBytes() and WriteBytesSwapped() functions. + +2001-06-24 21:01 robert + + * lame.bat: + + some comments updated + +2001-06-24 16:47 robert + + * doc/html/contributors.html, libmp3lame/version.h: + + adding two more contributors + +2001-06-24 15:58 robert + + * Makefile.MSVC: + + FLOAT8=float for IC + +2001-06-24 15:57 robert + + * Makefile.B32: + + let it work again + +2001-06-24 02:04 robert + + * libmp3lame/: quantize.c, quantize.h, quantize_pvt.h, takehiro.c, + vbrquantize.c: + + BUG fix in inc_subblock gain, was amplifying at the wrong place + this fix may break the testcases + some unused parameters removed + +2001-06-23 18:26 robert + + * Dll/MP3EncDll.dsp: + + patch for DLL Project file by Dmitry + +2001-06-23 17:56 robert + + * frontend/lametime.c, frontend/parse.c, mpglib/common.c, + Makefile.MSVC: + + some fixes needed by the Borland Compiler BCC, first attempt to support BCC with Makefile.MSVC, DLL not supported yet, MP1 MP2 reencoding does not work with BCCcd lame (why?) + +2001-06-23 12:19 robert + + * libmp3lame/quantize_pvt.c: + + fix letting Borland C++ compiler getting thru' again, Makefile.B32 is *not uptodate* + +2001-06-23 12:15 robert + + * frontend/get_audio.c: + + BUG fix for mp1 and mp2 input, fixes problem introduced in Revision 1.63 + +2001-06-22 08:55 aleidinger + + * ChangeLog: + + update changelog + +2001-06-22 08:49 aleidinger + + * Makefile.am: + + regen + +2001-06-22 08:48 aleidinger + + * Makefile.in: + + we have a test subdir in cvs, force the test target to be out of date at every invocation of make + +2001-06-21 20:40 bouvigne + + * libmp3lame/reservoir.c: + + change of the max frame size + +2001-06-19 04:46 markt + + * misc/: Lame.vbs, lameGUI.html: + + updates from "Ralf Kempkens" + +2001-06-18 18:51 markt + + * TODO, frontend/get_audio.c, frontend/get_audio.h, + frontend/main.c, frontend/main.h, frontend/parse.c, + include/lame.h, libmp3lame/bitstream.c, libmp3lame/bitstream.h, + libmp3lame/set_get.c, mpglib/interface.c, mpglib/mpglib.h: + + added two new functions to return number of PCM samples buffererd + but not encoded, and the number of bytes of mp3 data buffered but + not output. also added some comments to mpglib/interface.c to + make it easier to tell it to look for Xing headers in the middle + of a bitstream. + +2001-06-16 00:40 robert + + * Makefile.MSVC, Makefile.unix: + + CPU feature detection for fft routines + +2001-06-16 00:39 robert + + * libmp3lame/: fft.c, util.h: + + CPU feature autodetection for fft routines + +2001-06-15 22:23 markt + + * TODO, frontend/main.c, include/lame.h, libmp3lame/lame.c: + + Robert's fix to init histgram data with --nogap. + + lame_reinit_bitstream() renamed lame_init_bitstream(), and + it is called by lame_init_params(). It can also be called + after a call to lame_encode_flush_nogap(). + +2001-06-15 21:25 markt + + * TODO, frontend/main.c, include/lame.h, libmp3lame/lame.c: + + some fixes for VBR tags with --nogap option. + +2001-06-14 23:09 robert + + * frontend/parse.c: + + fixed stdin + +2001-06-14 00:58 robert + + * libmp3lame/version.h: + + bumped version to alpha 7 + +2001-06-14 00:43 robert + + * libmp3lame/: lame.c, psymodel.c: + + added JD's loudness approximation to Naoki's duplicated psy routine + as I defaulted JD's adapt stuff I was under the impression that he + added his code to both ones, so... + +2001-06-14 00:19 markt + + * frontend/main.c: + + fix for nogap truncation call. When processing the last + of the .wav files, we need to call lame_encode_flush() + instead of lame_encode_flush_nogap(). + +2001-06-13 22:46 robert + + * frontend/parse.c: + + LFN support for Win32: realized that it would be a good idea to release the search file handle after searching the filename + +2001-06-13 08:44 aleidinger + + * Makefile.DJGPP: + + nasm fix + +2001-06-12 21:58 robert + + * frontend/parse.c: + + long file name support for Win32 systems + works under Win95 using Intel compiler 4.5 / MSVC 4.2 + not tested under NT, and not much tested anyway ;-) + +2001-06-12 21:03 robert + + * Makefile.unix: + + seems to be forgotten by the last committ + +2001-06-12 20:32 markt + + * libmp3lame/bitstream.c: + + old crc code removed from bitstream.c. + I had added this in when looking for the xing/crc bug + +2001-06-12 12:47 aleidinger + + * frontend/lametime.c: + + fix cygwin build, sort some includes + +2001-06-12 12:45 aleidinger + + * libmp3lame/: Makefile.in, i386/Makefile.in: + + regen + +2001-06-12 12:45 aleidinger + + * libmp3lame/: Makefile.am, i386/Makefile.am: + + do not use libtool for the asm lib, libtool did not know about nasm + +2001-06-12 12:42 aleidinger + + * configure, frontend/Makefile.in: + + regen + +2001-06-12 12:42 aleidinger + + * configure.in: + + - enable shared lib + - disable asm routines + - fix build of asm routines in the win32 case + +2001-06-12 12:41 aleidinger + + * frontend/Makefile.am: + + statically link libmp3lame to the frondends + +2001-06-12 05:27 markt + + * libmp3lame/lame.c: + + removed CRC error message + +2001-06-12 05:27 markt + + * libmp3lame/VbrTag.c: + + fix for Xing/CRC problem. + + Xing toc data must start directly after sideinfo data, assuming + no CRC. If CRC is set, then the Xing toc data must *still* start + in the same location (since original Xing demo code does not + check for CRC and modify the toc offset). + +2001-06-12 04:51 markt + + * libmp3lame/: bitstream.c, lame.c: + + put old CRC routine back in (but disabled) + +2001-06-12 03:35 markt + + * Dll/BladeMP3EncDLL.c: + + added some comments about the DLL's non-standard use of libmp3lame.a + +2001-06-12 03:31 markt + + * libmp3lame/Makefile.am: + + Robert created lame_global_flags.h, + so I'm adding it to Makefile.am, in the "noinst" section. + +2001-06-12 00:48 robert + + * Dll/BladeMP3EncDLL.c, libmp3lame/lame_global_flags.h, + libmp3lame/quantize.c, libmp3lame/util.h: + + - fixed Makefile.unix to let mp3rtp compile again (does it still work?) + - had to move lame_global_flags structure into a file of its own, + because the Dll compiled but did not link anymore. + Now it works again, tested on Win95 using Makefile.MSVC + +2001-06-11 23:42 markt + + * Dll/BladeMP3EncDLL.c, include/lame.h, libmp3lame/set_get.c, + libmp3lame/util.h: + + committed Robert's patch. lame_global_flags is gone :-) + +2001-06-11 22:07 robert + + * frontend/main.c: + + some more new API things + +2001-06-11 18:49 markt + + * frontend/: gtkanal.c, parse.c: + + converted rest of frontend code over to "new api" + +2001-06-11 16:35 markt + + * frontend/get_audio.c, frontend/get_audio.h, frontend/gtkanal.c, + libmp3lame/mpglib_interface.c, mpglib/interface.c: + + Tracked down a bug in lame_decoder. It was not correctly + flushing the internal mpglib buffers when it hit EOF. + + Problem was most severe with low bitrate example. It the frame size + was 32 bytes, only the first 1/3 of the file would be decoded + and the reamining 2/3 of the entire file would be buffered + inside mpglib. + +2001-06-10 20:35 robert + + * Dll/BladeMP3EncDLL.c, include/lame.h: + + making the old VBR default in preparation for the next release + +2001-06-10 19:19 markt + + * API, USAGE, misc/Lame.vbs, misc/lameGUI.html: + + added new version of Lame.vbs from "Ralf Kempkens" + including a GUI/HTML interface. + +2001-06-08 21:40 markt + + * frontend/: get_audio.c, gtkanal.c, main.c, main.h: + + updated some comments related to restructering main.c + for the --nogap option + +2001-06-08 21:29 markt + + * API, TODO, frontend/get_audio.c, frontend/gtkanal.c, + frontend/main.c, frontend/mp3rtp.c, frontend/mp3x.c, + frontend/parse.c, frontend/parse.h, frontend/timestatus.c, + include/lame.h, libmp3lame/lame.c, libmp3lame/set_get.c: + + preliminary --nogap option added. + + --nogap file1 file2 file3 + + and it produces file1.mp3 file2.mp3 file3.mp3 + + problems: no id3tags, no vbr tags. + +2001-06-08 18:59 markt + + * test/lametest.py: + + fix so lametest.py doesn't crash if lame does not create an + output file. + +2001-06-08 00:00 markt + + * frontend/main.c, libmp3lame/bitstream.c: + + fixed bug with lame_encode_flush_nogap routine + +2001-06-07 22:12 robert + + * DEFINES, TODO: + + [no log message] + +2001-06-07 22:06 robert + + * frontend/parse.c, libmp3lame/encoder.c: + + --ath-adjust 1 (Gaby's original code) was disabled, any reasons for that JD? + +2001-06-07 19:14 markt + + * HACKING, frontend/get_audio.c, frontend/gtkanal.c, + frontend/parse.c, frontend/timestatus.c, libmp3lame/lame.c: + + started updating frontend code to use the new API. + +2001-06-07 14:02 aleidinger + + * libmp3lame/fft.c: + + unbreak (at least it compiles), more work needed + +2001-06-07 10:11 jd- + + * libmp3lame/encoder.c: + + Allow ATH auto-adjust code to begin at the minimum value on the leading frame + +2001-06-07 08:40 jd- + + * libmp3lame/encoder.c: + + Restored some ATH auto-adjust indentation and comments (altered since 3.88 + in a code clean up) + +2001-06-07 06:06 pgubanov + + * libmp3lame/fft.c: + + Choose asm-optimized FHT version if ARCH_X86 defined in fft.c + +2001-06-05 22:13 afaber + + * Dll/: BladeMP3EncDLL.c, BladeMP3EncDLL.h: + + Added R3Mix quality setting + +2001-06-05 19:19 aleidinger + + * doc/html/history.html: + + sync my entry with the one at the webpages + +2001-06-05 00:39 markt + + * INSTALL, TODO: + + added note about mpglib i-stereo bug in TODO list. + fixed typo in INSTALL file + +2001-06-04 23:57 markt + + * TODO, libmp3lame/reservoir.c: + + documented some variables in reservoir.c. + + Current status is: + + maxframesize = no restrictions + + if strict_ISO is defined, we use Gaby's less restrictive + interpretation of the standard. + + see TODO version 1.30 for a user who has a hardware player which + cannot handle 320kbps frames if the bit reservoir is used. + + I guess the final verdict is tough luck :-) + +2001-06-04 23:29 markt + + * API, HACKING, frontend/parse.c, libmp3lame/lame.c: + + + print error message and fail if user selects error_protection + (since this is currently broken) + + added some comments to HACKING on how to add a new option. + + updated API to reflect that all lame_set/get functions are now + working. + +2001-06-04 23:10 markt + + * include/lame.h, libmp3lame/lame.c: + + updated comments about lame_encode_flush_nogap() + +2001-06-04 23:08 markt + + * include/lame.h, libmp3lame/bitstream.c, libmp3lame/lame.c: + + added lame_encode_flush_nogap(). + + This routine will flush all internal mp3 buffers, and pad the + last frame with ancillary data so it is a complete mp3 frame. + + It will then set ResvSize to 0, so we can continue encoding. + + after a call to lame_encode_flush_nogap(), if we close + the mp3 file and open a new one for the future data, + then the two mp3 files should play back 'gapless' + if they are first concatenated together. + +2001-06-04 19:59 robert + + * frontend/parse.c, libmp3lame/lame.c, libmp3lame/quantize.c, + libmp3lame/version.h: + + tweaks to VBR + +2001-06-04 10:02 afaber + + * Dll/: BladeMP3EncDLL.c, BladeMP3EncDLL.h: + + Extended interface with VBR method selection + +2001-06-04 10:01 afaber + + * mpglib/layer3.c: + + Removed exit call(s) in error conditions, since these errors seems to be good recoverable + +2001-06-04 01:54 robert + + * libmp3lame/: lame.c, psymodel.c, quantize.c, util.h: + + small tweaks to the VBR codes + +2001-06-02 20:22 robert + + * libmp3lame/: lame.c, quantize.c, util.h, version.h: + + started different bit-pressure strategies (VBR) + +2001-06-02 15:26 aleidinger + + * configure: + + regen + +2001-06-02 15:25 aleidinger + + * configure.in: + + force cygwin users to use "CC=gcc ./configure" + +2001-06-01 19:40 glessard + + * frontend/get_audio.c: + + Added support for non-compressed AIFF-C files in parse_aiff_header(). + +2001-05-30 01:38 markt + + * configure, configure.in: + + removed -pedantic gcc option. + From the gcc man page: "There is no reason to use this + option; it exists only to satisfy pedants". + + And there is a reason not to use it: It causes people to + send me email asking if all the warning messages about c++ comments are ok. + +2001-05-29 22:14 robert + + * frontend/parse.c, include/lame.h, libmp3lame/encoder.c, + libmp3lame/lame.c, libmp3lame/set_get.c: + + quick fix for a typo that turned off auto adjust code by accident, sorry + +2001-05-27 18:58 robert + + * frontend/parse.c, libmp3lame/lame.c, libmp3lame/psymodel.c, + libmp3lame/quantize.c, libmp3lame/version.h: + + made JD's ATH adapt stuff default for --vbr-mtrh + some typings + changed bitpressure strategy for VBR a bit + +2001-05-26 21:31 jd- + + * libmp3lame/util.c: + + use more digestible code in ATHformula_jd for a pre-release compiler bundled + with a popular Linux distribution + +2001-05-26 16:17 robert + + * libmp3lame/lame.c: + + let the user select -qx for --vbr-mtrh, just to avoid useless e-mails + +2001-05-24 22:25 robert + + * libmp3lame/: lame.c, quantize_pvt.c: + + just 5 minutes to add some more on the --verbose printing side + +2001-05-21 18:55 bouvigne + + * doc/html/history.html: + + history + +2001-05-21 18:19 bouvigne + + * libmp3lame/lame.c: + + update of the default lowpass value. Will probably break some testcases + +2001-05-20 20:45 robert + + * libmp3lame/: encoder.c, lame.c, util.h: + + some more --verbose output + +2001-05-19 16:16 robert + + * libmp3lame/psymodel.c: + + typo fixed + +2001-05-19 16:13 robert + + * frontend/get_audio.c, frontend/main.c, frontend/parse.c, + frontend/timestatus.c, include/lame.h, libmp3lame/lame.c, + libmp3lame/psymodel.c, libmp3lame/util.h: + + starting a very verbose print function about all internal + settings, aiming more transparency for the experienced users + +2001-05-15 01:24 robert + + * libmp3lame/: psymodel.c, quantize_pvt.c, vbrquantize.c: + + some tunings + still problems with fatboy.wav and ns.wav + +2001-05-13 20:59 bouvigne + + * libmp3lame/util.c: + + comments in the ath functions + +2001-05-13 11:33 robert + + * libmp3lame/: lame.c, psymodel.c, util.c, util.h: + + fixing tonality problem for --vbr-mtrh + +2001-05-11 23:33 robert + + * libmp3lame/quantize_pvt.c: + + trying to point out the real difference in l3xmin calculation with nspsytune and without it + +2001-05-11 22:14 robert + + * libmp3lame/lame.c: + + nspsytune & newer vbr + +2001-05-11 01:30 robert + + * frontend/get_audio.c, frontend/main.h, include/lame.h, + libmp3lame/quantize.c, libmp3lame/quantize_pvt.c, + libmp3lame/version.h, test/VBR.op: + + compile fixes for Intel Compiler, dropped sfb21 early stopping for vbr-old (found differences) + +2001-05-10 19:01 aleidinger + + * include/lame.h, libmp3lame/set_get.c: + + - Make the last few set/get functions functional. + (TODO: use them in the frontend). + - Converted padding_type to an enum. + - Correct some typos. + - Adjust some lines to conform to the style of the majority of the file. + + TODO: + - Search for XXX and do appropriate actions. + - Search for typos (because of alot of cut&paste programming). + +2001-05-08 15:00 bouvigne + + * frontend/parse.c, libmp3lame/util.c: + + update of --r3mix + +2001-05-06 15:11 robert + + * libmp3lame/: lame.c, quantize.c, vbrquantize.c: + + some desperate values for the fast mtrh VBR mode + +2001-05-04 01:07 jd- + + * libmp3lame/: tools.h, util.c: + + Added "--athtype 5" to better represent higher frequencies (14 - 19 kHz). + Included supporting functions for quadratic interpolation. + +2001-05-03 20:13 robert + + * libmp3lame/: lame.c, quantize.c, util.c, util.h, vbrquantize.c: + + some VBR-codeclean-up + +2001-05-02 21:02 robert + + * misc/lame4dos.bat: + + patch by Alexander Stumpf: + - now works both with drag & drop (SFN) and from the 4DOS-Commandline (LFN) + - Using wildcards when prozessing from mp3 to mp3 caused a loop - fixed + - removed the mp3-extention test since LAME recognizes the input file fomat + correctly for several versions now (i.e. no --mp3input neccessary anymore) + +2001-05-01 22:55 robert + + * libmp3lame/version.h: + + bumped version number + +2001-05-01 22:18 robert + + * libmp3lame/: quantize.c, vbrquantize.c: + + new -q2 mode for --vbr-mtrh + +2001-05-01 20:37 bouvigne + + * libmp3lame/reservoir.c: + + change of max frame size + +2001-04-28 15:37 robert + + * libmp3lame/: encoder.c, quantize_pvt.c, util.c, vbrquantize.c: + + --vbr-mtrh uses now -Y by default, some tweaks + +2001-04-27 23:19 robert + + * libmp3lame/: psymodel.c, quantize_pvt.c, util.c, util.h: + + --experimentalY selects a different ATH adjustment + - keeps original noise floor + - affects high freqs more than low ones + +2001-04-26 23:06 cisc + + * config.guess, config.sub: + + Added MorphOS recognition to configure script. + +2001-04-26 04:38 markt + + * README.B32, TODO: + + removed mmx notes from README.B32 + +2001-04-25 16:21 aleidinger + + * configure, libmp3lame/i386/Makefile.in: + + regen + +2001-04-25 16:20 aleidinger + + * configure.in: + + bugfix for gcc version detection + +2001-04-25 16:19 aleidinger + + * libmp3lame/i386/Makefile.am: + + bugfix for non x86 architectures with installed nasm, tested by Karl Pauls on Darwin + +2001-04-25 06:59 markt + + * TODO, frontend/get_audio.c, frontend/main.h, frontend/parse.c, + include/lame.h, libmp3lame/set_get.c: + + removed 'disable_wave_header' variable from encoding library. + It is in the frontend code only. + +2001-04-24 01:38 markt + + * TODO, frontend/get_audio.c: + + added something to the TODO list. + + changed: + + "buffer[1]+i" code to "&buffer[1][i]" + + in get_audio.c. buffer[1]+i is clever, but it confused the + maintainer of EAC enough to cause him to submit it as a bug + report. + +2001-04-23 19:47 bouvigne + + * libmp3lame/: lame.c, util.c: + + [no log message] + +2001-04-22 22:57 bouvigne + + * libmp3lame/util.c: + + update of the ath functions + +2001-04-22 01:34 jd- + + * frontend/get_audio.c: + + Fixed trailing data bug introduced with the 24 bit input code + +2001-04-21 22:23 jd- + + * frontend/get_audio.c, frontend/get_audio.h, frontend/gtkanal.c, + frontend/main.c, frontend/mp3rtp.c, include/lame.h, + libmp3lame/lame.c: + + Add 24-bit PCM waveform input capability (with or without libsndfile), + and glue code to preserve the functionality of routines that only handle + up to 16-bit data. The changes support both little and big endian + architectures. + +2001-04-17 20:04 afaber + + * libmp3lame/libmp3lame.dsp, Dll/BladeMP3EncDLL.c, + mpglib/mpglib.dsp, frontend/lame.dsp: + + Added MMX compile option + +2001-04-17 19:22 bouvigne + + * libmp3lame/util.c: + + auto adjusting ath shape for vbr on ath type 4 + +2001-04-16 21:26 bouvigne + + * libmp3lame/: encoder.c, lame.c, psymodel.c: + + wrapped a few things inside of ifdef HAVE_GTK + +2001-04-16 11:50 takehiro + + * libmp3lame/: psymodel.c, util.h: + + spread function is now packed into linear array. + it reduces memory assumption and improves cache efficienty. + +2001-04-16 08:27 takehiro + + * include/lame.h, libmp3lame/VbrTag.c: + + now try to calculate the CRC of VBR header. + +2001-04-16 07:58 takehiro + + * libmp3lame/: bitstream.c, bitstream.h: + + cleaned and improved CRC calculation method + +2001-04-13 15:13 aleidinger + + * libmp3lame/set_get.c: + + add some comments about converting int->enum + +2001-04-13 15:12 aleidinger + + * frontend/parse.c: + + use some of Marks set-functions, also without error checking (yet) + +2001-04-12 17:40 bouvigne + + * libmp3lame/: encoder.c, lame.c: + + [no log message] + +2001-04-08 07:52 takehiro + + * libmp3lame/: machine.h, quantize_pvt.c: + + portability enchancement(from sourceforge's LAME open discussion forum). + + quantize_pvt.c: changed 1e99 into FLOAT8_MAX + machine.h: defined FLOAT8_MAX + +2001-04-04 21:58 bouvigne + + * libmp3lame/lame.c: + + update of the lowpass values for vbr rh + +2001-04-04 18:11 bouvigne + + * libmp3lame/psymodel.c: + + update of -d for joint stereo + +2001-04-01 03:22 jd- + + * frontend/parse.c, include/lame.h, libmp3lame/encoder.c, + libmp3lame/lame.c, libmp3lame/set_get.c, libmp3lame/util.h: + + added an --adapt-thres-level option to allow adding an offset (in dB) + to the point below which adaptive ATH level adjustment occurs + +2001-04-01 02:11 jd- + + * include/lame.h: + + added set/get functions to include/lame.h for option --adapt-thres-type + +2001-03-31 23:44 jd- + + * frontend/parse.c, libmp3lame/set_get.c: + + added set/get functions to libmp3lame/set_get.c for option + --adapt-thres-type, and used the set function in frontend + +2001-03-30 18:43 markt + + * testcase.mp3, frontend/get_audio.c, test/lametest.py: + + updated testcase.mp3 + removed some unused code from get_audio.c + +2001-03-30 17:16 markt + + * test/lametest.py: + + delete output mp3 file before running lame. + (before, if lame crashes and does not write any output, the + script would use the old output mp3 file, and if it hadn't changed, + all tests would pass.) + +2001-03-29 18:31 cisc + + * libmp3lame/: version.c, version.h: + + Moved inclusion of lame.h to version.h for lame_version_t in prototype. + +2001-03-27 12:26 jd- + + * libmp3lame/psymodel.c: + + added --adapt-thres-type 2 (auto-level adjustment of the ATH, + with a frequency-based loudness approximation). + +2001-03-27 12:04 jd- + + * frontend/parse.c, include/lame.h, libmp3lame/encoder.c, + libmp3lame/lame.c, libmp3lame/psymodel.c, libmp3lame/util.h: + + added option, --adapt-thres-type 2 (auto-level adjustment of the ATH + with a frequency-based loudness approximation). + +2001-03-27 10:56 aleidinger + + * configure: + + regen (do not enable vorbis by default) + +2001-03-27 10:56 aleidinger + + * configure.in: + + do not enable vorbis by default + +2001-03-26 23:02 markt + + * libmp3lame/set_get.c: + + added code to more of the lame_set/lame_get functions- + but without any error checking :-( + + Only 47 more to go! + +2001-03-26 20:46 markt + + * TODO, libmp3lame/util.c: + + dont scale the input if scale=1.0. + +2001-03-26 18:38 markt + + * TODO: + + updated TODO list with some filtering stuff + +2001-03-26 17:42 markt + + * libmp3lame/encoder.c: + + another MPEG2 bug found by: "Jiri Hajek" + + This code: + + > int sum_pe_MS = pe_MS[0][0] + pe_MS[0][1] + pe_MS[1][0] + pe_MS[1][1]; + > int sum_pe_LR = pe [0][0] + pe [0][1] + pe [1][0] + pe [1][1]; + + does not work for MPEG2. now fixed. + +2001-03-26 16:05 aleidinger + + * configure: + + regen (version bump) + +2001-03-26 16:04 aleidinger + + * configure.in: + + Welcome to 3.89 + +2001-03-26 00:38 markt + + * frontend/brhist.c: + + bug in brhist_disp_total() + + for --freeformat bmode, br_frames = 0 (why?) + so sum / br_frames would segfault. + + if br_frames == 0 , routine now just returns without printing + anything. + +2001-03-26 00:12 markt + + * TODO: + + minor editing of TODO file + +2001-03-25 23:18 markt + + * libmp3lame/version.h: + + updated version to 3.89 alpha 1 + +2001-03-25 23:16 markt + + * libmp3lame/version.h: + + updated version to 3.88beta + +2001-03-25 23:14 markt + + * API, README, TODO, libmp3lame/lame.c, libmp3lame/libmp3lame.dsp: + + made ath type 2 the default. + updated test cases + added set_get.c to libmp3lame.dsp + +2001-03-25 21:37 shibatch + + * libmp3lame/psymodel.c: + + Fixed nspsytune. + +2001-03-25 18:43 afaber + + * Dll/BladeMP3EncDLL.def, Dll/MP3EncDll.dsp, + libmp3lame/bitstream.h, libmp3lame/encoder.h, + libmp3lame/psymodel.c, libmp3lame/tables.h: + + Removed the last remainings of KLEMM_43 in order to complet the Windows DLL compilation + +2001-03-20 00:42 markt + + * libmp3lame/util.c: + + added a few more minor comments to resampling code + +2001-03-20 00:28 markt + + * libmp3lame/util.c: + + removed some cruft from blackman() filtering routine + +2001-03-19 21:26 markt + + * frontend/get_audio.c, libmp3lame/util.c, test/lametest.py: + + + Tested fixed resampling code. It seemed to work. + Added a few comments. + + Also added documentation for "-w" for the usage function in lametest.py + +2001-03-18 14:31 aleidinger + + * libmp3lame/vorbis_interface.c: + + use the new MSGF API in Vorbis + +2001-03-18 14:25 aleidinger + + * libmp3lame/vorbis_interface.c, frontend/get_audio.c: + + use the new ERRORF API in Vorbis encoding (+fixes for needed API change to lame_decode_ogg_{initfile,fromfile}()) + +2001-03-15 19:40 markt + + * libmp3lame/util.c: + + Put in fix for resampling bug in fill_buffer_resample. + + Code assumed it would be fed at least BLACKSIZE samples. + For each input buffer, the code would save the last BLACKSIZE + samples for use for the next call to fill_buffer_resample. + + If the code recieves less than blacksize samples, it will + now shift in just as many new samples as are available into + the save buffer. + + Not tested :-( + +2001-03-14 14:38 aleidinger + + * Dll/BladeMP3EncDLL.c, dshow/Encoder.cpp, dshow/Mpegac.cpp, + dshow/PropPage_adv.cpp: + + regexp: MPG_MD_(.*) -> $1 + +2001-03-14 14:38 aleidinger + + * Makefile.B32, Makefile.DJGPP, Makefile.MSVC, Makefile.unix: + + add set_get.c to the build + +2001-03-14 10:57 aleidinger + + * Makefile.in: + + regen + +2001-03-14 10:56 aleidinger + + * Makefile.am: + + do not forget Makfile.am.global at "make dist" + +2001-03-14 10:49 aleidinger + + * ChangeLog: + + update + +2001-03-14 10:40 aleidinger + + * doc/html/Makefile.in, doc/man/Makefile.in, + libmp3lame/i386/Makefile.in: + + regen with automake 1.4d instead of 1.4 + +2001-03-13 06:15 markt + + * libmp3lame/util.c: + + added assert() to resampling code + +2001-03-12 20:58 markt + + * libmp3lame/psymodel.c: + + a few more comments added to psymodel.c + +2001-03-12 20:40 markt + + * libmp3lame/: psymodel.c, tables.c: + + removed ISO TABLE reading code from psymodel.c, + and ISO psy data from tables.c + +2001-03-12 20:31 markt + + * libmp3lame/psymodel.c: + + removed shortlived MINTHMM experiment + +2001-03-12 18:52 markt + + * USAGE, configure: + + updated USAGE. + ran configuer with --enable-maintainer-mode which seems to + have touched all this .in files, sorry about that... + +2001-03-12 07:26 markt + + * API, libmp3lame/vbrquantize.c: + + a few updates to API + +2001-03-12 04:38 markt + + * frontend/get_audio.c, include/lame.h, libmp3lame/bitstream.c, + libmp3lame/bitstream.h, libmp3lame/encoder.c, + libmp3lame/encoder.h, libmp3lame/lame.c, libmp3lame/set_get.c: + + fixed a few compiler warnings and the assert in lame_get_mode(). + added NOT_SET value to MPEG_mode_e + +2001-03-11 11:25 aleidinger + + * DEFINES: + + - remove outdated entries + - add OLD_ATH_AUTO_ADJUST + +2001-03-11 11:24 aleidinger + + * Makefile.in: + + - regen from Makefile.am (testupdate target) + +2001-03-11 11:24 aleidinger + + * frontend/: depcomp, get_audio.c, gtkanal.c, main.c, mp3x.c, + parse.c, timestatus.c: + + *.c: + - use set/get functions + *** lame_set_quality(): should it check for <0 and >9 itself? (parse.c) + + depcomp: + - update (autotools) + +2001-03-11 11:23 aleidinger + + * libmp3lame/: depcomp, encoder.c, lame.c, psymodel.c, util.c, + util.h: + + libmp3lame/encoder.c: + - MPEG_mode (JOINT_STEREO) change (related to set/get functions change) + - J.D.s improvements to Gabriels ath auto adjust code (VBR) + - move ath auto adjust code into seperate function + + libmp3lame/lame.c: + - errorf/msgf/debugf changes + - MPEG_mode (JOINT_STEREO/...) change (related to set/get functions change) + - remove prototypes of set/get functions + + libmp3lame/psymodel.c: + - MPEG_mode (JOINT_STEREO/...) change (related to set/get functions change) + + libmp3lame/util.[ch]: + - new errorf/msgf/debugf implementation + + libmp3lame/depcomp: + - update (autotools) + +2001-03-11 11:22 aleidinger + + * include/lame.h: + + - set/get functions related cleanup + - errorf/msgf/debugf + +2001-03-11 11:21 aleidinger + + * libmp3lame/Makefile.in: + + regen + +2001-03-11 11:21 aleidinger + + * libmp3lame/Makefile.am: + + - add set_get.c + +2001-03-11 11:20 aleidinger + + * libmp3lame/set_get.c: + + - set and get functions for the gfp + +2001-03-10 19:15 markt + + * libmp3lame/encoder.c: + + a little more tuning of tot_energy for ATH adjust + +2001-03-10 19:06 markt + + * libmp3lame/encoder.c: + + modified ATH adjustment code to use tot_ener returned by psy model + and not the maximum of the PCM sample values. + + We need to replace this with JD's formula. We need to decide + if this is really worth while. My preference is to take the + most conservative ATH possible, but this seems to produce too + high bitrates for VBR modes. (this may no longer be true + not that masings are computed in all scalefactor bands) + +2001-03-10 18:33 markt + + * frontend/get_audio.c: + + added 127 also, on recommendation of JD, to 8bit -> 16bit + conversion routine + +2001-03-10 18:29 markt + + * frontend/get_audio.c: + + fix from "J.D." for + 8 bit input support. + +2001-03-09 17:56 markt + + * test/lametest.py: + + 'os.pathsep' changed to 'os.sep' + + For example, on unix: + + os.pathsep = ":" - the character that seperaters search paths in + the PATH environment variable + + os.sep = "/" - the charcter that seperates directories + +2001-03-07 12:32 aleidinger + + * test/lametest.py: + + - use OS independent path seperator + +2001-03-07 12:31 aleidinger + + * DEFINES: + + - NOTABELS is now the default + +2001-03-05 20:29 markt + + * libmp3lame/: lame.c, psymodel.c, quantize_pvt.c: + + code (disabled) to use minimum value when going from partition + bands to scalefactor bands (instead of average value) + +2001-03-05 18:21 markt + + * testcase.mp3, libmp3lame/psymodel.c, libmp3lame/quantize_pvt.c: + + Noise calculation: had to switch calculation of tot_noise and + over_noise back to being done in db units. Multiply (to save + the 22 log10() function calls) was overflowing. + + updated testcases to reflect changes + +2001-03-05 01:44 markt + + * testcase.mp3: + + updated testcase.mp3 for NOTABLES code + +2001-03-05 01:26 markt + + * libmp3lame/psymodel.c: + + NOTABLES enabled by default. + + Psycho acoustics computed in *all* scalefactor bands. + + cvs tag before this change: before_notables + cvs tag after this change: notables + +2001-03-05 01:25 markt + + * libmp3lame/psymodel.c: + + The last commit before NOTABLES becomes the default. + tagged with "before.notables" + +2001-03-04 20:03 markt + + * libmp3lame/: encoder.c, psymodel.c, psymodel.h, util.h: + + More prep work for enabling NOTABLES. + Will now compute masking for all scalefactor bands + +2001-03-04 15:30 markt + + * testcase.mp3, libmp3lame/psymodel.c, libmp3lame/util.c: + + Finished proper normalization of spreading function. + + updated testcases + +2001-03-04 06:56 markt + + * libmp3lame/psymodel.c: + + more tweaking of s3 normalization + +2001-03-04 06:48 markt + + * libmp3lame/psymodel.c: + + spreading function moved into seperate routine, s3_func(). + s3 normalized so that: + + +inf + / + | s3 [ bark ] d(bark) = 1 + / + -inf + + which resulted in dividing the result by 0.66. + + This is the first step in fixing the long outstanding bug + mentioned by Takehiro: s3[i][j] is normalized improperly for + values of i near the partition band boundaries. For these values, + the computed 'norm' is much too small since a lot of the data is + missing, resulting in artificially increasing the spreading function + (and thus the masking) + + --nspsytune: s3_l function is used with a normalization of .5 + (instead of computing the norm). So I changed this to a .5*.66 + to compensate for the above change. + + Next step: + + 1. + s3[i][j] will be multiplied by the width (in barks) of the + j'th partition band (about .35). Once this is done, we will not need to + compute and divide by 'norm' later. + + 2. + Make NOTABLES the default + + 3. + compute psymodel all the way up to 22khz. + +2001-03-04 05:51 markt + + * API, libmp3lame/lame.c, libmp3lame/util.c, libmp3lame/util.h: + + added prototypes to lame.c (but functions not yet written) + +2001-03-04 05:13 markt + + * include/lame.h: + + finished last of the prototypes + +2001-03-04 05:02 markt + + * frontend/get_audio.c: + + changed to: + + gfp->num_samples = data_length / (channels * ((bits_per_sample+7) / 8)); + + thanks J.D.! + +2001-03-04 00:20 markt + + * include/lame.h, libmp3lame/lame.c: + + added: + lame_encode_buffer_sample_t, which is called by the following functions + in the API: + + lame_encode_buffer (original, short int interface) + lame_encode_buffer_float + lame_encode_buffer_long + +2001-03-02 22:39 markt + + * frontend/get_audio.c, test/lametest.py: + + get_audio.c: fixed num_samples computation for case when + bits_per_sample < 8. (althouth this case is already trapped for + earlier) + + lametest.py: slight change to reference mp3 filename generation + so lametest.py can be run from another directory. + +2001-03-02 18:28 markt + + * Makefile.am, testcase.mp3, doc/html/Makefile.in, + doc/man/Makefile.in, frontend/get_audio.c, + libmp3lame/i386/Makefile.in: + + error message about non-PCM wave files from + "J.D." + + Added "make testupdate" to Makefile.am, which updates + the test file in the CVS repository + +2001-02-27 11:54 robert + + * include/lame.h, libmp3lame/lame.c: + + lame.h typo + lame.c fix for possibility of calling lame_init_parms twice + +2001-02-27 11:39 aleidinger + + * DEFINES: + + remove KLEMM_42 + +2001-02-27 11:38 aleidinger + + * configure, Makefile.in, frontend/Makefile.in, misc/Makefile.in: + + regen + +2001-02-27 11:37 aleidinger + + * frontend/Makefile.am, misc/Makefile.am: + + remove EXTRA_PROGRAMS on make clean + +2001-02-27 11:36 aleidinger + + * Makefile.am: + + remove testcase.new.mp3 on error + +2001-02-27 11:36 aleidinger + + * configure.in: + + display version of gcc + +2001-02-27 11:35 aleidinger + + * include/lame.h: + + fix typo in comment + +2001-02-27 11:33 aleidinger + + * libmp3lame/util.c: + + include machine/floatingpoint.h on FreeBSD + +2001-02-27 09:59 robert + + * libmp3lame/: VbrTag.c, bitstream.c, lame.c, quantize_pvt.h, + takehiro.c, util.c, util.h: + + VbrTag.c fixed gfp/gfc typo + lame.c made data flow analysis happier: there was a possible path to use channels before definition. Even though it would be an error following this path, but the compiler doesn't know it + util.hc message functions are not intended to change gfc?!? + takehiro.c fixed a warning + bitstream.c fixed a warning + +2001-02-27 06:14 markt + + * frontend/gtkanal.c, include/lame.h, libmp3lame/VbrTag.c, + libmp3lame/bitstream.c, libmp3lame/lame.c, libmp3lame/psymodel.c, + libmp3lame/quantize.c, libmp3lame/quantize_pvt.h, + libmp3lame/takehiro.c, libmp3lame/util.c, libmp3lame/util.h, + libmp3lame/vbrquantize.c: + + + Implmented Frank's excellent idea about error messages: + + gfc->errorf, gfc->msgf and gfc->debugf are all FILE *. + default is stderr. If you want to disable all internal library + messages, set these to NULL with lame_set_errorf(), lame_set_msgf() etc... + + For a GUI, you can set these to regular files, and then read + the files and display the messages in an pop up window. + + Maybe the default should be NULL? + +2001-02-27 05:17 markt + + * include/lame.h: + + plugging away at a few more prototypes + +2001-02-26 22:45 robert + + * frontend/parse.c, libmp3lame/util.c: + + little change to Roel's --r3mix setting, on request by Roel + +2001-02-26 19:08 markt + + * libmp3lame/VbrTag.c: + + non RH_SEEKTABLE code removed from VbrTag.c + +2001-02-26 18:57 markt + + * frontend/lametime.c: + + removed to //include lines + +2001-02-26 18:52 markt + + * frontend/: get_audio.c, lametime.c: + + + incomprehensible gobbledygook replaced by call to standard + 'stat' function for file size. + +2001-02-26 08:06 markt + + * include/lame.h: + + more prototypes added to lame.h + +2001-02-26 07:38 markt + + * USAGE, frontend/parse.c, libmp3lame/lame.c: + + useTemporal turned on by default + --notemp option added. + +2001-02-26 07:26 markt + + * include/lame.h: + + added more of the lame_get/lame_set prototypes to lame.h + + also added this: + + // I give up. Klemm has worn me down on this one... + typedef lame_global_flags lame_t; + +2001-02-26 06:34 markt + + * misc/Lame.vbs: + + lame.vbs changes submitted by "Paul Reedy" + +2001-02-25 22:47 markt + + * libmp3lame/vorbis_interface.c: + + removed a klemm_42 from vorbis_interface.c + +2001-02-25 22:47 markt + + * INSTALL, libmp3lame/lame.c, libmp3lame/vorbis_interface.c: + + klemm_42 enabled by default. + + This code uses a different formula to choose the lowpass + filter. It takes into account stereo vs. jstereo + (jstereo gets 25% more bandwidth). This has the effect + of stereo 128kbps using a 14khz lowpass filter, which some + people may not like. + +2001-02-25 22:02 markt + + * libmp3lame/lame.c, test/CBRABR.op: + + made allow_diff_short the default if mode=stereo and + allow_diff_short has not been set to 0 or 1 by the calling + program. + + addes these notes to lame_init_params() : + * + * We first have some complex code to determine bitrate, + * output samplerate and mode. It is complicated by the fact + * that we allow the user to set some or all of these parameters, + * and need to determine best possible values for the rest of them: + * + * set some CPU related flags + * check if we are mono->mono, stereo->mono or stereo->stereo + * compute bitrate and output samplerate: + * user may have set compression ratio + * user may have set a bitrate + * user may have set a output samplerate + * set some options which depend on output samplerate + * compute the actual compression ratio + * set mode based on compression ratio + * + * The remaining code is much simpler - it just sets options + * based on the mode & compression ratio: + * + * set allow_diff_short based on mode + * select lowpass filter based on compression ratio & mode + * set the bitrate index, and min/max bitrates for VBR modes + * disable VBR tag if it is not appropriate + * initialize the bitstream + * initialize scalefac_band data + * set sideinfo_len (based on channels, CRC, out_samplerate) + * write an id3v2 tag into the bitstream + * write VBR tag into the bitstream + * set mpeg1/2 flag + * estimate the number of frames (based on a lot of data) + * + * now we set more flags: + * nspsytune: + * see code + * VBR modes + * see code + * CBR/ABR + * see code + +2001-02-25 21:28 markt + + * frontend/parse.c: + + removed VBR warning + +2001-02-25 20:24 markt + + * libmp3lame/psymodel.c: + + edited a few comments in psymodel.c + +2001-02-25 20:17 markt + + * libmp3lame/encoder.c, libmp3lame/psymodel.c, + libmp3lame/psymodel.h, libmp3lame/util.h, test/nores.op: + + Started some re-originization of psymodel.c + created: + + psymodel_init() function, called by both psymodel and psymodel_ns. + + I was carefull to make sure no binary changes were introduced + with --nspsytune. + + Modified both psymodel and psymodel_ns to return the + energy in each channel. I'm going to request that the + ATH level adjust be based on the energy comptuted by the + psymodel, rather than computing a magnitude in encoder.c + +2001-02-25 17:37 markt + + * Dll/BladeMP3EncDLL.c, frontend/parse.c, include/lame.h, + libmp3lame/lame.c, libmp3lame/util.c, libmp3lame/util.h: + + removed mode_fixed variable. If calling program selects a mode + (mono, stereo, jstereo) then that mode is used, otherwise + lame picks best mode to use. + +2001-02-25 01:58 markt + + * include/lame.h: + + started adding more prototypes into lame.h: + + int lame_set_variable_name(lame_global_flags *, int) + int lame_get_variable_name(lame_global_flags *) + + _get will return the value (instead of an error code) + as suggested. + + _set will return an error code. But right now, the way lame + works there is no error checking until lame_init_params() is + called. This is because, for example, bitrate=135 + is not an error if free_format=1, but it is an error + for CBR. So many errors cannot be detected until all options + are set. + +2001-02-24 19:35 markt + + * include/lame.h, libmp3lame/util.h: + + commented out a uint_64_t field in util.h to get lame to + compile. Do we really need these types of variables? + + removed some stuff from lame.h. Note that many decisions have + already been made about the library interface, so if you are + planning on changing this, you need to check with me + (mark taylor) first. In particular, + there is going to be no file I/O, and all data is in + machine order. (no endian stuff in the library). + +2001-02-24 13:55 robert + + * Makefile.unix, configMS.h: + + get Makefile.unix working again (tested for Linux, not for OS/2 etc.) + +2001-02-21 21:17 robert + + * libmp3lame/lame.c: + + --vbr-mtrh related + +2001-02-21 17:07 robert + + * libmp3lame/vbrquantize.c: + + take sfb21 into consideration for median search + +2001-02-21 17:06 robert + + * libmp3lame/util.c: + + index transformation in select_kth_int() + +2001-02-21 14:59 aleidinger + + * test/lametest.py: + + do not print the passed/failed statistic in the makeref case + +2001-02-21 13:49 robert + + * frontend/parse.c, libmp3lame/lame.c: + + default quality handling fix + +2001-02-21 12:39 aleidinger + + * Dll/BladeMP3EncDLL.c: + + lame.h has to be included before version.h + +2001-02-20 18:34 aleidinger + + * Makefile.in, config.h.in, configure, configure.in, + frontend/brhist.c: + + - Patch (#103821) from guy_hutchison: + Fixes compilation problem on systems with ncurses dir + - add ChangeLog to Makefile.in + +2001-02-20 18:23 aleidinger + + * libmp3lame/: encoder.h, version.h: + + [no log message] + +2001-02-20 18:20 aleidinger + + * doc/html/: Makefile.am, Makefile.in: + + - add basic.html + +2001-02-20 18:20 aleidinger + + * configMS.h: + + - add LAME_LIBRARY_BUILD + +2001-02-20 18:20 aleidinger + + * libmp3lame/util.h: + + - more documentation, seems to be partially truncated (Frank) + - CPU_features is now a struct + +2001-02-20 18:19 aleidinger + + * libmp3lame/takehiro.c: + + - CPU_features is now a struct + +2001-02-20 18:19 aleidinger + + * libmp3lame/lame.c: + + - CPU_features is now a struct, no need to waste space for those + bolean values (Frank) + - introduce some KLEMM_44 protected code + +2001-02-20 18:18 aleidinger + + * libmp3lame/util.c: + + - fixes + docu for ATHformula_Frank() (Frank) + - don't compile old resampling in KLEMM_44 case + +2001-02-20 18:17 aleidinger + + * libmp3lame/version.c: + + - doxygen parseable documentation + - better lclint flags + - enable get_lame_version_numerical() + +2001-02-20 18:17 aleidinger + + * include/lame.h: + + - delete prototype of already removed get_lame_about() + - add get_lame_version_numerical() and lame_version_t + (now dshow didn't needs to include version.h to get the numerical + version of lame (dshow not changed, I let pgubanov do this)) + - introduce some KLEMM_44 protected code (Frank) + - rework formatting and documentation to be more (IMO much more) readable + (no lines longer than 80 chars, consistent formatting, looks alot cleaner) + +2001-02-20 10:41 aleidinger + + * DEFINES: + + Remove KLEMM_04, there was a previous commit which handled it, see + ChangeLog. + +2001-02-20 01:56 markt + + * DEFINES, frontend/brhist.c, frontend/get_audio.c, + frontend/timestatus.c: + + KLEMM 5,6,7 made the default & removed + +2001-02-20 00:40 markt + + * libmp3lame/lame.c: + + simplified lame_encoder_buffer_interleaved: it now always calls + lame_encoder_buffer() + +2001-02-20 00:30 markt + + * libmp3lame/: encoder.c, lame.c, util.c, util.h: + + fix for --scale problem? + + made a new routine: fill_buffer() + + This is the generic routine used to copy data from the input buffer + into lame's internal buffer, 'mfbuf[]'. + + It also calls the resample code if necessary, and the user selected + rescaling code if necessary. + +2001-02-20 00:26 markt + + * frontend/parse.c: + + added comment to vbr warning message + +2001-02-20 00:24 markt + + * frontend/parse.c: + + re-added the warning about VBR modes. It seems to have been deleted + at some point. + + This is because this website: + + http://www.kuro5hin.org/?op=displaystory;sid=2001/1/25/164540/759 + + is comparing Vorbis with lame -V4. + + While many people like the high bitrate VBR modes, + lame -V4 is *often* of lower quality than CBR. + +2001-02-19 18:29 aleidinger + + * test/VBR.op: + + - remove "--silent", lametest.py now handles this + + Aproved by: robert + +2001-02-19 18:28 aleidinger + + * test/lametest.py: + + - allow relative paths in a more portable manner + - should be more OS independand now + - more file checks (readable/executable) + - internally adds new option "--quiet" to the options + + This works on my system, it also should work on systems where the + previous version worked. It's not as portable as it could be, + search for XXX in the source. + +2001-02-18 21:18 robert + + * frontend/main.c, frontend/parse.c, libmp3lame/lame.c, + libmp3lame/version.h, test/VBR.op: + + new options --silent and --quiet to be really quiet + new option --verbose (default) to turn -S/--silent off again + --vbr-mtrh and --vbr-new use now ATH type 2 + for VBR modes it is allowed to use different block types in stereo mode (not yet joint stereo) + bumped version to 3.88 alpha 10 + +2001-02-18 12:11 aleidinger + + * dshow/: Makefile.am, Makefile.in: + + Add recently added files to the makefile. + +2001-02-17 15:45 pgubanov + + * dshow/Encoder.cpp: + + gfp is sometimes zero in CEncoder::Encode() - why??? + +2001-02-17 14:30 aleidinger + + * libmp3lame/: pcm.c, pcm.h: + + New code from Frank, some needed parts in different files aren't commited + yet, they produce huge differences with lametest.py even if KLEMM_44 isn't + defined. -> KLEMM_44 (new API + resampling) isn't usable yet + +2001-02-17 14:27 aleidinger + + * test/lametest.py: + + - use "/usr/bin/env python" instead of "/usr/bin/python" in shebang line + (portability) + - use "-l" instead of "--lines" for wc + (portability, has to run on every IEEE 1003.2 ("POSIX.2") compliant + system) + - bugfix, check for lame2 instead for lame1 in the lame2 part + (Note: the entire test didn't work for me if I use e.g. + ./lametest.py XXX.op ../../testcases/XXX ../../build.org/frontend/lame ...) + +2001-02-17 14:17 pgubanov + + * dshow/: aboutprp.cpp, aboutprp.h: + + Elecard copyrigth added (executives need it for some reason) + +2001-02-17 13:58 pgubanov + + * dshow/: Mpegac.cpp, Property.rc, UIDS.H, dshow.dsp, dshow.dsw, + elogo.ico, resource.h: + + Some stability improvements + Elecard copyrigth added (executives need it for some reason) + +2001-02-16 17:23 markt + + * doc/html/basic.html: + + added basic.html to cvs + +2001-02-16 10:35 pgubanov + + * dshow/dshow.dsp: + + STDC_HEADERS defined in project settings + +2001-02-16 10:33 pgubanov + + * libmp3lame/lame.c: + + mono handling in encode_buffer_interleaved caused access violation - fixed + +2001-02-14 22:22 aleidinger + + * ChangeLog: + + Now we have a ChangeLog, generated from the output of "cvs log" + +2001-02-14 22:21 aleidinger + + * ChangeLog.header: + + Header for the ChangeLog, not included at "make dist" + +2001-02-14 22:20 aleidinger + + * TODO: + + remove Makefile.MSVC, robert seems to keep it up to date + +2001-02-14 22:20 aleidinger + + * Makefile.B32: + + try to unbreak it, add configMS.h -> config.h (untested) + +2001-02-14 22:20 aleidinger + + * DEFINES: + + add USE_FFT3DN + +2001-02-14 22:19 aleidinger + + * INSTALL: + + * add some more info how to use some advanced features of our + configure script + * add some info for Cygwin users (use configure) + * add some info about faster code with nasm + +2001-02-14 20:50 robert + + * frontend/parse.c: + + added -V1 to Roel's --remix preset, I assume it was missing by accident + +2001-02-14 16:38 aleidinger + + * Makefile.am.global, Makefile.in, aclocal.m4, configure, + configure.in, Dll/Makefile.in, debian/Makefile.in, + doc/Makefile.in, doc/html/Makefile.in, doc/man/Makefile.in, + dshow/Makefile.in, frontend/Makefile.in, include/Makefile.in, + libmp3lame/Makefile.in, libmp3lame/i386/Makefile.in, + misc/Makefile.in, mpglib/Makefile.in: + + use new automake 1.4d (bugfixes) + +2001-02-14 14:43 robert + + * libmp3lame/: encoder.c, util.h: + + tuning of the auto ath adjustment for --vbr-mtrh mode + +2001-02-14 14:24 robert + + * libmp3lame/util.c: + + patch by Roel: + tweaking his ATH modification (--athtype 3) + +2001-02-13 18:27 markt + + * frontend/parse.c: + + fixed typo in parse.c + +2001-02-13 18:24 markt + + * libmp3lame/psymodel.c: + + added a lot of documentation on the psycho acoustics + to the top of psymodel.c + +2001-02-13 18:22 markt + + * mpglib/: common.c, common.h, interface.c: + + improved head_check() function: When resyncing data stream, + only look for headers of the same layer of the previous + frames. i.e. dont allow layer 2 and layer 3 frames in the + same stream. + +2001-02-13 18:21 markt + + * frontend/: get_audio.c, parse.c: + + added the --r3mix option + fixed bug with --decoder-mp3delay option + added error message for non-8 and 16 bit input + +2001-02-13 16:58 robert + + * frontend/parse.c, include/lame.h, libmp3lame/encoder.c, + libmp3lame/lame.c, libmp3lame/psymodel.c, + libmp3lame/quantize_pvt.c, libmp3lame/util.c, libmp3lame/util.h: + + first of all: this patch shows no difference in the CBR/ABR test + + - made athtype 3 default for VBR modes, 1 still default for CBR/ABR modes + - made athadjust default for VBR modes, CBR/ABR modes don't need it + - removed --athadjust switch, was only temporally solution + - collected all spreaded ATH settings into ATH_t struct + if someone needs a new ATH related variable, please add it here + +2001-02-12 18:24 markt + + * doc/html/: contributors.html, history.html, index.html, + node6.html, switchs.html: + + new html docs from Gabriel + +2001-02-12 17:47 markt + + * test/lametest.py: + + print total pass/fail message at end + +2001-02-09 16:47 robert + + * libmp3lame/quantize_pvt.c: + + patch by Gaby: + allow ATH adjust for the ATH only modes too + +2001-02-08 22:19 robert + + * test/VBR.op: + + update to the VBR python options file + +2001-02-07 15:51 robert + + * libmp3lame/: encoder.c, vbrquantize.c: + + all patches --vbr-mtrh related + + encoder.c: + - made a variant of Gaby's auto ATH adjust the default + + vbrquantize.c: + - some small code moves + - added some safety margin to the global gain + +2001-02-06 21:43 robert + + * libmp3lame/: psymodel.c, vbrquantize.c: + + we should not try to hard to get high freqs thru' + so I will let --vbr-mtrh as is. It seems to give + reasonable file sizes again, even with Frank's ATH. + +2001-02-05 10:18 robert + + * frontend/parse.c, include/lame.h, libmp3lame/encoder.c, + libmp3lame/quantize_pvt.c: + + re-check-in of Gaby's ATH auto adjustment code. + You need to specify --athadjust to get this + SUBSTANTIALLY QUALITY IMPROVEMENT + + quote: + "Also, we already have gfc->ath_lower (specified in db). + No reason to add another variable which does the same thing, + and does not even use the same units." + + That is not true, there is actually no gfc->ath_lower in dB. + We have a gfp->ATHlower in dB. But this is of a totally + different meaning. + gfp->ATHlower will lower the ATH for the whole file by a fixed + amount of x dB. + gfc->ath_auto_adjust will lower the ATH on a frame by frame basis + depending on the peak volume. + +2001-02-05 04:58 markt + + * frontend/parse.c: + + Added warning about using VBR modes. + This is because this website: + + http://www.kuro5hin.org/?op=displaystory;sid=2001/1/25/164540/759 + + is comparing Vorbis with lame -V4. + + While many people like the high bitrate VBR modes, + lame -V4 is *often* of lower quality than CBR. + +2001-02-05 02:36 shibatch + + * libmp3lame/psymodel.c: + + Reverted part of last tweaks of nspsytune. + +2001-02-05 02:27 markt + + * HACKING: + + updated HACKING with directions on how to run the + lametest.py python script + +2001-02-05 02:24 markt + + * test/: CBRABR.op, VBR.op, lametest.py, nores.op: + + Adding a python script used for testing, along with + some sample options files. + +2001-02-05 02:23 markt + + * HACKING, libmp3lame/encoder.c, libmp3lame/quantize_pvt.c: + + reverted encoder.c and quantize_pvt.c back to 13:00 3 Feb 2001. + These modifications broke my test cases. Any such changes need + aproval first. + + Also, we already have gfc->ath_lower (specified in db). + No reason to add another variable which does the same thing, + and does not even use the same units. + +2001-02-05 00:34 cisc + + * frontend/amiga_mpega.c: + + MPG_MD_LR_LR define was moved, set mode_ext to 0 instead (since we don't get that info anyway). + +2001-02-04 23:56 robert + + * frontend/parse.c, libmp3lame/lame.c, libmp3lame/vbrquantize.c: + + parse.c: small change in default behaviour for --vbr-mtrh + lame.c: it makes no sense for a sfb21 extra at sample frequencies below 44.1 kHz + vbrquantize.c: oops, last commit was a merger from a wrong branch of mine + +2001-02-04 23:28 shibatch + + * libmp3lame/quantize_pvt.c: + + Enabled auto-adjust ATH for nspsytune. + +2001-02-04 23:14 shibatch + + * libmp3lame/psymodel.c: + + Tweaked nspsytune. + +2001-02-03 23:20 robert + + * libmp3lame/: quantize_pvt.c, version.h: + + bumped version to alpha 9 + some clean-up + +2001-02-03 20:10 robert + + * libmp3lame/: encoder.c, quantize_pvt.c, util.c, util.h, + vbrquantize.c: + + patch by Gabriel Bouvigne: + auto adjust of ATH for low volume tracks + a big improvement in quality! + therefore on by default + + patch by Robert Hegemann: + further improvement of --vbr-mtrh mode + +2001-02-02 01:04 robert + + * libmp3lame/: quantize.c, quantize_pvt.c: + + --vbr-mtrh tweaks + +2001-01-31 19:44 aleidinger + + * configure, configure.in: + + bugfix + +2001-01-31 15:34 robert + + * libmp3lame/quantize.c: + + fix a typo I introduced by my last commit + +2001-01-31 12:53 aleidinger + + * Makefile.am.global, Makefile.in, acconfig.h, acinclude.m4, + aclocal.m4, config.h.in, configMS.h, configure, configure.in, + depcomp, Dll/Makefile.in, debian/Makefile.in, doc/Makefile.in, + doc/html/Makefile.in, doc/man/Makefile.in, dshow/Makefile.in, + frontend/Makefile.in, include/Makefile.in, + libmp3lame/Makefile.am, libmp3lame/Makefile.in, + libmp3lame/i386/Makefile.in, misc/Makefile.in, + mpglib/Makefile.in: + + - config*/Makefile*/ac*: + * tests for *int*_t + * test for 80 bit floats (for speed optimizations) + * add pcm.* to the makefile + * removed resample.[ch] from the makefile + * depend upon automake 1.4b + * fix in check for ccc + (submitted by nold via the sourceforge patch page at + the lame project page, patch id #103507) + * something I may have forgotten + + Note: + Please don't commit any Makefile.in if you didn't have + changed the corresponding Makefile.am. CVS didn't stores + the time stamps of the files at commit time, it stores + the time stamps of the commit time, so we have to commit + the files in the correct order, but I'm to lazy to do so + and I assume I'm not the only one. + The same applies to config*. + + - depcomp: + missing file, the dependancy tracking should work again + +2001-01-30 20:53 robert + + * libmp3lame/quantize.c: + + fixed a design flaw in VBR_iteration_loop() I'm responsible for. + affects quality! + +2001-01-30 20:52 robert + + * libmp3lame/: lame.c, quantize_pvt.c, vbrquantize.c: + + tuning of --vbr-mtrh mode + +2001-01-30 20:51 robert + + * frontend/parse.c, include/lame.h: + + patch by Gaby: + changed --athlower to accept floats + +2001-01-30 11:02 robert + + * libmp3lame/: psymodel.c, util.c: + + psymodel.c: fixing compile problem (was: M_LN10 undefined) + util.c: Roel's modification to Gaby's ATH, new: --athtype 3 + +2001-01-29 14:46 robert + + * libmp3lame/vbrquantize.c: + + --vbr-mtrh and --vbr-new use now the faster and sloppier + scalefactor-band noise calculation with quality settings + -q 3...9 + +2001-01-28 12:51 takehiro + + * libmp3lame/: quantize.h, util.h: + + oops, compile problem fix + +2001-01-28 12:39 takehiro + + * libmp3lame/: quantize.c, quantize.h, quantize_pvt.c, + vbrquantize.c: + + magic number 4095 and 4096 is removed + +2001-01-27 18:00 takehiro + + * libmp3lame/psymodel.c: + + make temporal masking effect strong. + +2001-01-27 17:52 takehiro + + * libmp3lame/quantize_pvt.c: + + debug message is removed :) + +2001-01-27 17:39 takehiro + + * frontend/parse.c, include/lame.h, libmp3lame/psymodel.c, + libmp3lame/quantize_pvt.c, libmp3lame/util.h: + + experimental temporal masking support. + "--temporal" option to use this. + +2001-01-26 22:47 robert + + * frontend/parse.c, libmp3lame/psymodel.c, libmp3lame/quantize.c, + libmp3lame/quantize_pvt.c, libmp3lame/vbrquantize.c: + + tuning of --vbr-mtrh VBR mode + +2001-01-25 20:57 robert + + * misc/abx.c: + + update by Frank: + some further endings and audio formats + +2001-01-24 23:59 robert + + * libmp3lame/quantize_pvt.c: + + found and fixed another BUG caused by the "bit optimization." patch + +2001-01-24 23:02 robert + + * libmp3lame/: pcm.c, pcm.h: + + updates by Frank + +2001-01-24 22:33 robert + + * Makefile.DJGPP, Makefile.unix: + + small config.h related tunings + +2001-01-24 21:33 robert + + * libmp3lame/vbrquantize.c: + + quick-fix for code that was broken by Takehiro's last + "bit optimization." in function calc_xmin(), quantize_pvt.c + +2001-01-23 12:50 takehiro + + * libmp3lame/quantize_pvt.c: + + bit optimization. + +2001-01-23 07:12 shibatch + + * libmp3lame/quantize.c: + + Bugfix of nspsytune. + +2001-01-22 23:00 afaber + + * Dll/BladeMP3EncDLL.c: + + VBR was always enabled, even when the client did not ask for it + +2001-01-22 19:54 aleidinger + + * libmp3lame/vorbis_interface.c: + + remove trailing garbage + +2001-01-22 09:31 shibatch + + * libmp3lame/: psymodel.c, quantize.c: + + Tweaked nspsytune. + +2001-01-22 04:35 markt + + * Makefile.in, configure, Dll/Makefile.in, debian/Makefile.in, + doc/Makefile.in, doc/html/Makefile.in, doc/man/Makefile.in, + dshow/Makefile.in, frontend/Makefile.in, frontend/parse.c, + include/Makefile.in, libmp3lame/Makefile.in, + libmp3lame/psymodel.c, libmp3lame/i386/Makefile.in, + misc/Makefile.in, mpglib/Makefile.in: + + fixed bug preventing -m a mode from working. + + ran autoconf which changed all the Makefile.in's + +2001-01-22 01:07 robert + + * libmp3lame/: pcm.c, pcm.h, vorbis_interface.c: + + patches by Frank: + + vorbis_interface: was/is broken since a long time + pcm.[ch]: fixing some transfer errors (email) + +2001-01-21 21:14 afaber + + * Dll/BladeMP3EncDLL.c: + + Fixed problems with writing the Xing MP3 header (gfc->internal_flags structure was already freed, while it was needed to write the Xing MP3 tag) + +2001-01-21 19:13 robert + + * libmp3lame/: pcm.c, pcm.h: + + patches by Frank: + + scalar.nas - new SIMD assembler routines + resample.[ch] - removed + pcm.[ch] - new, containing resampling routines and more + version.c - some clean up + +2001-01-21 19:06 robert + + * libmp3lame/: i386/scalar.nas, resample.c, resample.h, version.c: + + patches by Frank: + + scalar.nas - new SIMD assembler routines + resample.[ch] - removed + pcm.[ch] - new, containing resampling routines and more + version.c - some clean up + +2001-01-21 19:03 robert + + * frontend/lametime.c: + + it's always a good idea to include its own header file + +2001-01-20 09:51 robert + + * libmp3lame/util.c: + + patch by Gaby: + + I changed a file from the 19/01 cvs (I added an ath balanced between the + original one and Frank's one on the option --athtype 2) + +2001-01-19 09:08 shibatch + + * libmp3lame/: encoder.c, psymodel.c, quantize_pvt.c: + + Improved reservoir handling(nspsytune). + +2001-01-18 22:18 robert + + * libmp3lame/quantize_pvt.c: + + allow "--athlower n" to modify the ATH for sfb21 + +2001-01-18 13:04 aleidinger + + * Makefile.DJGPP: + + add config.h to the clean target + +2001-01-18 13:03 aleidinger + + * Makefile.DJGPP: + + bugfix (please report if it's broken, I can't test the config.h target) + +2001-01-17 21:32 robert + + * Makefile.unix: + + additional fixes + +2001-01-17 20:35 robert + + * libmp3lame/: VbrTag.c, util.c, util.h: + + RH_SEEK_TABLE enables a different method of generating TOC entries + in Xing VBR header. now enabled! + + PLEASE TEST TRY IT + + It should fix the problem poeple reported who encode radio shows or + alike which last a few hours. + Another advantage is, it will not steadily increase LAME's memory footprint + while running. + +2001-01-17 16:05 shibatch + + * libmp3lame/psymodel.c: + + Reverted the final change. + It degraded encoded quality of gspi*.wav. + +2001-01-17 13:26 shibatch + + * libmp3lame/psymodel.c: + + Tweaked nspsytune. + +2001-01-17 09:55 robert + + * Makefile.unix: + + try to fix the broken Makefile after latest configurification + +2001-01-17 09:54 robert + + * libmp3lame/newmdct.c: + + + replaced M_SQRT2 by SQRT2 which is defined in util.h + + replaced "=-" by "= -" to avoid confusion with the + old K&R "=-" operator, an equivalent to "-=". Even + though new compilers seem to handle it as an + assignement and unary minus sequence, but some + buggy compiler could be trapped here (as I). + +2001-01-16 13:08 robert + + * configMS.h: + + turned some defines for system include files on + +2001-01-16 09:04 robert + + * Makefile.MSVC: + + fixed typo, sorry + +2001-01-15 15:16 aleidinger + + * Makefile.am, Makefile.am.global, Makefile.in, config.h.in, + configMS.h, configure, configure.in, Dll/Makefile.am, + Dll/Makefile.in, debian/Makefile.am, debian/Makefile.in, + doc/Makefile.am, doc/Makefile.in, dshow/Makefile.am, + dshow/Makefile.in, frontend/Makefile.am, frontend/Makefile.in, + frontend/brhist.c, frontend/console.c, frontend/get_audio.c, + frontend/gpkplotting.c, frontend/main.c, frontend/mp3rtp.c, + frontend/parse.c, frontend/rtp.c, include/Makefile.am, + include/Makefile.in, libmp3lame/Makefile.am, + libmp3lame/Makefile.in, libmp3lame/id3tag.c, + libmp3lame/machine.h, misc/Makefile.am, misc/Makefile.in, + mpglib/Makefile.am, mpglib/Makefile.in, mpglib/common.c, + mpglib/decode_i386.c, mpglib/mpg123.h: + + automake/autoconf cleanup and enhancement + +2001-01-15 14:19 shibatch + + * libmp3lame/: encoder.c, psymodel.c, util.h: + + More cleanups and bugfixes of --nspsytune. + +2001-01-15 09:38 aleidinger + + * doc/html/Makefile.am: + + remove node[57].html + +2001-01-15 09:14 gramps + + * USAGE: + + Raised track limit from 99 to 255 per user requests. + +2001-01-15 09:10 robert + + * Makefile.B32, Makefile.MSVC, Makefile.unix: + + more RH_AMP clean up + +2001-01-15 08:58 gramps + + * frontend/parse.c, doc/html/id3.html: + + Raised track limit from 99 to 255 per user requests. + +2001-01-15 08:48 gramps + + * libmp3lame/id3tag.c: + + - Simplified prologue of all public functions, removing intermediate "spec" + variable, and assuming (like the rest of LAME) that gfp is never null. + - Fixed a stupid sizeof bug (mine) in "id3tag_init". + - Raised track limit from 99 to 255 per user requests. + - No longer write full text of genre in version 2 tag. Now write more + cannonical "(num)" format where "num" is the text version of the genre + number, more closely following the updated ID3v2.3 spec and usage in id3lib. + This also makes the tag smaller. + - Now use id3lib-compatible bogus language descriptor "XXX" in version 2 + comment frames instead of just null bytes. + - Changed order of frames written in version 2 tag to match version 1 tag. + - Restored some of Frank's optimizations. + - Fixed LAME URL. + - Reworded some comments and fixed misspellings. + - Moved "local_strcasecmp" back into its original position. + - Some small reformatting to match original file. + +2001-01-14 23:29 gramps + + * USAGE: + + - Changed "highest" to "higher" to describe recommended quality setting in + constant bit rate example. + + - Changed "CBR" to "VBR" to correct misspelling in variable bit rate + description. + +2001-01-14 22:40 gramps + + * doc/html/Makefile.in: + + Removed dependency on obsolete node5.html and node7.html. + +2001-01-14 22:35 markt + + * USAGE, frontend/parse.c: + + documentation of -q parameter in USAGE and lame --longhelp + +2001-01-14 22:13 markt + + * doc/html/: node5.html, node7.html: + + removed as per Gaby + +2001-01-14 22:12 markt + + * libmp3lame/: lame.c, quantize.c: + + created new routine lame_init_qval() which does all the + gfp->quality related settings. Cleaned up some more RH_AMP code: + The only way to enable scalefac_scale right now is with + -Z or --nspsytune. + +2001-01-14 21:01 markt + + * testcase.mp3: + + updated test case + (Takehiro fixed a bug which I introduced, which changes test cases). + +2001-01-14 17:25 aleidinger + + * DEFINES, Makefile.in, aclocal.m4, config.guess, config.sub, + configure, configure.in, missing, mkinstalldirs, Dll/Makefile.am, + Dll/Makefile.in, debian/Makefile.in, doc/Makefile.in, + doc/html/Makefile.in, doc/man/Makefile.in, dshow/Makefile.in, + frontend/Makefile.in, frontend/depcomp, include/Makefile.in, + libmp3lame/Makefile.in, libmp3lame/depcomp, + libmp3lame/i386/Makefile.in, misc/Makefile.in, misc/depcomp, + mpglib/Makefile.in, mpglib/depcomp: + + DEFINES: + remove obsolete defines + + configure*: + minor cleanup + + Makefile*: + - minor cleanup + - use automake 2.14b + + Added files: + needed for new automake + + rest: + updated automake files + +2001-01-14 15:40 aleidinger + + * misc/abx.c: + + there are encoders with different delays on different channels (Frank) + +2001-01-14 12:21 shibatch + + * libmp3lame/lame.c: + + Enabled scalefac_scale if --nspsytune is specified. + +2001-01-14 12:02 takehiro + + * testcase.mp3: + + fixed new amp_scalefac_bands + (it may use "trigger" variable without any initialization) + +2001-01-14 09:42 takehiro + + * libmp3lame/quantize.c: + + minor bug fix. + when subblock gain=1 and scalefactor is -1(means no need to calculate), + LAME will try to check the quantization with meanless scalefactor combination. + +2001-01-14 09:39 takehiro + + * libmp3lame/quantize.c: + + subblock_gain is 3-bit and its limit is 7, not 8. + +2001-01-14 09:35 takehiro + + * libmp3lame/quantize.c: + + oops, conflicts are removed + +2001-01-14 09:31 takehiro + + * libmp3lame/: quantize.c, quantize_pvt.c, quantize_pvt.h: + + to store the distortion into III_psy_xmin structure, not simple array. + this may make array pointer calculation easier and bring some speed up. + +2001-01-14 09:26 shibatch + + * libmp3lame/: encoder.c, psymodel.c, psymodel.h: + + Cleanup and small speed optimization of --nspsytune. + +2001-01-14 08:17 markt + + * API: + + one minor update to the API file + +2001-01-14 08:13 markt + + * testcase.mp3, libmp3lame/lame.c, libmp3lame/quantize.c: + + made a new, simpler unified amp_scalefac_bands(): + + * distort[] = noise/masking + * distort[] > 1 ==> noise is not masked + * distort[] < 1 ==> noise is masked + * max_dist = maximum value of distort[] + * + * Three algorithms: + * noise_shaping_amp + * 0 Amplify all bands with distort[]>1. + * + * 1 Amplify all bands with distort[] >= max_dist^(.5); + * ( 50% in the db scale) + * + * 2 Amplify first band with distort[] >= max_dist; + * + * + * For algorithms 0 and 1, if max_dist < 1, then amplify all bands + * with distort[] >= .95*max_dist. This is to make sure we always + * amplify at least one band. + * + + noise_shaping_amp=0 -q3 .. -q9 + noise_shaping_amp=1 -q2 + noise_shaping_amp=2 -q1, -q0 + + --nspsytune was using what is now noise_shaping_amp=2, but the only + way to get this now is to use --nspsytune -q1. + Naoki: is this a problem? + + I also defaulted the clever RH_AMP stoping criterion in + outer_loop. + +2001-01-14 05:36 markt + + * libmp3lame/: lame.c, psymodel.c, quantize.c, quantize_pvt.c, + util.h, vbrquantize.c: + + some tuning of VBR masking_lower because of new ATH function. + Disabled VBR_q based lowering of ATH. Is this still needed? + You can always achieve the same effect with --athlower option. + +2001-01-13 18:01 aleidinger + + * Makefile.am, Makefile.in, configure, configure.in, + Dll/Makefile.in, debian/Makefile.am, debian/Makefile.in, + doc/Makefile.in, doc/html/Makefile.in, doc/man/Makefile.in, + dshow/Makefile.am, dshow/Makefile.in, frontend/Makefile.am, + frontend/Makefile.in, include/Makefile.in, + libmp3lame/Makefile.am, libmp3lame/Makefile.in, + libmp3lame/i386/Makefile.am, libmp3lame/i386/Makefile.in, + misc/Makefile.in, mpglib/Makefile.am, mpglib/Makefile.in: + + "make dist" related: + - add debian subdir + - add missing files + + different builddir related: + - change argument to -l option for nasm + +2001-01-13 17:40 aleidinger + + * libmp3lame/Makefile.in.old: + + obsolete + +2001-01-13 17:36 aleidinger + + * frontend/Makefile.in.old: + + obsolete + +2001-01-13 13:45 takehiro + + * libmp3lame/newmdct.c: + + bit coding hack and cleanup + +2001-01-13 12:55 takehiro + + * Makefile.in, Dll/Makefile.in, doc/Makefile.in, + doc/html/Makefile.in, doc/man/Makefile.in, dshow/Makefile.in, + frontend/Makefile.in, include/Makefile.in, + libmp3lame/Makefile.in, libmp3lame/i386/Makefile.in, + misc/Makefile.in, mpglib/Makefile.in: + + automake generated + +2001-01-13 12:54 takehiro + + * libmp3lame/: fft.c, i386/Makefile.am, i386/fft3dn.nas: + + now LAME supports 3dnow! fft + +2001-01-13 10:37 pgubanov + + * dshow/Encoder.cpp: + + Removed (char*) cast in lame_encode_buffer() call + +2001-01-12 19:20 markt + + * debian/: changelog, control, copyright, lame-dev.docs, + lame-dev.files, lame-extras.files, lame.docs, lame.files, rules: + + added debian files from Ingo Saitz + +2001-01-12 19:17 markt + + * debian/: cron.d.ex, dirs, docs, emacsen-install.ex, + emacsen-remove.ex, emacsen-startup.ex, ex.doc-base.package, + files, init.d.ex, manpage.1.ex, manpage.sgml.ex, menu.ex, + postinst.debhelper, postinst.ex, postrm.ex, preinst.ex, + prerm.debhelper, prerm.ex, substvars, watch.ex: + + New Debian package from Ingo Saitz + +2001-01-12 19:11 markt + + * README.Debian: + + removed README.Debian + +2001-01-12 11:13 aleidinger + + * misc/abx.c: + + further improvements, e.g. reduced latency (Frank) + +2001-01-11 22:37 markt + + * HACKING, frontend/mp3rtp.c, frontend/mp3x.c: + + updated mp3rtp.c and mp3x.c to use lame_global_flags *lame_init() + (lame allocates storage for lame_global_flags) + rather than lame_init_old(&gf) which required calling + program to instantiate gf. + + Now we need to start writing one routine for every parameter: + + lame_set_bitrate + lame_set_num_channels + etc... + +2001-01-10 16:03 aleidinger + + * frontend/lame.dsp, frontend/mp3x.dsp, libmp3lame/libmp3lame.dsp, + mpglib/mpglib.dsp: + + work around for a bug in VC (Todd Richmond) + +2001-01-09 15:15 aleidinger + + * misc/abx.c: + + bugfixes + +2001-01-08 18:15 aleidinger + + * DEFINES: + + removed KLEMM_12, on by default + +2001-01-08 18:07 aleidinger + + * libmp3lame/vbrquantize.c: + + Roberts VBR code: speed improvement for vbr-mtrh (ping pong patch, OKed by Mark) + +2001-01-07 23:47 markt + + * frontend/: portableio.c, timestatus.c: + + chage to KLEMM-36 from Frank + +2001-01-07 22:53 markt + + * frontend/timestatus.c, libmp3lame/psymodel.c: + + undefined variable (last = 0, line 214) in timestatis.c + commented out. + + fixed some dimensions in the funtion prototype of l3para_read + +2001-01-07 22:35 markt + + * frontend/timestatus.c: + + Applied Frank's patch (from mp3encoder) to timestatus.c + with -R. I hope I didn't undo this by mistake! + +2001-01-07 22:33 markt + + * frontend/timestatus.c: + + added a brhist_jump_back() to timestatus_klemm(). + sent to me by Magnus Holmgren. + +2001-01-07 22:28 markt + + * USAGE, frontend/parse.c, include/lame.h, libmp3lame/encoder.c, + libmp3lame/lame.c, libmp3lame/psymodel.c: + + added the "-ma" option. + Ultimate goal: + 8 kbps Mono + 16- 96 kbps Intensity Stereo (if available, otherwise Joint Stereo) + 112-128 kbps Joint Stereo -mj + 160-192 kbps something between -mj and -ms + 224-320 kbps Independent Stereo -ms + + currently enables KLEMM_12. KLEMM_12 is gone. + +2001-01-07 16:17 aleidinger + + * libmp3lame/lame.c: + + Don\'t change floatingpoint mask for FreeBSD on Alpha hardware, obtained from FreeBSD-Ports + +2001-01-07 14:48 aleidinger + + * misc/abx.c: + + cleanup, no functional change + +2001-01-07 14:47 aleidinger + + * Dll/Example.dsw, Dll/MP3EncDll.dsw, dshow/dshow.dsw, + frontend/lame.dsw, frontend/mp3x.dsw, misc/abx.c: + + fix *.dsw + new version of abc.c (Frank) + +2001-01-07 09:14 markt + + * frontend/: mp3rtp.c, mp3x.c: + + global variables used by frontend code are now instantiated + in parse.c. + + Before, the were defined external in main.h, and instantiated + in the frontend, meaning they had to appear in mp3x.c, main.c + and mp3rtp.c + + we need to get rid of these! + +2001-01-07 09:11 markt + + * frontend/main.c, frontend/main.h, frontend/parse.c, + libmp3lame/lame.c: + + more tweaks to the --decode-mp3delay option + +2001-01-07 08:28 markt + + * libmp3lame/: lame.c, quantize.c, util.h: + + added a variable, noise_shaping_amp. It does nothing right now. + +2001-01-07 08:24 markt + + * frontend/: main.c, main.h, parse.c: + + added a undocumented option --decode-mp3delay + to allow someone to adjust the number of samples + lame --decode will truncate. David Robinson requirested this + since he didn't like that lame --decode would truncate 1106 samples + (assuming a encoder delay of 576) since BladeEnc has an encoder delay + of only 528.) + +2001-01-07 05:25 markt + + * frontend/main.c, libmp3lame/util.c: + + main.c: uses lame_init() instead of lame_init_old(). + util.c: added frank's changes: 32 point filter instead of 19. + prep work for frank's new resampling/filtering code. + updated test cases. + +2001-01-06 23:12 markt + + * libmp3lame/: lame.c, psymodel.c, quantize_pvt.c, util.c: + + ATHformula modifed to work in Hz instead of Khz. + + Minor change to a bunch of routines + regeneration of + test cases. + +2001-01-06 22:57 markt + + * testcase.mp3: + + updated testcase + +2001-01-06 22:55 markt + + * libmp3lame/fft.c: + + Switched to the Blackman window for the FFT energy estimator. + This is just to merge some nspsytune code into default + +2001-01-06 07:40 gramps + + * libmp3lame/id3tag.c: + + Backed out some large changes done in November which introduced at least two bugs. Also fixed other older bug in id3tag_write_v2. + +2001-01-06 01:11 markt + + * include/lame.h, libmp3lame/lame.c, libmp3lame/psymodel.c: + + more prep work to remove all psycho acoustic tables + +2001-01-06 01:00 markt + + * libmp3lame/: VbrTag.h, lame.c, mpglib_interface.c, psymodel.c: + + added formulas to replace the last of the table data. + some changes to reflect that Xing VBR header parsing code + has been moved into mpglib + +2001-01-05 22:15 markt + + * mpglib/: interface.c, mpglib.h: + + added XingVBR header parsing code + +2001-01-05 22:13 markt + + * frontend/: get_audio.c, gtkanal.c: + + fixed bug in frame analyzer when analyzing mp3 files. + frame counter incremented too soon. This was introduced + when someone (maybe me, but I dont remember!) replaced the + use of gfp->frameNum with a global variable limited in scope to + just gtkanal.c + + get_audio.c: removed VBR Xing header checking code. + this has been moved into mpglib. + +2001-01-05 15:26 aleidinger + + * Makefile.in.old, configure.in.old: + + obsolete + +2001-01-05 15:20 aleidinger + + * Makefile.B32, Makefile.unix, frontend/brhist.c, + frontend/get_audio.c, frontend/gpkplotting.c, frontend/gtkanal.c, + frontend/lame.dsp, frontend/lametime.c, frontend/main.c, + frontend/mp3rtp.c, frontend/mp3x.c, frontend/mp3x.dsp, + frontend/parse.c, frontend/portableio.c, frontend/rtp.c, + frontend/timestatus.c, libmp3lame/VbrTag.c, + libmp3lame/bitstream.c, libmp3lame/debugscalefac.c, + libmp3lame/encoder.c, libmp3lame/fft.c, libmp3lame/id3tag.c, + libmp3lame/lame.c, libmp3lame/libmp3lame.dsp, + libmp3lame/mpglib_interface.c, libmp3lame/newmdct.c, + libmp3lame/psymodel.c, libmp3lame/quantize.c, + libmp3lame/quantize_pvt.c, libmp3lame/resample.c, + libmp3lame/reservoir.c, libmp3lame/tables.c, + libmp3lame/takehiro.c, libmp3lame/util.c, + libmp3lame/vbrquantize.c, libmp3lame/version.c, + libmp3lame/vorbis_interface.c, misc/abx.c, mpglib/common.c, + mpglib/dct64_i386.c, mpglib/decode_i386.c, mpglib/interface.c, + mpglib/layer1.c, mpglib/layer2.c, mpglib/layer3.c, + mpglib/mpglib.dsp, mpglib/tabinit.c: + + misc/abx.c: (Frank Klemm) + - level adjustment + - clean up + - A-B repeat ("chunks") + + Makefile.*: + - nuke NOTERMCAP, it's HAVE_TERMCAP now + (defined where neccessary, please report slipped in breakage) + + (frontend|mp3x|libmp3lame|mpglib).dsp: + - copy configMS.h config.h (Todd Richmond) + - unbreak (Todd Richmond) + - nuke NOTERMCAP + - change HAVE([A-Z]*) to HAVE_$1 + + *.c: + - get rid of configMS.h, we finally have support in *.dsp + +2001-01-03 13:06 aleidinger + + * Makefile.DJGPP, Makefile.am, Makefile.in, Makefile.unix, + aclocal.m4, config.h.in, configure, configure.in, + frontend/Makefile.am, frontend/Makefile.in, frontend/brhist.c, + frontend/console.c, frontend/get_audio.c, frontend/gpkplotting.c, + frontend/gtkanal.c, frontend/lametime.c, frontend/main.c, + frontend/mp3rtp.c, frontend/mp3x.c, frontend/parse.c, + frontend/portableio.c, frontend/rtp.c, frontend/timestatus.c, + libmp3lame/VbrTag.c, libmp3lame/bitstream.c, + libmp3lame/debugscalefac.c, libmp3lame/encoder.c, + libmp3lame/fft.c, libmp3lame/id3tag.c, libmp3lame/lame.c, + libmp3lame/mpglib_interface.c, libmp3lame/newmdct.c, + libmp3lame/psymodel.c, libmp3lame/quantize.c, + libmp3lame/quantize_pvt.c, libmp3lame/resample.c, + libmp3lame/reservoir.c, libmp3lame/tables.c, + libmp3lame/takehiro.c, libmp3lame/util.c, + libmp3lame/vbrquantize.c, libmp3lame/version.c, + libmp3lame/vorbis_interface.c, misc/Makefile.am, + misc/Makefile.in, mpglib/common.c, mpglib/dct64_i386.c, + mpglib/decode_i386.c, mpglib/interface.c, mpglib/layer1.c, + mpglib/layer2.c, mpglib/layer3.c, mpglib/tabinit.c: + + Makefile.{unix,DJGPP}: Bugfixes (Includes) + Makefile.am: follow the move of some scripts to misc + *: add dmalloc support (configure --with-dmalloc) + (it seems we have a memleak somewhere, I will have a closer look soon) + +2001-01-03 11:51 shibatch + + * libmp3lame/: psymodel.c, encoder.c: + + Tweaking and bugfix of --nspsytune. + +2001-01-02 06:02 markt + + * frontend/get_audio.c, libmp3lame/encoder.c: + + typo in read_samples_pcm fixed + +2001-01-01 17:35 markt + + * API, HACKING: + + minor edits to API and HACKING + +2001-01-01 17:26 markt + + * Lame.vbs, README.WINGTK, TODO, USAGE, lame4dos.bat, + misc/Lame.vbs, misc/lame4dos.bat: + + moved some more scripts into 'misc' directory + +2001-01-01 17:12 markt + + * INSTALL, README.WINGTK, USAGE, auenc, mlame, + frontend/README.Win32, misc/auenc, misc/mlame: + + moved scripts into misc directory + moved README.Win32 (which described compiling mp3x under windows) + back to its original name, README.WINGTK + minor updates to INSTALL and USAGE + +2000-12-27 13:13 aleidinger + + * misc/abx.c: + + - listen to the difference of both signals + - highlighting of "errors" + - DC canceling + - support for monaural signals + - cleanup + - bugfixes + - correct shell quoting + +2000-12-25 10:49 shibatch + + * frontend/parse.c, libmp3lame/lame.c, libmp3lame/quantize_pvt.c, + libmp3lame/util.h: + + Tweaked --nspsytune. + +2000-12-22 15:36 aleidinger + + * misc/abx.c: + + now with cross correlation (Frank) + +2000-12-20 22:55 aleidinger + + * misc/abx.c: + + - files to test have to have the same samplerate (Frank) + - check for correct number of arguments (Alexander) + +2000-12-20 15:14 aleidinger + + * DEFINES, libmp3lame/psymodel.c, libmp3lame/tables.c, + libmp3lame/tables.h: + + Patches for KLEMM_43 protected code + +2000-12-19 13:09 aleidinger + + * DEFINES, libmp3lame/lame.c, libmp3lame/psymodel.c, + libmp3lame/quantize.c, libmp3lame/quantize_pvt.c, + libmp3lame/reservoir.c, libmp3lame/tables.c, + libmp3lame/vbrquantize.c: + + Ping pong #3, OKed by Mark. + +2000-12-19 08:16 markt + + * LICENSE: + + simplifed the LICENSE file describing how to use + LAME in commercial software + +2000-12-19 07:51 markt + + * INSTALL, README, README.B32: + + updated README files with new configure information. + debuging statement added to interface.c, then removed. + +2000-12-19 07:46 markt + + * frontend/: brhist.c, get_audio.c: + + more size_t's removed + +2000-12-19 07:43 markt + + * frontend/: main.c, mp3rtp.c, parse.c, rtp.c, rtp.h: + + removed some size_t's. + Added some windows code to rtp.c/mp3rtp.c: It is supposed to + be much improved: + + LAME is really great project. + + However, RTP code for multicasting isn't very good. + + I've attached some modification, and tested it on Win NT4 and Win2K with + FreeAmp on ordinary 10 and 100 Mbit Ethernet with encoding in neverending + loop. It was running one week w/o any probs. + + I would like to please you to not include my name anywhere (there are + several reason why, at the moment). + + However, code is very MSVC specific, so it is commented out + with #if 0. Most of the code was added to the end of rtp.c. + +2000-12-19 07:00 markt + + * frontend/main.c: + + deleted stupid C++ typecasts. LAME is written in C. + integer arguments to fwrite() do not need typecasts. + +2000-12-16 05:43 shibatch + + * libmp3lame/: lame.c, psymodel.c: + + 1. Old ATH formula is now default for --nspsytune. + 2. Tweaked a parameter of --nspsytune. + 3. Minor code cleanup. + +2000-12-14 13:32 aleidinger + + * Makefile.in, configure, Dll/Makefile.in, doc/Makefile.in, + doc/html/Makefile.in, doc/man/Makefile.in, dshow/Makefile.in, + frontend/Makefile.in, include/Makefile.in, + libmp3lame/Makefile.in, libmp3lame/i386/Makefile.in, + misc/Makefile.in, mpglib/Makefile.in: + + regen + +2000-12-14 13:31 aleidinger + + * configure.in, libmp3lame/i386/Makefile.am: + + force nasm to generate coff output when building under cygwin (Egor Duga) + +2000-12-14 10:05 aleidinger + + * Makefile.in, config.h.in, configure, Dll/Makefile.in, + doc/Makefile.in, doc/html/Makefile.in, doc/man/Makefile.in, + dshow/Makefile.in, frontend/Makefile.in, include/Makefile.in, + libmp3lame/Makefile.in, libmp3lame/i386/Makefile.in, + misc/Makefile.in, mpglib/Makefile.in: + + regen + +2000-12-14 10:04 aleidinger + + * Makefile.DJGPP, Makefile.am, Makefile.unix, configMS.h, + configure.in, frontend/Makefile.am, libmp3lame/Makefile.am, + libmp3lame/i386/Makefile.am, mpglib/Makefile.am: + + configure.in: + - determine the size of various types at configure time + - add --enable-debug=anoying + + configMS.h: + - add SIZEOF_... defines, see configure.in + + Makefile.unix: + - bugfix from Robert (shame on me) + + Makefile.DJGPP: + - add cpu_feat.nas and scalar.nas to the build with NASM + + Submitted by Egor Duda (thank you, works great): + * Makefile.am: add $(EXEEXT) to executables for cygwin build + * Makefile.am: take source .wav file from srcdir + * configure.in: require autoconf 2.13 + * configure.in: check for executable files extension + * frontend/Makefile.am: use builddir to get autogenerated headers + and libraries from, in case we're doing build in separate directory; + take normal headers from srcdir instead of current. + * libmp3lame/Makefile.am: ditto + * libmp3lame/i386/Makefile.am: ditto + * mpglib/Makefile.am: ditto + +2000-12-13 02:28 shibatch + + * libmp3lame/lame.c: + + Minor bugfix. + +2000-12-13 02:21 shibatch + + * libmp3lame/psymodel.c: + + Minor bugfix of --nspsytune. + (forgot to merge.) + +2000-12-12 04:50 shibatch + + * frontend/parse.c, include/lame.h, libmp3lame/encoder.c, + libmp3lame/lame.c, libmp3lame/psymodel.c, libmp3lame/quantize.c, + libmp3lame/quantize_pvt.c, libmp3lame/util.c, libmp3lame/util.h: + + Added option --athtype which selects ATH formula. + + Some major changes to --nspsytune. + 1. --nspsytune doesn't use pe. + 2. MS psymodel is modified. Added new option --nssafejoint. + 3. some more tunings of short block preecho control. + +2000-12-12 01:11 markt + + * libmp3lame/: lame.c, util.c: + + + Latest checkin from Alex include an rewritten 'Bitrate()' routine. + + This breaks the --abr code, since new routine considers a bitrate of 0 + invalid. Now fixed. + +2000-12-11 22:15 markt + + * misc/Makefile.am: + + added mlame_corr.c to the + EXTRA_DIST line of Makefile.am + +2000-12-11 16:03 aleidinger + + * DEFINES, Makefile.in, frontend/main.c, include/lame.h, + libmp3lame/encoder.c, libmp3lame/encoder.h, libmp3lame/fft.c, + libmp3lame/fft.h, libmp3lame/lame.c, + libmp3lame/mpglib_interface.c, libmp3lame/newmdct.c, + libmp3lame/newmdct.h, libmp3lame/psymodel.c, + libmp3lame/psymodel.h, libmp3lame/quantize_pvt.h, + libmp3lame/util.c, libmp3lame/util.h, libmp3lame/vbrquantize.c, + libmp3lame/vorbis_interface.c, mpglib/interface.c, + mpglib/interface.h: + + tries to include every change before the CVS rollback which didn't changes output + +2000-12-11 14:48 aleidinger + + * frontend/gtkanal.c, libmp3lame/bitstream.c, libmp3lame/encoder.c, + libmp3lame/lame.c, libmp3lame/newmdct.c, libmp3lame/psymodel.c, + libmp3lame/quantize.c, libmp3lame/quantize_pvt.c, + libmp3lame/reservoir.c, libmp3lame/util.c, libmp3lame/util.h, + libmp3lame/vbrquantize.c, libmp3lame/vorbis_interface.c: + + redo gfc->stereo -> gfc->channels_out conversation + +2000-12-11 01:32 markt + + * USAGE: + + updated info regarding the MAD decoder + +2000-12-11 00:34 markt + + * Makefile.am, libmp3lame/lame.c: + + applied patch for cygwin FPE stuff + +2000-12-11 00:01 markt + + * USAGE, configure, configure.in, mlame_corr.c, + frontend/get_audio.c, frontend/get_audio.h, include/lame.h, + libmp3lame/mpglib_interface.c, misc/mlame_corr.c: + + configure: removed all the debug warning flags. it was impossible + to find real problems when compiling in debug mode. + + moved mlame_corr.c into 'misc' directory + + removed some 'size_t' and 'unsigned' from get_audio.c + + made mp3buffer 'unsigned char*' for the mpglib interface routines. + +2000-12-08 13:47 aleidinger + + * auenc, misc/mugeco.sh: + + more portability fixes from Fredrik Mellstrom + +2000-12-07 18:58 aleidinger + + * mlame: + + use sh instead of bash + +2000-12-07 18:55 aleidinger + + * auenc: + + portability patch from Fredrik Mellstrom + +2000-12-05 15:48 aleidinger + + * DEFINES: + + update + +2000-12-05 15:46 aleidinger + + * Makefile.MSVC: + + add scalar.nas + +2000-12-05 15:40 aleidinger + + * configure, Dll/Makefile.in, doc/Makefile.in, + doc/html/Makefile.in, doc/man/Makefile.in, frontend/Makefile.in, + include/Makefile.in, libmp3lame/Makefile.in, + libmp3lame/i386/Makefile.in, mpglib/Makefile.in: + + regen + +2000-12-05 15:37 aleidinger + + * Makefile.B32, Makefile.MSVC, Makefile.in, config.h.in, + configMS.h, configure.in, frontend/Makefile.am, + frontend/get_audio.c, frontend/get_audio.h, + frontend/portableio.c, libmp3lame/Makefile.am, + libmp3lame/i386/Makefile.in, libmp3lame/i386/cpu_feat.nas, + misc/ath.c, mpglib/Makefile.am: + + play ping-pong with some files (we're now at 2000-12-03 again), ok'ed by Mark + +2000-12-05 01:17 markt + + * DEFINES: + + restored DEFINES. + + Sorry Alexendar - I tried to only revert the *.c and *.h files + to their Nov 21 values (because of test case problems) but + I was unable to get this to work. I was lazy and reverted + entire repository back to Nov 21. + +2000-12-05 01:15 markt + + * DEFINES: + + trying to restore DEFINES + +2000-12-04 14:36 aleidinger + + * Makefile.unix: + + add scalar.nas to build + +2000-12-04 06:31 pgubanov + + * dshow/: PropPage.cpp, PropPage.h: + + Target bitrate fix + +2000-12-04 06:30 pgubanov + + * dshow/: Mpegac.cpp, Mpegac.def, Mpegac.h, PropPage_adv.cpp, + PropPage_adv.h, Property.rc, README, REG.CPP, REG.H, UIDS.H, + dshow.dsp, iaudioprops.h, resource.h: + + CR/LF fix + +2000-12-03 23:27 markt + + * testcase.mp3, libmp3lame/util.c: + + KLEMM_01 defaulted. + + This enables the new ATH formula. + +2000-12-03 23:03 markt + + * libmp3lame/: tables.c, tables.h: + + huffmantab: int changed back to short. + +2000-12-03 23:00 markt + + * DEFINES, Makefile.B32, Makefile.MSVC, Makefile.in, config.h.in, + configMS.h, configure, configure.in, Dll/Makefile.in, + doc/Makefile.in, doc/html/Makefile.in, + doc/html/contributors.html, doc/html/examples.html, + doc/html/history.html, doc/html/id3.html, doc/html/index.html, + doc/html/lame.css, doc/html/modes.html, doc/html/node6.html, + doc/html/switchs.html, doc/man/Makefile.in, frontend/Makefile.am, + frontend/Makefile.in, frontend/get_audio.c, frontend/get_audio.h, + frontend/gtkanal.c, frontend/main.c, frontend/parse.c, + frontend/portableio.c, include/Makefile.in, include/lame.h, + libmp3lame/Makefile.am, libmp3lame/Makefile.in, + libmp3lame/bitstream.c, libmp3lame/bitstream.h, + libmp3lame/encoder.c, libmp3lame/encoder.h, libmp3lame/fft.c, + libmp3lame/fft.h, libmp3lame/lame.c, + libmp3lame/mpglib_interface.c, libmp3lame/newmdct.c, + libmp3lame/newmdct.h, libmp3lame/pcm.c, libmp3lame/pcm.h, + libmp3lame/psymodel.c, libmp3lame/psymodel.h, + libmp3lame/quantize.c, libmp3lame/quantize.h, + libmp3lame/quantize_pvt.c, libmp3lame/quantize_pvt.h, + libmp3lame/reservoir.c, libmp3lame/tables.c, libmp3lame/tables.h, + libmp3lame/util.c, libmp3lame/util.h, libmp3lame/vbrquantize.c, + libmp3lame/version.h, libmp3lame/vorbis_interface.c, + libmp3lame/i386/Makefile.am, libmp3lame/i386/Makefile.in, + libmp3lame/i386/cpu_feat.nas, mpglib/Makefile.am, + mpglib/Makefile.in, mpglib/interface.c, mpglib/interface.h: + + + Reverted back to Nov 21 version. + + Added HTML doc from GB + +2000-12-03 17:38 aleidinger + + * configure: + + regen + +2000-12-03 17:37 aleidinger + + * configure.in: + + fix in debugging options + +2000-12-03 14:16 aleidinger + + * DEFINES: + + add KLEMM_36 + +2000-12-03 14:14 aleidinger + + * frontend/portableio.c: + + Portability fix from Frank, you need to define KLEMM_36 to enable it + (no functional change if you leave it disabled): + ---snip--- + It is a hoax to call this code portable-IO: + + - It doesn't work on machines with CHAR_BIT != 8 + - it also don't test this error condition + - otherwise it tries to handle CHAR_BIT != 8 by things like + masking 'putc(i&0xff,fp)' + - It doesn't handle EOF in any way + - it only works with ints with 32 or more bits + - It is a collection of initial buggy code with patching the known errors + instead of CORRECTING them! + For that see comments on the old Read16BitsHighLow() + ---snip--- + +2000-12-03 13:14 aleidinger + + * misc/abx.c: + + Improvements from Frank: + - more input formats (detected by filename) + Improvements by me: + - sanity checks + - works on FreeBSD + +2000-12-01 17:42 aleidinger + + * libmp3lame/: psymodel.c, tables.c, tables.h: + + Patches from Frank: + ---snip--- + defined 4 new types for holding psydata information + psydata is divided into 25 normal tables (the 24 tables + 1 master table) + access via "normal" index instead of scanning through the data + tables are now sparsable, i.e. it is possible to remove unneeded parts + but this is not yet done to avoid to do to much things at once + tables are now smaller + ---snip--- + Hi also did some tests to verify this didn't changes the output. + + I also verified it with "make test" and some regular encoding. + +2000-11-30 10:23 aleidinger + + * DEFINES: + + add description of some compile time defines + +2000-11-30 10:20 aleidinger + + * Makefile.B32: + + sync with recent changes in the other Makefiles: + - HAVExxx -> HAVE_xxx + - HAVE_CONFIG_MS_H + +2000-11-30 10:17 aleidinger + + * frontend/: get_audio.c, get_audio.h: + + - remove check for CHAR_BITS, was a typo from Frank (confirmed by Frank) + - add optimization for unknown SIZEOF_UNSIGNED_LONG (submitted by Frank) + in optimized version of SwapBytesInWords() + - make the optimized version of SwapBytesInWords() the default + (OKed by Mark) + - remove DetermineByteOrder(), we have compile time support for it + +2000-11-30 10:14 aleidinger + + * configure, Makefile.in, libmp3lame/Makefile.in, + libmp3lame/i386/Makefile.in, mpglib/Makefile.in, + dshow/Makefile.in, doc/man/Makefile.in, doc/html/Makefile.in, + doc/Makefile.in, Dll/Makefile.in, frontend/Makefile.in, + include/Makefile.in: + + regen + +2000-11-30 10:11 aleidinger + + * libmp3lame/pcm.c: + + - some modifications from Frank + +2000-11-30 10:08 aleidinger + + * configure.in: + + - compile time check for sizeof(int) + - more compiler warnings for debugging + +2000-11-30 10:07 aleidinger + + * config.h.in, configMS.h: + + - compile time value for sizeof(int) + +2000-11-30 10:07 aleidinger + + * libmp3lame/Makefile.am, frontend/Makefile.am, mpglib/Makefile.am: + + - additional options for lclint + +2000-11-30 10:06 aleidinger + + * libmp3lame/i386/Makefile.am: + + - *.lst instead of specifying every file in "CLEANFILES" + +2000-11-27 16:39 aleidinger + + * libmp3lame/: pcm.c, pcm.h: + + submitted by Frank, first revision of a new lame API, not connected to the build yet + +2000-11-26 20:58 robert + + * libmp3lame/: lame.c, util.c, util.h, i386/cpu_feat.nas: + + Part2 of Frank's Patch + + His List of Changes (part 1 + 2): + + - changed the type of the MP3 byte stream from 'char' to 'unsigned char' + - added some 'const' attributes + - added to lame_internal_flags: gfp, frame_size, coding, frame_count + - one code move inside lame.c (mode_ext), one remove (channels_out) + - two new types in util.c + - some bug fixes with Ogg + - SIMD2 detection + +2000-11-26 10:49 robert + + * frontend/get_audio.c, frontend/main.c, include/lame.h, + libmp3lame/bitstream.c, libmp3lame/bitstream.h, + libmp3lame/encoder.c, libmp3lame/encoder.h, libmp3lame/fft.c, + libmp3lame/fft.h, libmp3lame/lame.c, + libmp3lame/mpglib_interface.c, libmp3lame/newmdct.c, + libmp3lame/newmdct.h, libmp3lame/psymodel.c, + libmp3lame/psymodel.h, libmp3lame/util.h, + libmp3lame/vorbis_interface.c, mpglib/interface.c, + mpglib/interface.h: + + Patch by Frank: + changes from char to unsigned char + +2000-11-25 22:59 robert + + * libmp3lame/quantize.c: + + bug fix for -X6, could result in clicking noises + +2000-11-25 20:40 robert + + * libmp3lame/quantize.c: + + typo "powf()" lend to crashes under windows, fixed + +2000-11-25 18:56 robert + + * libmp3lame/: quantize.c, quantize.h, vbrquantize.c: + + small fix for vbr-mtrh mode + +2000-11-25 18:18 robert + + * libmp3lame/: lame.c, quantize.c, quantize_pvt.c, quantize_pvt.h, + util.h, vbrquantize.c: + + removed superfluous memset in vbr_noise_shaping2() + some veryminor speed up for cbr + amp_scalefac cleanup + +2000-11-24 17:28 robert + + * frontend/gtkanal.c: + + Patches by Frank: + + - documentation + - introduced gfc->channels_in + - renamed gfc->stereo into gfc->channels_out + (note by me: stereo would imply a boolean type stereo ? yes/no + what's really annoying and confusing is that we didn't used it that way, + but instead stereo=1 -> mono/1-channel, stereo=2 -> stereo/2-channels) + - minor bug fixes for BitrateIndex search + +2000-11-24 17:06 robert + + * include/lame.h, libmp3lame/bitstream.c, libmp3lame/encoder.c, + libmp3lame/lame.c, libmp3lame/newmdct.c, libmp3lame/psymodel.c, + libmp3lame/quantize.c, libmp3lame/quantize_pvt.c, + libmp3lame/reservoir.c, libmp3lame/util.c, libmp3lame/util.h, + libmp3lame/vbrquantize.c: + + Patches by Frank: + + - documentation + - introduced gfc->channels_in + - renamed gfc->stereo into gfc->channels_out + (note by me: stereo would imply a boolean type stereo ? yes/no + what's really annoying and confusing is that we didn't used it that way, + but instead stereo=1 -> mono/1-channel, stereo=2 -> stereo/2-channels) + - minor bug fixes for BitrateIndex search + +2000-11-23 23:19 robert + + * libmp3lame/vbrquantize.c: + + some loops manually unrolled into "Duff's Device" + speed improvement for --vbr-mtrh GCC compiled ca. 5 % overall + speed improvement for --vbr-mtrh Intel 4.5 compiled ca. 1-2 % + looks like the intel compiler does a better job on loops + compared to GCC. + +2000-11-23 15:14 robert + + * Makefile.MSVC: + + compromise between size/speed/multi CPU, thanks to Dmitry + +2000-11-23 13:06 aleidinger + + * misc/ath.c: + + readd support for other systems than linux (at least FreeBSD) + +2000-11-22 21:03 robert + + * Makefile.MSVC: + + added little howto into Makefile.MSVC + think MS C compiler works now again + +2000-11-22 01:09 robert + + * frontend/parse.c: + + cosmetics + +2000-11-22 00:30 robert + + * libmp3lame/lame.c, libmp3lame/psymodel.c, + libmp3lame/quantize_pvt.c, libmp3lame/tables.c, + libmp3lame/tables.h, libmp3lame/util.c, libmp3lame/version.h, + misc/ath.c: + + some patches by Frank + + - replace ath.c (has with Lame nothing to do) + - lame.c: A line in my new code exchange (see ATHformula problems) + - util.c: ATHformula changed over from kHz to cycles per second (last util formula with kHz been) + - ATHformula below 20 cycles per second (instead of 10 cycles per second) limits (< 20 cycles per second are Infraschall, + additionally the function becomes there completely useless) + - quantize_pvt.c: Effects of ATHformula + - tables.c: + - something documents - + -number of entries over one increases + (20=>21, 11=>12, etc..) + - SNR_s converted and to the obvious values + 0.15/0.18/0.20/0.25/0.30/0.35/0.40 rounded. + - w1 and w2 with 576 multiply (error is < + 0.91*10^-3, it seems in the tables both to have been rounded off as well as with + minimum error have been rounded) - end to OF DATA marker to the integrity test + inserted - a reading in of the table revises: psymodel.c - fewer error-prone code (fewer + * p++) - meaningful error messages for problem localization - Peeeeeeps in the case of + error - removing from loop (now j, is used only farther back; and adapted by k2) - + ATHformula - util.c - some amusing " while" Konstrukte, which originate still from the + ISO code, transformed into the appropriate " for" Konstrukte (with it first some amusing + things are noticeable, so e.g. why starting from index 0 instead of 1 are looked up?) + +2000-11-21 22:15 robert + + * Makefile.MSVC, frontend/gtkanal.c: + + some reorganization in Makefile.MSVC + it's now more commandline configurable + +2000-11-20 20:45 robert + + * frontend/: mp3x.c, parse.c: + + fix for mp3x.c: showed usage twice + fix for parse.c: lame_version_print() + in some situations the text is longer than 80 characters + now the url will be wrapped into the next line, right aligned + if 80 character aren't enough + +2000-11-20 15:08 robert + + * Makefile.MSVC, Makefile.unix, frontend/parse.c, + libmp3lame/lame.c, libmp3lame/quantize.c: + + overhauled Makefile.MSVC for easier configuration + design bug in parse.c fixed (should not include files from engine) + +2000-11-20 01:48 robert + + * Makefile.MSVC, Dll/BladeMP3EncDLL.c: + + it's now possible to compile lame_enc.dll with Makefile.MSVC + tried the DLL with CD-ex, seems to work + +2000-11-20 00:16 robert + + * Makefile.MSVC: + + updated Compile Flags due to crashes + added rule to generate config.h out of configMS.h + first try to let the dll compile, still does not work + +2000-11-19 14:12 robert + + * Makefile.MSVC, Makefile.unix, frontend/gtkanal.c, + libmp3lame/lame.c: + + Some bugs fixed introduced due to configure stuff and others + +2000-11-19 11:26 aleidinger + + * Makefile.MSVC: + + bugfix for decoder define + +2000-11-18 12:13 aleidinger + + * frontend/Makefile.in: + + regen (unbreak build) + +2000-11-18 12:12 aleidinger + + * frontend/Makefile.am: + + bugfix after removing ieeefloat.* + +2000-11-18 10:50 aleidinger + + * frontend/brhist.c, frontend/get_audio.c, frontend/gpkplotting.c, + frontend/gtkanal.c, frontend/lame.dsp, frontend/lametime.c, + frontend/main.c, frontend/mp3rtp.c, frontend/mp3x.c, + frontend/parse.c, frontend/portableio.c, frontend/rtp.c, + frontend/timestatus.c, libmp3lame/VbrTag.c, + libmp3lame/bitstream.c, libmp3lame/debugscalefac.c, + libmp3lame/encoder.c, libmp3lame/fft.c, libmp3lame/id3tag.c, + libmp3lame/lame.c, libmp3lame/libmp3lame.dsp, + libmp3lame/mpglib_interface.c, libmp3lame/newmdct.c, + libmp3lame/psymodel.c, libmp3lame/quantize.c, + libmp3lame/quantize_pvt.c, libmp3lame/reservoir.c, + libmp3lame/tables.c, libmp3lame/takehiro.c, libmp3lame/util.c, + libmp3lame/vbrquantize.c, libmp3lame/version.c, + libmp3lame/vorbis_interface.c, misc/abx.c, misc/ath.c, + mpglib/common.c, mpglib/dct64_i386.c, mpglib/decode_i386.c, + mpglib/interface.c, mpglib/layer1.c, mpglib/layer2.c, + mpglib/layer3.c, mpglib/mpglib.dsp, mpglib/tabinit.c: + + include configMS.h on Windows + +2000-11-18 10:49 aleidinger + + * Makefile.MSVC, Makefile.DJGPP: + + define HAVE_CONFIG_MS_H for Windows + +2000-11-18 10:49 aleidinger + + * Makefile.in: + + regen (configMS.h) + +2000-11-18 10:48 aleidinger + + * Makefile.am, configMS.h: + + introduce configMS.h for Windows + +2000-11-18 05:40 markt + + * README.Debian, debian/changelog, debian/control, + debian/copyright, debian/cron.d.ex, debian/dirs, debian/docs, + debian/emacsen-install.ex, debian/emacsen-remove.ex, + debian/emacsen-startup.ex, debian/ex.doc-base.package, + debian/files, debian/init.d.ex, debian/manpage.1.ex, + debian/manpage.sgml.ex, debian/menu.ex, + debian/postinst.debhelper, debian/postinst.ex, debian/postrm.ex, + debian/preinst.ex, debian/prerm.debhelper, debian/prerm.ex, + debian/rules, debian/substvars, debian/watch.ex, + frontend/brhist.c, frontend/get_audio.c, frontend/main.c: + + added debian stuff. Make one of the KLEMM's the default + +2000-11-18 04:30 markt + + * Makefile.B32, Makefile.DJGPP, Makefile.MSVC, Makefile.in, + Makefile.unix, Dll/Makefile.in, doc/Makefile.in, + doc/html/Makefile.in, doc/man/Makefile.in, dshow/Makefile.in, + frontend/get_audio.c, frontend/portableio.c, include/Makefile.in, + libmp3lame/Makefile.in, libmp3lame/i386/Makefile.in, + mpglib/Makefile.in: + + Makefiles: removed ieeefloat.* from makefiles. + get_audio.c: replaced DetermineByteOrder with original routine. + +2000-11-18 04:24 markt + + * frontend/: Makefile.am, Makefile.in, get_audio.c, get_audio.h, + ieeefloat.c, ieeefloat.h, portableio.c, portableio.h: + + Removed ieeefloat.* + +2000-11-15 18:52 aleidinger + + * frontend/get_audio.c: + + only allow fast SwapBytesInWords if SIZEOF_UNSIGNED_LONG is defined + +2000-11-14 12:25 aleidinger + + * libmp3lame/resample.h: + + remove define of INLINE + +2000-11-14 12:24 aleidinger + + * frontend/ieeefloat.c: + + let configure handle little/big endianess + +2000-11-14 12:20 aleidinger + + * libmp3lame/: bitstream.c, fft.c, newmdct.c, psymodel.c, + quantize.c, takehiro.c, util.c: + + INLINE -> inline + +2000-11-14 12:19 aleidinger + + * libmp3lame/machine.h: + + As discussed on the mailinglist: + - correct when to define INLINE/inline + - INLINE -> inline, configure already does something similar + +2000-11-14 12:18 aleidinger + + * libmp3lame/encoder.c: + + compile time resolvable assertions switched to compile time errors + +2000-11-14 12:18 aleidinger + + * libmp3lame/lame.c: + + - compile time resolvable assertions switched to compile time errors + - adjust version string + +2000-11-14 12:17 aleidinger + + * frontend/parse.c: + + - adjust version string + - sort system includes + +2000-11-14 12:16 aleidinger + + * include/lame.h: + + - quiet 4 lclint "errors" + - disable get_lame_about() + +2000-11-14 12:15 aleidinger + + * libmp3lame/version.c: + + - switched from run time generated version strings to compile time + generated ones + - implement void get_lame_version_numerical(lame_version_t *const) + (#ifdef'ed out) + - disable get_lame_about(), snprintf isn't available in Win32 + +2000-11-13 14:11 aleidinger + + * dshow/Makefile.in: + + regen (add dshow.dsw) + +2000-11-13 14:10 aleidinger + + * dshow/Makefile.am: + + add dshow.dsw + +2000-11-13 14:10 aleidinger + + * misc/mugeco.sh: + + shell math instead of awk math (no leading zeros needed) + +2000-11-13 13:42 pgubanov + + * include/lame.h: + + Explicit CDECL for API + +2000-11-13 13:31 pgubanov + + * dshow/: Encoder.h, Encoder.cpp, dshow.dsp: + + Synchronized with current LAME code + +2000-11-13 10:57 aleidinger + + * libmp3lame/i386/Makefile.am: + + support for CONFIG_DEFS + +2000-11-13 10:57 aleidinger + + * libmp3lame/Makefile.in, libmp3lame/i386/Makefile.in, + frontend/Makefile.in: + + regen + +2000-11-13 10:56 aleidinger + + * libmp3lame/Makefile.am, frontend/Makefile.am: + + - support for CONFIG_DEFS + - possibility to exclude code to lint + +2000-11-13 10:53 aleidinger + + * frontend/ieeefloat.c: + + remove CVS log tag/information, we have "cvs log" for this + +2000-11-13 10:50 aleidinger + + * frontend/get_audio.c: + + - sort includes + - compile time resolvable assertions switched to compile time errors + - we didn't need to determine the size of "unsigned long" at runtime + (KLEMM_10 case), we're able to do it at compile time (with the help + of configure) + +2000-11-13 10:48 aleidinger + + * libmp3lame/vbrquantize.c: + + - move define of TAKEHIRO_IEEE754_HACK into configure.in + - commented out code -> ifdef'ed out code + (I'm on a anti-warning rampage) + +2000-11-13 10:47 aleidinger + + * libmp3lame/quantize_pvt.c: + + move define of TAKEHIRO_IEEE754_HACK into configure.in + +2000-11-13 10:45 aleidinger + + * misc/: abx.c, ath.c: + + - include config.h + - include correct soundcard.h (with support from configure) + +2000-11-13 10:42 aleidinger + + * configure, config.h.in, Makefile.in: + + regen + +2000-11-13 10:41 aleidinger + + * configure.in: + + - handle TAKEHIRO_IEEE754_HACK + - support for 'CONFIG_DEFS="-Dxxx" ./configure' + - handle endianess + - check for soundcard.h + +2000-11-13 10:39 aleidinger + + * mpglib/Makefile.in: + + regen (add possibility to exclude code for linting) + +2000-11-13 10:38 aleidinger + + * mpglib/Makefile.am: + + add possibility to exclude code for linting + +2000-11-13 10:35 aleidinger + + * misc/mugeco.sh: + + add start and stop date/time + +2000-11-13 09:30 pgubanov + + * dshow/dshow.dsw: + + Initial release + +2000-11-12 22:18 aleidinger + + * misc/mugeco.sh: + + add id + +2000-11-12 22:17 aleidinger + + * misc/mugeco.sh: + + bugfix + +2000-11-12 20:45 aleidinger + + * misc/Makefile.in: + + regen (add mugeco.sh) + +2000-11-12 20:45 aleidinger + + * misc/Makefile.am: + + add mugeco.sh + +2000-11-12 20:43 aleidinger + + * misc/mugeco.sh: + + first version of the multi generation encoder script + +2000-11-12 10:57 aleidinger + + * Makefile.in, configure: + + regen (readd dshow) + +2000-11-12 10:56 aleidinger + + * Makefile.am, configure.in: + + readd dshow + +2000-11-11 23:20 pfk + + * Makefile.DJGPP, Makefile.am, Makefile.in, Makefile.in.old, + Makefile.unix, USAGE, configure, configure.in, + frontend/get_audio.c, frontend/get_audio.h, frontend/main.c, + frontend/parse.c, libmp3lame/bitstream.c, libmp3lame/encoder.h, + libmp3lame/lame.c, libmp3lame/resample.c, libmp3lame/resample.h, + libmp3lame/reservoir.c, libmp3lame/tables.c, libmp3lame/tables.h, + libmp3lame/i386/scalar.nas, misc/abx.c: + + + + A lot of very small changes. Most important is prparing of a more + sofisticated method to determine the bandwidth and the MP3 sampling + frequency. + +2000-11-11 17:26 aleidinger + + * configure, Makefile.in: + + regen (add dshow) + +2000-11-11 17:26 aleidinger + + * configure.in, Makefile.am: + + add dshow + +2000-11-11 17:25 aleidinger + + * dshow/: Makefile.am, Makefile.in: + + initial version + +2000-11-11 05:56 markt + + * testcase.mp3, libmp3lame/encoder.c, libmp3lame/machine.h, + libmp3lame/util.c: + + updated testcases after changing some default settings + +2000-11-11 05:47 markt + + * libmp3lame/encoder.c: + + make RH_VALIDATE_MS the default + +2000-11-11 04:40 markt + + * frontend/parse.c, libmp3lame/lame.c, libmp3lame/util.c: + + undid some of Frank's changes to the resample code. + +2000-11-11 01:55 markt + + * dshow/Encoder.cpp: + + [no log message] + +2000-11-11 01:53 markt + + * dshow/: Encoder.cpp, Encoder.h, Mpegac.cpp, Mpegac.def, Mpegac.h, + PropPage.cpp, PropPage.h, PropPage_adv.cpp, PropPage_adv.h, + Property.rc, README, REG.CPP, REG.H, UIDS.H, dshow.dsp, + iaudioprops.h, resource.h: + + directshow filter for LAME from Peter Gubanov + +2000-11-10 23:18 pfk + + * frontend/get_audio.c, libmp3lame/lame.c, libmp3lame/machine.h, + libmp3lame/resample.c, libmp3lame/resample.h, libmp3lame/util.c, + libmp3lame/util.h, libmp3lame/i386/scalar.nas, misc/scalartest.c: + + + + Resample continued. + + The old code now uses a 31 Tap FIR for HQ coding and a 7 Tap FIR for MQ and + LQ coding. + +2000-11-10 14:42 aleidinger + + * frontend/.cvsignore, libmp3lame/.cvsignore, mpglib/.cvsignore: + + add lclint.txt + +2000-11-10 14:41 aleidinger + + * frontend/Makefile.in, libmp3lame/Makefile.in, mpglib/Makefile.in: + + regen (lclint target) + +2000-11-10 14:40 aleidinger + + * config.h.in: + + regen (HAVE_EFENCE) + +2000-11-10 14:39 aleidinger + + * configure: + + regen (disalbe-shared/HAVE_EFENCE) + +2000-11-10 14:36 aleidinger + + * configure.in: + + - new default: no shared lib + - define HAVE_EFENCE if apropriate + +2000-11-10 14:33 aleidinger + + * mpglib/Makefile.am: + + add lclint target (564 code "errors" found so far) + +2000-11-10 14:33 aleidinger + + * frontend/Makefile.am: + + add lclint target (471 code "errors" found so far) + +2000-11-10 14:32 aleidinger + + * libmp3lame/Makefile.am: + + add lclint target (1505 code "errors" found so far) + +2000-11-10 14:31 aleidinger + + * libmp3lame/quantize.c: + + fix RH_AMP (gfc = gfp->internal_flags) + +2000-11-09 22:01 pfk + + * include/lame.h, libmp3lame/bitstream.c, libmp3lame/resample.c, + libmp3lame/resample.h, libmp3lame/i386/scalar.nas, misc/ath.c, + misc/scalartest.c: + + + + Start of resampling. + +2000-11-09 00:29 pfk + + * testcase.mp3, libmp3lame/bitstream.c, libmp3lame/id3tag.c, + libmp3lame/machine.h, libmp3lame/version.h, misc/ath.c: + + + + Small changes. + + - removed an old function strcasecmp (replaced by fuzzy_strcmp) + - optimized region 2 bitcoder + - remark about version.h (stringification) + - INLINE = inline + static + +2000-11-08 19:59 aleidinger + + * libmp3lame/resample.c, mpglib/layer1.c: + + include assert.h, seems to be forgotten in last commit (how could this + compile?) + +2000-11-07 23:06 pfk + + * frontend/get_audio.c, frontend/parse.c, frontend/timestatus.c, + include/lame.h, libmp3lame/VbrTag.c, libmp3lame/bitstream.c, + libmp3lame/id3tag.c, libmp3lame/lame.c, + libmp3lame/mpglib_interface.c, libmp3lame/version.c, + libmp3lame/version.h, misc/ath.c, mpglib/layer1.c: + + + + Changed back to old report interface until we've discussed all possible + versions and make a decision. + + Some bugfixes. Some remarks. + +2000-11-07 15:36 aleidinger + + * configure: + + regen after: + - HAVE{MPGLIB,VORBIS,GTK} -> HAVE_$1 + - --disable-analyzer-hooks + - --enable-efence + +2000-11-07 15:36 aleidinger + + * config.h.in: + + HAVE{MPGLIB,VORBIS,GTK} -> HAVE_$1 + +2000-11-07 15:35 aleidinger + + * configure.in: + + - HAVE{MPGLIB,VORBIS,GTK} -> HAVE_$1 + - --disable-analyzer-hooks + - --enable-efence (use the ElectricFence malloc debugging library) + +2000-11-07 15:31 aleidinger + + * frontend/get_audio.c, frontend/main.c, frontend/parse.c, + libmp3lame/lame.c, libmp3lame/mpglib_interface.c, + libmp3lame/vorbis_interface.c: + + HAVE{MPGLIB,VORBIS,GTK} -> HAVE_$1 + +2000-11-07 12:42 aleidinger + + * frontend/Makefile.in, libmp3lame/Makefile.in: + + regen after amiga_mpega.c move + +2000-11-07 12:41 aleidinger + + * frontend/Makefile.am, libmp3lame/Makefile.am: + + follow the move of amiga_mpega.c from libmp3lame to frontend + +2000-11-07 01:59 pfk + + * frontend/brhist.c, frontend/get_audio.c, frontend/get_audio.h, + frontend/main.c, libmp3lame/bitstream.c, libmp3lame/version.h: + + + + minor changes. + + some options can be passed via "export LAMEOPT=..." + +2000-11-07 00:58 cisc + + * Makefile.unix, frontend/amiga_mpega.c, libmp3lame/amiga_mpega.c: + + Moved amiga_mpega.c to frontend where it belongs, and added it to Makefile.unix + +2000-11-07 00:14 markt + + * libmp3lame/: bitstream.c, encoder.c, lame.c, psymodel.c, + psymodel.h, quantize.c, quantize.h, quantize_pvt.c, + quantize_pvt.h, reservoir.c, reservoir.h, util.c, util.h, + vbrquantize.c: + + removed lame_global_flags pointer from lame_internal_flags. + +2000-11-06 23:19 markt + + * libmp3lame/: lame.c, quantize_pvt.c, util.c, util.h: + + fixed resample bug when resampling by integer amounts. + +2000-11-06 19:26 cisc + + * API: + + Improved get_lame_xxx() API a little bit more + +2000-11-06 19:22 cisc + + * frontend/gtkanal.c, frontend/parse.c, include/lame.h, + libmp3lame/VbrTag.c, libmp3lame/bitstream.c, libmp3lame/lame.c, + libmp3lame/version.c, libmp3lame/version.h: + + Improved get_lame_xxx() API a little bit more + +2000-11-06 17:29 robert + + * libmp3lame/: quantize.c, quantize_pvt.c: + + fixed segmentation fault in Frank's noise calculation + implemented Todd Richmond's idea to speed up the outer_loop() + +2000-11-06 12:31 aleidinger + + * libmp3lame/i386/.cvsignore: + + add .lst files + +2000-11-06 08:22 markt + + * Makefile.am, configure.in, frontend/.indent.pro, + frontend/brhist.c, libmp3lame/.indent.pro: + + went back to frame counts in VBR display + +2000-11-06 04:24 markt + + * frontend/get_audio.c, mpglib/interface.c, mpglib/mpglib.h: + + cleaned up mpeg header search code in get_audio.c + modified mpglib so we can move VBR header code into mpglib + and out of the frontend code. a little more work is still needed. + +2000-11-06 01:13 pfk + + * libmp3lame/: bitstream.c, bitstream.h, id3tag.c, util.o: + + + + Small changes for fuzzy ID3 tag compare. + +2000-11-06 00:58 cisc + + * frontend/gtkanal.c, frontend/parse.c, include/lame.h, + libmp3lame/VbrTag.c, libmp3lame/bitstream.c, libmp3lame/lame.c, + libmp3lame/version.c, libmp3lame/version.h: + + Modified get_lame_xxx() API so it's more re-entrance friendly (returning a const pointer from a static var that's changed every time the function is called is really dirty!). + +2000-11-05 22:27 pfk + + * testcase.mp3, frontend/parse.c, frontend/rtp.h, + frontend/timestatus.c, libmp3lame/lame.c, libmp3lame/quantize.c, + libmp3lame/quantize_pvt.c, libmp3lame/quantize_pvt.h: + + + + Minor changes. + Added -X8. + +2000-11-05 18:29 pfk + + * frontend/get_audio.c, include/lame.h, libmp3lame/lame.c, + libmp3lame/quantize.c, libmp3lame/util.h, libmp3lame/util.o: + + + + Changed lame_init_???_init to Class_ID. + On initialization this variable gets the value LAME_ID. + Advantages documented. + + Some little Bugs fixed. + +2000-11-05 17:13 takehiro + + * Makefile.in, configure, configure.in, Dll/Makefile.in, + doc/Makefile.in, doc/html/Makefile.in, doc/man/Makefile.in, + frontend/Makefile.in, frontend/main.c, frontend/parse.c, + include/Makefile.in, libmp3lame/Makefile.in, + libmp3lame/newmdct.c, libmp3lame/quantize.c, + libmp3lame/quantize_pvt.c, libmp3lame/i386/Makefile.in, + misc/Makefile.in, mpglib/Makefile.in: + + configure.in: typo fix + newmdct.c: precision fix(?) + +2000-11-05 14:52 aleidinger + + * libmp3lame/i386/Makefile.in: + + regen (clean of generated .lst files) + +2000-11-05 14:52 aleidinger + + * libmp3lame/i386/Makefile.am: + + add generated .lst files to files to clean + +2000-11-05 14:41 aleidinger + + * misc/Makefile.in: + + regen after adding scalartest.c + +2000-11-05 14:40 aleidinger + + * misc/Makefile.am: + + add scalartest.c + +2000-11-05 14:34 aleidinger + + * libmp3lame/: util.c~, util.d, util.o: + + remove generated/backup files, seems they are commited by accident + +2000-11-05 13:15 pfk + + * libmp3lame/: tools.c, tools.h: + + + + add file for generic tools. + +2000-11-05 13:09 pfk + + * testcase.mp3, libmp3lame/bitstream.c, libmp3lame/bitstream.h, + libmp3lame/lame.c, libmp3lame/lameerror.h, libmp3lame/psymodel.c, + libmp3lame/resample.c, libmp3lame/resample.h, + libmp3lame/tables.c, libmp3lame/tables.h, libmp3lame/util.c, + libmp3lame/util.c~, libmp3lame/util.d, libmp3lame/util.h, + libmp3lame/util.o, libmp3lame/version.h, + libmp3lame/i386/scalar.nas, misc/scalartest.c: + + + + * Changed psy_data from double to float (this ssem not to change any bit in + MP3, but saves 20 KB). + + * Other, but small modifications + +2000-11-05 00:19 pfk + + * frontend/brhist.c: + + + + bugfix. Sorry + +2000-11-04 18:15 pfk + + * frontend/brhist.c, frontend/brhist.h, frontend/mp3rtp.c, + frontend/rtp.c, frontend/rtp.h, frontend/timestatus.c, + include/lame.h, libmp3lame/resample.c, libmp3lame/resample.h, + libmp3lame/tables.c, libmp3lame/version.c, + libmp3lame/i386/Makefile.am, libmp3lame/i386/Makefile.in, + libmp3lame/i386/scalar.nas, misc/ath.c: + + + + small changes in brhist. + some tests and modifications for streaming MP3. + other unremarkable stuff + +2000-11-04 02:18 pfk + + * doc/html/switchs.html, frontend/get_audio.c, + frontend/timestatus.c: + + + + Unimportant changes. + +2000-11-03 14:21 aleidinger + + * libmp3lame/id3tag.c: + + more 'const'nes, also saves some bytes in the generated .o + +2000-11-03 14:13 aleidinger + + * libmp3lame/i386/Makefile.in: + + regen after change in Makefile.am + +2000-11-03 14:13 aleidinger + + * libmp3lame/i386/Makefile.am: + + remove trailing backslash in last line of EXTRA_DIST + +2000-11-03 14:08 aleidinger + + * doc/html/contributors.html: + + add myself to contributors + +2000-11-03 14:07 aleidinger + + * configure: + + NOTERMCAP/TERMCAP_AVAILABLE -> HAVE_TERMCAP + +2000-11-03 14:04 aleidinger + + * frontend/brhist.c, configure.in, config.h.in: + + NOTERMCAP/TERMCAP_AVAILABLE -> HAVE_TERMCAP + +2000-11-03 14:00 aleidinger + + * frontend/parse.c: + + add missing include + +2000-11-03 00:47 pfk + + * frontend/brhist.c, frontend/console.c, frontend/console.h, + frontend/mp3rtp.c, frontend/parse.c, frontend/timestatus.c, + include/lame.h, libmp3lame/bitstream.c, libmp3lame/lame.c, + libmp3lame/mpglib_interface.c, libmp3lame/resample.h, + libmp3lame/util.c, libmp3lame/version.c, libmp3lame/version.h, + libmp3lame/i386/Makefile.am, libmp3lame/i386/Makefile.in, + libmp3lame/i386/scalar.nas: + + + + Minor changes. Biggest ist in bitstream.c, but triggered by KLEMM_14. + +2000-11-02 17:16 pfk + + * TODO, frontend/brhist.c, frontend/console.c, frontend/console.h, + libmp3lame/resample.c, libmp3lame/resample.h, + libmp3lame/version.c, libmp3lame/i386/scalar.nas: + + + + These are minor changes to a version which fails on my computer. + + * MMX reporting added to get_lame_version(9 as requested by TODO. + * Added 5 files for resampling and console IO. + +2000-11-02 12:57 aleidinger + + * mpglib/: common.c, common.h: + + bugfix for --disable-decoder-layer1 case + +2000-11-01 21:56 markt + + * LICENSE, frontend/parse.c, include/lame.h: + + updated LICENSE to remove comments about libsndfile, + since libsndfile no longer included in library + +2000-11-01 21:54 markt + + * libmp3lame/: .indent.pro, bitstream.c, version.h: + + added indent.pro back to CVS + +2000-11-01 18:25 markt + + * STYLEGUIDE, libmp3lame/encoder.c: + + some more context fixes + +2000-11-01 18:22 markt + + * libmp3lame/: newmdct.c, psymodel.c, quantize.c, quantize_pvt.c, + reservoir.c, reservoir.h, takehiro.c, util.c, vbrquantize.c: + + removed more 'context'. + + lame now segfaults. + +2000-11-01 18:06 markt + + * libmp3lame/: .indent.pro, VbrTag.c, fft.c, fft.h, id3tag.c, + lame.c, newmdct.h, psymodel.h, quantize.h, quantize_pvt.h: + + removing 'context' + +2000-11-01 17:56 markt + + * libmp3lame/: bitstream.c, bitstream.h, util.h: + + restored bitstream.c to original. + drain_into_ancillary_data was written the way it is + on purpose. dont change it without checking with me first + +2000-11-01 17:46 markt + + * libmp3lame/util.h: + + [no log message] + +2000-11-01 17:40 markt + + * libmp3lame/util.h: + + removed 'context' + why was lame_internal_flags renamed context? + This is under the catagory of cosmetic. + +2000-11-01 17:32 markt + + * STYLEGUIDE, frontend/get_audio.c, frontend/parse.c, + libmp3lame/lame.c, libmp3lame/mpglib_interface.c, + libmp3lame/quantize.c, libmp3lame/quantize_pvt.c: + + removed some cosmetic changes. + +2000-11-01 16:09 robert + + * frontend/: mp3rtp.c, rtp.c: + + mp3rtp was broken, does now compile again + +2000-11-01 14:35 robert + + * libmp3lame/: quantize.c, quantize_pvt.h: + + only cosmetic changes, done by indent + +2000-11-01 14:31 robert + + * frontend/.indent.pro, libmp3lame/.indent.pro, misc/.indent.pro: + + these files are used by the indent program to pretty format sources + +2000-11-01 00:01 robert + + * frontend/: brhist.c, brhist.h, main.c, timestatus.c: + + some more brhist pretty print + +2000-10-31 13:58 aleidinger + + * frontend/Makefile.in: + + regen after bugfix in Makefile.am + +2000-10-31 13:57 aleidinger + + * frontend/Makefile.am: + + fix build of mp3x + +2000-10-31 13:18 robert + + * Makefile.MSVC, frontend/brhist.c, frontend/lametime.h: + + fixes for bitrate histogram and MS compilation + +2000-10-31 12:18 robert + + * frontend/: lametime.c, parse.c, timestatus.c: + + quick fixes for Console_IO stuff + Console_IO is declared in brhist.c, but when compiling + without bitrate histogram capabilities the code would + not compile anymore + +2000-10-30 23:58 robert + + * Makefile.MSVC, Makefile.unix: + + analyzer stuff was moved to frontend + because of automake/configure + +2000-10-30 22:34 robert + + * libmp3lame/vbrquantize.c: + + Takehiro's IEEE754 hack for VBR modes new and mtrh + +2000-10-30 11:28 aleidinger + + * Makefile.in: + + we didn't need acconfig.h, so don't depend on it + +2000-10-30 10:51 robert + + * libmp3lame/util.c: + + BUG fix for debug code for BUG fix for fill_buffer_resample() ;-( + +2000-10-30 10:48 robert + + * libmp3lame/util.c: + + BUG fix for fill_buffer_resample() + +2000-10-29 22:26 robert + + * libmp3lame/util.c: + + small fix for fill_buffer_resample() + some buffers where too small allocated, but this will + not really help, the routine has some ugly looking points + left that need to be fixed. + +2000-10-29 21:11 robert + + * libmp3lame/: VbrTag.c, bitstream.c, bitstream.h, encoder.c, + id3tag.c, lame.c, quantize.c, quantize_pvt.c, reservoir.c, + reservoir.h, util.c, util.h, vbrquantize.c: + + gfp gfc stuff FINISHED for now + +2000-10-29 20:03 robert + + * libmp3lame/: encoder.c, fft.c, fft.h, newmdct.c, newmdct.h, + psymodel.c, psymodel.h, quantize_pvt.h, takehiro.c: + + a step further with this gfp gfc stuff + +2000-10-29 19:15 robert + + * libmp3lame/: quantize_pvt.h, takehiro.c, util.h: + + some more gfc stuff + +2000-10-29 18:12 robert + + * libmp3lame/: encoder.c, quantize.c, quantize.h, quantize_pvt.c, + quantize_pvt.h, takehiro.c, vbrquantize.c: + + more on gfp gfc reorganization + +2000-10-29 16:37 robert + + * libmp3lame/: quantize.c, quantize_pvt.c, quantize_pvt.h, + takehiro.c, vbrquantize.c: + + gfp gfc reorganization + +2000-10-29 13:58 robert + + * libmp3lame/: fft.c, lame.c, psymodel.c, quantize.c, + quantize_pvt.c, util.h: + + data encapsulating Naoki's psymode + +2000-10-29 12:52 aleidinger + + * .cvsignore: + + add some config.h related files + +2000-10-29 12:51 aleidinger + + * configure: + + now with support for config.h + +2000-10-29 12:50 aleidinger + + * Makefile.in, Dll/Makefile.in, doc/Makefile.in, + doc/html/Makefile.in, doc/man/Makefile.in, frontend/Makefile.in, + include/Makefile.in, libmp3lame/Makefile.in, + libmp3lame/i386/Makefile.in, misc/Makefile.in, + mpglib/Makefile.in: + + regenerated after adding support for config.h + +2000-10-29 12:49 aleidinger + + * frontend/Makefile.am, libmp3lame/Makefile.am, mpglib/Makefile.am: + + support for config.h + +2000-10-29 12:47 aleidinger + + * config.h.in, stamp-h.in: + + config.h support + +2000-10-29 12:45 aleidinger + + * frontend/brhist.c, frontend/get_audio.c, frontend/gpkplotting.c, + frontend/gtkanal.c, frontend/ieeefloat.c, frontend/lametime.c, + frontend/main.c, frontend/mp3rtp.c, frontend/mp3x.c, + frontend/parse.c, frontend/portableio.c, frontend/rtp.c, + frontend/timestatus.c, configure.in, aclocal.m4: + + support for config.h + +2000-10-29 12:41 aleidinger + + * mpglib/common.c, mpglib/dct64_i386.c, mpglib/decode_i386.c, + mpglib/interface.c, mpglib/layer1.c, mpglib/layer2.c, + mpglib/layer3.c, mpglib/tabinit.c, libmp3lame/VbrTag.c, + libmp3lame/amiga_mpega.c, libmp3lame/bitstream.c, + libmp3lame/debugscalefac.c, libmp3lame/encoder.c, + libmp3lame/fft.c, libmp3lame/id3tag.c, libmp3lame/lame.c, + libmp3lame/mpglib_interface.c, libmp3lame/newmdct.c, + libmp3lame/psymodel.c, libmp3lame/quantize.c, + libmp3lame/quantize_pvt.c, libmp3lame/reservoir.c, + libmp3lame/tables.c, libmp3lame/takehiro.c, libmp3lame/util.c, + libmp3lame/vbrquantize.c, libmp3lame/version.c, + libmp3lame/vorbis_interface.c: + + support for config.h + +2000-10-28 21:57 pfk + + * configure, libmp3lame/bitstream.c, libmp3lame/bitstream.h, + libmp3lame/lame.c: + + + + CRC table based code removed + + Ease CRC header calculation + +2000-10-28 14:23 pfk + + * frontend/get_audio.c, frontend/lametime.c, frontend/lametime.h, + frontend/main.c, frontend/mp3x.c, frontend/parse.c, + include/lame.h, libmp3lame/bitstream.c, libmp3lame/lame.c, + libmp3lame/util.c, libmp3lame/util.h: + + + + Moved 2 functions from util.c to lametime.c + + Fixed a memory leak caused by an early return + + bitstream: Local crc moved to gfp->crcvalue, next step can be to remove a + function parameter + + minor changes + +2000-10-28 12:31 robert + + * include/lame.h, libmp3lame/VbrTag.c, libmp3lame/bitstream.c, + libmp3lame/lame.c, libmp3lame/util.c, libmp3lame/util.h: + + hunting some BUGs, but still not found + encoding a mono VBR resampled to 11 kHz shows some strange behaviour + +2000-10-28 10:47 aleidinger + + * Dll/Makefile.in, doc/Makefile.in, doc/html/Makefile.in, + doc/man/Makefile.in, frontend/Makefile.in, include/Makefile.in, + libmp3lame/Makefile.in, libmp3lame/i386/Makefile.in, + misc/Makefile.in, mpglib/Makefile.in: + + don't use gtar instead of tar + +2000-10-28 10:42 aleidinger + + * lame.spec: + + lame.spec gets now generated at configure time from lame.spec.in + +2000-10-28 10:40 aleidinger + + * Makefile.am, Makefile.in: + + - add lame.spec.in to distribution + - remove lame.spec from distribution + - show how long lame needs for the testcase + +2000-10-28 10:35 aleidinger + + * configure.in, configure: + + - generate lame.spec from lame.spec.in + - CPU specific optimizations (x86, gcc 2.7.3.x or better) + +2000-10-28 10:32 aleidinger + + * lame.spec.in: + + template for configure to generate lame.spec + +2000-10-28 01:29 pfk + + * include/lame.h, libmp3lame/lame.c, libmp3lame/util.c, + libmp3lame/util.h, libmp3lame/version.h: + + + + short => sample_t in lame_encode_buffer and all the related stuff + + some essential but simple speedups in resampling code + + resulting MP3 will be different from previous + + code modification not finished, this is only half of the work + +2000-10-27 23:04 robert + + * libmp3lame/vbrquantize.c: + + max_range tables + +2000-10-27 21:50 pfk + + * frontend/main.c, libmp3lame/lame.c, libmp3lame/psymodel.c, + libmp3lame/util.c, libmp3lame/util.h: + + + + KLEMM_04(old) removed, scalar routines introduced. + +2000-10-27 21:34 robert + + * libmp3lame/vbrquantize.c: + + LSF needs some different max_range tables + I plugged some in and it seems to work + they are designed after max_sfac_tab[6][4] + you may look into scale_bitcount_lsf() + +2000-10-27 16:30 robert + + * libmp3lame/: quantize.c, vbrquantize.c: + + LSF hack for vbr-mtrh VBR mode + +2000-10-27 15:48 takehiro + + * libmp3lame/newmdct.c: + + bit optimization + +2000-10-27 11:27 robert + + * libmp3lame/quantize_pvt.c, mpglib/layer3.c: + + BUG in frame analyzer fixed, there was some wild pointer used + in layer3.c in preflag condition + +2000-10-27 11:19 takehiro + + * libmp3lame/: machine.h, tables.c, tables.h, + i386/choose_table.nas: + + 64bit int lookup table moved from C code to asm code. + +2000-10-26 19:07 pfk + + * frontend/brhist.c, frontend/get_audio.c, frontend/mp3rtp.c, + frontend/timestatus.c, include/lame.h, libmp3lame/bitstream.c, + libmp3lame/psymodel.c, libmp3lame/util.c, misc/ath.c: + + + + Make some modifications active. + + No Termcap terms are now handled in the same way like termcap terms. + +2000-10-25 22:18 robert + + * libmp3lame/: quantize.c, quantize.h, quantize_pvt.h, + vbrquantize.c: + + improved vbr_mtrh VBR mode + +2000-10-25 14:03 aleidinger + + * frontend/Makefile.am: + + prevent the CVS Id from being integrated into Makefile.in + +2000-10-24 22:47 robert + + * Makefile.MSVC, Makefile.unix, libmp3lame/quantize.c: + + improved RH_AMP + +2000-10-24 22:17 pfk + + * frontend/get_audio.c, libmp3lame/mpglib_interface.c, + libmp3lame/psymodel.c: + + + + Better syncword recognization + +2000-10-24 18:11 takehiro + + * configure, configure.in, frontend/Makefile.in, + libmp3lame/machine.h: + + configure/configure.in + added "--enable-all-float", which make FLOAT8 as float + + machine.h + FLOAT (and FLOAT8) typedef fix for alpha processor + +2000-10-24 17:44 takehiro + + * libmp3lame/newmdct.c: + + loop integration. + "make test" may find some difference caused by some rounding problem + +2000-10-24 15:01 robert + + * libmp3lame/quantize.c: + + fix for -q7 mode + +2000-10-24 13:54 robert + + * libmp3lame/quantize.c: + + typo + +2000-10-24 13:28 robert + + * libmp3lame/: quantize.c, quantize_pvt.c, quantize_pvt.h: + + some simplifications + +2000-10-24 11:40 robert + + * Makefile.MSVC, Makefile.unix, libmp3lame/quantize.c: + + improvements, need some compile time defines, look into Makefile.unix + +2000-10-23 18:59 robert + + * libmp3lame/machine.h: + + FLOAT is float, FLOAT8 is double again ;-) + +2000-10-23 15:50 takehiro + + * Makefile.am, Makefile.in, frontend/Makefile.in: + + more make test update + +2000-10-23 15:44 takehiro + + * libmp3lame/machine.h: + + sorry, mistaken check in.... + +2000-10-23 15:40 takehiro + + * Makefile.am, Makefile.in, lame.spec, Dll/Makefile.in, + doc/Makefile.in, doc/html/Makefile.in, doc/man/Makefile.in, + frontend/Makefile.in, include/Makefile.in, + libmp3lame/Makefile.in, libmp3lame/machine.h, + libmp3lame/i386/Makefile.in, misc/Makefile.in, + mpglib/Makefile.in: + + "make test" update + +2000-10-23 15:40 takehiro + + * libmp3lame/bitstream.c: + + cosmetic change + +2000-10-23 10:16 aleidinger + + * Makefile.in: + + update after change to Makefile.am + +2000-10-23 10:16 aleidinger + + * Makefile.am: + + let test targetbuild frontend/lame if it isn't already build + - didn't work with "make -j 4 test" + - IMHO the previous version was a feature + (requested by Takehiro-san) + + splittet test target into more subtargets + + corrected testg target + + added CVS_RSH=ssh to update/diff target + +2000-10-22 22:50 robert + + * libmp3lame/psymodel.c: + + fix for short block I introduced 2000-10-19 + +2000-10-22 18:20 pfk + + * Makefile.unix, frontend/brhist.c, frontend/brhist.h, + frontend/get_audio.c, frontend/main.c, frontend/parse.c, + frontend/parse.h, include/lame.h, libmp3lame/bitstream.c, + libmp3lame/encoder.c, libmp3lame/encoder.h, libmp3lame/lame.c, + libmp3lame/reservoir.c, libmp3lame/util.c, libmp3lame/util.h, + libmp3lame/version.c, libmp3lame/version.h, misc/ath.c: + + + + A lot of small changes, most of them must be switched on via compile time + defines. + + vbr displays shows MS and LR frames different. + + vbr displays depends on the current display width. + +2000-10-22 15:36 takehiro + + * Makefile.am: + + do "make test" with one step + +2000-10-22 15:28 takehiro + + * .cvsignore, Dll/.cvsignore, doc/.cvsignore, doc/html/.cvsignore, + doc/man/.cvsignore, frontend/.cvsignore, include/.cvsignore, + libmp3lame/.cvsignore, libmp3lame/i386/.cvsignore, + misc/.cvsignore, mpglib/.cvsignore: + + igonore Makefile.am things (.libs, .deps, and so on) + +2000-10-22 15:17 takehiro + + * libmp3lame/.cvsignore, mpglib/.cvsignore: + + added *.lo + +2000-10-22 12:06 aleidinger + + * ltconfig, ltmain.sh, missing, mkinstalldirs: + + generated by automake/libtool + +2000-10-22 12:02 aleidinger + + * frontend/Makefile.in, libmp3lame/Makefile.in, mpglib/Makefile.in: + + generated by automake + +2000-10-22 12:01 aleidinger + + * configure: + + now with automake/libtool support + +2000-10-22 12:00 aleidinger + + * confdefs.h: + + seems to get generated at configure time + +2000-10-22 11:58 aleidinger + + * aclocal.m4: + + generated by aclocal + +2000-10-22 11:58 aleidinger + + * configure.in: + + - add asm support if nasm is found + (if we support this, see ASM_FOR_ARCH) + - added automake support + - added libtool support + (a Dll user should look into "AC_LIBTOOL_WIN32_DLL" of the libtool + documentation and send apropriate patches) + - --enable-{mp3x,mp3rtp} + - only build analyzer if GTK is present + - set CPUTYPE (to use asm routines where supported) + - --enable-decoder* -> --disable-decoder* + +2000-10-22 11:57 aleidinger + + * acinclude.m4: + + remove GTK entry, "aclocal" takes care of it in aclocal.m4 + +2000-10-22 11:53 aleidinger + + * misc/Makefile.am: + + Initial automake support + +2000-10-22 11:52 aleidinger + + * Dll/Makefile.in, doc/Makefile.in, doc/html/Makefile.in, + doc/man/Makefile.in, include/Makefile.in, + libmp3lame/i386/Makefile.in, misc/Makefile.in, Makefile.in: + + generated by automake + +2000-10-22 11:50 aleidinger + + * frontend/: README.Win32, gpkplotting.c, gpkplotting.h, gtkanal.c, + gtkanal.h, mp3x.c, mp3x.dsp, mp3x.dsw: + + moved from analyzer/... because automake didn't allows sources for one + program/library to be in more than one directory (at least without + hacks) + +2000-10-22 11:46 aleidinger + + * Makefile.am: + + - initial automake support + - delete testcase.new.mp3 on "clean" + - added "update" target, does a cvs update + - added "diff" target, does a cvs diff -u + +2000-10-22 11:44 aleidinger + + * frontend/Makefile.am: + + - initial automake support + - conditionally build mp3x/mp3rtp + +2000-10-22 11:43 aleidinger + + * libmp3lame/: Makefile.am, i386/Makefile.am: + + Initial automake/libtool support: + - if nasm is detected and we have asm for this @CPUTYPE@: + * include asm support + - didn't build without decoder: "undefined reference to `mpg123_pinfo'" + +2000-10-22 11:41 aleidinger + + * mpglib/Makefile.am: + + Initial automake/libtool support: + - mpglib gets linked to libmp3lame.{a,so} + - isn't installed on it's own + +2000-10-22 11:39 aleidinger + + * Dll/Makefile.am, doc/Makefile.am, doc/html/Makefile.am, + doc/man/Makefile.am, include/Makefile.am: + + Initial automake support. + +2000-10-22 10:19 takehiro + + * libmp3lame/: l3side.h, newmdct.c, quantize.c, quantize_pvt.c, + quantize_pvt.h, takehiro.c, vbrquantize.c: + + 1. changed sfb_smax to sfb_smin. it is really minimum number, and so confusing. + 2. prepare for mixed block + 3. prepare for asm quantize code + +2000-10-22 09:41 takehiro + + * libmp3lame/: fft.c, util.h: + + no need to be in internal flag for constants + +2000-10-22 09:27 takehiro + + * libmp3lame/: Makefile.in, encoder.c, newmdct.c, newmdct.h, + util.h: + + 1 (util.h) deleted unused flag from internal flags + 2 (newmdct) in place code of mdct_short + 3 some cosmetic change + +2000-10-22 08:25 takehiro + + * libmp3lame/newmdct.c: + + code clean up + +2000-10-22 06:56 takehiro + + * libmp3lame/machine.h: + + deleted old remark about asm routine + +2000-10-22 06:56 takehiro + + * libmp3lame/newmdct.c: + + code cleanup + +2000-10-21 19:28 takehiro + + * libmp3lame/: quantize_pvt.c, i386/choose_table.nas: + + reduce memory assumption little and bit faster choose_table + +2000-10-21 19:11 takehiro + + * libmp3lame/newmdct.c: + + add coment and remove unused code + +2000-10-21 19:01 takehiro + + * libmp3lame/newmdct.c: + + bit optimization and now thread safe, I think. + +2000-10-21 17:24 takehiro + + * libmp3lame/newmdct.c: + + brute force loop unrolling and some elimination of multiple. + bit faster. + +2000-10-21 13:05 robert + + * libmp3lame/: encoder.c, quantize.c, quantize_pvt.c, + quantize_pvt.h, vbrquantize.c: + + frame analyzer info will now be set up in main encoding + routine only, for the whole frame. problem with SCFSI fixed + +2000-10-20 21:46 afaber + + * Dll/: BladeMP3EncDLL.c, BladeMP3EncDLL.h: + + Added lame alpha, beta version and if MMX is enabled to the version interface, + should be backward compatible + +2000-10-20 21:43 afaber + + * frontend/brhist.c: + + Fixed histgramming display for Win32, added fflush + +2000-10-20 20:50 afaber + + * frontend/: brhist.c, brhist.h: + + Resolved const mistach beween BRHIST function declartions + +2000-10-20 20:49 afaber + + * libmp3lame/libmp3lame.dsp: + + Added MPGLIB define + +2000-10-20 19:28 robert + + * misc/: abx.c, ath.c: + + initial checkin + +2000-10-20 13:04 robert + + * libmp3lame/: quantize.c, vbrquantize.c: + + I think I fixed a BUG in subblock gain code + +2000-10-19 21:10 robert + + * frontend/parse.c, include/lame.h, libmp3lame/lame.c, + libmp3lame/psymodel.c, libmp3lame/quantize.c: + + fixed BUG in atQ table, removed --raise-smr stuff + +2000-10-18 17:34 robert + + * libmp3lame/lame-analysis.h: + + no way to disable analysis for lame-lib + +2000-10-18 16:47 robert + + * libmp3lame/lame-analysis.h, mpglib/layer3.c, mpglib/mpglib.h: + + fixed some ambiguities + define NOANALYSIS as suggested in INSTALL if you don't want + to collect some analysis data + +2000-10-18 11:18 robert + + * frontend/brhist.c, include/lame.h, libmp3lame/lame.c: + + some tweaks + +2000-10-18 11:02 shibatch + + * libmp3lame/psymodel.c: + + Rewrote double to FLOAT8. + +2000-10-18 10:55 shibatch + + * libmp3lame/psymodel.c: + + Added short block pre-echo control to --nspsytune. + This improves castanets.wav. + +2000-10-17 22:59 pfk + + * STYLEGUIDE, frontend/brhist.c, frontend/brhist.h, + frontend/get_audio.h, frontend/main.c, frontend/parse.c, + frontend/parse.h, frontend/timestatus.c, include/lame.h, + libmp3lame/lame.c, libmp3lame/mpglib_interface.c, + libmp3lame/psymodel.c, libmp3lame/util.h: + + + + * small changes to prepare to add a lame float interface + * other stuff + +2000-10-17 00:13 pfk + + * Makefile.unix, frontend/brhist.c, frontend/brhist.h, + frontend/get_audio.c, frontend/timestatus.c, include/lame.h, + libmp3lame/VbrTag.c, libmp3lame/bitstream.c, libmp3lame/fft.c, + libmp3lame/lame.c, libmp3lame/mpglib_interface.c, + libmp3lame/quantize_pvt.c, libmp3lame/version.c, + libmp3lame/version.h: + + + + removed some shorts. + two version of version report + some minor changes + +2000-10-16 22:19 robert + + * frontend/: brhist.c, main.c: + + cosmetics + +2000-10-16 19:55 florian + + * Makefile.in, configure, configure.in, libmp3lame/Makefile.in, + libmp3lame/lame.c, mpglib/Makefile.in: + + integrated Alexanders patch, minor bug fixes + +2000-10-16 19:29 robert + + * libmp3lame/: tables.c, tables.h, takehiro.c: + + takehiro.c now thread safer + +2000-10-16 19:27 robert + + * frontend/brhist.h: + + missing include files + +2000-10-16 10:03 robert + + * Makefile.unix: + + some convenience + +2000-10-16 02:40 markt + + * include/lame.h, libmp3lame/VbrTag.c: + + [no log message] + +2000-10-16 02:29 markt + + * include/lame.h: + + added some prototypes. no code yet + +2000-10-16 02:29 markt + + * API: + + added some lame_set_variable prototypes in lame.h + +2000-10-16 02:17 markt + + * frontend/mp3rtp.c, include/lame.h, libmp3lame/fft.h, + libmp3lame/lame.c: + + fixed fft.h defines + +2000-10-16 02:12 markt + + * API, Makefile.in, configure, configure.in: + + broken frame analyzer fixed - -DANALYSIS was missing from default + library build + +2000-10-16 01:38 markt + + * frontend/: get_audio.c, main.c, mp3rtp.c: + + fixed broken fskip() + +2000-10-16 01:37 markt + + * STYLEGUIDE, Dll/BladeMP3EncDLL.c: + + fixed Frank's broken fskip() + +2000-10-16 00:44 markt + + * libmp3lame/: Makefile.in, mpglib_interface.c, util.c, util.h: + + made data for resampling dynamically allocated + +2000-10-16 00:28 pfk + + * STYLEGUIDE, frontend/brhist.c, frontend/brhist.h, + frontend/get_audio.c, frontend/parse.c, frontend/timestatus.c, + frontend/timestatus.h: + + + + Most changes must be switched on via KLEMM_0[0-9]. + Also some minor changes. + Start of short documenation of the source code. + + _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ + + **************** + *** #defines *** + **************** + + KLEMM_01: Use my experimental data to calculate ATH + But masking for >16 kHz seems to be buggy. + KLEMM_02: lame_set_stream_binary_mode() and lame_get_file_size() as + lib function, still searching a better place for that + KLEMM_03: not more used + KLEMM_04: faster FIR filter with less rounding errors + KLEMM_05: sparse VBR bitrate display + KLEMM_06: fskip() uses fseek() if possible + KLEMM_07: use of timestatus_klemm.c which only uses timestatus.c functions, + some code clarification and documentation + +2000-10-15 22:46 markt + + * libmp3lame/: util.c, util.h: + + lowpass filtering data structurs made dynamic + +2000-10-15 21:23 markt + + * USAGE: + + [no log message] + +2000-10-15 21:17 markt + + * frontend/get_audio.c, libmp3lame/VbrTag.c: + + Fixed bug parsing Xing VBR header: lame will now compute + correct number of frames when decoding + +2000-10-15 20:54 markt + + * Makefile.unix, frontend/get_audio.c, frontend/main.c: + + playback bugfix + +2000-10-15 20:12 markt + + * Dll/BladeMP3EncDLL.c: + + msv6 dll project files updated + +2000-10-15 20:11 markt + + * Dll/: MP3EncDll.dsp, MP3EncDll.dsw (MSVC6): + + msvc6 update + +2000-10-15 20:05 markt + + * Dll/: MP3EncDll.dsp, MP3EncDll.dsw: + + reverted back to MSVC5 project files. + accidently changed them to my MSVC6 versions. + + Albert, when are you goint to upgrade!!!! + +2000-10-15 20:02 markt + + * Dll/: MP3EncDll.dsp, MP3EncDll.dsw: + + msv6 dll project files updated + +2000-10-15 19:51 markt + + * libmp3lame/lame.c: + + fixed typo + +2000-10-15 19:33 markt + + * USAGE, include/lame.h, libmp3lame/lame.c: + + updated USAGE + +2000-10-15 19:10 markt + + * API, USAGE, Dll/BladeMP3EncDLL.c: + + edited API, USAGE + +2000-10-14 19:18 robert + + * libmp3lame/i386/cpu_feat.nas: + + BUG in 3DNow detection fixed, was my faulty porting to NASM + +2000-10-14 11:42 robert + + * libmp3lame/: takehiro.c, util.h: + + takehiro.c now thread safe ? + +2000-10-14 10:08 pfk + + * frontend/brhist.c, libmp3lame/psymodel.c: + + + + psymodel: FIR filter changed, trigger with KLEMM_04 + brhist: display changed back to the old display, new display must be + triggered by KLEMM_05 + +2000-10-13 22:58 pfk + + * frontend/brhist.c, frontend/brhist.h, frontend/main.c, + frontend/timestatus.c, include/lame.h, libmp3lame/util.c: + + + + Changes are commented in brhist.c or must be enabled with KLEMM_xx. + +2000-10-13 16:43 robert + + * frontend/brhist.c, frontend/brhist.h, frontend/main.c, + include/lame.h, libmp3lame/lame.c: + + bitrate histogram is working again + +2000-10-13 15:24 robert + + * Makefile.unix: + + small fixes + +2000-10-13 05:37 florian + + * frontend/Makefile.in, frontend/Makefile.in.old, + libmp3lame/Makefile.in, libmp3lame/Makefile.in.old: + + prepare for automake: new vars, system dependent checks to configure.in + +2000-10-13 05:17 florian + + * Makefile.in, Makefile.in.old, configure, configure.in, + configure.in.old: + + prepare for automake: new vars, system dependent checks to configure.in + +2000-10-12 19:19 florian + + * acinclude.m4, aclocal.m4, configure.in: + + Preparing for automake + +2000-10-12 17:48 robert + + * Makefile.MSVC, Makefile.unix: + + NASM specific fixes + +2000-10-12 17:19 robert + + * libmp3lame/i386/cpu_feat.nas: + + CPU feature code using NASM + +2000-10-12 17:18 robert + + * Makefile.MSVC, libmp3lame/Makefile.in, libmp3lame/util.c: + + CPU feature detection code now using NASM + +2000-10-12 08:59 shibatch + + * libmp3lame/: psymodel.c, quantize.c, quantize_pvt.c, util.h: + + Add two new features to --nspsytune. + 1. New block type selecting algorithm. + 2. Improved noise shaping at high bitrate CBR. Turned on by -q1 --nspsytune. + +2000-10-12 00:50 robert + + * Makefile.MSVC: + + it's getting better :-) + +2000-10-12 00:49 robert + + * frontend/parse.c: + + BUG fix in case LAME compiled without GTK, then called with -g + +2000-10-11 23:08 robert + + * libmp3lame/: Makefile.in, quantize_pvt.c, util.c: + + fixes for Frank's ATH + +2000-10-11 18:45 robert + + * include/lame.h, libmp3lame/lame.c: + + added alternative to lame_encode_finish: + - lame_encode_flush, does the same as lame_encode_finish + but will not free lame internal buffers + - lame_close, will free lame internal buffers + + So the following is equivalent to lame_encode_finish + lame_encode_flush() + + lame_close() + + But this adds the possibility to get some more + analyzing after all frames are encoded. + + Suggested to use with + lame_bitrate_hist() + lame_stereo_mode_hist() + +2000-10-11 17:54 robert + + * libmp3lame/: encoder.c, lame.c, util.c, util.h: + + simple statistics (histogram) added, + problem: lame_encode_finish() also frees internal buffer + solution: two new functions splitting lame_encode_finish() + into lame_encode_flush() and lame_close() + +2000-10-10 23:18 pfk + + * libmp3lame/util.c: + + + + Additional ATH calculation (enabled by KLEMM_01). + +2000-10-10 20:26 robert + + * libmp3lame/: lame.c, takehiro.c: + + use of MMX should be safe on non MMX CPUs now, + but this will not work on Microsoft platforms. + We will have to adapt the assembler routines + for the MS assembler or for NASM. + +2000-10-10 19:36 robert + + * Makefile.MSVC, libmp3lame/util.c: + + Makefile work + +2000-10-10 18:34 robert + + * libmp3lame/lame.c: + + cut'n'paste devil :( + +2000-10-10 18:28 robert + + * libmp3lame/: lame.c, util.c, util.h: + + Frank's CPU feature detection code added + +2000-10-10 17:59 afaber + + * Dll/BladeMP3EncDLL.c, Dll/BladeMP3EncDLL.h, frontend/brhist.c, + libmp3lame/VbrTag.c, libmp3lame/libmp3lame.dsp: + + MSVC Win32 updates, added Alpha Beta version numbers to DLL version structure + (should be backward compatible) + +2000-10-10 05:31 markt + + * TODO: + + notes about what needs to be done for configure + +2000-10-09 19:55 markt + + * libmp3lame/: encoder.h, lame-analysis.h: + + [no log message] + +2000-10-09 19:55 markt + + * TODO, frontend/timestatus.c, include/lame.h: + + generic cleanup + +2000-10-09 19:42 markt + + * TODO: + + frame analyzer now works with ./configure, at least for linux + +2000-10-09 19:29 markt + + * Makefile.B32, Makefile.DJGPP, Makefile.MSVC, TODO, configure, + configure.in, frontend/get_audio.c, frontend/get_audio.h: + + attept to fix Makefiles.B32, DJGPP, MSVC. + +2000-10-09 16:27 markt + + * libmp3lame/lame-analysis.h: + + [no log message] + +2000-10-09 16:23 markt + + * Makefile.in, Makefile.unix, aclocal.m4, configure, configure.in, + frontend/Makefile.in, frontend/main.h, + libmp3lame/lame-analysis.h: + + moved mp3x -> analyzer (name was clashing with executable name) + work on configure to get mp3x to compile (not yet done) + but gtk stuff in configure.in now working + +2000-10-09 14:38 markt + + * libmp3lame/lame.c: + + added a comment about downsampling + +2000-10-08 20:08 markt + + * frontend/main.c, frontend/timestatus.c, include/lame.h, + libmp3lame/VbrTag.c, libmp3lame/VbrTag.h, libmp3lame/encoder.c, + libmp3lame/lame.c: + + cleaned up VBR tag stuff + +2000-10-08 19:43 markt + + * frontend/get_audio.c, frontend/get_audio.h, frontend/main.c, + frontend/main.h, frontend/mp3rtp.c, frontend/parse.c, + frontend/parse.h, frontend/timestatus.c, frontend/timestatus.h, + include/lame.h, libmp3lame/lame.c, libmp3lame/version.c, + libmp3lame/version.h: + + lots of changes, just trying to get things to compile. + +2000-10-08 17:48 markt + + * libmp3lame/id3tag.h: + + Trying to add id3tag.h again. + +2000-10-07 08:25 robert + + * lame4dos.bat: + + bug fixes by Alexander Stumpf + +2000-10-07 05:04 markt + + * libmp3lame/: id3tag.c, util.h: + + missing id3tag.h include files for util.h, id3tag.c + +2000-10-07 05:00 markt + + * INSTALL, Makefile.unix, Dll/LameDLLInterface.htm, + frontend/main.c, frontend/main.h, include/lame.h, + libmp3lame/id3tag.c, libmp3lame/lame.c, libmp3lame/util.c, + libmp3lame/util.h: + + id3tag_spec made it back into lame.h. deleted. + + frameNum has to be in the library - the front end has no way + of correctly counting frames unless it parses the mp3 output + headers. totalframes should also probably be in the library. + +2000-10-06 21:16 florian + + * Makefile.in, configure, configure.in, frontend/Makefile.in, + libmp3lame/Makefile.in: + + minor changes for install and uninstall + +2000-10-06 13:19 takehiro + + * libmp3lame/: id3tag.c, lame.c, util.h: + + quick fix, maybe work but not checked hard + +2000-10-06 13:19 takehiro + + * frontend/main.c, include/lame.h: + + quick fix, I don't check this + +2000-10-06 00:55 markt + + * libmp3lame/: id3tag.c, lame.c, util.h: + + id3tag cleanup + +2000-10-06 00:54 markt + + * frontend/parse.c, include/lame.h: + + id3 stuff cleaned up. id3 related strucs made internal to the + library + +2000-10-05 19:53 cisc + + * frontend/: get_audio.c, get_audio.h: + + small correction + +2000-10-05 05:18 markt + + * TODO, frontend/Makefile.in: + + [no log message] + +2000-10-05 05:13 markt + + * Makefile.in, configure, configure.in, libmp3lame/Makefile.in: + + more configure work. + +2000-10-05 04:50 markt + + * testcase.mp3: + + updated testcase + +2000-10-05 04:49 markt + + * Makefile.in, libmp3lame/psymodel.c: + + added comment about Naoki's blocktype bug fix. + also, for JSTEREO but with the '-d' option, L and R channels + can have different block types, so we cant just look at the + block type for channel 0 + +2000-10-05 04:31 markt + + * Makefile.in, frontend/Makefile.in: + + forgot to add Makefile.in + +2000-10-04 22:37 robert + + * Lame.vbs: + + needs Windows Script >= 5.1, donated by Ralf Kempkens + +2000-10-04 17:13 afaber + + * Dll/Example.dsw, Dll/MP3EncDll.dsp, libmp3lame/libmp3lame.dsp, + mpglib/mpglib.dsp: + + MSVC project update(s) to new layout of the libmp3lame files + +2000-10-04 12:48 shibatch + + * libmp3lame/psymodel.c: + + Bugfix of long block pre-echo control. + +2000-10-04 12:13 takehiro + + * libmp3lame/i386/: choose_table.nas, fft.nas, fft3dn.nas, + fftfpu.nas, fftsse.nas, ffttbl.nas, nasm.h: + + moved i386 directory + +2000-10-04 04:26 markt + + * libmp3lame/Makefile.in: + + [no log message] + +2000-10-04 04:23 markt + + * configure, configure.in: + + make still does not work. some kind of infinite loop + +2000-10-04 04:00 markt + + * Makefile.unix: + + more configure work + +2000-10-04 03:54 markt + + * Makefile.in, Makefile.unix, VbrTag.c, VbrTag.h, amiga_mpega.c, + bitstream.c, bitstream.h, configure, configure.in, + debugscalefac.c, encoder.c, encoder.h, fft.c, fft.h, id3tag.c, + l3side.h, lame-analysis.h, lame.c, machine.h, mpglib_interface.c, + newmdct.c, newmdct.h, psymodel.c, psymodel.h, quantize.c, + quantize.h, quantize_pvt.c, quantize_pvt.h, reservoir.c, + reservoir.h, tables.c, tables.h, takehiro.c, util.c, util.h, + vbrquantize.c, version.c, version.h, vorbis_interface.c, + libmp3lame/Makefile.am, libmp3lame/Makefile.in, + libmp3lame/VbrTag.c, libmp3lame/VbrTag.h, + libmp3lame/amiga_mpega.c, libmp3lame/bitstream.c, + libmp3lame/bitstream.h, libmp3lame/debugscalefac.c, + libmp3lame/encoder.c, libmp3lame/encoder.h, libmp3lame/fft.c, + libmp3lame/fft.h, libmp3lame/id3tag.c, libmp3lame/l3side.h, + libmp3lame/lame-analysis.h, libmp3lame/lame.c, + libmp3lame/machine.h, libmp3lame/mpglib_interface.c, + libmp3lame/newmdct.c, libmp3lame/newmdct.h, + libmp3lame/psymodel.c, libmp3lame/psymodel.h, + libmp3lame/quantize.c, libmp3lame/quantize.h, + libmp3lame/quantize_pvt.c, libmp3lame/quantize_pvt.h, + libmp3lame/reservoir.c, libmp3lame/reservoir.h, + libmp3lame/tables.c, libmp3lame/tables.h, libmp3lame/takehiro.c, + libmp3lame/util.c, libmp3lame/util.h, libmp3lame/vbrquantize.c, + libmp3lame/version.c, libmp3lame/version.h, + libmp3lame/vorbis_interface.c: + + + Moved everything to libmp3lame. worked on configure, but + not quite working. + +2000-10-04 03:01 markt + + * frontend/aclocal.m4, frontend/configure, frontend/configure.in, + mpglib/configure, mpglib/configure.in: + + removed more configure files in subdirectories. + There should only be one ./configure, in the main directory + +2000-10-04 02:57 markt + + * configure, configure.in, frontend/get_audio.c, + frontend/get_audio.h, frontend/timestatus.c, + frontend/timestatus.h: + + more configure work + +2000-10-04 01:07 markt + + * configure, configure.in, frontend/Makefile.in: + + more configure patches for frontend. + +2000-10-04 01:02 markt + + * TODO, configure, configure.in, frontend/configure: + + new configure that doesn't run configure in all the subdirectories! + +2000-10-03 22:08 afaber + + * README.WINGTK, lamelib.dsp, frontend/lame.dsp, frontend/lame.dsw, + libmp3lame/libmp3lame.dsp, mpglib/mpglib.dsp: + + Re-organized some of the MSVC project files, fixes to compile mp3x again on Win32 platform + +2000-10-03 17:56 robert + + * fft.c: + + removed unused includes + +2000-10-03 10:32 robert + + * fft.c, fft.h, lame.c, psymodel.c, quantize.c, quantize_pvt.c, + util.h: + + fft.c now thread safe !? + +2000-10-03 09:44 robert + + * encoder.c, newmdct.c, newmdct.h: + + removed redundancies + +2000-10-03 09:43 robert + + * testcase.mp3: + + updated testcase for LAME 3.88 alpha 1 + +2000-10-03 04:07 markt + + * INSTALL: + + Some configure options are for the library, some are for + the front end. How do we pass front end options to + frontend/configure? + +2000-10-03 03:57 markt + + * Makefile.in: + + [no log message] + +2000-10-02 10:15 markt + + * Makefile.in: + + make -> $(MAKE) + +2000-10-02 09:00 markt + + * quantize_pvt.h: + + Fix for winamp bug. (commented out for now) + +2000-10-02 06:20 markt + + * aclocal.m4, configure, configure.in, frontend/configure, + frontend/configure.in: + + configure updates + +2000-10-01 19:05 afaber + + * lamelib.dsp, frontend/lame.dsp, mpglib/mpglib.dsp: + + Adapted project file in order to compile it again with the MSVC compiler + +2000-10-01 18:34 markt + + * Makefile.in: + + [no log message] + +2000-10-01 18:25 markt + + * INSTALL, Makefile.in, id3tag.c, lame-analysis.h, lame.c, + frontend/Makefile.in, frontend/configure, frontend/configure.in, + frontend/main.c, frontend/parse.c, include/lame-analysis.h, + include/lame-id3tag.h, include/lame.h: + + trying to move decoding back into library + +2000-10-01 17:58 afaber + + * frontend/get_audio.c: + + Make it compile again with MSVC compiler + +2000-10-01 17:17 markt + + * frontend/: gpkplotting.c, gpkplotting.h, gtkanal.c, main.c, + mp3x.c: + + moved GTK frame analyzer stuff into mp3x + +2000-10-01 15:29 takehiro + + * Makefile.in, aclocal.m4, configure, configure.in, + mpglib_interface.c, vorbis_interface.c, frontend/Makefile.in, + frontend/get_audio.c, frontend/main.c, + frontend/vorbis_interface.c, mpglib/Makefile.in, + mpglib/configure, mpglib/configure.in, mpglib/main.c: + + more modularization work. + VORBIS and mpglib interface is now in the libmp3lame library. + functions in these files are wrapper of mpglib/libvorbis. + I think it is ok to include them in libmp3lame. + +2000-10-01 15:19 takehiro + + * VbrTag.c: + + merged VbrTag.h into lame.h + +2000-10-01 15:03 takehiro + + * encoder.c, lame.c, util.h, Dll/BladeMP3EncDLL.c, + frontend/get_audio.c, include/lame.h: + + merged VbrTag.h into lame.h + +2000-10-01 11:28 afaber + + * mpglib/: common.c, common.h, dct64_i386.c, decode_i386.c, + interface.c, interface.h, layer1.c, layer1.h, layer2.c, layer2.h, + layer3.c, layer3.h, main.c, mpg123.h, mpglib.dsp, mpglib.h, + dct64_i386.h, decode_i386.h: + + More MPGLIB cleanup, got rid of the global mpstr struct gmp (in order to make lib thread safe) + +2000-10-01 10:40 afaber + + * mpglib/: common.c, common.h, decode_i386.c, interface.c, + layer3.c, mpg123.h: + + Cleanup of mpg123.h file (still need to get rid of the dirty extern gmp hack) + +2000-10-01 10:05 afaber + + * mpglib/: layer1.c, mpg123.h: + + Removed unused stuff in MPG123.h file, removed stuff that was commented out in Layer1.c + +2000-10-01 10:00 afaber + + * mpglib/: mpg123.h, tabinit.c: + + Removed some double/float warnings, removed disable warnings pragma for MSVC compiler + +2000-10-01 09:52 takehiro + + * lame.c, frontend/main.c: + + moved main_crc_init from frontend to library + +2000-10-01 09:51 afaber + + * mpglib/: common.c, common.h, dct64_i386.c, decode_i386.c, + interface.c, layer2.c, layer3.h, mpg123.h, mpglib.dsp, tabinit.c, + tabinit.h: + + Reorganized some of the function prototypes, removed non existing function prototypes from common.h + +2000-10-01 09:32 takehiro + + * libmp3lame/.cvsignore: + + initial check in for libmp3lame + +2000-10-01 09:29 takehiro + + * libmp3lame/Makefile.am: + + check in for the feauture... + +2000-10-01 09:09 afaber + + * bitstream.h, frontend/main.c: + + Added void main_CRC_init (void) function prototype in bitstream.h + +2000-10-01 06:24 takehiro + + * frontend/: Makefile.in, mp3x.c: + + making frameanalyzer problem fixed + +2000-10-01 04:56 markt + + * util.c: + + added Frank's normalization of Blackman filter coefficients. + This had no effect on any of my resample test cases. + +2000-09-30 15:32 markt + + * STYLEGUIDE: + + more notes on identation and int in STYLEGUIDE + +2000-09-30 15:09 afaber + + * id3tag.c: + + fixed signed/unsigned mismatch + +2000-09-30 14:50 markt + + * HACKING, bitstream.c, bitstream.h, util.c, util.h: + + added stuff in HACKING on how to handle global data + moved freegfc() into util.c + +2000-09-30 14:28 markt + + * util.c: + + number of pre-computed convolution windows determined dynamically. + (storage still needs to malloc'd and free'd in lame_encode_finish). + +2000-09-30 14:17 robert + + * Makefile.in: + + small fix + +2000-09-30 13:14 afaber + + * Dll/: BladeMP3EncDLL.c, MP3EncDll.dsp: + + Changes in order to get it compile on a Win32 platform + +2000-09-30 12:49 afaber + + * lamelib.dsp, VbrTag.h, lame.dsp, lame.dsw, frontend/brhist.c, + frontend/get_audio.c, frontend/lame.dsp, frontend/lame.dsw, + frontend/timestatus.c, mpglib/mpglib.dsp: + + Changes in order to get it compile on a Win32 platform + +2000-09-30 08:29 takehiro + + * frontend/parse.c: + + renamed some functions + +2000-09-30 08:21 takehiro + + * doc/html/: contributors.html, examples.html, history.html, + id3.html, index.html, lame.css, modes.html, node6.html, + switchs.html: + + new document for 3.87 from Gaby. + +2000-09-30 08:15 takehiro + + * frontend/: configure, configure.in: + + debug about gtk detection + +2000-09-30 07:54 takehiro + + * lame.c, frontend/get_audio.c, frontend/main.c, frontend/main.h, + frontend/mp3rtp.c, frontend/parse.c, include/lame.h: + + removed outpath from library. + +2000-09-30 06:58 takehiro + + * bitstream.c, bitstream.h, util.c, util.h: + + moved some code from util to bitstream + +2000-09-30 04:40 markt + + * VbrTag.c, lame.c, frontend/vorbis_interface.c: + + re-enabled id3v2 tag and Xing vbr header + +2000-09-29 18:16 takehiro + + * lame.c, frontend/get_audio.c, frontend/main.c, frontend/main.h, + frontend/parse.c, frontend/timestatus.c, include/lame.h: + + "silent" and "brhist" is moved to frontend + +2000-09-29 18:07 takehiro + + * lame.c, frontend/main.c, frontend/main.h, frontend/parse.c, + frontend/timestatus.c, include/lame.h: + + "update_interval" is moved to frontend + +2000-09-29 17:49 takehiro + + * encoder.c, lame.c, psymodel.c, quantize.c, vbrquantize.c, + frontend/main.c, frontend/parse.c, include/lame-analysis.h, + include/lame.h, frontend/mp3x.c: + + changed from "gtkflag" to "analysis", because it is not only for gtk. + +2000-09-29 17:48 takehiro + + * frontend/timestatus.c: + + oops, timestatus not correctly displayed + +2000-09-29 17:43 takehiro + + * id3tag.c, lame.c, quantize.c, quantize_pvt.c, util.h, + vbrquantize.c, frontend/gtkanal.c, frontend/main.c, + frontend/mp3x.c, frontend/parse.c, include/analysis.h, + include/id3tag.h, include/lame-analysis.h, include/lame-id3tag.h, + include/lame.h, mpglib/layer3.c, mpglib/mpglib.h: + + OK, Florian, I renamed include file avoid confusing. + (it's so generic and not likely to be unique) + +2000-09-29 17:31 takehiro + + * Makefile.in, encoder.c, lame.c, parse.c, psymodel.c, util.c, + util.h, vbrquantize.c, frontend/Makefile.in, frontend/brhist.c, + frontend/get_audio.c, frontend/get_audio.h, frontend/gtkanal.c, + frontend/main.c, frontend/main.h, frontend/parse.c, + frontend/parse.h, frontend/timestatus.c, + frontend/vorbis_interface.c: + + 1. timestatus things are moved to frontend(maybe complete ?) + 2. input file handling is moved to frontend(so the file input API is removed) + +2000-09-29 04:51 markt + + * frontend/brhist.c, frontend/get_audio.c, frontend/get_audio.h, + mpglib/main.c: + + removed analysis.h from get_audio.c + typo in brhist.c + +2000-09-28 23:31 robert + + * lame4dos.bat: + + improved lame.bat for 4DOS users, donated by Alexander Stumpf + +2000-09-28 16:36 takehiro + + * Makefile.in, VbrTag.c, brhist.c, brhist.h, configure, + configure.in, encoder.c, get_audio.c, get_audio.h, gpkplotting.c, + gpkplotting.h, gtkanal.c, id3tag.h, ieeefloat.c, ieeefloat.h, + lame.c, lametime.c, lametime.h, main.c, mp3rtp.c, mp3x.c, + parse.c, portableio.c, portableio.h, psymodel.c, quantize.c, + quantize_pvt.c, rtp.c, rtp.h, tables.c, timestatus.c, + timestatus.h, util.c, util.h, vbrquantize.c, version.c, + version.h, vorbis_interface.c, frontend/.cvsignore, + frontend/Makefile.in, frontend/aclocal.m4, frontend/brhist.c, + frontend/brhist.h, frontend/configure, frontend/configure.in, + frontend/get_audio.c, frontend/get_audio.h, + frontend/gpkplotting.c, frontend/gpkplotting.h, + frontend/gtkanal.c, frontend/ieeefloat.c, frontend/ieeefloat.h, + frontend/lametime.c, frontend/lametime.h, frontend/main.c, + frontend/mp3rtp.c, frontend/mp3x.c, frontend/parse.c, + frontend/portableio.c, frontend/portableio.h, frontend/rtp.c, + frontend/rtp.h, frontend/timestatus.c, frontend/timestatus.h, + frontend/vorbis_interface.c, include/id3tag.h, include/lame.h, + mpglib/Makefile.in, mpglib/layer3.c, mpglib/mpglib.h: + + moved frontend staffs into frontend/ + Need to debug vorbis/mpglib/analyzer/bitrate histgram. + still long way to go... + + HAVEGTK is changed ANALYSIS(library side) and HAVEGTK(frontend side) + + BRHIST is deleted from library. all the bitrate histogram works are + now in frontend(but not works properly, yet). + + timestatus things are also moved to frontend. + + parse.c is now out of library. + +2000-09-27 12:05 takehiro + + * include/analysis.h, gtkanal.h: + + moved gtkanal.h to include/analysis.h + +2000-09-27 04:17 florian + + * Makefile.in: + + fixed make install -> move of lame.h broke it. + +2000-09-26 17:47 takehiro + + * Makefile.in, gtkanal.h: + + more clean up and debug "make clean" + +2000-09-26 17:35 takehiro + + * Makefile.in: + + moved more staff out of libmp3lame + +2000-09-26 17:28 takehiro + + * Makefile.in: + + removed brhist.o etc from library + +2000-09-26 17:25 takehiro + + * include/lame.h: + + lame.h moved to include + +2000-09-26 17:24 takehiro + + * timestatus.c: + + little clean up + +2000-09-26 17:03 takehiro + + * Makefile.in, configure, configure.in, lame.h: + + 1 moved lame.h into include/ + 2 modularized work with mpglib + +2000-09-26 16:59 cisc + + * amiga_mpega.c: + + Mark, you broke lame_decode_initfile(), what were you thinking? ;) .. anyways, fixed, and added new mp3data struct variables... + +2000-09-26 15:48 takehiro + + * mpglib/: .cvsignore, Makefile.in, common.c, configure, + configure.in, dct64_i386.c, decode_i386.c, interface.c, layer3.c, + main.c, tabinit.c: + + configure support and more modularized work + +2000-09-26 15:47 takehiro + + * mpglib/Makefile: + + now this is generated by configure + +2000-09-26 05:22 markt + + * version.h: + + CVS is now 3.88 alpha 1 + +2000-09-26 04:49 markt + + * version.h: + + updated to 3.87 beta + +2000-09-26 04:48 markt + + * get_audio.c, get_audio.h, gtkanal.c, timestatus.c, mpglib/main.c: + + removed all references to gfc-> from get_audio.c + this was needed if we are going to move get_audio.c out of + libmp3lame and into the front end code. + +2000-09-26 01:00 markt + + * HACKING, STYLEGUIDE: + + [no log message] + +2000-09-26 00:55 markt + + * CodingStyle.c, lametype.h: + + Removed two files + +2000-09-26 00:09 markt + + * amiga_mpega.c, get_audio.c, lame.c, lame.h, timestatus.c, + timestatus.h, util.h: + + when input file was a mp3, it was trashing a bunch of + variables (mode, bitrate, etc..) + +2000-09-25 21:37 robert + + * Makefile.MSVC: + + MMX choose table support, needs NASM (can be disabled) + +2000-09-25 21:23 florian + + * configure, configure.in: + + changed default installation prefix to /usr (/usr/local/lib doesn't seem to be in default linker path) + +2000-09-25 20:58 florian + + * Makefile.in: + + fixed shared lib (runtime linker information) + +2000-09-25 15:20 markt + + * Makefile.in: + + removed ?= from makefile + +2000-09-25 14:36 shibatch + + * psymodel.c: + + A small bugfix of --nspsytune. + +2000-09-25 02:13 florian + + * configure, Makefile.in, configure.in: + + cleaner version handling of libmp3lame.so, uninstall target in Makefile + +2000-09-25 00:30 markt + + * id3tag.c: + + fixed genre bug in id3tag.c + +2000-09-24 22:59 markt + + * id3tag.c, vbrquantize.c: + + removed yet another unsigned loop counter + +2000-09-24 21:53 robert + + * Makefile.MSVC: + + enabled Takehiro's IEEE hack + +2000-09-24 14:59 robert + + * configure, configure.in: + + BUG fixed, which prevented using Layer1/2 decoding abilities + +2000-09-24 14:34 robert + + * encoder.c, lame.c, quantize.c, quantize_pvt.c, quantize_pvt.h, + util.h, vbrquantize.c: + + code cleanup and very little speedup + +2000-09-24 12:38 robert + + * quantize.c: + + minor RH_AMP tweak, and once again, do not use tabulator within this file + +2000-09-24 12:29 robert + + * quantize.c: + + please do not use tabulators within this file (better in no files) + +2000-09-24 12:22 robert + + * VbrTag.c: + + minor BUG fix for MPEG-2(.5) + +2000-09-24 11:39 takehiro + + * quantize.c: + + sorry, scalefac_scale did not have a bug. that was my compiler bug... + +2000-09-24 10:38 afaber + + * mpglib/interface.c: + + Fixed MP1/2 decoding problem, for files that were encoded with a CRC + +2000-09-24 01:32 markt + + * get_audio.c: + + minor fix to mp3 header parsing + +2000-09-23 23:36 afaber + + * bitstream.c: + + removed unused variable bits + +2000-09-23 23:36 afaber + + * id3tag.c: + + fixed signed/unsigned mismatch, added bitstream.h include file + +2000-09-23 22:31 markt + + * VbrTag.c, bitstream.c, bitstream.h, id3tag.c, id3tag.h, lame.c, + lame.h, main.c, parse.c: + + id3v1 and id3v2 tags now get written directly into + the bitstream instead of into the output file. + + The only file I/O left in libmp3lame will be the VBR tag. + +2000-09-23 21:13 markt + + * get_audio.c, lame.h, mpglib/main.c: + + removed lame_decode_fromfile() calls from the API, + moved them into get_audio.c + +2000-09-23 20:08 markt + + * lame.h, mpglib/main.c: + + some mpglib restructering. + All mp3 routines which work with files now only make + calls to lame_decode_* that are in the API. + +2000-09-23 14:48 markt + + * VbrTag.c: + + bug in Xing header for MPEG2.5 fixed + +2000-09-23 09:07 takehiro + + * quantize.c, quantize_pvt.c, util.c, util.h: + + workaround for subblock_gain and scalefac_scale artifact. + I hope this will fix -q1 problems. + +2000-09-23 02:11 markt + + * version.c: + + [no log message] + +2000-09-23 01:23 markt + + * mpglib/main.c: + + [no log message] + +2000-09-23 01:23 markt + + * VbrTag.c, VbrTag.h, lame.h, parse.c, util.c, util.h: + + bug fixed in decoding: if syncword found in Xing VBR header toc, + it would confuse things. + + Also fixed overflow in vbrtag.c, and changed size of xing vbr + header to 128kbs. This will make non-vbr aware players + give a more reasonable playing time estimate. + +2000-09-23 00:51 robert + + * psymodel.c: + + minor fix + +2000-09-22 22:54 shibatch + + * quantize.c, quantize_pvt.c: + + Minor bugfixes of --nspsytune. Frame analyzer works correctly with --nspsytune. + +2000-09-21 23:55 shibatch + + * parse.c, psymodel.c, quantize.c: + + Tweaks to --nspsytune. This improves CBR quality. + +2000-09-21 16:50 afaber + + * Dll/LameDLLInterface.htm: + + Updated lame_enc.dll documentation file + +2000-09-20 22:56 takehiro + + * Makefile.in, configure, configure.in, encoder.c, lame.c, + timestatus.c: + + more configure updates. + not compiling/linking BRHIST routine when it is disabled. + +2000-09-20 20:50 afaber + + * Dll/: BladeMP3EncDLL.c, BladeMP3EncDLL.h, Example.cpp: + + Added bNoRes option in LHV1 structure, updated example to have default settings as in testcase.wav test case + +2000-09-20 19:08 afaber + + * brhist.c, lame.h: + + Changed BRHST un-signed variables to signed variables + +2000-09-20 18:50 afaber + + * Dll/BladeMP3EncDLL.c: + + High quality was not enabled + +2000-09-20 18:49 afaber + + * Dll/MP3EncDll.dsp: + + Added TAKEHIRO_IEEE754_HACK define to project file + +2000-09-20 18:41 afaber + + * lame.dsp: + + Added TAKEHIRO_IEEE754_HACK define to project file + +2000-09-20 16:40 robert + + * quantize.c: + + VBR old quality tuning for --raise-smr + +2000-09-19 14:40 takehiro + + * Makefile.in: + + update glibc inline math error detection + +2000-09-19 14:32 takehiro + + * configure, configure.in: + + oops, needless gabage removed + +2000-09-19 14:26 takehiro + + * configure: + + newer configure script made by configure.in + +2000-09-19 14:12 takehiro + + * Makefile.in, configure.in: + + not compiling/linking mpglib code when it disabled. + not compiling/linking gtk related code when it disabled. + + control LAYER1 and LAYER2 decoding function with --enable-decode-layer1 and + --enable-decode-layer2 + + autodetect math inline bug of glibc < 2.1.3 + +2000-09-19 14:11 robert + + * quantize_pvt.c: + + modified --ATHlower to not touch sfb21 + +2000-09-19 14:06 takehiro + + * .cvsignore: + + ignore files related configure script and library itself + +2000-09-19 05:33 markt + + * mpglib/main.c: + + got rid of a size_t in main.c + +2000-09-19 05:19 markt + + * lame.dsp (MSVC6), Dll/MP3EncDll.dsp: + + updated msvc6 project files + +2000-09-19 04:54 markt + + * mpglib/main.c: + + removed unsigned int being used as a loop counter. + +2000-09-19 04:18 markt + + * encoder.h, lame.c, util.c, util.h: + + updated filter settings + +2000-09-18 22:29 afaber + + * Dll/Example.cpp: + + Bug fixes in example file + +2000-09-18 21:57 markt + + * testcase.mp3, util.c, util.h: + + changed BPC to 160 on Frank's advice. + This means pre-compute 160 filter-sinc-windows, instead of just 16. + Should also fix the aliasing problem shown in mp3.com bulliten + board + +2000-09-18 21:30 markt + + * Makefile.B32, Makefile.DJGPP, Makefile.in, Makefile.unix: + + Makefiles updated to reflect that all the ASM code has been + removed and replaced with IEEE754_HACK. I'm glad to see + it gone - but I didn't remove it! + +2000-09-18 21:28 markt + + * STYLEGUIDE, VbrTag.c, brhist.c, get_audio.c, machine.h, + quantize.c, quantize_pvt.c, takehiro.c, vorbis_interface.c: + + minor code cleanup. + +2000-09-18 20:53 afaber + + * lame.dsp: + + Fixed library problem in ReleaseGTK mode + +2000-09-18 20:09 markt + + * config.log: + + removed config.log from repository + +2000-09-18 19:43 afaber + + * brhist.c: + + Fixes for Cygwin compiler + +2000-09-18 18:52 markt + + * INSTALL, Makefile.in, Makefile.unix, config.log: + + more configure updates + +2000-09-18 18:34 markt + + * INSTALL, INSTALL.configure, Makefile, Makefile.in, Makefile.unix, + aclocal.m4, confdefs.h, config.guess, config.log, config.sub, + configure, configure.in, install-sh: + + added configure stuff from Florian! + + original Makefile is now in Makefile.unix + +2000-09-18 01:48 cisc + + * util.c, vbrquantize.c, version.h: + + warning fixes & bumped alpha version + +2000-09-17 23:25 markt + + * Makefile, lame.h: + + added note about shared library + +2000-09-17 22:25 markt + + * USAGE, encoder.c, lame.c, lame.h, parse.c: + + --scale option added + +2000-09-17 21:47 afaber + + * bitstream.c, get_audio.c, quantize.c: + + removed unecessary (int) casts + +2000-09-17 21:21 markt + + * HACKING, STYLEGUIDE, lame.h: + + some editing + +2000-09-17 21:04 afaber + + * encoder.c, lame.dsp: + + Enabled BRHIST in MSVC project file, and changed calls to brhist functions in encoder.c + +2000-09-17 20:55 markt + + * encoder.c, takehiro.c: + + forgot to add encoder.c to cvs + +2000-09-17 20:53 markt + + * bitstream.c, machine.h, util.c, util.h: + + more 'unsigned's removed + +2000-09-17 20:52 afaber + + * brhist.c, brhist.h, lame.c, lame.h, timestatus.c: + + Moved BRHIST variables to lame_global_flags structure, so a library (like lame_enc.dll) can have access to the histogramming data + +2000-09-17 20:20 markt + + * lame.c, testcase.mp3, version.c: + + resampling nolonger needs to quantize back to integers + since internal representation of PCM samples is now floating point + +2000-09-17 19:50 markt + + * Makefile, fft.c, gtkanal.c, lame.c, machine.h, newmdct.c, + newmdct.h, psymodel.c, psymodel.h, testcase.mp3, util.c, util.h, + mpglib/main.c: + + sample_t changes updated, sample_t = FLOAT + +2000-09-17 18:52 markt + + * INSTALL, Makefile, Makefile.B32, Makefile.DJGPP, Makefile.MSVC, + encoder.h, lame.c, lame.dsp, lametime.h, main.c, timestatus.h, + Dll/MP3EncDll.dsp: + + added encoder.c which has the core encoding function. + fixed sample_t stuff + +2000-09-17 17:55 robert + + * Makefile, l3side.h, quantize.c, quantize_pvt.c, takehiro.c: + + not everyone has access to Vorbis in Mark's home directory ;-) + +2000-09-17 17:54 afaber + + * mpglib/main.c: + + Changed return value from zero to -1 when EOF has been reached + +2000-09-17 16:19 takehiro + + * quantize.c: + + added #include + +2000-09-17 10:07 takehiro + + * get_audio.c: + + trivial warning fix + +2000-09-17 09:32 takehiro + + * quantize_pvt.c: + + removed old assembler code + +2000-09-17 09:30 takehiro + + * main.c: + + quick hack for "sample_t is not defined" + +2000-09-17 05:00 cisc + + * get_audio.h, version.c: + + updated some libsndfile related stuff + +2000-09-17 04:19 cisc + + * VbrTag.h, bitstream.h, brhist.h, encoder.h, fft.h, get_audio.h, + gpkplotting.h, gtkanal.h, id3tag.h, ieeefloat.h, l3side.h, + lame.h, lametime.h, lametype.h, machine.h, newmdct.h, + portableio.h, psymodel.h, quantize.h, quantize_pvt.h, + reservoir.h, rtp.h, tables.h, timestatus.h, util.h, version.h: + + conformed all this-is-included-defines to match 'project_file_name' style + +2000-09-16 22:52 afaber + + * lame.dsp, reservoir.c, reservoir.h, tables.c, tables.h, + timestatus.c, timestatus.h, util.c, util.h, vbrquantize.c: + + Changed lame header/source to LGPL license where necessary, added LGPL header to files when applicable + +2000-09-16 22:39 afaber + + * encoder.h, fft.h, get_audio.c, get_audio.h, gpkplotting.c, + gpkplotting.h, gtkanal.c, gtkanal.h, l3side.h, lametime.c, + lametime.h, newmdct.h, parse.c, psymodel.h, quantize.c, + quantize.h, quantize_pvt.c, quantize_pvt.h, Dll/MP3EncDll.dsp: + + Changed lame header/source to LGPL license where necessary, added LGPL header to files when applicable + +2000-09-16 22:16 afaber + + * fft.c, machine.h, psymodel.c: + + Removed the float/double compiler warnings + +2000-09-16 22:08 afaber + + * Dll/: BladeMP3EncDLL.h, MP3EncDll.dsp: + + Small changes to the lame_enc project settings + +2000-09-16 21:52 afaber + + * brhist.c, brhist.h, get_audio.c, gtkanal.c, lametime.h, main.c, + psymodel.c, quantize.c, takehiro.c, timestatus.c, vbrquantize.c, + mpglib/layer2.c, mpglib/layer3.c, mpglib/main.c: + + Removed a bunch of signed/unsigned compiler warnings + and removed const/no const assignements compiler warnings + welcome to const hell Frank! + +2000-09-16 21:07 markt + + * Makefile, quantize_pvt.c: + + shared lib support, IEEE stuff the default on i386 + +2000-09-16 21:07 cisc + + * amiga_mpega.c: + + added mode & mode_ext support to mp3data struct, like mpglib/main.c + +2000-09-16 21:06 afaber + + * lame.dsp: + + Added lametime.c and lametime.h files to project + +2000-09-16 19:03 markt + + * HACKING, STYLEGUIDE: + + style updates + +2000-09-16 18:54 markt + + * STYLEGUIDE: + + adding STYLEGUIDE + +2000-09-16 18:54 markt + + * CodingStyle.c, LICENSE, USAGE, bitstream.c, get_audio.c, + gtkanal.c, id3tag.c, l3side.h, lame.c, lame.h, lametime.c, + machine.h, parse.c, quantize.c, quantize_pvt.c, quantize_pvt.h, + tables.c, tables.h, takehiro.c, testcase.mp3, timestatus.c, + util.h, vbrquantize.c, version.c, mpglib/common.h, + mpglib/interface.h, mpglib/main.c: + + got rid of a bunch of unsigned variables. + +2000-09-16 13:59 afaber + + * brhist.c, psymodel.c, quantize_pvt.c, takehiro.c, vbrquantize.c: + + Removed the signed/unsigned mismatch compiler warnings + +2000-09-16 13:30 afaber + + * bitstream.c: + + Removed the signed/unsigned mismatch compiler warnings + +2000-09-16 12:53 afaber + + * mpglib/layer1.c: + + Switched include from mpg123.h to common.h to avoid compiler warnings + +2000-09-16 00:43 cisc + + * psymodel.c, timestatus.c: + + warning fixes + +2000-09-15 16:36 shibatch + + * psymodel.c: + + Tweaks to --nspsytune. + +2000-09-15 15:01 takehiro + + * quantize_pvt.c: + + oops, foolish bug ... + +2000-09-15 13:03 takehiro + + * quantize_pvt.c: + + TAKEHIRO_IEEE754_HACK now C99 aliasing rule compliant. + it runs correctly with "-fstrict-aliasing" (GCC) + +2000-09-14 03:32 markt + + * brhist.c, mpglib/mpg123.h: + + fixed VBR display + +2000-09-13 23:31 markt + + * Makefile, quantize.c, reservoir.c: + + NORES_TEST turned back of + +2000-09-13 18:46 afaber + + * Dll/BladeMP3EncDLL.c: + + Fixed bug in lame_enc.dll when using preset option, and return proper frame size when using MPEG-2 + +2000-09-13 18:24 afaber + + * mpglib/: common.c, common.h, interface.c, interface.h, layer2.c, + layer3.c, main.c, mpg123.h, mpglib.dsp, mpglib.h: + + Added common.h and interface.h, and added the functions prototypes that should be in these files, instead of mpg123.h + +2000-09-13 18:22 markt + + * util.c: + + precompute for filter turned back on + +2000-09-13 18:19 markt + + * lame.c, util.c, util.h: + + replaced upsampling filter with 19 point blackman filter + +2000-09-13 11:18 markt + + * parse.c: + + typo in documentation + +2000-09-13 11:03 markt + + * Makefile, parse.c, testcase.mp3, vorbis_interface.c: + + fixed vorbis_interface.c so it would compile + +2000-09-13 10:59 markt + + * Makefile, bitstream.c, fft.c, get_audio.c, lame.c, lame.h, + psymodel.c: + + fixed some bugs introduced by frank. + get_audio.c must count samples for .wav files. + lame.c: disabling ATH is not the way to solve the problem Frank + wants to solve + +2000-09-13 09:23 robert + + * quantize.c: + + quality adjustment for VBR old to better use --raise-smr + +2000-09-12 22:36 pfk + + * brhist.c, gtkanal.c, id3tag.c, lame.c, lametype.h, main.c, + psymodel.c, quantize.c, quantize_pvt.c, tables.c, tables.h, + takehiro.c, util.c, util.h, vbrquantize.c, vorbis_interface.c, + mpglib/common.c, mpglib/huffman.h, mpglib/l2tables.h, + mpglib/layer2.c, mpglib/layer3.c, mpglib/main.c, mpglib/mpg123.h, + mpglib/tabinit.c: + + + + added const to all constant tables, so that they are placed in write + protected RAM or in ROM (standalone DSP version). + + The SEGFAULT be with you (instead of debugging for hours). + + Also some remarks instead of changes instead of code changes. + + Remove them if they are fully useless. + +2000-09-12 20:47 robert + + * Makefile, lame.c, lame.h, parse.c, psymodel.c, quantize_pvt.c: + + added --raise-smr <0..1> a new toy to control quality + +2000-09-12 18:20 pfk + + * Makefile, Makefile.B32, Makefile.DJGPP, Makefile.MSVC, + bitstream.c, get_audio.c, lame.c, lame.h, lametype.h, parse.c, + util.h, version.h, vorbis_interface.c, mpglib/main.c: + + + + Some bug fixes + Activated lametime.c + Two types of display update now possible (old and new, depends on Makefile) + +2000-09-12 06:26 pfk + + * brhist.c, lame.c, lametype.h, version.c: + + + + brhist.c Changed display of percentages between 0.1 and 1 % + + lame.c: ??? + version.h: include as less as possible + + lametype.h: First try to disentangle the #include jungle of lame + (this style would be the immediate death for larger + projects) + +2000-09-12 00:47 markt + + * main.c, mpglib/l2tables.h, mpglib/layer2.h: + + al_table struct renamed al_table2 + +2000-09-11 20:33 shibatch + + * psymodel.c: + + --nspsytune uses additive masking. + +2000-09-11 20:05 robert + + * psymodel.c: + + disabled "additive masking" in subband calculation + +2000-09-11 20:04 robert + + * lame.c, lame.h, parse.c, quantize.c, quantize.h, quantize_pvt.c: + + experimental mix of VBR new and old available with --vbr-mtrh + +2000-09-10 23:24 markt + + * HACKING: + + added rule #1 LAME style guide + +2000-09-10 22:13 markt + + * doc/html/modes.html: + + modes.html was not in the repository + +2000-09-10 21:45 markt + + * testcase.mp3, testcase.wav: + + made the test case a little longer + (100k .wav file) + +2000-09-10 21:27 markt + + * lame.h, parse.c, mpglib/huffman.h, mpglib/l2tables.h, + mpglib/layer2.h: + + reverted mpglib routines back to original. + please keep mpglib as close as possible to the mpg123/mpglib + code that it is based on. + + Went back to display every 100 frames, which I prefer. + +2000-09-10 20:54 markt + + * Makefile, lame.c, timestatus.c: + + went back to display every 100 frames. + +2000-09-10 19:54 cisc + + * brhist.c: + + small adjustment + +2000-09-10 19:52 cisc + + * version.c: + + correct includes for libsndfile prototypes + +2000-09-10 18:05 pfk + + * Makefile, USAGE, brhist.c, brhist.h, fft.c, fft.h, lame.c, + lame.h, version.h, mpglib/huffman.h: + + + + some minor changes. Start to introduce sample_t. + + Changed VBR display. + +2000-09-10 13:11 pfk + + * fft.c, parse.c, psymodel.c, version.h, mpglib/l2tables.h, + mpglib/layer2.h: + + + + fft.c: loop variables short => size_t/int + layer2.h + l2tables.h: formated, structure definition changed for (possible) + speedup + parse.c optimized sfb21 usage for presets + +2000-09-09 23:00 pfk + + * get_audio.c, gtkanal.c, lametime.c, lametime.h, mpglib/common.c, + mpglib/l2tables.h, mpglib/layer2.c, mpglib/layer2.h, + mpglib/mpg123.h: + + + + struct al_table {} <=> + typedef struct {} al_table conflict removed + + lame/gtkanal.c: typecast of functions ptr's + +2000-09-09 21:11 pfk + + * CodingStyle.c, Makefile, USAGE, lametime.c, lametime.h, mlame, + mlame_corr.c, quantize_pvt.c, quantize_pvt.h, vbrquantize.c, + version.c, version.h, mpglib/layer1.c, mpglib/layer2.c: + + + + Makefile: added option -pedantic + USAGE: updated some remarks, + added some remarks, + kbs => kbps, HZ/hz => Hz, space between number and unit + mlame: -mf => -mj + uses mlame_corr + mlame_corr: First try of a program which analyzes the total file + and recommend flags + quantize_pvt.*: made some arrays const + asm => __asm__ + version.* copied vom pfk1 tree + mpglib/*.c added newline at the end of the file + + CodingStyle.c start of an CodingStyle Guide, pre-alpha + lametime.* heavy system specific code should moved to this + file, should not mixed with other code + +2000-09-09 21:04 cisc + + * amiga_mpega.c: + + warning fix + +2000-09-09 14:41 robert + + * bitstream.c: + + fixed debugging code + +2000-09-09 11:40 takehiro + + * newmdct.c: + + sorry, back to old... + +2000-09-09 11:22 robert + + * quantize.c: + + BUG fix for possible endless loop in RH_AMP code + +2000-09-09 10:59 takehiro + + * newmdct.c: + + bit faster mdct. + there's some difference caused by rounding problem, but i think this is OK. + +2000-09-09 10:34 takehiro + + * bitstream.c: + + bit faster putbits + +2000-09-09 10:28 takehiro + + * bitstream.c: + + small fix of debugging code + +2000-09-08 19:28 robert + + * quantize.c: + + to combine VBR_rh with VBR_mt define RH_VBR_MTRH at compile time + +2000-09-08 16:05 robert + + * quantize.c, quantize_pvt.c, quantize_pvt.h: + + merging branches pfk1 with main + +2000-09-08 14:55 robert + + * gtkanal.h, quantize.c, quantize_pvt.c, quantize_pvt.h, + vbrquantize.c: + + set_pinfo calcs noise and masking of its own + +2000-09-08 12:17 robert + + * parse.c, quantize.c, quantize_pvt.c, quantize_pvt.h, takehiro.c, + vbrquantize.c: + + substitution of lame_global_flags with lame_internal_flags + +2000-09-08 11:22 robert + + * parse.c: + + Bug fix for automatic file type recognition back into MAIN branch + +2000-09-08 10:04 shibatch + + * psymodel.c: + + A minor bugfix of mask_add(). + +2000-09-07 23:37 pfk + + * mlame_corr.c: + + + + file to use with mlame to select different modes by pre analysing wav files. + +2000-09-07 18:06 afaber + + * mpglib/mpglib.dsp: + + Cleanup project file a bit + +2000-09-07 18:05 afaber + + * README.WINGTK: + + Small modification to the instruction, in order to compile/link with latest GTK/GDK libs + +2000-09-07 18:04 afaber + + * lame.dsp: + + Changed project file to work with latest GTK/GDK libs + +2000-09-07 17:40 afaber + + * Dll/BladeMP3EncDLL.c: + + Fixed problem in VBR WriteTag function (it did not compile, MP3 file stream was not closed properly, wrong file name was used) + +2000-09-07 12:26 shibatch + + * psymodel.c, quantize_pvt.c: + + Tweaks to --nspsytune. + +2000-09-06 23:19 robert + + * quantize.c (pfk1): + + modularization and clean-up finished + +2000-09-06 18:02 markt + + * Makefile (pfk1): + + [no log message] + +2000-09-06 07:50 shibatch + + * psymodel.c, quantize_pvt.c: + + updated --nspsytune. + +2000-09-06 07:15 markt + + * Makefile, amiga_mpega.c, bitstream.c, brhist.c, fft.c, fft.h, + get_audio.c, get_audio.h, gtkanal.c, gtkanal.h, lame.c, lame.h, + main.c, mp3rtp.c, newmdct.c, newmdct.h, parse.c, psymodel.c, + psymodel.h, quantize.c, quantize_pvt.c, quantize_pvt.h, + reservoir.c, tables.c, tables.h, takehiro.c, timestatus.c, + util.c, util.h, vbrquantize.c, version.c, version.h, + vorbis_interface.c, mpglib/common.c, mpglib/decode_i386.c, + mpglib/huffman.h, mpglib/interface.c, mpglib/l2tables.h, + mpglib/layer1.c, mpglib/layer2.c, mpglib/layer3.c, mpglib/main.c, + mpglib/mpg123.h: + + LAME CVS reverted back to Aug 30 version. + + code before this can be checked out with: + cvs update -r pfk1 + +2000-09-05 23:55 pfk + + * HACKING, Makefile, TODO, get_audio.c, lame.c, lame.h, mlame, + parse.c, version.h, mpglib/README, mpglib/huffman.h, + mpglib/layer1.c, mpglib/layer2.c: + + + HACKING: add type proposals + Makefile: layer 1 enabled + mlame: flaw removed + get_audio: C-Linkage problem solved + layer1.c: bug fixed + disabled decoding enabled, works for C/C++ + huffman.c: read protect/scope protect tables using 'const'/'static' + lame.h: Starting RPC support, 3 macros IN/OUT/INOUT defined + Starting supported for szip compressed wave/aiff + parse.c: detection of raw/wav/aiff input (proposal of RH) + boolean bug fixed !=||!=||!= + layer2.c: common layer1/layer2 buffer moved from layer2.c to layer1.c + lame.c: bug fixed: -V9 switched to mono + Auto switch to mono reported wrong compression ratio + report of forced joint stereo usage + + *: Some spelling errors removed + +2000-09-05 22:20 robert + + * quantize.c: + + more modularization and clean-up, some few more to come + +2000-09-05 20:39 shibatch + + * psymodel.c: + + Tweaks to --nspsytune(table optimization). + +2000-09-05 16:36 cisc + + * parse.c, mpglib/common.c, mpglib/interface.c, mpglib/l2tables.h, + mpglib/layer1.c, mpglib/layer2.c, mpglib/layer3.c: + + quick fix to make mpglib compile, prolly still broken though. fixed mono bug in layer1.c? + +2000-09-04 23:17 shibatch + + * psymodel.c: + + Tweaks to --nspsytune. + +2000-09-04 19:56 robert + + * quantize.c: + + more cleanup in VBR_rh + +2000-09-04 16:05 robert + + * quantize.c: + + more modularization work + + it is now possible to combine VBR_RH with VBR_MT + +2000-09-03 22:33 cisc + + * brhist.c: + + small change + +2000-09-03 19:10 robert + + * quantize.c: + + updated remarks + +2000-09-03 17:21 pfk + + * get_audio.c, gtkanal.c, lame.h, main.c, mp3rtp.c, parse.c, + util.c, util.h, version.h: + + + + some bugfixes, move some functionality to two simple functions. + + Added support of 24 and 32 bit BE and LE AIFF and WAV files + (simple support, only using upper 16 bit) + + marking 3 areas which seems to be buggy. + +2000-09-03 17:19 robert + + * quantize.c, quantize_pvt.c, quantize_pvt.h, takehiro.c, + vbrquantize.c: + + code cleanup in quantize_pvt.c + +2000-09-03 15:06 robert + + * lame.c, quantize.c, quantize_pvt.c, quantize_pvt.h, takehiro.c, + vbrquantize.c: + + takehiro.c now free of lame_global_flags + +2000-09-03 14:05 robert + + * quantize.c, quantize_pvt.c, quantize_pvt.h: + + code clean up + +2000-09-03 13:06 pfk + + * Makefile, brhist.c, get_audio.c, get_audio.h, gtkanal.c, lame.c, + lame.h, main.c, version.c, version.h: + + + + minor fixes + + get_audio: (simple) support of 24 bit PCM + Replaced the different types of tabs by 3, 4 or 8 spaces + +2000-09-03 12:42 shibatch + + * psymodel.c: + + Tweaks to --nspsytune. + +2000-09-03 11:47 shibatch + + * psymodel.c, quantize_pvt.c: + + Tweaks to --nspsytune. Noise calculation using tonality is canceled. + +2000-09-03 09:54 robert + + * tables.c: + + fix for i386/choose_table.nas, could not be linked + +2000-09-03 06:50 cisc + + * lame.c: + + removed *extremely* annoying debug. fixed related bug? should be checked if mono encoding still works! + +2000-09-03 06:48 cisc + + * get_audio.c: + + fixed conflicting prototype when LIBSNDFILE is defined + +2000-09-02 18:06 robert + + * quantize_pvt.c: + + small fix to previous check in + +2000-09-02 18:03 robert + + * gtkanal.h, quantize.c, quantize_pvt.c, quantize_pvt.h, + vbrquantize.c: + + set_pinfo does now the noise calculation for the frame analyzer + code cleanup + +2000-09-02 15:36 pfk + + * mlame: + + + + extended functionality and feature fix + +2000-09-02 13:36 pfk + + * main.c: + + + + bug fix. + +2000-09-02 13:28 pfk + + * get_audio.c, main.c: + + + + Bug fix in final fwrite(). + +2000-09-02 06:38 cisc + + * util.h: + + warning and error fixes + +2000-09-02 05:42 cisc + + * mpglib/mpg123.h: + + It's important to remember the PARENT_IS_SLASH define when including files from previous dir. + +2000-09-02 05:29 cisc + + * amiga_mpega.c, lame.c, util.c: + + warning and error fixes + +2000-09-02 03:13 pfk + + * Makefile, get_audio.c, gtkanal.c, lame.c, lame.spec, psymodel.h, + timestatus.c, util.c, util.h, vbrquantize.c, version.c, + version.h, mpglib/l2tables.h, mpglib/layer2.c, mpglib/mpg123.h: + + + + Quick and Dirty: Now compilable with g++. + + Layer 1 and 2 decoding makes problems. + + structs and typedef structs with the same name. + Must be patched. + +2000-09-02 01:03 cisc + + * psymodel.c, quantize_pvt.c, timestatus.c: + + warning fixes + +2000-09-01 23:28 pfk + + * Makefile, lame.c, lame.h, util.c, util.h, mpglib/layer1.c, + mpglib/layer2.c: + + + + Bugfix for 9 kbps error + +2000-09-01 23:28 robert + + * get_audio.c: + + small typo in remark + +2000-09-01 20:21 pfk + + * bitstream.c, get_audio.c, gtkanal.c, gtkanal.h, lame.c, lame.h, + newmdct.c, psymodel.c, quantize.c, quantize_pvt.c, reservoir.c, + tables.c, tables.h, util.c, util.h, vbrquantize.c, version.h, + mpglib/common.c, mpglib/interface.c, mpglib/layer1.c, + mpglib/layer2.c, mpglib/layer3.c, mpglib/main.c, mpglib/mpg123.h: + + + + * A lot of minor changes + + * Changed the name of structure element from 'stereo' to 'channels' + if it has the meaning of 'channels'. This is so confusing, so that + there are some bugs in lame. + + Rest read in 'Bad and worse programming styles' and 'job security' + + -- + Frank Klemm + +2000-09-01 16:19 robert + + * lame.c: + + small fix, lame -v x.wav did not work anymore + +2000-09-01 04:04 cisc + + * amiga_mpega.c: + + some warning and error fixes + +2000-09-01 04:03 cisc + + * LICENSE: + + libsndfile is now LGPL + +2000-09-01 00:05 pfk + + * brhist.c, lame.c, parse.c, quantize.c, util.c, util.h, version.c: + + + + presets modified + changed name of bitrate_table to index_to_bitrate + added table bitrate_to_index, speedup of functions using it. + +2000-08-31 21:33 pfk + + * Makefile, amiga_mpega.c, fft.c, fft.h, get_audio.c, get_audio.h, + gtkanal.c, lame.c, lame.h, main.c, mp3rtp.c, newmdct.c, + newmdct.h, psymodel.c, psymodel.h, quantize_pvt.c, util.c, + util.h, version.c, version.h, vorbis_interface.c, + mpglib/decode_i386.c, mpglib/main.c: + + + + Introduction of the type sample_t for PCM samples. + 'short' should not be used in the future. + +2000-08-31 11:06 shibatch + + * psymodel.c: + + minor bugfix of mask_add(). + +2000-08-30 23:29 pfk + + * LICENSE, PRESETS.draft, bitstream.c, lame.c, parse.c, + timestatus.c, util.h, version.c, version.h: + + [no log message] + +2000-08-30 07:18 shibatch + + * quantize_pvt.c: + + Tweaks to --nspsytune. + +2000-08-29 22:35 pfk + + * debugscalefac.c, get_audio.c, id3tag.c, lame.c, lame.h, parse.c, + util.c, util.h, version.c, version.h, doc/html/switchs.html: + + [no log message] + +2000-08-29 10:14 shibatch + + * psymodel.c, quantize_pvt.c: + + Tweakings to --nspsytune. + Tonality table is optimized a little. + Noise calculation now uses tonality. + NSATHSCALE is decreased from 103 to 100. + +2000-08-28 20:18 robert + + * lame.c: + + small tweak to RH_VALIDATE_MS + +2000-08-28 19:55 robert + + * lame.h, parse.c, psymodel.c: + + small fixes + +2000-08-28 19:27 shibatch + + * psymodel.c: + + Tweaks to the tonality table. vbrtest.wav is now encoded correctly with --nspsytune. + +2000-08-28 18:37 pfk + + * lame.h, parse.c, version.c, version.h: + + + + parse.c: presets are taken from a table + version.c: version incremented (should be done more often) + +2000-08-28 10:04 shibatch + + * parse.c, quantize_pvt.c, psymodel.c: + + + Changes to --nspsytune. + +2000-08-27 11:51 robert + + * lame.c: + + tweak to validate MS switching criterion (to be enabled with RH_VALIDATE_MS) + +2000-08-27 04:34 markt + + * parse.c: + + look for .mp3 or .MP3 when parsing input filename + +2000-08-26 04:07 markt + + * Makefile: + + openBSD tweak + +2000-08-26 04:06 markt + + * Makefile (debug): + + tweak for Open BSD + +2000-08-26 04:03 markt + + * Dll/BladeMP3EncDLL.h: + + added include sys/types to BlaceMP3EncDLL.h + Borland compiler needs definitions for BOOL and DWORD. + +2000-08-24 20:34 robert + + * quantize.c: + + little tweak to VBR-old, side channel gets now a little lower bit skeleton + +2000-08-23 23:08 robert + + * Makefile, lame.c, quantize.c, quantize_pvt.c: + + sfb21 kludge, only VBR tries to get an undistorted sfb21 + at lower sample frequencies it makes more trouble than + we can gain from that, so now sfb21 will be ignored in + VBR mode for MPEG-2 LSF. + + first tweak (not enabled) for M/S switching criterion + +2000-08-23 00:02 markt + + * lame.c, vorbis_interface.c: + + messages about filters, vorbis modes + +2000-08-22 18:29 markt + + * lame.c, util.h: + + moved last_time into lame_internal_flags struct + +2000-08-22 16:30 markt + + * get_audio.c: + + byte swapping code now only used for 16 bit input files. + +2000-08-22 03:19 markt + + * lame.c: + + minor gtkflag changes + +2000-08-22 00:08 pfk + + * get_audio.c, parse.c: + + + + get_audio.c: + Support of reporting all supported input file types. + +2000-08-21 20:16 robert + + * lame.c: + + pe_MS was not initialized in case we don't use our psychoacoustic model + +2000-08-21 16:02 robert + + * lame.c, mpglib/main.c: + + LayerI+II LSF corrections + +2000-08-21 15:47 markt + + * doc/html/: contributors.html, history.html, id3.html, index.html, + switchs.html: + + updated docs from Gabriel + +2000-08-21 05:32 markt + + * Makefile (debug), USAGE, vorbis_interface.c: + + added support for the four new vorbis modes. (higher bitrates) + use with the -b option. + +2000-08-21 04:52 markt + + * main.c, mp3rtp.c, Dll/BladeMP3EncDLL.c: + + Fixed problem with writing VBR tag if user renames mp3 output + file during the encoding. + +2000-08-21 00:40 markt + + * lame.c, lame.h, main.c, mp3rtp.c: + + more prep work for vbr tag problem + +2000-08-21 00:28 markt + + * VbrTag.c, VbrTag.h, lame.c: + + prep work to fix Vbrtag when user renames mp3 file during encodiing. + +2000-08-21 00:05 markt + + * main.c, testcase.mp3: + + fixes to main.c: it is supposed to be example code for how to + use the LAME library - it should only include lame.h, all other + .h files are supposed to be private to the encoding library. + +2000-08-21 00:00 markt + + * INSTALL, Makefile, Makefile.B32, Makefile.DJGPP, Makefile.MSVC, + README.B32, TODO, bitstream.c, gtkanal.c, lame.c, lame.dsp, + quantize-pvt.c, quantize-pvt.h, quantize.c, quantize_pvt.c, + quantize_pvt.h, takehiro.c, vbrquantize.c, Dll/MP3EncDll.dsp: + + changed quantize-pvt.c to quantize_pvt.c + Added Boland stuff_ + +2000-08-20 23:21 markt + + * Makefile, version.h: + + Amiga stuff for Makefile, updated version.h to 3.87alpha + +2000-08-20 21:22 afaber + + * Dll/: BladeMP3EncDLL.c, BladeMP3EncDLL.h: + + enhanced lame_enc dll debugging + +2000-08-20 20:50 robert + + * lame.c: + + fixed bug for LSF, + ms_ratio will not be calculated for the second granule + because at lower sample rates there is no second granule + but the M/S switching criterion relies ms_ratio on it + +2000-08-19 10:54 robert + + * lame.c, parse.c, mpglib/main.c: + + total frames of LayerI files was not correctly estimated for decoding + +2000-08-18 18:07 robert + + * USAGE, get_audio.c, gtkanal.c, lame.c, lame.h, parse.c, + mpglib/main.c: + + LayerI+II decoding patches + +2000-08-18 01:40 pfk + + * bitstream.c, brhist.c, lame.c, main.c, parse.c, timestatus.c, + timestatus.h: + + + + bitstream.c: Table based CRC calculation code added (must be enabled to use) + brhist.c: Enlighted design of the bit rate history output + main.c: init of CRC Table in bitstream.c + parse.c: Some parameters can be name in Hz/bps and in kHz/kbps + timestatus.c: Enlighted design of the time counters + lame.c: Changed screen update frequency from 50/100 frames to 2 seconds + +2000-08-17 14:34 robert + + * Makefile, Makefile.DJGPP, Makefile.MSVC, mpglib/common.c: + + Layer1/2 related update + +2000-08-16 17:05 robert + + * Makefile.MSVC: + + added GTK support (frame analyzer) + +2000-08-16 01:22 afaber + + * parse.c, mpglib/common.c, mpglib/interface.c, mpglib/l2tables.h, + mpglib/layer1.c, mpglib/layer1.h, mpglib/layer2.c, + mpglib/layer2.h, mpglib/mpg123.h, mpglib/mpglib.dsp: + + Added support for Layer 1 and Layer 2 decoding + +2000-08-15 19:31 robert + + * Makefile, lame.c, takehiro.c, util.h: + + patch to prevent core dump in case big value = 576 in count_bits_long() + +2000-08-13 13:44 afaber + + * Dll/: BladeMP3EncDLL.c, BladeMP3EncDLL.h, Example.cpp, + LameDLLInterface.htm: + + Added Lame presets to the DLL interface + added HTM document how to use the lame_enc.dll interface + +2000-08-13 02:50 afaber + + * Dll/: Example.cpp, Example.dsp, Example.dsw, MP3EncDll.dsp: + + Added DLL Example + +2000-08-12 15:42 robert + + * quantize.c: + + major speed increase for vbr-old + +2000-08-11 20:53 robert + + * psymodel.c: + + RH_AMP tweak, improves vbrtest.wav + +2000-08-08 21:08 afaber + + * Dll/BladeMP3EncDLL.c: + + Add new RecordItem array, not completely finsihed yet, but it compiles + +2000-08-08 20:11 cisc + + * psymodel.c, takehiro.c: + + code cleanup + +2000-08-08 04:01 markt + + * Makefile: + + Dec Alpha makefile fix + +2000-08-07 18:24 robert + + * Makefile, lame.c, quantize-pvt.c, quantize.c: + + code cleanup + +2000-08-07 05:53 markt + + * takehiro.c: + + code cleanup in count_bits_long() + +2000-08-07 00:00 markt + + * Makefile (debug), doc/html/history.html, mpglib/interface.c, + mpglib/layer3.c: + + bug fixed in mpglib error recovery from corrupt frames + +2000-08-06 22:58 markt + + * get_audio.c, testcase.mp3: + + oops, one bug in 3.86beta. try and change this before + anyone downloads source from the web site :-) + +2000-08-06 22:34 markt + + * get_audio.c, version.h, doc/html/history.html: + + lame 3.86 beta release + +2000-08-06 21:34 markt + + * lame.c, lame.h, testcase.mp3: + + disabled scalefac_scale (except if -q1 is used) + and make old vbr mode the default + +2000-08-06 20:58 markt + + * quantize-pvt.c, testcase.mp3: + + Reverted back to original definition of over_noise and tot_noise: + + tot_noise = is really the average over each sfb of: + [noise(db) - allowed_noise(db)] + + and over_noise is the same average, only over only the + bands with noise > allowed_noise. + +2000-08-06 20:32 markt + + * mpglib/main.c: + + Album ID tag reading bug fixes + +2000-08-06 20:21 markt + + * INSTALL, USAGE, lame.c, lame.h, parse.c, quantize-pvt.c, + takehiro.c, timestatus.c, timestatus.h, util.h, vbrquantize.c, + Dll/MP3export.pas, Dll/README: + + added the "--athlower n" option which lowers the ATH by n db. + + Added possible fix for region0_count and region1_count getting + set to illegal negative values. + +2000-08-03 20:07 robert + + * Makefile, lame.c, lame.spec, quantize-pvt.c, quantize.c: + + don't worry Mark! my noise calculation wrapped by RH_NOISE_CALC + define RH_NOISE_CALC at compile time to get my version of noise + calculation + + special: + -Y amp_scalefac_bands will amplify only the maximum distorted band + +2000-08-01 06:36 markt + + * INSTALL, bitstream.c: + + added a few assert's + +2000-08-01 04:53 markt + + * quantize.c: + + Fixed amp_scalefac_bands (RH found this) + +2000-08-01 04:38 markt + + * get_audio.c, util.c, util.h, mpglib/main.c: + + updated lame --decode to read Roel's AID stuff + +2000-07-31 19:17 markt + + * Makefile (debug), INSTALL, Makefile.DJGPP, lame.spec: + + updated debug makefile + +2000-07-31 19:00 markt + + * Makefile, TODO, USAGE: + + open bsd updates to makefile + +2000-07-31 18:46 markt + + * quantize.c, takehiro.c, testcase.mp3: + + Takehiro's best_huffman_divide turned back on + for MPEG1 only + +2000-07-31 18:38 markt + + * quantize-pvt.c, quantize-pvt.h, quantize.c, takehiro.c: + + many commits were made over the weekend. But: + + 1. MPEG2 encoding was broken + 2. all my test cases failed. + + #11 is bad. #2 can be caused be general improvements, but + coupled with #1 is a bad sign. + + I spent all of sunday tracking down the many changes, and trying + to find what what the cause of what. I finally ran out of time + and am going to revert some changes back to last working copy. + + Here is a summary: + + takehiro.c: newest version, except: + count_bits_long uses old code (new code commented out). + This code was breaking MPEG2 + + scfsi: uses old slen1_n, slen2_n. I will change this + with the next commit. (in about 10min) + + best_huffman_divide: short block code breaks MPEG2. + short block code is still there, but disabled. + + quantize-pvt.c: Newest version, except: + + all noice calculations reverted back to db. + tot_noise, over_noise, ave_noise, etc. are given in db + and will always be given in db. + + distort[], is left in units of energy, since this saves + many log10() function calls. + + quantize.c : Reverted back to last working version, except + have newest version of VBR_iteration_loop(). + +2000-07-31 00:36 robert + + * psymodel.c: + + revert back to previous version, + it creept in by accident + +2000-07-30 23:48 robert + + * lame.c, psymodel.c, quantize.c: + + minor tweaks + +2000-07-29 22:37 robert + + * lame.bat: + + long file names on in for, thanks to Ih�rosi Wiktor + +2000-07-27 16:42 takehiro + + * bitstream.c: + + minor change + +2000-07-27 16:41 takehiro + + * quantize.c, vbrquantize.c: + + make the short block huffman coding more efficient + +2000-07-27 16:39 takehiro + + * machine.h: + + oops MMX code couldn't compile... + +2000-07-27 16:38 takehiro + + * fft.c: + + removed unused code + +2000-07-27 16:38 takehiro + + * takehiro.c: + + restore old algorithm temporary... + +2000-07-26 13:56 takehiro + + * newmdct.c: + + minor coding hack and prepare for GOGO's subband filtering code + +2000-07-26 13:47 takehiro + + * quantize-pvt.c, quantize-pvt.h, takehiro.c, util.h: + + debug for region0/1 which kzmi reported + +2000-07-26 13:25 takehiro + + * machine.h, quantize-pvt.h, takehiro.c: + + i hope this fix make intel native asm code available on VC + +2000-07-25 22:28 robert + + * quantize.c: + + possible endless loop for different -X modes fixed, + some modes do not minimize "over" and would never + reach over == 0 in some rare cases + +2000-07-25 20:39 robert + + * quantize.c: + + small "fast encode" fix + +2000-07-25 20:09 robert + + * Makefile: + + fixed typo + +2000-07-25 19:24 robert + + * quantize-pvt.c, quantize-pvt.h, quantize.c: + + fixed somehow messed up noise calculation + +2000-07-25 15:42 robert + + * quantize.c: + + small bug fix + +2000-07-24 23:50 cisc + + * get_audio.c: + + small fix + +2000-07-24 23:32 cisc + + * USAGE, get_audio.c: + + Changed lame_decoder() to write native endian format when not writing WAV header (-x will byteswap). + +2000-07-24 20:31 markt + + * quantize.c: + + removed some print statements + +2000-07-24 20:30 markt + + * quantize-pvt.c, quantize.c, takehiro.c: + + fixed rare bug with -X0 getting stuck in a loop when over>0 and + over and over_noise didn't change from one iteration to the next. + +2000-07-24 05:51 markt + + * parse.c: + + updated docs + +2000-07-24 05:42 markt + + * USAGE, get_audio.c, gtkanal.c, lame.h, parse.c: + + -t: disables Xing header for encoding, + disables WAV header for decoding + +2000-07-21 17:39 markt + + * Makefile, vorbis_interface.c: + + vorbis interface fixes + +2000-07-21 17:09 markt + + * INSTALL, Makefile.DJGPP, README.DJGPP: + + updated some DJGPP stuff + +2000-07-21 16:50 markt + + * VbrTag.c, encoder.h, get_audio.c: + + added some comments about decoder/encoder delay, + +2000-07-20 04:29 kzmi + + * machine.h: + + add mingw32 support. using windows.h. + +2000-07-20 04:28 kzmi + + * Makefile: + + add non-UNIX environment support. (NOUNIXCMD) + specifying UNAME,ARCH,PGM on command line is available. + +2000-07-19 23:19 robert + + * vbrquantize.c: + + oops, fixed typo + +2000-07-19 22:42 robert + + * vbrquantize.c: + + fixed problem with Roel's clips.wav file, + "pseudo endless loop" problem now gone + maybe the annoying spikes too? + +2000-07-18 22:57 robert + + * vbrquantize.c: + + moved calc_xmin out of VBR_noise_shaping + moved xr34 calculation out of VBR_noise_shaping + changed analog silence detection from granule based to frame based + hacked in a first digital silence treatment per granule (can be optimized) + + round about 8 percent faster on my Pentium 200 machine + +2000-07-18 00:09 markt + + * lame.c: + + moved some stuff into lame_init() + +2000-07-17 23:36 robert + + * vbrquantize.c: + + to make someone happy ;) + +2000-07-17 23:28 markt + + * lame.c: + + Changes from Kimmo: split lame_init_params() into 3 smaller + routines. This somehow fixes some crashes on PPC (which OS?). + +2000-07-17 23:10 markt + + * USAGE, lame.c, machine.h, main.c, quantize.c, util.c, + mpglib/common.c, mpglib/mpg123.h: + + Mac patches. (in an #ifdef macintosh) + +2000-07-17 15:38 robert + + * vbrquantize.c: + + analog silence treatment like in old VBR + +2000-07-16 02:16 robert + + * quantize.c: + + minor tweaks + +2000-07-15 19:20 robert + + * quantize.c: + + OK found what was wrong, should work now + +2000-07-15 17:55 markt + + * Makefile, lame.c, quantize.c: + + Reverted back to older version of quantize.c becuase + version 1.137 broke some of my CBR test cases. + + made scalefac_scale always on for all vbr modes + +2000-07-15 16:49 robert + + * lame.c, quantize.c: + + Takehiro's scalefac_scale now default for old-VBR, no more -q1 necessary + +2000-07-15 04:55 markt + + * Makefile: + + updated makefile for Dec Alpha Linux + +2000-07-14 20:06 markt + + * USAGE, lame.h: + + c++ name mangling fix, type in USAGE + +2000-07-12 18:03 robert + + * util.c, util.h: + + critical band width formula added + +2000-07-11 02:25 markt + + * vbrquantize.c: + + tuning for vbr_mt to fix chirp from John Dalton + +2000-07-11 00:47 markt + + * quantize.c: + + better tuning for ABR mode + +2000-07-11 00:31 markt + + * gtkanal.c, quantize-pvt.c, quantize.c, vbrquantize.c, + mpglib/main.c: + + bug in frame analyzer (causes hangs near eof) fixed + better resyncing during mp3 file initialization in mpglib + +2000-07-10 23:03 markt + + * lame.c, main.c, parse.c, reservoir.c, testcase.mp3, + vbrquantize.c: + + tuned new VBR so Roel will be happy :-) + +2000-07-10 00:24 markt + + * timestatus.c: + + timestatus overflow fix + +2000-07-09 20:05 markt + + * Makefile.DJGPP, README.DJGPP, quantize-pvt.c, quantize.c: + + more updated for DJGPP + +2000-07-09 13:19 shibatch + + * fft.h: + + I forgot to commit fft.h. (by Naoki Shibata) + +2000-07-09 13:16 shibatch + + * fft.c, lame.c, lame.h, parse.c, psymodel.c, quantize-pvt.c: + + Added --nspsytune command line option. This should solve vbrtest problem. (By Naoki Shibata) + +2000-07-09 03:22 gramps + + * parse.c: + + additional help for ID3-style comments in Ogg Vorbis output from a patch by Ralph Giles + +2000-07-09 03:20 gramps + + * lame.c: + + don't add ID3 tags to Ogg Vorbis output + +2000-07-09 03:18 gramps + + * vorbis_interface.c: + + partial support for ID3-style comments from a patch by Ralph Giles + +2000-07-08 15:08 robert + + * quantize.c: + + long time BUG in old VBR fixed, preventing LAME from using more than 2500 bits per channel + +2000-07-08 00:39 markt + + * README.DJGPP, get_audio.c: + + 8bit .wav files supported. + +2000-07-07 22:44 markt + + * Makefile: + + Updateted Makefile for alpha/linux + +2000-07-07 21:42 robert + + * quantize-pvt.h, quantize.c: + + little VBR-old speed up (upto 10%) + +2000-07-07 20:09 markt + + * Makefile.DJGPP, README.DJGPP: + + updated DJGPP stuff from Chris Wise + +2000-07-07 00:34 robert + + * quantize.c: + + more "old-VBR" tuning + +2000-07-06 22:20 cisc + + * amiga_mpega.c: + + Should now work for GCC. + +2000-07-06 16:54 robert + + * Dll/BladeMP3EncDLL.c: + + DLL uses now the same VBR routine by default as the EXE + +2000-07-05 04:57 markt + + * quantize-pvt.c, timestatus.c: + + minor changes + +2000-07-04 23:52 cisc + + * brhist.c, quantize-pvt.c, takehiro.c: + + code cleanup + +2000-07-04 23:52 gramps + + * id3tag.h, lame.h: + + make id3tag.h dependent on lame.h instead of the other way around + +2000-07-04 22:16 markt + + * lame.h, testcase.mp3, util.h, version.h: + + updated version to 3.86 alpha + +2000-07-04 15:40 robert + + * lame.c, quantize.c: + + old VBR silence bug fixed + +2000-07-04 14:46 robert + + * VbrTag.c: + + oops, 1 bit forgotten + +2000-07-04 03:32 kzmi + + * quantize-pvt.c, quantize-pvt.h, quantize.c, vbrquantize.c: + + old tot_noise and over_noise are obsolete. + tot_avg_noise and over_avg_noise were renamed as tot_noise + and over_noise. + +2000-07-04 03:28 gramps + + * USAGE, VbrTag.c, id3tag.c, id3tag.h, lame.c, lame.h, main.c, + mp3rtp.c, parse.c, doc/html/id3.html: + + ID3 version 2 tag support + +2000-07-03 17:10 robert + + * VbrTag.c: + + keep CRC bit for additional Xing-VBR frame + +2000-07-03 16:21 markt + + * doc/html/history.html: + + [no log message] + +2000-07-03 16:20 markt + + * README.DJGPP, lame.h, psymodel.c, quantize-pvt.c, vbrquantize.c, + version.h: + + lame 3.85 beta release + (old VBR mode back to being the default) + +2000-07-03 00:58 markt + + * Makefile, machine.h, psymodel.c: + + added note about FLOAT8 = float breaking certain features + +2000-07-03 00:57 markt + + * Makefile: + + [no log message] + +2000-07-03 00:48 markt + + * psymodel.c, testcase.mp3: + + updated mid/side demasking thresholds with takehiro's formula + +2000-07-03 00:25 markt + + * psymodel.c, vbrquantize.c: + + more tweakes to ATH/PE calculation. psymodel.c uses additive masking + so ATH needed a *= numlines. + +2000-07-02 23:51 markt + + * psymodel.c: + + added ATH threshold to PE calculation. + +2000-07-02 23:39 markt + + * psymodel.c, quantize-pvt.c, quantize-pvt.h, util.c, util.h, + vbrquantize.c: + + code so that ATH can be used for PE formula + +2000-07-02 21:44 markt + + * Makefile: + + Makefile updated so float8 = double + +2000-07-02 18:40 markt + + * lame.c, quantize-pvt.c, quantize-pvt.h, quantize.c, takehiro.c, + util.c, vbrquantize.c: + + short block re-ording complete! + all routines updated, but not cleaned up: it is now possible + to merge most short block and long block loops + +2000-07-01 22:12 robert + + * lame.c: + + code cleanup + +2000-07-01 21:48 robert + + * util.c: + + integer based padding routine + +2000-07-01 20:37 cisc + + * lame.c, quantize-pvt.h, util.h: + + code cleanup + +2000-07-01 18:12 markt + + * bitstream.c, lame.c, quantize-pvt.c, quantize-pvt.h, quantize.c, + takehiro.c, testcase.mp3, util.c, util.h, vbrquantize.c: + + re-order short blocks data storage. in preperation for takehiro's + asm routines + +2000-07-01 15:23 robert + + * lame.c, quantize-pvt.c, quantize.c: + + old VBR no ATH bug fixed + +2000-07-01 13:51 robert + + * lame.c, quantize-pvt.h, quantize.c, util.c, util.h: + + code cleanup + +2000-07-01 11:26 robert + + * lame.c, lame.h, parse.c, quantize-pvt.c, quantize.c: + + made switch between default VBR modes easier, look into lame.h + +2000-07-01 02:35 markt + + * lame.c, parse.c, version.h: + + 3.85 alpha (CVS) version: new vbr mode is the default + +2000-07-01 02:32 markt + + * parse.c: + + still bugs trying to make 3.84beta release + +2000-07-01 02:16 markt + + * lame.c, parse.c, quantize-pvt.c: + + i screwed up the 3.84 beta release, lets try again. + making old vbr mode the defailt, temporarily + +2000-07-01 02:11 markt + + * Makefile, version.h: + + [no log message] + +2000-06-30 23:32 markt + + * Makefile: + + makefile: -DFLOAT8 is float + +2000-06-30 23:30 markt + + * lame.c, parse.c, version.h: + + ok, back to new vbr mode = default + +2000-06-30 23:28 markt + + * doc/html/history.html: + + [no log message] + +2000-06-30 23:27 markt + + * Makefile, lame.c, parse.c, version.h: + + old vbr mode made the default. --vbr-old and --vbr-new options + can specify which mode. This is just for the next 10min + while I put out lame 3.84. CVS will then revert back to + default = new vbr mode + +2000-06-30 23:15 markt + + * get_audio.c: + + 8 bit input support (maybe works?) + +2000-06-30 14:25 kzmi + + * VbrTag.c, bitstream.c, brhist.c, debugscalefac.c, gtkanal.c, + psymodel.c, quantize-pvt.c, vbrquantize.c, vorbis_interface.c: + + replaced fprintf/printf/exit() functions with macro + +2000-06-27 13:58 kzmi + + * get_audio.c, lame.c, main.c, timestatus.c, timestatus.h: + + replace printf/fprintf/exit() with macro. + decode_progress() and decode_progress_finish() are added + in timestatus.c. these functions are used in lame_decode(). + +2000-06-27 02:23 markt + + * INSTALL, Makefile, TODO: + + minor updates + +2000-06-27 01:18 markt + + * mpglib/layer3.c: + + Sergey's bug fix for layer3.c MPEG2 tables + +2000-06-26 20:47 afaber + + * Dll/MP3EncDll.dsp: + + Version 1.30 beta 1 + +2000-06-26 16:08 markt + + * quantize.c: + + put Roberts ABR -V n settings back in. + +2000-06-26 05:56 markt + + * TODO, lame.c, quantize.c, vbrquantize.c: + + fixed one bug in VBR handling of vbrquantize.c + changed ABR mode: it should not be adjusting masking thresholds + based on quality settings. It doesn't make sense to change the + maskings if the number of bits is fixed. + +2000-06-25 19:07 robert + + * quantize-pvt.h, quantize.c: + + little improvements for experimentalX modes + +2000-06-24 07:49 kzmi + + * parse.c, util.h: + + replace printf/fprintf and exit() in parse.c with macro + +2000-06-24 06:00 kzmi + + * util.h: + + abolished LAME_ASSERT(). + +2000-06-24 05:57 kzmi + + * util.c: + + LAME_ASSERT() macro was removed. It was replaced assert(). + +2000-06-23 14:45 kzmi + + * util.h: + + FLUSH_ERR() --> FLUSH_ERROR() + +2000-06-23 13:59 kzmi + + * util.h: + + new macros used instead of fprintf(), assert(), and exit(). + +2000-06-23 13:53 kzmi + + * util.c: + + Alternative printing function lame_errorf() was added. + It will be called instead of fprintf() by using new macro "ERRORF" + +2000-06-22 20:41 robert + + * lame.c, parse.c: + + minor bugs + +2000-06-22 18:42 robert + + * USAGE, lame.c, parse.c, quantize.c: + + Marks new VBR now the default, old still under there, use --vbr-old + +2000-06-22 17:16 robert + + * lame.c, util.h: + + padding as in "MPEG-Layer3/Bitstream Syntax and Decoding" + +2000-06-22 16:06 robert + + * mpglib/layer3.c: + + table correction, thanks to Sergey Sapelin + +2000-06-21 15:38 afaber + + * machine.h: + + Update project file (added FLOAT8_is_float define) + +2000-06-21 05:04 markt + + * lame.c, lame.h, psymodel.c, psymodel.h, quantize-pvt.c, util.h, + vorbis_interface.c: + + added some return codes, removed some exits + +2000-06-21 01:14 markt + + * brhist.c: + + added brhist display for windows, from mremondini@racine.ra.it + +2000-06-21 00:05 markt + + * machine.h: + + added default settings for FLOAT8 + +2000-06-20 23:34 markt + + * psymodel.c, quantize-pvt.c, util.h: + + added code to compute numlines and bo,bu arrays instead of using + table data + +2000-06-20 13:28 takehiro + + * Makefile, machine.h: + + prepare for architecture depending optimization + +2000-06-19 05:08 markt + + * main.c, parse.c, vorbis_interface.c: + + more vorbis bugs fixed + +2000-06-19 01:10 markt + + * lame.c: + + oops, if (gfc->filter_type=0) statement fixed + +2000-06-18 14:39 markt + + * mpglib/interface.c: + + mpglib: better resyncing code + +2000-06-18 04:34 cisc + + * version.c: + + minor change + +2000-06-18 04:15 cisc + + * takehiro.c: + + Removed redundant return. + +2000-06-18 04:13 markt + + * vorbis_interface.c: + + more ogg updates + +2000-06-18 04:09 markt + + * main.c (ogg), lame.c: + + ogg stuff + +2000-06-18 04:08 cisc + + * version.c: + + Included get_audio.h for prototypes... + +2000-06-18 03:59 cisc + + * version.c: + + Added version-check for libsndfile... + +2000-06-18 03:43 markt + + * Makefile, main.c (ogg), lame.c, version.c: + + ogg updates + +2000-06-17 14:00 robert + + * parse.c, quantize-pvt.c: + + typo in parse.c was disabling -Xn settings + +2000-06-17 04:57 takehiro + + * TODO: + + something added + +2000-06-17 00:35 markt + + * lame.c, psymodel.c, util.h: + + code to compute numlines_[] mostly debugged, but not in use. + only remaining psycho acoustic table data: minval (for long + blocks) and SNR for short blocks. + +2000-06-16 18:17 markt + + * encoder.h, psymodel.c, testcase.mp3, util.h: + + psymodel cleanup, bval[] table lookup replaced with + formulas. Next step: replace numlines with formulas + +2000-06-16 18:03 robert + + * TODO: + + point added + +2000-06-16 17:31 markt + + * psymodel.c, quantize-pvt.c, vbrquantize.c: + + code re-arrangment in psymode.c. In preperation to replace + bval[] from table lookup with formulas. + +2000-06-15 16:45 markt + + * vbrquantize.c: + + bug fix for -Y VBR mode: needed to check for return code + for count_bits for errors. + +2000-06-15 15:56 markt + + * parse.c, vbrquantize.c, vorbis_interface.c, mpglib/interface.c: + + mpglib bug fix from Naoki + +2000-06-15 00:06 markt + + * lame.c: + + scalefac_scale disabled for VBR modes. + +2000-06-14 21:13 markt + + * quantize-pvt.c, quantize-pvt.h, quantize.c, vbrquantize.c: + + A new noise moded(-X 7) and a new structure to keep track + of all the different noise measures, from Iwasa Kazmi + +2000-06-14 21:04 markt + + * lame.c, lame.h, main.c, parse.c, util.c, util.h: + + new FindNearestBitrate routine, return codes for lame_init_params. + +2000-06-14 20:03 markt + + * USAGE, gpkplotting.c: + + font in frame analyzer, updates to USAGE + +2000-06-14 03:15 markt + + * Makefile.MSVC, vorbis_interface.c: + + updated vorbis support (mono, different samplerates) + +2000-06-13 12:42 takehiro + + * bitstream.c, tables.h, takehiro.c: + + minor optimization and debug + +2000-06-13 11:27 takehiro + + * tables.c, takehiro.c: + + completely MMXed choose table routine. faster! + +2000-06-12 05:29 markt + + * psymodel.c, quantize-pvt.c, quantize-pvt.h, quantize.c, + vbrquantize.c: + + added a different FFT->MDCT normalization, disabled. + +2000-06-10 09:38 robert + + * Makefile.MSVC, machine.h: + + vorbis support + +2000-06-10 03:39 cisc + + * quantize-pvt.c, vbrquantize.c: + + Aaargh, and now it suddenly doesn't work anymore, just gives me tons and tons of bitreservoir errors. :P + +2000-06-10 02:43 cisc + + * vbrquantize.c: + + Ooops, fixed redefinition... + +2000-06-10 01:56 cisc + + * quantize-pvt.c, vbrquantize.c: + + TAKEHIRO_IEEE754_HACK works great now, let's put it as default. + +2000-06-10 00:26 markt + + * Makefile, quantize-pvt.c: + + Mat's ROUNDFAC fix. If #define TAKEHIRO_IEEE754_HACK is + used, ROUNDFAC should be set to -0.0946 + +2000-06-10 00:10 markt + + * Makefile, README, USAGE, lame.c, parse.c, quantize.c: + + trivial changes + +2000-06-09 22:54 robert + + * USAGE: + + average bitrate coding (--abr) usage added + +2000-06-09 22:18 robert + + * get_audio.c, lame.c, lame.h, parse.c, quantize.c, quantize.h: + + Safe VBR mode available as --abr x, targetting x kbits + you can use -b and -B switches as usual with VBR + +2000-06-09 20:34 markt + + * get_audio.c, get_audio.h, quantize-pvt.c: + + minor changes + +2000-06-09 01:00 markt + + * tables.c: + + fixed bug in tables.c + +2000-06-09 00:30 markt + + * Makefile: + + [no log message] + +2000-06-09 00:28 markt + + * Makefile, lame.c: + + fix for when compiling without #define HAVEVORBIS + +2000-06-09 00:22 markt + + * INSTALL, Makefile, Dll/MP3EncDll.dsp: + + updated makefiles for VORBIS option + +2000-06-08 23:19 markt + + * USAGE, lame.c, parse.c, vorbis_interface.c: + + .ogg encoding now works. + +2000-06-08 21:15 markt + + * lame.c, vorbis_interface.c: + + more .ogg encoding stuff. still not working + +2000-06-08 20:46 markt + + * Makefile, get_audio.c, gtkanal.c, lame.c, lame.h, parse.c, + vorbis_interface.c: + + --ogg option to produce .ogg files. not yet working + +2000-06-08 06:04 markt + + * API: + + updated API to include HAVEVORBIS info + +2000-06-08 05:59 markt + + * Makefile: + + makefile for libvorbis support + +2000-06-08 05:58 markt + + * Makefile, USAGE, get_audio.c, lame.h, parse.c, + vorbis_interface.c, mpglib/main.c: + + added .ogg file decoding. + Re-encode all your Vorbis files to MP3 !!! + + (or, lame --decode input.ogg output.wav might be usefull) + +2000-06-07 23:36 markt + + * INSTALL, get_audio.c, lame.h, reservoir.c: + + started to add .ogg decoding + +2000-06-07 22:56 sbellon + + * VbrTag.c, get_audio.c, ieeefloat.c, ieeefloat.h, machine.h, + portableio.c, reservoir.c, mpglib/decode_i386.c, mpglib/mpg123.h: + + added support for FPA10 hardware (RISC OS only) + +2000-06-07 22:54 sbellon + + * main.c: + + changed RISC OS file typing code + +2000-06-07 13:26 takehiro + + * lame.spec: + + spec file for RPM. contributed by ramsy@linux.or.jp + +2000-06-05 18:44 markt + + * gpkplotting.c, gtkanal.c: + + updated X windows font selection (thanks Iwasa) + +2000-06-05 17:38 markt + + * testcase.mp3: + + updated testcase + +2000-06-03 05:39 takehiro + + * takehiro.c: + + more aggressive scfsi using and little bit memory optimization + +2000-06-03 02:46 cisc + + * get_audio.c: + + code cleanup + +2000-06-01 18:30 cisc + + * amiga_mpega.c: + + code cleanup + +2000-05-31 21:00 markt + + * quantize.c: + + SAFE_VBR mode fixes + +2000-05-31 20:40 markt + + * USAGE, lame.c, parse.c, psymodel.c, quantize.c: + + SAFE_VBR mode added. not enabled yet + +2000-05-31 19:52 cisc + + * vbrquantize.c: + + code cleanup + +2000-05-31 03:37 cisc + + * timestatus.c: + + code cleanup + +2000-05-31 00:25 robert + + * Makefile: + + [no log message] + +2000-05-31 00:24 robert + + * mpglib/: interface.c, layer3.c, main.c, mpg123.h: + + code cleanup + +2000-05-30 23:47 markt + + * lame.c: + + -f "fast mode" is now a little slower. + + It now *will* compute psycho acoustics, used for total bits + and pre-echo detection. But it will not spend any time + trying to find optimal scalefactors. + +2000-05-30 23:37 markt + + * TODO, bitstream.c, lame.c, takehiro.c, vbrquantize.c: + + fixed scfsi bug in vbrquantize.c + +2000-05-30 22:29 cisc + + * VbrTag.c, bitstream.c, get_audio.c, l3side.h, main.c, + quantize-pvt.c, quantize-pvt.h, util.c: + + code cleanup + +2000-05-30 22:01 cisc + + * takehiro.c, timestatus.c: + + code cleanup + +2000-05-30 20:01 robert + + * VbrTag.c, gtkanal.c, lame.c, newmdct.c, psymodel.c, + quantize-pvt.c, reservoir.c, takehiro.c, timestatus.c, util.c, + util.h, vbrquantize.c, Makefile: + + code cleanup + +2000-05-30 16:01 robert + + * fft.c, get_audio.c, main.c: + + code cleanup + +2000-05-30 15:16 robert + + * bitstream.c, l3side.h, quantize.c, quantize.h, util.h: + + signed/unsigned fixes + +2000-05-30 00:20 markt + + * Makefile: + + updated Makefile comment about Sun OS + +2000-05-30 00:12 markt + + * bitstream.c, psymodel.c, reservoir.c, takehiro.c, vbrquantize.c: + + psymodel.c: yet another loop check added + + vbrquantize.c: best_scalefac_store can change scalefac values. + scalefactors must be saved and restored before each call. + + bitstream.c: added part2_length assert check + +2000-05-29 22:11 cisc + + * get_audio.c: + + Included portableio.h for prototypes. + +2000-05-29 21:49 cisc + + * amiga_mpega.c: + + Skip bad frames. + +2000-05-29 19:59 robert + + * VbrTag.c, get_audio.c, quantize.c, vbrquantize.c: + + compiler warnings fixed + +2000-05-29 17:15 afaber + + * VbrTag.c: + + Private bit was not retained in VBR header, changes masking bit from 0x0c to 0x0d + +2000-05-29 17:14 afaber + + * Dll/: BladeMP3EncDLL.c, BladeMP3EncDLL.h: + + Some minor fixes to the DLL inteface, added Write VBR tag prototype + Added LGPL header to *.h file + +2000-05-29 17:12 afaber + + * lame.dsp: + + Set proper defines in the debug mode + +2000-05-29 16:50 markt + + * mpglib/: layer3.c, main.c, mpglib.h: + + parent_is_slash #define, for the Amiga + +2000-05-29 14:39 markt + + * brhist.c, machine.h, psymodel.c, mpglib/interface.c: + + fixed loop problems with large --cwlimit + +2000-05-28 23:48 markt + + * Makefile: + + makefile debug branch + +2000-05-28 23:47 markt + + * Makefile: + + makefile now -O3 (linux) by default + +2000-05-28 23:46 markt + + * Makefile, USAGE, psymodel.c, quantize.c, reservoir.c, + vbrquantize.c, mpglib/interface.c: + + code cleanup + +2000-05-28 06:56 takehiro + + * quantize-pvt.c: + + restored old GCC asm routine + +2000-05-28 05:01 takehiro + + * Makefile, takehiro.c: + + initial MMX implementation attempt.. + use MMX to huffman coding. + +2000-05-27 07:41 takehiro + + * takehiro.c: + + more pseudo SIMD code + +2000-05-27 07:23 takehiro + + * testcase.mp3: + + testcase update for new scalefac_scale + +2000-05-27 07:22 takehiro + + * quantize-pvt.c, quantize-pvt.h, takehiro.c: + + pseude SIMD countbit routine preparing for MMX + +2000-05-27 07:21 takehiro + + * quantize.c: + + oops, foolish typemiss... + +2000-05-27 03:22 takehiro + + * lame.c, quantize.c, version.h: + + scalefac_scale debug and use it as default + new subblock_gain algorithm + (initial release, -Z to enable it, but not works fine) + +2000-05-27 03:08 takehiro + + * newmdct.c: + + minor changing + +2000-05-27 03:06 takehiro + + * quantize-pvt.c, quantize.c, quantize-pvt.h: + + scalefac_scale debug and use it as default + new subblock_gain algorithm + (initial release, -Z to enable it, but not works fine) + +2000-05-26 19:03 markt + + * gtkanal.c, lame.c, vbrquantize.c: + + vbrquantize.c work + +2000-05-26 01:49 cisc + + * amiga_mpega.c, get_audio.c, lame.h: + + Fixed a bunch of errors that must have been committed whilst sleepwalking. ;) + +2000-05-26 00:49 markt + + * get_audio.c, lame.h, main.c: + + moved WAV writing routines and lame_decoder() into get_audio.c + +2000-05-26 00:31 markt + + * main.c: + + another bug in WriteWav + +2000-05-26 00:02 markt + + * main.c, quantize-pvt.c: + + tweaked .wav file output. Fixed small bug in short block bit + allocation (thanks Iwasa!) + +2000-05-25 23:02 markt + + * lame.dsp (MSVC6): + + updated project files MSVC6 tag + +2000-05-25 15:27 markt + + * amiga_mpega.c, get_audio.c, gtkanal.c, lame.h, main.c, + vbrquantize.c, mpglib/interface.c, mpglib/main.c: + + updated frame analyzer to show difference between original/decoded + updated --decode to return bitrate, samplerate, numchannels. + if samplerate or numchannels changes in mp3 stream, --decode will + quite with an error message + +2000-05-24 16:53 markt + + * gtkanal.c, gtkanal.h, quantize-pvt.c, vbrquantize.c, + mpglib/layer3.c: + + tweeks to frame analyzer: added preflag display + +2000-05-24 00:24 cisc + + * get_audio.c: + + Fixed silly bug preventing mp3input working together with libsndfile. + +2000-05-23 04:12 markt + + * bitstream.c, gtkanal.c, quantize-pvt.c, quantize.c, + vbrquantize.c: + + fixed a bug in the frame analyzer: was rescaling axis between plotting + energy, masking and noise + +2000-05-22 18:20 shibatch + + * mpglib/tabinit.c: + + Changed decwin to more precise one. + +2000-05-22 17:11 markt + + * quantize-pvt.c: + + make IEEE stuff the default on GNU i386 + +2000-05-22 13:14 cisc + + * main.c: + + fwrite() returns number of objects actually written + +2000-05-22 05:39 markt + + * main.c: + + fixed bug for mono .wav headers for lame --decode + +2000-05-22 05:27 markt + + * quantize-pvt.c: + + GNU C ASM code is temporarily disabled. + + It looks like Takehiro's changes to 1.107 have broken this code. + +2000-05-22 05:07 markt + + * mpglib/: common.c, interface.c: + + more robust frame resyncing + +2000-05-22 05:07 markt + + * quantize.c, vbrquantize.c: + + more robust mpglib decoding (frame re-syncing) + +2000-05-21 20:54 cisc + + * quantize-pvt.c: + + TAKEHIRO_IEEE754_HACK should not be default + +2000-05-21 20:31 robert + + * parse.c: + + PRESET tunings: + + after we dropped the ISO 7680 bit buffer limit + allow more often 320 kbits frames + + for MPEG2.5 allow more often short blocks + only 8 kHz streams have now problems with + short blocks, so don't use them then + - dropped all highpass filters, cos the + results did not satisfy me + (in my opinion they actually do more harm than good) + - tuned some lowpass filters cos of the sfb21 + noise calculation in VBR + +2000-05-21 19:33 markt + + * l3side.h, parse.c, psymodel.c, quantize-pvt.c, quantize-pvt.h, + quantize.c, quantize.h, reservoir.c, reservoir.h: + + comments and other code cleanup + +2000-05-21 16:42 takehiro + + * quantize.c: + + new scalefac_scale algorithm option changed -Y -> -Z + +2000-05-21 16:25 takehiro + + * quantize.c: + + new scalefac_scale algorithm + +2000-05-21 16:19 takehiro + + * quantize-pvt.h, quantize.c: + + new scalefac_scale algorithm. enables with -Y option. + +2000-05-21 13:15 takehiro + + * quantize-pvt.h: + + VBR bug related sfb22 fixed + +2000-05-21 12:52 takehiro + + * quantize-pvt.c: + + VBR bug related sfb22 fixed + +2000-05-20 23:49 robert + + * quantize-pvt.c, quantize.c: + + minor tweaks + +2000-05-20 23:33 robert + + * quantize.c: + + VBR hack + +2000-05-20 21:05 markt + + * bitstream.c, main.c, mpglib/main.c: + + totbit buffer overflow fix + +2000-05-20 20:57 cisc + + * takehiro.c: + + choose_table() argument is int *, not unsigned * + +2000-05-20 20:36 markt + + * bitstream.c, main.c, util.h, mpglib/main.c: + + mpglib will not decode Xing VBR header. + write_timing changed to unsigned long to allow encoding more + than 4 hours at 128kbs. + +2000-05-20 15:13 markt + + * main.c, takehiro.c: + + .wav output with --decode was putting wrong filesize in + .wav header. + +2000-05-19 23:01 markt + + * quantize-pvt.c, testcase.mp3, version.h: + + updated version.h lame 3.84 alpha (CVS version) + +2000-05-19 20:07 markt + + * doc/html/history.html: + + updated history for 3.83beta + +2000-05-19 20:06 markt + + * version.h: + + lame 3.83beta + +2000-05-19 18:43 markt + + * encoder.h, lame.c: + + possible serious buffering problem fixed. LAME buffers input data until + it has at least 1904 samples. It then starts processing them. + + The old MDCT routines processed 1728 samples and had a delay of 528. + (introduced in 3.54) But the new MDCT routines, because the delay is + so small (48 samples) actually need 2014 samples to be in the buffer! + + If you use the lame input routines, for MPEG1, this bug would + not be found because the buffer always has well over 2014 samples + in it. But it was possible to trigger it in MPEG2 encodings. + It would also be possible to trigger this bug in programs + that use lame_enc.dll and pass LAME data that is not in + chunks of 1152 samples. + +2000-05-19 17:23 markt + + * bitstream.c, lame.c, lame.h, parse.c, psymodel.c, testcase.mp3, + vbrquantize.c: + + tweaks to psymodel initialization + more work on vbrquantize.c + +2000-05-19 01:38 markt + + * bitstream.c, gtkanal.c, l3side.h, lame.c, main.c, psymodel.c, + quantize-pvt.c, takehiro.c, testcase.mp3, vbrquantize.c: + + more work on vbrquantize.c + +2000-05-18 18:50 markt + + * main.c: + + updated decoder to remove initial delay + +2000-05-18 05:38 markt + + * main.c, parse.c: + + lame --decode now outputs .wav files + file length in header is set to 2^32-1, since we dont + really know ahead of time how many samples are in the mp3 file. + +2000-05-17 22:25 markt + + * quantize.c: + + ath lower bug in quantize.c fixed + +2000-05-17 22:08 markt + + * quantize-pvt.c: + + calc_noise1 will compute noise (and related info) for + last scalefactor band + +2000-05-17 21:33 markt + + * quantize-pvt.c, takehiro.c: + + frame analyzer displays more data in scalefactor band 22 + +2000-05-17 19:50 markt + + * gtkanal.h, quantize-pvt.c, quantize-pvt.h, quantize.c, + vbrquantize.c: + + modified frame analyzer to show last scalefactor band, + energy and masking (from the ATH). distortion is not yet + calculated in this band. + +2000-05-17 18:08 markt + + * gtkanal.c, l3side.h, quantize-pvt.c, quantize.c, util.h: + + Possible fix for recent VBR/sweep bug: + min bitrate not strictly enforced with -F, and + analog silence was only being computed up th 16khz. + +2000-05-17 17:16 markt + + * USAGE, brhist.c, get_audio.c, lame.c, lame.h, main.c, quantize.c, + reservoir.c, util.c, util.h, vbrquantize.c: + + moved framenum, totalframes into lame.h (so programs which + use libmp3lame can compute statis info.) + +2000-05-15 14:34 takehiro + + * newmdct.c: + + more coding hack. + +2000-05-14 23:38 cisc + + * newmdct.c: + + Changed M_PI to PI + +2000-05-14 08:12 takehiro + + * newmdct.c: + + Naoki's short block mdct + and more my coding hack for mdct + +2000-05-14 05:51 takehiro + + * newmdct.c, util.h: + + mdct_long coding hack + +2000-05-12 11:59 robert + + * util.h, lame.c, newmdct.c: + + code cleanup + +2000-05-12 09:51 takehiro + + * newmdct.c, doc/html/history.html: + + more work in mdct_long and window_filtering + +2000-05-12 05:03 markt + + * testcase.mp3: + + updated testcase.mp3 + +2000-05-12 05:02 markt + + * version.h: + + updated version to 3.83 alpha + +2000-05-12 05:01 markt + + * API, README, version.h, doc/html/history.html: + + version 3.83 + +2000-05-10 13:55 takehiro + + * quantize-pvt.c: + + dirty hack for IEEE 754 FPU + +2000-05-09 16:31 afaber + + * Dll/BladeMP3EncDLL.c: + + Fixed problem with build date string, temp string was not initialized properly (was missing a terminator character) + +2000-05-09 11:30 takehiro + + * newmdct.c: + + Naoki's mdct_long with my coding hack. + +2000-05-09 02:45 cisc + + * API, brhist.c: + + Added NOTERMCAP define and changed brhist.c accordingly. + +2000-05-08 22:48 markt + + * testcase.mp3: + + [no log message] + +2000-05-08 22:41 markt + + * quantize-pvt.c, doc/html/history.html: + + updated side channel 320kbs fix + +2000-05-08 22:30 robert + + * Makefile, quantize-pvt.c: + + M/S reduce_side bug fixed, + nonISO buffer mode should work now for + 320 kbits MS streams too + +2000-05-08 19:55 afaber + + * Dll/BladeMP3EncDLL.c: + + Bumped up version number of DLL version library, fixed some of the debugging code + +2000-05-08 17:46 markt + + * doc/html/: contributors.html, examples.html, id3.html, + index.html, lame.css, node5.html, node6.html, switchs.html: + + updated docs from Gaby + +2000-05-08 17:40 markt + + * version.h: + + 3.82 alpha(CVS) version + +2000-05-08 17:38 markt + + * version.h, doc/html/history.html: + + 3.81beta release + +2000-05-08 17:31 markt + + * Makefile, USAGE, VbrTag.c, brhist.c, lame.h, parse.c, + reservoir.c, util.c: + + removed ISO buffer limitation, added --strictly-enforce-ISO option + +2000-05-08 00:06 markt + + * quantize-pvt.c, reservoir.c, vbrquantize.c: + + started work on vbrquantize.c + +2000-05-07 11:09 robert + + * Makefile, Makefile.MSVC, lame.c, parse.c: + + -F option now working, + updated Makefile for DOS + +2000-05-07 03:59 takehiro + + * newmdct.c, util.h: + + new IDCT32 routine from Naoki and optimized by me. + and more thread safe coding. + +2000-05-06 22:20 markt + + * testcase.mp3: + + updated testcases + +2000-05-06 22:20 markt + + * l3bitstream-pvt.h, lame.dsp, Dll/MP3EncDll.dsp: + + updated project files (for removal of ISO code) + +2000-05-06 22:18 markt + + * Makefile, VbrTag.c, VbrTag.h, formatBitstream.c, + formatBitstream.h, l3bitstream.c, l3bitstream.h, lame.c, + quantize.c, util.c, util.h, vbrquantize.c: + + removed all ISO code + +2000-05-06 22:09 markt + + * version.h: + + updated version to 3.81 alpha 1 (CVS version) + +2000-05-06 22:07 markt + + * Makefile: + + updated makefile for beta release + +2000-05-06 22:05 markt + + * version.h, doc/html/history.html: + + updated version for 3.80 beta release + +2000-05-06 22:04 markt + + * USAGE, lame.c, lame.h, main.c, parse.c, quantize.c, + vbrquantize.c: + + added -F option and compression ratio options + +2000-05-06 19:16 markt + + * USAGE, lame.c, lame.h, parse.c, util.c: + + --freeformat option added. Allows lame to write free format + bitstreams + +2000-05-06 18:45 markt + + * bitstream.c, gtkanal.c, lame.c, parse.c, psymodel.c, quantize.c, + util.h, mpglib/interface.c, mpglib/main.c: + + fixed buffer overflow in bitstream.c, + some improvements to mpglib mp3 playback + +2000-05-06 09:27 afaber + + * Dll/MP3EncDll.dsp: + + Update workspaces + +2000-05-05 20:48 markt + + * get_audio.c, mpglib/common.c, mpglib/interface.c, mpglib/main.c, + mpglib/mpg123.h, mpglib/mpglib.h: + + free format mp3 decoding now supported, not fully tested + +2000-05-04 00:07 takehiro + + * takehiro.c: + + new count bits routine, speed up by coding hack. + +2000-05-03 07:23 markt + + * psymodel.c: + + updated comments + +2000-05-03 07:21 markt + + * psymodel.c, testcase.mp3: + + minor change to long block pre-echo control + +2000-05-03 07:18 markt + + * psymodel.c, testcase.mp3: + + minor improvement to long block pre-echo control + +2000-05-03 03:03 markt + + * mpglib/interface.c: + + one last tweak to interface.c + +2000-05-03 02:37 markt + + * bitstream.c, mpglib/common.c, mpglib/interface.c, + mpglib/layer3.c, mpglib/mpg123.h, mpglib/mpglib.h: + + worked on mpglib/interface.c to make it handle free format + bitstreams. (not yet working) + +2000-05-02 18:31 afaber + + * Dll/: BladeMP3EncDLL.c, MP3EncDll.dsp: + + Update lame version, bug fixes to play list file generation + +2000-05-02 02:53 markt + + * reservoir.c: + + for CBR encoding, 320kbs, dont allow main_data_begin > 0 + +2000-05-02 01:24 markt + + * gtkanal.c, lame.c, psymodel.c, quantize-pvt.c, quantize.c, + testcase.mp3: + + tweaked a bunch of bit allocation on PE settings, + based on tunings of testsignal2.wav and castanets.wav + +2000-05-01 18:18 markt + + * bitstream.c, brhist.c, brhist.h, lame.c, lame.dsp, lame.h, + parse.c, quantize-pvt.c, reservoir.c, util.h, Dll/MP3EncDll.dsp: + + bunch of vbr histogram tweaks, and added --athshort option for + internal testing only + +2000-04-30 17:54 robert + + * lame.bat: + + DOS batch file to put on Win9x Desktop + you can drag and drop waves on it and + lame will encode them to mp3 + +2000-04-29 23:41 markt + + * bitstream.c, reservoir.c, testcase.mp3: + + moved where main_data_begin was corrected when + padding into ancillary data + +2000-04-26 18:14 markt + + * USAGE, lame.h, main.c, parse.c: + + added the '--decode' option + +2000-04-26 00:54 markt + + * machine.h, main.c, mpglib/decode_i386.c, mpglib/layer3.c: + + moved calls to open the output file until after all + arguments and other conditions are checked. + +2000-04-24 22:22 markt + + * reservoir.c, testcase.mp3: + + disabled acillary drain (pre-frame) because of bugs at 320kbs + Could be player or encoder bug - have to investigate + +2000-04-19 21:35 robert + + * psymodel.c: + + MPEG2.5 related bug fixed + +2000-04-19 19:35 markt + + * lame.c, lame.h, parse.c, quantize-pvt.c: + + fixed bug allowing more than 4096 bits in a granule + +2000-04-18 22:57 markt + + * lame.c, lame.h, psymodel.c, reservoir.c, takehiro.c, util.h: + + lame is now (*maybe*) thread safe! + +2000-04-18 08:35 markt + + * VbrTag.c, VbrTag.h, bitstream.c, brhist.c, get_audio.c, + get_audio.h, id3tag.c, id3tag.h, l3bitstream.c, lame.c, lame.h, + parse.c, psymodel.c, quantize-pvt.c, quantize.c, reservoir.c, + reservoir.h, testcase.mp3, util.c, util.h, vbrquantize.c, + Dll/BladeMP3EncDLL.c: + + more thread-safe work, and id3/vbr tag bug discovered by + Iwasa Kasmi + +2000-04-17 23:29 markt + + * lame.c, psymodel.c, quantize-pvt.c, quantize.c, util.h, + vbrquantize.c: + + tweaks to vbrquantize.c + +2000-04-17 06:12 markt + + * lame.c, testcase.mp3, vbrquantize.c: + + updated test cases + +2000-04-17 05:16 markt + + * bitstream.c, l3bitstream.c, l3side.h, lame.c, quantize-pvt.c, + reservoir.c, mpglib/main.c: + + fixed VBR stuffing bits problem. + if VBR uses a large frame, then ResvMax may become small, and + we have to make sure that main_data_begin doesn't create a buffer + which violates this condition. + + The old code wouldn't check the above, but it would pad the current + frame with 0's (wasting bits) to make sure the *next* frame didn't + violate the ResvMax condition. But this results in wasted bits + because in VBR there is a change the *next* frame will be at + a lower bitrate and thus have a larger ResvMax. + +2000-04-17 02:25 markt + + * API, Makefile, get_audio.c, gtkanal.c, lame.c, lame.h, main.c, + mp3x.c, parse.c, psymodel.c, quantize-pvt.c, quantize.c, + reservoir.c, util.h, vbrquantize.c, mpglib/layer3.c, + mpglib/main.c, mpglib/mpglib.h: + + Removed gtk specific code from libmp3lame.a: libmp3lame.a can now + be compiled to support the mp3 frame analyzer but does not require + gtk to be installed. (and thus, HAVEGTK does not occure in any + of the library routines). To compile the frame analyzer (mp3x) you + of course still need gtk installed. + +2000-04-17 00:38 markt + + * VbrTag.c, mpglib/main.c: + + another attempt at fixing mpeg2.5 xing header + +2000-04-16 20:56 markt + + * VbrTag.c: + + VBR header for MPEG2.5 fixed. + +2000-04-14 00:37 markt + + * lame.c, main.c, parse.c, quantize-pvt.c, reservoir.c, + reservoir.h, vbrquantize.c: + + tweaks to vbrquantize.c + +2000-04-13 01:57 markt + + * version.h (lame3_70): + + fixed version + +2000-04-13 01:19 markt + + * lame.c, quantize-pvt.c, quantize-pvt.h, quantize.c, util.h, + vbrquantize.c: + + vrbquantize bounds checking + +2000-04-12 18:44 markt + + * lame.c, psymodel.c, quantize.c, testcase.mp3, util.h, + vbrquantize.c: + + removed gfc->masking_lower + +2000-04-12 18:29 markt + + * Makefile, quantize-pvt.c, quantize.c: + + Robert's VBR quality control mode now the default! + +2000-04-12 18:19 markt + + * lame.c, quantize-pvt.c, quantize-pvt.h, quantize.c, util.h, + vbrquantize.c: + + removed static masking_lower + +2000-04-12 18:10 markt + + * quantize-pvt.c, quantize.c: + + removed reduce_sidechannel static + +2000-04-12 18:08 markt + + * quantize-pvt.c, quantize.c, vbrquantize.c: + + removed convert_mdct static variable + +2000-04-12 18:06 markt + + * quantize-pvt.c, util.h: + + removed static variables ATH_l, ATH_s + +2000-04-12 15:47 markt + + * lame.c, psymodel.c, quantize.c, vbrquantize.c, doc/man/lame.1: + + removed qthr_l, qthr_s from psymodel.c + fixed man pages. + enabled new VBR code with -Y + disabled -Z option: it was broken since subblock gains were not + scaled into xrpow + +2000-04-12 01:37 markt + + * mpglib/layer3.c: + + gtk changes + +2000-04-12 01:36 markt + + * gtkanal.c, lame.c, psymodel.c, quantize-pvt.c, quantize-pvt.h, + quantize.h, testcase.mp3, vbrquantize.c: + + new vbr quantize code mostly done! + +2000-04-11 18:24 markt + + * Makefile, get_audio.c, get_audio.h, gtkanal.c, gtkanal.h, lame.c, + lame.h, quantize.c, util.h, vbrquantize.c: + + removed all static variables from get_audio.c + +2000-04-11 15:59 markt + + * HACKING: + + updated HACKING + +2000-04-11 15:55 markt + + * API, l3side.h, lame.c, quantize-pvt.c, quantize-pvt.h, util.h, + vbrquantize.c: + + updated API + +2000-04-11 00:33 markt + + * lame.c, vbrquantize.c: + + work on vbrquattize.c + +2000-04-10 20:24 markt + + * lame.c, main.c, quantize-pvt.c, quantize.c, util.c, util.h: + + bug fixed: mfbuf overflow, and check for overflow was + being done, but after the overflow and in this case + the overflow was causing the check to pass. + +2000-04-10 16:41 markt + + * lame.c, quantize.h, util.c, util.h, vbrquantize.c: + + precompute 16 windows for downsampling. much faster. + +2000-04-09 21:53 markt + + * bitstream.c, quantize-pvt.c, quantize.c, reservoir.c, util.c, + mpglib/layer3.c, mpglib/main.c: + + MPEG2.5 8khz sampling rate fixes + +2000-04-09 02:08 markt + + * encoder.h, lame.c, quantize-pvt.c, quantize-pvt.h, quantize.c, + reservoir.c, testcase.mp3: + + tweaked bit reservoir growth, bits on pe allocation + +2000-04-08 23:33 markt + + * lame.c, quantize-pvt.c, takehiro.c, testcase.mp3: + + tweaks to on_pe, side channel bit allocation + +2000-04-08 20:33 markt + + * encoder.h, testcase.mp3: + + switched to encoder delay of 576 + +2000-04-08 20:31 markt + + * bitstream.c, tables.c: + + [no log message] + +2000-04-08 20:22 markt + + * bitstream.c, quantize.c, takehiro.c, testcase.mp3, util.c, + util.h: + + Takehiro's more efficient short block huffman coding. + +2000-04-08 18:08 markt + + * lame.c: + + VBR compression ratio calculation + +2000-04-08 01:26 cisc + + * bitstream.c: + + Use INLINE dammit! ;) + +2000-04-07 00:11 markt + + * util.c: + + fixed M_PI problem + +2000-04-06 21:08 robert + + * bitstream.c: + + scalefac_band compile fix + +2000-04-06 19:26 markt + + * doc/html/history.html (lame3_70): + + [no log message] + +2000-04-06 19:17 markt + + * Makefile, version.h (lame3_70): + + [no log message] + +2000-04-06 18:49 markt + + * Makefile (lame3_70): + + [no log message] + +2000-04-06 18:48 markt + + * version.h, doc/html/history.html (lame3_70): + + version 3.70 + +2000-04-06 18:30 markt + + * gtkanal.c, l3bitstream-pvt.h, l3bitstream.c, l3side.h, lame.c, + quantize-pvt.c, quantize-pvt.h, quantize.c, takehiro.c, + testcase.mp3, util.h, vbrquantize.c: + + made scalefac_band non-local + +2000-04-06 18:23 markt + + * bitstream.c: + + [no log message] + +2000-04-06 18:19 markt + + * bitstream.h: + + [no log message] + +2000-04-06 18:18 markt + + * bitstream.c: + + opps, forgot to add this... + +2000-04-06 17:31 markt + + * Makefile.MSVC, lame.dsp, Dll/MP3EncDll.dsp: + + MSVC project files updated + +2000-04-06 17:29 markt + + * VbrTag.c, VbrTag.h, lame.c, util.c, util.h: + + takehiro bitstream.c now on by default! + +2000-04-06 16:32 markt + + * takehiro.c, mpglib/layer3.c: + + takehiro bitstream.c now working for CBR, disabled by default + +2000-04-05 08:54 markt + + * Makefile, l3bitstream.c, lame.c, quantize-pvt.c, quantize-pvt.h, + tables.c, tables.h, takehiro.c, util.c, util.h: + + takehiro's bitstream.c package close to being interface + into lame. + +2000-04-05 01:38 markt + + * lame.c, util.c: + + mode_fixed bug + +2000-04-05 01:38 markt + + * lame.c (lame3_70): + + mode_fixed bug fixed + +2000-04-04 22:49 markt + + * version.h, doc/html/history.html (lame3_70): + + updated version + +2000-04-04 21:36 robert + + * parse.c: + + [no log message] + +2000-04-04 20:37 cisc + + * amiga_mpega.c (lame3_70): + + Fixed nsamp overflow problem. + +2000-04-04 19:51 markt + + * lame.c, util.c, util.h: + + upsampling uses old interpolation code + downsampling uses good, FIR/blackman window code + +2000-04-04 19:27 markt + + * version.h (lame3_70): + + updated version + +2000-04-04 19:05 markt + + * Makefile.MSVC: + + loopold removed from makefile.msvc + +2000-04-04 17:45 markt + + * parse.c (lame3_70), parse.c: + + cwlimit parsing fixed + +2000-04-04 16:05 markt + + * lame.c (lame3_70), lame.c: + + default mode will use jstereo + +2000-04-04 03:20 markt + + * Dll/BladeMP3EncDLL.c (lame3_70): + + [no log message] + +2000-04-04 03:20 markt + + * Dll/BladeMP3EncDLL.c: + + more fixes + +2000-04-03 19:50 markt + + * quantize-pvt.c: + + more gfc changes + +2000-04-03 19:19 markt + + * HACKING, lame.c, newmdct.c, quantize-pvt.c, quantize.c, util.c, + util.h: + + more thread-safe work. (moving all static variables into + gfc-> struct) + +2000-04-03 18:24 markt + + * brhist.c, get_audio.c, gtkanal.c, l3bitstream.c, l3bitstream.h, + lame.c, lame.h, newmdct.c, parse.c, psymodel.c, quantize-pvt.c, + quantize.c, quantize.h, reservoir.c, takehiro.c, util.c, util.h, + vbrquantize.c: + + more massive internal changes in the goal of making + lame thread safe. + + gfp-> user controlled varialbes + gfc-> all other internal parameters. eventually all global variables + which very from encode to encode need to go in here. + +2000-04-03 16:00 markt + + * Dll/BladeMP3EncDLL.c: + + dll finally fixed! + +2000-04-03 15:59 markt + + * Dll/BladeMP3EncDLL.c (lame3_70): + + dll fixes + +2000-04-03 15:39 markt + + * lame.c, Dll/BladeMP3EncDLL.c (lame3_70): + + bug in lame_enc dll fixed? + +2000-04-03 15:38 markt + + * Dll/BladeMP3EncDLL.c: + + bug in lame_enc.dll finally fixed? + +2000-04-03 01:19 markt + + * lame.c: + + tweaked output display + +2000-04-03 01:07 markt + + * lame.c, Dll/BladeMP3EncDLL.c: + + new resample routine. very slow, but much higher + quality. + +2000-04-02 19:38 robert + + * parse.c: + + overhauled presets: + + redesign of help page + + phone uses now MPEG2.5 8kHz + + sw new, for short wave radio @ 11.025 kHz 24kbits + + am new, for am radio @ 16 kHz 32 kbits + + fm changed, 22.05 kHz 64 kbits + + radio new, the old fm at 112 kbits + rest minor tunings + +2000-04-02 02:57 markt + + * Dll/BladeMP3EncDLL.c (lame3_70): + + [no log message] + +2000-04-02 02:44 markt + + * Dll/: BladeMP3EncDLL.c (lame3_70), BladeMP3EncDLL.c: + + [no log message] + +2000-04-02 01:56 markt + + * Dll/: BladeMP3EncDLL.c, BladeMP3EncDLL.h (lame3_70): + + Dll updates + +2000-04-02 01:55 markt + + * Dll/BladeMP3EncDLL.c: + + more DLL updates + +2000-04-02 01:39 markt + + * parse.c, util.c: + + MPEG2.5 docs + +2000-04-02 01:35 markt + + * l3bitstream.c, lame.c, lame.h, psymodel.c, quantize-pvt.c, + quantize-pvt.h, util.c, util.h, Dll/BladeMP3EncDLL.c, + Dll/BladeMP3EncDLL.h: + + MPEG2.5 support + +2000-04-01 11:47 robert + + * lame.c, parse.c: + + + added --version and --license switch + + changed --help to give only most important options + so that it fits on a 80x24 terminal display + + added --longhelp switch to get the full options list + + changed -v and -Vx, now they switch quality to 2 + you can go down below 2 by adding -f or -q5 + + changed presets: + turned off highpass filters except for "phone" + voice sample freq now 22.05 kHz, due to mpg123 bug + +2000-04-01 01:09 markt + + * Dll/BladeMP3EncDLL.c (lame3_70): + + more dll bug fixes (mono) + +2000-04-01 00:04 markt + + * version.h (lame3_70): + + updated version to 3.68 alpha 1 + +2000-03-31 23:56 markt + + * Dll/BladeMP3EncDLL.c (lame3_70): + + fixed mono bug + +2000-03-31 23:53 markt + + * lame.c, vbrquantize.c, Dll/BladeMP3EncDLL.c: + + mono encoding bug in DLL fixed + +2000-03-31 22:47 robert + + * Makefile, quantize-pvt.c, quantize-pvt.h: + + removed RH_ATH/RH_SIDE_CBR code + +2000-03-31 22:45 robert + + * quantize.c: + + minor frame analyzer fix for VBR, removed RH_ATH/RH_SIDE_CBR code + +2000-03-30 23:39 markt + + * lame.c, parse.c (lame3_70): + + undocumented -q option for internal testing + +2000-03-30 23:38 markt + + * get_audio.c, gtkanal.c, lame.c, main.c, parse.c, quantize.c: + + added -q option for internal testing. sets value of gfp->quality + +2000-03-30 19:51 markt + + * testcase.mp3: + + updated test case for new CVS version + +2000-03-30 09:37 markt + + * INSTALL: + + wingtk doc + +2000-03-30 09:36 markt + + * INSTALL: + + [no log message] + +2000-03-30 08:24 markt + + * INSTALL, README: + + updated docs + +2000-03-30 08:04 markt + + * README.WINGTK, lame.dsp, Dll/MP3EncDll.dsp: + + new directions for compiling mp3x under windows + +2000-03-30 07:54 markt + + * lame.dsp (MSVC6), README.WINGTK: + + updated project files + +2000-03-30 07:00 markt + + * lame.dsp (MSVC6), Dll/MP3EncDll.dsp: + + updated project files + +2000-03-30 05:39 markt + + * VbrTag.c, gtkanal.c, gtkanal.h, l3bitstream.c, lame.c, machine.h, + psymodel.c, quantize.c, takehiro.c, mpglib/layer3.c: + + added big_values display to mp3x + +2000-03-30 05:38 markt + + * VbrTag.c, l3bitstream.c, lame.c, machine.h, quantize.c, + takehiro.c, vbrquantize.c: + + fixed 2 bugs: + + l3bitstream.c: + 1. The quadruples were encoded with the wrong sign: Any non-zero + coefficient in the count1 block was marked as negative! + + takehiro.c: + 2. short blocks were using a cod_info->big_values=288 + (which should be 576, because big_values was multiplied by 2 + in the new version of takehiro.c) + +2000-03-29 20:49 markt + + * doc/html/: contributors.html, examples.html, history.html, + id3.html, index.html, lame.css, node6.html, switchs.html: + + new docs from Gabriel + +2000-03-29 02:00 markt + + * l3bitstream.c, psymodel.c, quantize-pvt.c, quantize.c, + reservoir.c, takehiro.c, util.c, vbrquantize.c, brhist.c, fft.c, + get_audio.c, globalflags.h, gtkanal.c, gtkanal.h, lame.c, + newmdct.c, parse.c: + + removed globalflags.h + +2000-03-29 01:55 markt + + * globalflags.h (lame3_70), brhist.c, fft.c, get_audio.c, + gtkanal.c, gtkanal.h, lame.c, newmdct.c, parse.c, vbrquantize.c: + + removed "globalflags.h" + +2000-03-29 01:06 markt + + * lame.c: + + missing free() calls in lame_encode_buffer_interleave + +2000-03-28 16:41 takehiro + + * takehiro.c: + + oops, this may remove any seg.fault bug... + +2000-03-28 15:39 takehiro + + * takehiro.c: + + Oops, I mistake count1 for big_values + +2000-03-28 13:08 cisc + + * amiga_mpega.c: + + Fixed overflow problem with nsamp calculation. + +2000-03-27 22:09 markt + + * lame.c: + + fixes to lame_encode_buffer_interleave + +2000-03-27 22:09 markt + + * lame.c: + + fixes to lame_encode_buffer_interleave() + +2000-03-27 21:46 robert + + * takehiro.c: + + added assertion, cos here is a bug + +2000-03-27 21:34 markt + + * doc/html/history.html: + + updated history.html + +2000-03-27 21:33 markt + + * version.h: + + [no log message] + +2000-03-27 21:09 markt + + * lame.c: + + minor change with ms_ener_ratio_ave + +2000-03-27 21:06 markt + + * lame.c: + + ms_ener_ratio_ave M/S override switch turned off + +2000-03-27 20:58 markt + + * version.h: + + changed version number. 3.80 is the next beta version, + 3.70 is the stable version + +2000-03-27 19:42 markt + + * version.h (lame3_80): + + updated version in the lame3_80 branch + +2000-03-27 19:42 markt + + * version.h: + + this is new the future version 3.81beta + +2000-03-27 19:39 markt + + * l3bitstream.c, quantize.c, tables.c, takehiro.c (lame3_80): + + The next "official" stable release, lame3.80. + lame3_80 is a branch. + + This will not include Takehiro's latest lossless encoding stuff. + (l3bitstream.c, quantize.c, tables.c, takehiro.c) + +2000-03-27 19:26 markt + + * takehiro.c: + + gfp->use_scfsi replaced by mode_gr==2 + +2000-03-27 17:53 markt + + * get_audio.c, lame.c, main.c, util.c, version.h: + + Ingo -f fast-math rounding problem fix + +2000-03-27 15:59 takehiro + + * takehiro.c: + + debugged seg.fault when count1 is 576 + +2000-03-26 21:21 markt + + * quantize.c: + + opps, i screwed up quantize.c! fixed version + +2000-03-26 10:05 markt + + * Makefile, gtkanal.c, gtkanal.h, lame.c, quantize.c, + mpglib/layer3.c: + + disabled noise_shaping_stop=1, fixed jstereo default mode problem, + updated frame analyzer + +2000-03-25 18:16 cisc + + * takehiro.c: + + Use INLINE define instead of inline. + +2000-03-25 16:18 takehiro + + * lame.c: + + enable noise_shaping==1 when high quality mode even without -X + +2000-03-25 16:17 takehiro + + * takehiro.c: + + debug seg.fault when big_values==0 + +2000-03-25 15:01 takehiro + + * l3bitstream.c, quantize-pvt.c, quantize-pvt.h, quantize.c, + tables.c, takehiro.c: + + best huffman divide now "more best" huffman coding. + +2000-03-25 03:35 takehiro + + * Makefile, l3bitstream.c, l3side.h, lame.c, psymodel.c, + quantize-pvt.c, tables.c, takehiro.c: + + new faster lossless coding routine(especially with -h) + +2000-03-25 00:06 markt + + * get_audio.c, main.c, quantize-pvt.h, quantize.c, takehiro.c, + testcase.mp3: + + added some code to best_scalefac_store: + if ix=0 in a scalefactor band, set the scalefactor to 0 also, + to save a few bits. + +2000-03-24 23:06 markt + + * lame.dsp (MSVC6), Dll/MP3EncDll.dsp: + + updated project files + +2000-03-24 23:02 markt + + * get_audio.c, machine.h: + + _setmode stuff for windows + +2000-03-24 22:37 markt + + * lame.h, quantize-pvt.c, mpglib/layer3.c: + + fixed MPEG2 tables in mpglib, + added more accurate mp3buffer size bound in lame.h + +2000-03-24 18:21 markt + + * quantize-pvt.c, quantize-pvt.h, quantize.c: + + [no log message] + +2000-03-24 18:08 markt + + * lame.dsp, loopold.c, Dll/MP3EncDll.dsp: + + removed loopold.c + +2000-03-24 18:07 markt + + * Makefile, gtkanal.c, lame.c, lame.h, psymodel.c, psymodel.h, + quantize-pvt.c, quantize.c: + + Removed old M/S stereo mode which uses L/R masking functions. + removed loopold.c and all that other "dual channel" stuff + +2000-03-24 02:00 markt + + * VbrTag.c, lame.c: + + MPEG2 VBR tag should now work + +2000-03-24 01:38 markt + + * VbrTag.c, VbrTag.h, lame.c, Dll/BladeMP3EncDLL.c: + + Xing MPEG2 headers work + +2000-03-23 22:13 markt + + * Makefile: + + uncommented options in makefile + +2000-03-23 22:12 markt + + * API, Makefile, lame.c, lame.h, util.c, mpglib/common.c: + + strange bug with -f fast-math option under gcc: it would compute + the mp3 framesize wrong, due to incorrect integer truncation. + Replaced implicit integer truncation with floor() to fix this. + +2000-03-23 20:30 markt + + * Makefile, get_audio.c, lame.c, lame.h: + + autoconvert moved into lame_encode_buffer + +2000-03-23 20:02 markt + + * Makefile, lame.c, lame.h: + + lame_encode_buffer_interleaved added to API + +2000-03-22 17:14 markt + + * vbrquantize.c: + + minor fixes + +2000-03-22 04:15 markt + + * version.h, doc/html/history.html: + + lame 3.66 + +2000-03-22 02:03 markt + + * USAGE, gtkanal.c, lame.c, machine.h, main.c, parse.c, + quantize-pvt.c: + + float/double version of ASM quantize routines + +2000-03-21 23:02 markt + + * brhist.c, brhist.h, gtkanal.c, gtkanal.h, l3bitstream-pvt.h, + l3bitstream.c, l3bitstream.h, lame.c, loopold.c, newmdct.c, + newmdct.h, psymodel.c, psymodel.h, quantize-pvt.c, + quantize-pvt.h, quantize.c, quantize.h, reservoir.c, reservoir.h, + takehiro.c, util.c, util.h, vbrquantize.c, mpglib/layer3.c: + + replaced all "gf." by gfp-> + +2000-03-21 20:58 markt + + * lame.c: + + fixed bug in lame_encode_finish: if user informs + lame that mp3buffer has size 0, lame will not check to make + sure the mp3buffer is big enough to store the encoded data + +2000-03-19 22:29 afaber + + * lame.c, Dll/BladeMP3EncDLL.c: + + Fixes to the lame DLL encoder: + If last frame is too short, set number of output bits to 0 instead of -1 + Don't disable the bWriteVBRTag flag if input file is null + +2000-03-19 20:07 cisc + + * get_audio.c: + + Byteswapping (-x) didn't work when using LIBSNDFILE + +2000-03-18 00:33 cisc + + * parse.c: + + Fixed typo in define. + +2000-03-18 00:32 cisc + + * amiga_mpega.c: + + Erk, didn't spot the array/pointer relation, restored to previous version. + +2000-03-17 22:09 cisc + + * amiga_mpega.c: + + b[] is a pointer, so supply addresses of pcm_l&r. + +2000-03-17 19:29 markt + + * lame.c: + + VBR was displaying MPEG2 bitrates - fixed. + +2000-03-17 04:31 markt + + * machine.h: + + added note to machine.h + +2000-03-17 04:30 markt + + * version.h, doc/html/history.html: + + uncommented gcc ASM code + +2000-03-17 04:27 markt + + * quantize-pvt.c: + + uncommended the GCC ASM code for quantize_xrpow() + +2000-03-17 00:07 markt + + * doc/html/history.html: + + updated history + +2000-03-17 00:05 markt + + * amiga_mpega.c, get_audio.c, lame.h, version.h, mpglib/main.c, + mpglib/mpglib.dsp: + + some tweaks to API for lame_decode_fromfile + +2000-03-16 23:59 markt + + * lame.dsp, mpglib/mpglib.dsp (MSVC6), Dll/BladeMP3EncDLL.c: + + project file tweaks + +2000-03-16 23:36 markt + + * get_audio.c, lame.dsp, lame.h, parse.c: + + updated project files MSVC5 + +2000-03-16 23:19 markt + + * lame.dsp, mpglib/mpglib.dsp (MSVC6), main.c: + + updated MSVC6 branch project files + +2000-03-16 19:42 markt + + * Dll/BladeMP3EncDLL.c: + + update to bladedll + +2000-03-16 19:38 markt + + * gtkanal.c, lame.h, mpglib/main.c: + + one last change to lame_decode()... + +2000-03-16 19:05 markt + + * get_audio.c, get_audio.h, gtkanal.c, gtkanal.h, lame.c, lame.h, + main.c, mp3rtp.c, mp3x.c, parse.c, util.c, util.h: + + more and these really should be the last changes to the API + 'gf' is no substantiated by the calling program, and passed + to all lame_routines(). This is so lame can eventually be + made re-entrant by putting all static vars in the gf struct. + +2000-03-16 16:44 markt + + * VbrTag.c, loopold.c, machine.h, takehiro.c, timestatus.c, util.h: + + strict ansi patches from Heiko.Eissfeld + +2000-03-16 05:33 markt + + * USAGE, main.c: + + updated USAGE + +2000-03-16 05:28 markt + + * mpglib/mpglib.dsp: + + revert back to MSVC5 + +2000-03-16 05:26 markt + + * lame.dsp, lame.dsw (MSVC6), main.c, mpglib/mpglib.dsp: + + MSVC changes to compile lame.exe + +2000-03-16 00:24 markt + + * timestatus.c: + + fixed CPU/playing time display bug + +2000-03-15 20:37 markt + + * encoder.h, l3bitstream.c, lame.h, parse.c, psymodel.c, + takehiro.c: + + minor changes + +2000-03-15 01:34 markt + + * filters.c, filters.h: + + removed filters.c, filters.h + +2000-03-15 01:30 markt + + * Dll/MP3EncDll.dsp: + + updated MSVC6 project files + (in MSVC6 branch) + +2000-03-15 01:20 markt + + * Dll/: MP3EncDll.dsp, MP3EncDll.dsw: + + reverting back to MSVC5 + +2000-03-15 01:14 markt + + * parse.c, Dll/BladeMP3EncDLL.c, Dll/MP3EncDll.dsp, + Dll/MP3EncDll.dsw: + + updated bladeenc dll + +2000-03-14 21:01 markt + + * lame.c, loopold.c, quantize-pvt.c, quantize-pvt.h, quantize.c, + quantize.h, reservoir.c, reservoir.h, util.c, util.h, + vbrquantize.c: + + removed fr_ps struct + +2000-03-14 20:45 markt + + * brhist.c, brhist.h, l3bitstream.c, l3bitstream.h, lame.c, lame.h, + psymodel.c, psymodel.h, quantize-pvt.c, quantize-pvt.h, + quantize.c, reservoir.c, timestatus.h, util.c, util.h, + vbrquantize.c: + + removed "info" sturct. Removing fr_ps struct + +2000-03-14 07:21 markt + + * brhist.c, l3bitstream.c, lame.c, lame.h, loopold.c, psymodel.c, + quantize-pvt.c, quantize.c, reservoir.c, timestatus.c, + timestatus.h, util.c, util.h: + + removed more info-> variables + +2000-03-14 06:36 markt + + * lame.c, lame.h: + + removing some of the info-> variables + +2000-03-10 23:21 cisc + + * amiga_mpega.c: + + Had to make a dummy break-function to make atexit() work. + +2000-03-10 23:18 markt + + * loopold.c: + + segfault fixed in loopold.c when count[] was zero for one channel + and non-zero for the other + +2000-03-10 20:56 markt + + * API, Makefile, gtkanal.c, lame.c, lame.h, version.c: + + added lame_version to the API + +2000-03-10 20:13 markt + + * Dll/BladeMP3EncDLL.c: + + removed some unnecessary #includes + +2000-03-10 19:48 markt + + * Dll/MP3EncDll.dsp: + + added #define LAMEPARSE to Blade project files + +2000-03-10 19:38 markt + + * Dll/: BladeMP3EncDLL.c, MP3EncDll.dsp: + + Blade dll updated to handle new interface + Albert: Sorry if I broke anything, the old version is still in CVS :-) + +2000-03-10 18:55 markt + + * Dll/BladeMP3EncDLL.c (test): + + testing... + +2000-03-10 16:01 markt + + * Dll/BladeMP3EncDLL.c: + + BladeMP3 changes + +2000-03-10 01:41 markt + + * Dll/BladeMP3EncDLL.c: + + some changes to update BaldeMP3encdll + +2000-03-09 19:42 markt + + * quantize-pvt.c, takehiro.c: + + quantize_xrpow_ISO also uses tablelookup, so it also needed the + "xr too big" check + +2000-03-09 18:05 markt + + * HACKING, get_audio.c, gtkanal.c, lame.c, lame.h, main.c, parse.c: + + [no log message] + +2000-03-08 00:16 markt + + * Makefile, parse.c: + + Robert's presets restored. polyphase filters now except filterwidth + arguments. + +2000-03-08 00:05 markt + + * lame.c, lame.h, newmdct.c: + + polyphase filter now supports lowpasswidth and highpasswidth option + +2000-03-07 23:10 cisc + + * API: + + Added AMIGA_MPEGA #define, and fixed a few minor spelling errors... ;) + +2000-03-07 22:56 cisc + + * amiga_mpega.c: + + Made sure lame_decode_fromfile() won't return an empty frame (unless there's an error). + +2000-03-07 18:33 markt + + * API, Makefile, get_audio.c, lame.c, main.c, parse.c: + + minor tweeks to compile w/o decoding library + +2000-03-07 08:01 sbellon + + * lame.c: + + fixed RISC OS FPE support + +2000-03-06 23:28 markt + + * API: + + API description + +2000-03-06 19:55 markt + + * lame.dsp: + + [no log message] + +2000-03-06 19:53 markt + + * Makefile, Makefile.MSVC, get_audio.c, get_audio.h, id3tag.h, + lame.c, lame.dsp, lame.h, parse.c, Dll/MP3EncDll.dsp, + mpglib/common.c, mpglib/dct64_i386.c, mpglib/decode_i386.c, + mpglib/interface.c, mpglib/layer3.c, mpglib/main.c, + mpglib/tabinit.c: + + More library work. + Sorry to all the non-unix developers out there, but this will + break all project files. (but we are very close to the end of + the modularization work). + + New code needs the following #defines set somewhere: + + #define HAVEMPGLIB to use mpglib's mp3 *decoding* capibility + (or AMEGA_MPEGA on amiga systems, and dont define HAVEMPGLIB) + #define BRHIST to allow the display of the VBR historgram + #define LIBSNDFILE to use Erik de Castro Lopo's libsndfile + #define LIBSNDLAME to use LAME's minimial internal sndfile I/O + #define LAMEPARSE to use LAME's command line parsing/option setting routines + #define HAVEGTK to compile in support for the GTK mp3 frame analyzer + +2000-03-06 15:16 markt + + * filters.c, lame.c, lame.h, newmdct.c, parse.c, testcase.mp3: + + polyphase filters are now working! + some tuning of polyphase fiters. + removed MDCT filters, sfb21 cutoff. + +2000-03-06 03:59 markt + + * gtkanal.c, lame.c, newmdct.c, psymodel.c: + + new polyphase filters + +2000-03-05 19:07 markt + + * psymodel.c: + + Gabriel: L/R block matching fix + +2000-03-05 18:37 markt + + * id3tag.c, id3tag.h, lame.c, lame.h, newmdct.c, parse.c, + doc/html/id3.html: + + id3v1.1 tags from Don Melton + +2000-03-04 17:19 markt + + * get_audio.c, lame.c: + + resampling moved to fill_buffer_resample() in lame.c, + which has linear and 3rd order resampling + +2000-03-04 15:31 markt + + * amiga_mpega.c, get_audio.c, lame.c, main.c, quantize-pvt.c, + quantize.c, vbrquantize.c: + + patch from kimmo to remove more c++ comments, + fill_buffer_linear_resample code + +2000-03-04 05:13 markt + + * lame.c: + + fill_buffer routines + +2000-03-03 19:25 markt + + * encoder.h, mp3rtp.c: + + mp3rtp uses new, simplified lame_encode_buffer interface + +2000-03-03 19:01 markt + + * encoder.h, lame.c, lame.h, main.c, testcase.mp3: + + added lame_encode_buffer, the new, prefered encoding interface + +2000-02-29 21:19 robert + + * parse.c: + + minor change, exit if wrong preset type was given + +2000-02-29 19:54 robert + + * fft.c: + + minor speed up (at least for gcc) + +2000-02-29 18:00 sbellon + + * lame.c: + + moved RISC OS floating point exception part into debugging area + +2000-02-27 19:11 robert + + * quantize-pvt.c, quantize-pvt.h, quantize.c: + + removed unused parameter + +2000-02-27 18:36 robert + + * psymodel.c: + + code clean up, giving an overall speed up of 3-4% + +2000-02-25 07:00 markt + + * lame.c: + + minor cleanup + +2000-02-24 15:30 robert + + * loopold.c, quantize-pvt.c, quantize-pvt.h, quantize.c: + + code cleanup, removed unused parameter + +2000-02-23 02:40 cisc + + * amiga_mpega.c: + + Fixed up the cleanup function. + +2000-02-22 23:21 robert + + * quantize-pvt.c, testcase.mp3: + + switched back to original bin_search_stepsize routine + +2000-02-22 03:14 markt + + * quantize-pvt.c, testcase.mp3: + + RH bin_search_stepsize now the default + +2000-02-22 00:54 cisc + + * amiga_mpega.c: + + Oh, nevermind, wasn't very efficient here, proper place would be in sndfile.lib + +2000-02-22 00:15 cisc + + * lame.h, main.c: + + Minor fixes. + +2000-02-21 23:58 cisc + + * amiga_mpega.c: + + Make sure input-file is closed when CTRL-C is received. + +2000-02-21 23:05 markt + + * Makefile, get_audio.c, gtkanal.c, ieeefloat.c, l3bitstream.c, + main.c, util.c, doc/html/history.html, mpglib/main.c: + + some 64bit DEC Alpha patches + +2000-02-21 22:40 robert + + * quantize-pvt.c: + + speed up of bin_search_stepsize, the bin_search is about 20% faster, resulting in an average speed up of 2-3%, disabled by default as it breaks the testcase + +2000-02-21 22:39 sbellon + + * main.c: + + + further RISC OS support added + +2000-02-21 00:21 markt + + * lame.c: + + minor + +2000-02-20 23:36 markt + + * get_audio.c, lame.c, lame.h, main.c, mp3rtp.c, parse.c: + + num_samples /eof fix, ABORTFP fix, stdout mode setting fix + +2000-02-20 20:31 markt + + * mpglib/common.c: + + better error message + +2000-02-20 20:03 robert + + * get_audio.c: + + removed warning about fill up with zeros again, it is common at the end of an input file + +2000-02-20 19:26 robert + + * Makefile, quantize-pvt.c, quantize-pvt.h, quantize.c: + + code cleanup + +2000-02-20 18:45 robert + + * psymodel.c: + + code cleanup + +2000-02-20 14:09 robert + + * formatBitstream.c: + + fixed assertion failure while flushing bitstream at end of encoding + +2000-02-20 14:08 robert + + * get_audio.c: + + applied patch from Jeremy Hall to fix stdin problem + +2000-02-19 13:32 afaber + + * fft.c, formatBitstream.c, formatBitstream.h, get_audio.c, + ieeefloat.c, l3bitstream.c, machine.h, quantize-pvt.c, + quantize.c, takehiro.c, mpglib/mpg123.h: + + Fixed many warning messages when compiling with MSVC + +2000-02-19 12:15 afaber + + * VbrTag.c: + + Applied patch from Mathew Hendry to avoid divide by zero + +2000-02-18 16:21 robert + + * quantize-pvt.c: + + Mathew Hendry: line 813 should read "#define USE_MSC_ASM" and not "#define USE_MSC_AMS" + +2000-02-18 16:20 robert + + * Makefile.MSVC: + + Mathew Hendry: "stray space character following the \" patched + +2000-02-18 16:07 robert + + * lame.c: + + Mathew Hendry's CYGWIN gcc FPU control patch + +2000-02-18 06:16 markt + + * Makefile, gtkanal.c, lame.c, testcase.mp3: + + changed sizeof frame analyzer so it fits on a 800x600 screen. + make --nores also set info->padding = 0. Avoids problem with + small changes in frac_SpF causing different padding patterns and + mp3 file differences. + +2000-02-17 20:12 robert + + * loopold.c, quantize-pvt.h, quantize.c: + + code clean-up, it seems the SIGFPE exceptions are gone + +2000-02-16 22:42 cisc + + * machine.h: + + Fixed INLINE define for SAS/C. + +2000-02-16 21:18 cisc + + * main.c: + + Include machine.h so that needed prototypes get added. + +2000-02-16 07:06 markt + + * quantize-pvt.c, quantize-pvt.h, quantize.c: + + new quantize xrpow for PowerPC + +2000-02-16 03:56 markt + + * lame.c, quantize-pvt.c: + + patches for risc_os + +2000-02-15 22:16 robert + + * quantize.c: + + forgot to save plotting data for best quantization in VBR_iteration_loop + +2000-02-15 17:12 robert + + * quantize-pvt.h, quantize.c: + + VBR_iteration_loop speedup, removed extra quantizations + +2000-02-15 14:51 markt + + * Makefile: + + [no log message] + +2000-02-15 14:40 markt + + * lame.c: + + some non-initilized memory patches + +2000-02-15 02:01 robert + + * quantize-pvt.c: + + bug in ms_convert fixed when source and target are the same + +2000-02-14 21:48 robert + + * quantize-pvt.c: + + Mathew Hendry's quantize-xrpow gcc asm patch + +2000-02-14 21:47 robert + + * quantize.c: + + missing line added + +2000-02-14 21:01 afaber + + * lame.c: + + Intialize float arrays to avoid floating point errors when ABORTFP is set + Added floating point trapping code for MSVC compiler + +2000-02-14 20:53 afaber + + * psymodel.c: + + Intialize tot_ener to avoid floating point errors + +2000-02-14 05:50 markt + + * Makefile, loopold.c, parse.c, quantize-pvt.c, quantize-pvt.h, + quantize.c: + + merged takehiro2 branch back into main branch. + there is still a floating point exception which I cannot track down. + +2000-02-14 04:53 markt + + * psymodel.c, takehiro.c, doc/html/contributors.html, + doc/html/examples.html, doc/html/id3.html, doc/html/index.html, + doc/html/switchs.html: + + updated html from Gabriel + +2000-02-13 18:52 robert + + * fft.c, fft.h, psymodel.c: + + modified energy calculation, fast MS fft patch should work now + +2000-02-11 17:21 markt + + * Makefile, quantize.c, reservoir.c: + + fixed scalefac not-initialized problem. This would happen when + xr = 0 and outer_loop() was skipped. + +2000-02-11 16:34 markt + + * psymodel.c: + + m/s fft patch was not working. + +2000-02-10 19:00 robert + + * parse.c: + + added help info for --preset option and shuffled help text to bring it more in line + +2000-02-10 16:33 robert + + * fft.c, fft.h, psymodel.c: + + applied Takehiro Tominaga's fast MS fft patch + +2000-02-10 14:22 markt + + * doc/html/history.html: + + updated history file from web page + +2000-02-10 06:43 markt + + * version.h: + + updated version + +2000-02-10 06:15 markt + + * lame.c, parse.c, version.c, version.h: + + added version info to help output + +2000-02-10 05:42 markt + + * psymodel.c, testcase.mp3: + + fixed bug in s3_s spreading function calculation. + +2000-02-10 05:35 markt + + * loopold.c, quantize-pvt.h, quantize.c: + + undo some of takehiro's speedup improvements until we can track + down floating point exceptions + +2000-02-10 05:23 markt + + * Makefile, brhist.c, brhist.h, lame.c, loopold.c, psymodel.c, + quantize-pvt.c, quantize-pvt.h, quantize.c: + + some bug fixes: + + psymodel partition band calculations done *before* + the spreading function need to use npart_l_orig. After spreading function, + use npart_s_orig. + + 3 cases of scalefac->l[i][sfb] which should be scalefac->l[sbf][i] + + VBR min & max bitrate index setting problem fixed + +2000-02-08 17:20 afaber + + * lame.c: + + Guarded disp_brhist with #ifdef BRHIST, in order to compile with MSVC + +2000-02-06 10:57 takehiro + + * loopold.c, quantize-pvt.c, quantize-pvt.h, quantize.c, + psymodel.c: + + new spread matrix calculation is now default(faster!) + +2000-02-06 05:59 markt + + * gtkanal.c: + + Iwasa's changes to gtkanal.c + +2000-02-05 12:32 robert + + * lame.c, lame.h, parse.c, util.c, util.h: + + applied Ingo Saitz command line usage patch + +2000-02-05 05:16 markt + + * Makefile.MSVC, brhist.c, lame.c, loopold.c, machine.h, parse.c, + quantize.c: + + minor code cleanup + +2000-02-04 23:49 robert + + * parse.c: + + added "--preset type" option to offer users some usefull presettings + that should shorten the commandline for most cases + +2000-02-04 21:42 afaber + + * lame.c, lame.dsp: + + Fixed WIN32 compiler errors + +2000-02-04 21:26 robert + + * parse.c: + + added '--help' option to allow DOS users to scroll thru the usage page with "lame --help | more" + +2000-02-04 13:57 takehiro + + * loopold.c, quantize-pvt.c, quantize-pvt.h, quantize.c, + takehiro.c: + + speed up hack on the array index. + +2000-02-04 13:49 takehiro + + * psymodel.c: + + and more faster calculation + +2000-02-04 02:29 markt + + * lame.h, quantize-pvt.c: + + minor editing + +2000-02-03 15:43 takehiro + + * psymodel.c: + + some assertion bug(?) has removed + +2000-02-03 15:31 takehiro + + * psymodel.c: + + more faster calculation + +2000-02-02 22:30 afaber + + * mpglib/main.c: + + Added MPGLIB library + +2000-02-02 22:25 takehiro + + * psymodel.c: + + faster spread function calculation + +2000-02-02 17:12 markt + + * get_audio.h, quantize-pvt.c, quantize-pvt.h, quantize.c, + takehiro.c, vbrquantize.c: + + minor code cleanup + +2000-02-02 10:31 markt + + * Makefile: + + testcase update + +2000-02-02 10:25 markt + + * Makefile, filters.c, lame.c, quantize-pvt.c, quantize.c: + + fixed some minor bugs in new scalefac data structure code + +2000-02-02 10:17 markt + + * Makefile, fft.c, filters.c, filters.h, gtkanal.c, + l3bitstream-pvt.h, l3bitstream.c, l3bitstream.h, l3side.h, + lame.c, loopold.c, psymodel.c, psymodel.h, quantize-pvt.c, + quantize-pvt.h, quantize.c, quantize.h, tables.c, tables.h, + takehiro.c, vbrquantize.c (takehiro0): + + The pre-takehiro1 scalefac datastructure code + +2000-02-02 09:19 markt + + * Makefile, filters.c, lame.c, quantize-pvt.c, quantize.c + (takehiro1): + + some bugs fixed with new scalefac struct + +2000-02-01 14:09 takehiro + + * l3side.h, lame.c, loopold.c, psymodel.c, psymodel.h, + quantize-pvt.c, quantize-pvt.h, quantize.c, quantize.h, + vbrquantize.c: + + code clean up. changed definition of structure to optimize array index calculation + +2000-02-01 11:26 takehiro + + * Makefile, fft.c, filters.c, filters.h, gtkanal.c, + l3bitstream-pvt.h, l3bitstream.c, l3bitstream.h, l3side.h, + lame.c, loopold.c, quantize-pvt.c, quantize-pvt.h, quantize.c, + quantize.h, tables.c, tables.h, takehiro.c, vbrquantize.c: + + scalefactor's structure changed + +2000-01-31 22:21 robert + + * quantize-pvt.c, quantize.c: + + little VBR tweaks + +2000-01-31 18:56 markt + + * get_audio.c, lame.c, lame.h, main.c, mp3rtp.c, mp3x.c, version.h: + + updated comments, added lame_close_infile() + +2000-01-31 18:22 markt + + * lame.c, lame.h, main.c, mp3rtp.c, mp3x.c: + + more modularizaton, fixes to mp3rtp + +2000-01-31 05:49 markt + + * mlame: + + spelling error + +2000-01-30 23:00 cisc + + * fft.c: + + Use INLINE define instead of inline. + +2000-01-30 22:19 markt + + * get_audio.c, lame.c, lame.h, parse.c: + + renamed highq quality + +2000-01-30 22:01 markt + + * mp3rtp.c: + + added Felix's email to mp3rtp.c code :-) + +2000-01-30 20:44 markt + + * lame.h: + + minor editing + +2000-01-30 20:27 markt + + * lame.c, lame.h, loopold.c, parse.c, psymodel.c, quantize-pvt.c, + quantize.c, takehiro.c: + + cleaned up highq option. + highq=0 (best quality)... 9(worst quality) + values supported so far: + highq=9 (turned on with -f) + highq=5 (default) + highq=2 (turned on with -h) + +2000-01-30 19:34 markt + + * lame.c, lame.h, machine.h, parse.c, quantize-pvt.c, takehiro.c: + + fixed bug in overflow check in count_bits + +2000-01-30 16:19 robert + + * Makefile, quantize-pvt.c, quantize-pvt.h, quantize.c: + + introduced new RH_ATH compile switch and splitted + RH_masking into RH_SIDE_VBR, RH_SIDE_CBR and + RH_QUALITY_CONTROL=n (n=1,2) + + RH_SIDE_CBR turns off side channel reduction for CBR + RH_SIDE_VBR turns off side channel reduction for VBR + RH_QUALITY_CONTROL=1 plus above switches equals RH_masking + RH_QUALITY_CONTROL=2 is tuned to be used with RH_ATH + RH_ATH changes the definition of distortion a bit: + a)PSY: noise over the PSY model threshold as average + quantization noise over PSY model threshold + b)ATH: max quantization noise of a single freq line over + the ATH threshold of that freq line + the resulting distortion is the min of a) and b) + +2000-01-30 10:54 markt + + * parse.c: + + parse_args and related code moved to parse.c + +2000-01-30 10:53 markt + + * brhist.c, brhist.h: + + vbr histogram code in seperate file + +2000-01-30 10:50 markt + + * Makefile, TODO, get_audio.c, gtkanal.c, id3tag.c, id3tag.h, + lame.c, lame.h, main.c, mp3rtp.c, mp3x.c, util.c, util.h, + Dll/BladeMP3EncDLL.c, Dll/MP3EncDll.dsp, mpglib/main.c: + + more modularization work. Calling program is now responsible for + mp3 file output + +2000-01-30 07:41 markt + + * l3side.h, loopold.c, machine.h, psymodel.c, quantize-pvt.c, + quantize-pvt.h, quantize.c, takehiro.c, vbrquantize.c: + + #ifdef NOPOW removed, replaced by table lookup. You can still + go back to pow() function or exp() by changing the POW20 and IPOW20 + macros in machine.h + +2000-01-30 06:17 takehiro + + * l3side.h, loopold.c, psymodel.c, quantize-pvt.c, quantize-pvt.h, + quantize.c, takehiro.c: + + use lookup table to calculate pow(2.0, xx).(when not defined NOPOW) + +2000-01-30 06:09 takehiro + + * fft.c: + + faster FFT implementation + +2000-01-28 00:57 cisc + + * lame.c: + + Fixed -m bug when bitrate>=160 (gf.mode_fixed was not set). + +2000-01-27 17:16 markt + + * lame.h: + + comments about varius quality options + +2000-01-27 08:27 markt + + * quantize-pvt.c: + + Fixed bug in scale_bitcount_lsf which was severely limiting the + possible scalefacters used by MPEG2. (Lionel Bonnet) + +2000-01-27 07:49 markt + + * Makefile, get_audio.c, get_audio.h, gtkanal.c, machine.h: + + minor changes + +2000-01-27 05:05 markt + + * fft.c, fft.h, psymodel.c, testcase.mp3: + + Takehiro's fft_short and fft_long now the defaults. + +2000-01-27 04:35 markt + + * rtp.c: + + more updates from Felix + +2000-01-27 03:52 cisc + + * loopold.c, psymodel.c, quantize-pvt.c, quantize.c, takehiro.c, + util.h, vbrquantize.c: + + Added NOPOW define, will replace certain pow()s with optimized variant. + +2000-01-27 02:06 cisc + + * get_audio.c: + + Removed faulty undef of bitwidth. + +2000-01-26 12:37 takehiro + + * fft.c: + + window[] and window_s[]'s buffer overrun is corrected + +2000-01-26 10:27 markt + + * filters.c, lame.c, lame.h: + + more bugs in specifigy a lowpass filter fixed. --voice mode + recast in terms of lowpass filter and other options + +2000-01-26 08:39 markt + + * psymodel.c: + + removed two c++ commends (by request) + +2000-01-26 08:00 markt + + * lame.c: + + moved frameNum=0 from lame_init to lame_init_params + +2000-01-26 07:44 markt + + * HACKING, get_audio.c, get_audio.h, globalflags.h, gtkanal.c, + lame.c, lame.h, main.c, mp3rtp.c, mp3x.c, Dll/BladeMP3EncDLL.c, + Dll/MP3EncDll.dsp: + + more modularizatin work. LAME can now be used as a true library, + without the need to construct simulated argument lists. + See HACKING for some details, and mp3rtp.c for an example. + +2000-01-25 17:50 markt + + * get_audio.c, get_audio.h, globalflags.h, lame.c: + + major work down towards libmp3lame.a: split out parse_args and + parameter setting routines. might have broken some things... + +2000-01-25 17:48 markt + + * rtp.h: + + bug fix from Felix + +2000-01-20 23:21 robert + + * lame.c: + + sfb21 parameter messages added + +2000-01-20 08:03 markt + + * lame.c: + + tweaked filter and other encoding parameter messages + +2000-01-20 07:21 markt + + * gtkanal.c, gtkanal.h, mpglib/layer3.c: + + fixed gtk scfsi printout - mpglib/layer3.c seems correct now. + +2000-01-20 06:09 markt + + * Makefile, TODO, mpglib/layer3.c: + + scfsi fixes to mpglib from Iwasa Kazmi + +2000-01-19 22:11 takehiro + + * mpglib/layer3.c: + + scalefactor for short block last sfb(12) was wrong. + +2000-01-18 18:51 afaber + + * l3bitstream.c: + + Made my bug fixes against version 1.9 instead of a previous version + +2000-01-17 22:31 afaber + + * l3bitstream.c: + + Guarded BF_FlushBitstream function call if PartHoldersInitialized equals zero. + This to avoid GPF when III_Flushbitstream is called when no data is encoder + +2000-01-16 06:49 markt + + * lame.c, lame.h, main.c: + + cleaned up main.c + +2000-01-15 20:33 markt + + * loopold.c, takehiro.c, testcase.mp3: + + added best_scalefac_store to non -h code also + +2000-01-15 14:35 takehiro + + * psymodel.c: + + little bit optimization + +2000-01-14 13:05 takehiro + + * takehiro.c: + + debug message is removed... + +2000-01-14 12:56 takehiro + + * l3bitstream.c, loopold.c, quantize-pvt.c, quantize.c, psymodel.h, + takehiro.c: + + to make it use scfsi + +2000-01-14 07:47 markt + + * doc/html/history.html: + + [no log message] + +2000-01-14 07:34 markt + + * version.h: + + version 3.61 + +2000-01-14 06:35 markt + + * lame.c, quantize.c: + + filters were incorrectly being used under VBR + +2000-01-14 05:54 markt + + * USAGE, lame.c: + + more on the -k option + +2000-01-14 05:46 markt + + * USAGE, lame.c, mpglib/main.c: + + -k option will disable *all* filtering and frequency cutoffs + +2000-01-13 20:41 robert + + * Makefile, quantize.c: + + more VBR (RH_masking) finetuning + now -V3 should give the same result as -V6 before + +2000-01-13 17:21 markt + + * lame.c, psymodel.h: + + fixed noshort option, fixed l3psycho_anal.h + +2000-01-13 16:26 takehiro + + * filters.c, get_audio.c, l3bitstream.c, lame.c, loopold.c, + newmdct.c, newmdct.h, psymodel.c, quantize-pvt.c, quantize-pvt.h, + quantize.c, reservoir.c, reservoir.h, takehiro.c, util.c, util.h, + vbrquantize.c: + + moved info.stereo into gf.stereo + +2000-01-13 07:43 markt + + * loopold.c, quantize.c: + + got rid of old, no longer used preemph code + +2000-01-13 02:07 markt + + * filters.c, get_audio.c, globalflags.h, gtkanal.c, lame.c, + psymodel.c, quantize-pvt.c, quantize-pvt.h, quantize.c, + takehiro.c, vbrquantize.c, mpglib/main.c: + + moved the rest of the global variables into gf struct + +2000-01-13 00:37 markt + + * quantize.c (debug-mat): + + some debug code + +2000-01-12 22:38 afaber + + * .cvsignore, VbrTag.c, lame.dsp: + + fixed a few casting warnings + Updated .cvsignore to ignore output of testcase + +2000-01-12 14:30 takehiro + + * filters.c, globalflags.h, l3bitstream.c, lame.c, newmdct.c, + newmdct.h, quantize-pvt.c, quantize-pvt.h, reservoir.c, + takehiro.c, util.c, vbrquantize.c: + + more simple & fast scalefac_scale use + and mode_gr is moved into gf structure. + +2000-01-11 20:23 cisc + + * amiga_mpega.c: + + Fixed timestatus bug (forgot nsamp variable). + +2000-01-11 05:46 markt + + * quantize.c (debug-mat), gtkanal.c, lame.c: + + changed axis in gtk flag + +2000-01-10 16:37 cisc + + * VbrTag.h, get_audio.c, machine.h, util.c: + + Removed AMIGA_ASYNCIO, custom modified libsndfile worked better. + +2000-01-10 09:34 takehiro + + * mpglib/layer3.c: + + debug for scalefactor reading with scfsi. + +2000-01-10 03:44 cisc + + * get_audio.c: + + Disabled open/close of mp3 when AMIGA_MPEGA and LIBSNDFILE is enabled. + +2000-01-10 02:44 cisc + + * amiga_mpega.c: + + MPGLIB replacement using mpega.library. (AmigaOS) + +2000-01-10 02:40 cisc + + * get_audio.c, mpglib/main.c: + + Removed AMIGA_ASYNCIO stuff for mpglib now that we got AMIGA_MPEGA. + +2000-01-10 02:07 cisc + + * get_audio.c, lame.h: + + Added mpega.library support for decoding mpeg audio, enable with AMIGA_MPEGA. (AmigaOS) + +2000-01-10 00:45 markt + + * loopold.c, quantize.c: + + fixed bug in loopold: scalesave loop was using SBMAX instead of SBPSY, + and exceeding bounds. + +2000-01-09 23:11 markt + + * Dll/BladeMP3EncDLL.c, doc/html/examples.html, doc/html/id3.html, + mpglib/layer3.c: + + globalflags update + +2000-01-09 23:10 markt + + * get_audio.c, globalflags.h, gtkanal.c, gtkanal.h, lame.c, + loopold.c, main.c, mp3x.c, psymodel.c, quantize-pvt.c, + quantize.c, reservoir.c, vbrquantize.c: + + moved more globalflags into the gf. struct + +2000-01-09 22:56 cisc + + * VbrTag.h, get_audio.c, machine.h, util.c, mpglib/main.c: + + Added usage of asyncio.library for improved I/O, enable with AMIGA_ASYNCIO. (AmigaOS) + +2000-01-09 22:26 markt + + * quantize.c, testcase.mp3, doc/html/history.html: + + updated validation testcase. + +2000-01-09 20:59 markt + + * Makefile, version.h: + + release 3.60beta + +2000-01-09 20:55 markt + + * testcase.mp3, testcase.wav: + + new test case: testcase.wav and 'official' output testcase.mp3 + 'make test' will perform a comparison. see makefile for details + +2000-01-09 20:52 markt + + * Makefile: + + new validation procedure + +2000-01-09 20:21 markt + + * doc/html/: history.html, index.html, switchs.html: + + updated web pages from Gabriel + +2000-01-09 16:08 cisc + + * mpglib/main.c: + + VbrTag.h wasn't included on Amiga + +2000-01-09 16:07 cisc + + * fft.c: + + Removed INLINE from fht (will get inlined as a local function anyway) + +2000-01-09 10:54 takehiro + + * l3bitstream.c, l3side.h, loopold.c, quantize-pvt.c, + quantize-pvt.h, quantize.c, takehiro.c: + + All Huffman code search algorithm is implemented. + (-h option to enable this) + more slower, but better quality. + +2000-01-09 07:51 markt + + * Makefile, psymodel.c, quantize.c: + + AAC masking function now the default. This represents less + masking then the old masking function. + +2000-01-09 07:34 markt + + * gtkanal.c, gtkanal.h, lame.c, psymodel.c, psymodel.h, quantize.c: + + compute mid/side energy rations in addition to masking ratios. + in the future we might use this for side channel bit allocation. + it is not used at all right now. + +2000-01-09 04:11 markt + + * Makefile, psymodel.c, quantize.c: + + someone mistakenly uncommented the call to preemphasis(). + this routine should *not* be used. preemph is now taken care of + in scale_bitcount. + +2000-01-08 17:57 robert + + * psymodel.c: + + define AAC_TMN_NMT at compile time to activate AAC tone masking noise + and noise masking tone values + +2000-01-08 17:56 robert + + * quantize.c: + + tuned VBR code, inactive until you define RH_masking at compile time + +2000-01-08 17:54 robert + + * Makefile: + + added suggested compiler options for gcc 2.95.2, uncomment them to activate them + +2000-01-08 17:52 robert + + * PRESETS.draft: + + changed frequencies to Lames format + +2000-01-07 06:40 markt + + * HACKING, Makefile: + + updated HACKING notes + +2000-01-07 06:13 markt + + * get_audio.c, globalflags.h, lame.c, loopold.c, psymodel.c, + quantize-pvt.c, quantize.c, reservoir.c: + + Robert's cw_lower_limit, upper_limit code back in. Default is compute + cw[] up to 8.9Khz. set with --cwlimit + + started putting global variables into global_flags struct. + +2000-01-06 05:12 markt + + * mp3rtp.c: + + more rtp updates + +2000-01-06 04:58 markt + + * lame.c, mp3rtp.c, rtp.c: + + more rtp updates + +2000-01-05 23:52 robert + + * quantize.c: + + VBR: masking lower was not set correctly + it was only set for sloppy mode, fixed now + +2000-01-05 17:40 afaber + + * mpglib/mpglib.h: + + Fixed BOOL definition conflict for Win32 systems + +2000-01-05 16:47 markt + + * Makefile, mp3rtp.c, rtp.c, rtp.h: + + added mp3rtp code. uses lame library, but not part of normal lame + encoder + +2000-01-05 10:04 markt + + * VbrTag.c, VbrTag.h, get_audio.c, l3side.h, lame.h, mpglib/main.c: + + Check for Xing header in mp3 input files + +2000-01-05 06:29 markt + + * version.h: + + updated version + +2000-01-05 06:20 markt + + * Makefile, psymodel.c: + + norm_l, norm_s table data replaced by formulas. + +2000-01-03 05:15 markt + + * INSTALL, Makefile, encoder.h, gtkanal.c, lame.c, main.c, + doc/html/contributors.html, doc/html/index.html, + doc/html/lame.css, doc/html/node6.html, doc/html/node7.html, + doc/html/switchs.html: + + new html from Gabriel. Fixed but that was causing the first frame to + always be zero. changed encoder delay to 800 to fix some other problems + and remove the buffering of the first frame in lame_encode(). + +1999-12-29 15:34 takehiro + + * doc/html/: contributors.html, history.html, index.html, + node6.html, node7.html, switchs.html: + + updated html doc written by Gabriel Bouvigne. + +1999-12-28 22:02 afaber + + * lame.dsp, Dll/BladeMP3EncDLL.c, Dll/BladeMP3EncDLL.h, + Dll/MP3EncDll.dsp, mpglib/mpglib.dsp: + + Some fixes to the Encoder DLL: + use -h instead of -k flag for high qualtiy + The voice option was set in HQ mode, which is obviously not correct + +1999-12-26 14:48 takehiro + + * l3bitstream.c, lame.c: + + some foolish bug is removed :) + +1999-12-26 09:51 takehiro + + * globalflags.h, lame.c, quantize-pvt.c: + + new option "--noath" to disable the ATH masking + +1999-12-26 09:50 takehiro + + * .cvsignore: + + ignore mp3x binary exe. + +1999-12-23 12:27 takehiro + + * quantize-pvt.c: + + guess wiser initial StepSize for bin_search_stepsize + +1999-12-22 17:38 markt + + * Makefile, psymodel.c: + + AAC NMT/TMN values (commented out) + +1999-12-22 08:03 markt + + * quantize-pvt.c: + + back to oringal (ave_noise < ATH) definition of analog silence for + VBR mode. + +1999-12-22 07:39 markt + + * psymodel.c: + + added AAC spreading function (disabled by default) + +1999-12-21 08:18 markt + + * Makefile, fft.c, l3side.h, lame.c, psymodel.c, psymodel.h, + quantize-pvt.c, quantize.c: + + Bug fix in Mid/Side masking thresholds + +1999-12-19 21:33 afaber + + * Dll/BladeMP3EncDLL.c: + + Set home page link to Lame home page + +1999-12-19 01:47 markt + + * Makefile, globalflags.h, lame.c, psymodel.c: + + went back to ISO layer III recommended cw formulas + +1999-12-19 01:15 robert + + * globalflags.h, lame.c, psymodel.c: + + patched GPSYCHO, enable with --psy-model 0 + +1999-12-17 04:24 markt + + * USAGE, globalflags.h, lame.c, reservoir.c: + + added the --nores option to disable the bitreservoir. only usefull + in special circumstances + +1999-12-16 05:24 markt + + * quantize-pvt.c: + + changed analog silence switch to use max_ener rather than ave_ener. + only affects VBR mode: when analog silence is detected, the min bitrate + is allowed to drop to 32kbs even if set higher with -b + +1999-12-14 23:51 cisc + + * fft.c: + + Changed M_PI to PI. (Not everyone has M_PI, but PI is always defined in util.h) + +1999-12-14 22:44 robert + + * PRESETS.draft: + + first sketch of what could become PRESETS for LAME + +1999-12-14 22:40 robert + + * lame.c, quantize.c: + + added new experimentalX quant_compare -X6 mode + +1999-12-14 04:38 markt + + * Makefile, fft.c, fft.h, psymodel.c: + + Takehiro's fft's back in. fft_short2(), fft_long2() will call original + fft's (with one minor change: 0 protection for ax[] and bx[] was not + needed and has been removed). Takehiro's routines are fft_short() and + fft_long(). They dont give bit-for-bit identical answers, and I still + want to track this down before making them the defaults. . + +1999-12-14 00:19 robert + + * lame.c: + + changed filter options + +1999-12-13 21:56 markt + + * version.h: + + updated version to 3.58 + +1999-12-12 21:14 robert + + * lame.c: + + grrr, mist some filter comandline combinations :( + +1999-12-12 19:22 robert + + * lame.c: + + fixed filter commandline parameter inconsistencies + +1999-12-12 19:02 markt + + * filters.c, newmdct.c, util.h: + + removed extra #define's related to PI + +1999-12-12 03:53 cisc + + * filters.c, loopold.c, newmdct.c, quantize.c, util.h: + + Added new PI and LOG predefined variants, and stuck them in at respective places. + +1999-12-11 23:37 robert + + * lame.c: + + added low/highpass filter switches + +1999-12-11 23:36 robert + + * filters.c, globalflags.h: + + added highpass filter similar to lowpass filter + fixed lowpass filter to avoid endless loops + +1999-12-11 20:13 robert + + * mlame: + + fix for filenames containing spaces + +1999-12-11 00:57 takehiro + + * .cvsignore: + + added lame binary executable itself + +1999-12-10 01:57 takehiro + + * lame.c, loopold.c, quantize.c, util.c, util.h: + + little bit good subblock_gain calculation. + and nint2 is removed. + +1999-12-09 15:17 takehiro + + * loopold.c: + + little bit clean up. some variable restoring is removed. + +1999-12-09 07:07 markt + + * quantize-pvt.c, quantize-pvt.h, quantize.c, takehiro.c: + + PRECALC_SIZE bug? + PRECALC_SIZE should be 8191+15+1, since max value of xr/ix is 8191+15. + +1999-12-09 06:29 markt + + * loopold.c: + + cod_info-> should be cod_info[ch]-> + +1999-12-09 02:34 takehiro + + * loopold.c, quantize.c: + + Oops, stepsize history was not recorded. + +1999-12-09 02:28 takehiro + + * loopold.c, quantize-pvt.c, quantize-pvt.h, quantize.c: + + initial value of binary search is separeted by channels. + maybe faster bin_search_stepsize + +1999-12-09 00:44 cisc + + * l3bitstream-pvt.h: + + Removed write_ancillary_data() prototype. (No longer used) + +1999-12-09 00:38 cisc + + * takehiro.c: + + Included the correct quantize header. (quantize-pvt.h instead of quantize.h) + +1999-12-08 19:39 cisc + + * util.h: + + Adjusted PI/SQRT2 precision. (SQRT2 deviated from standard math.h value) + +1999-12-08 19:37 cisc + + * mpglib/mpg123.h: + + Fixed M_PI/M_SQRT2 to work on all platforms. Removed unused INLINE. + +1999-12-08 13:45 takehiro + + * mpglib/layer3.c: + + debug about scfsi treatment + +1999-12-08 06:27 markt + + * Makefile, lame.c: + + fixed display bug for VBR histogram under ncurses. Now termcap + is replaced by the more modern ncurses. + +1999-12-08 05:46 markt + + * psymodel.c, takehiro.c: + + avoid bounds check on xr[] for non-hq mode, from Mat. + spelling error in psymodel.c fixed :-) + +1999-12-08 05:24 markt + + * TODO: + + [no log message] + +1999-12-08 03:49 takehiro + + * psymodel.c: + + debugged possible buffer overrun. + +1999-12-07 22:58 cisc + + * mpglib/layer3.c: + + No GTK on Amiga. :( + +1999-12-07 22:56 cisc + + * main.c: + + Removed redundant __buffsize (SAS/C (AmigaOS)) + +1999-12-07 05:11 markt + + * Makefile, TODO, quantize-pvt.c: + + removed -.5 from quantize_xrpow + +1999-12-07 02:04 markt + + * fft.c, fft.h, lame.c, psymodel.c, quantize-pvt.c: + + backed out takehiro's fft changes for now + added latest quantize_xrpow asm from Acy and Mat + +1999-12-06 22:45 takehiro + + * fft.c: + + lookup table integration + +1999-12-06 20:38 afaber + + * fft.c, lame.h, machine.h, psymodel.c: + + Fixed compiler errors + +1999-12-03 10:13 takehiro + + * fft.c, fft.h, psymodel.c: + + maybe faster FFT coding + +1999-12-03 10:11 takehiro + + * l3bitstream.c: + + foolish mistake has removed :) + +1999-12-03 09:45 takehiro + + * l3bitstream.c, l3bitstream.h, lame.c: + + little bit cleanup + +1999-12-02 17:01 takehiro + + * loopold.c, quantize-pvt.c, quantize-pvt.h, quantize.c, + takehiro.c: + + correct adj43 overrun(maybe) + +1999-11-30 19:30 afaber + + * Dll/.cvsignore, mpglib/.cvsignore: + + Added .cvsignore files in sub projects + +1999-11-30 19:27 afaber + + * .cvsignore, gtkanal.c, lame.dsp, util.c, mpglib/mpglib.dsp: + + Added Win32 specific output files to .cvsignore + updated project files to set proper output directory and fixed alignment + problem between mpglib project and lame project, now all modules + have 8 byte alignment in all configurations + +1999-11-29 19:54 takehiro + + * .cvsignore: + + configure ignoring *.d file + +1999-11-29 19:48 takehiro + + * quantize.c: + + And more cleanup. needless variable store/restores are removed. + +1999-11-29 19:39 takehiro + + * quantize.c: + + little bit code cleanup(deleted needless call of scale_bitcount) + sorry, it is not bugfix of "TOO LARGE quantizerStepSize" ;p + +1999-11-29 16:34 markt + + * loopold.c, quantize-pvt.h, quantize.c: + + removed unused VBRbits from non-VBR quant routines + +1999-11-29 03:13 markt + + * loopold.c, quantize-pvt.c, quantize.c: + + scalefactor preemph *correctly* turned back on + +1999-11-29 02:55 markt + + * loopold.c, quantize-pvt.c: + + scalefac pre-emph turned back on in loopold.c + +1999-11-29 02:45 markt + + * encoder.h, gtkanal.h, l3side.h, lame.c, newmdct.c, psymodel.c, + psymodel.h, quantize.c, util.c: + + MS stereo switch slightly improved: old formula was based on the average + of ms_ratio of both granules. New formula uses ms_ratio from both + granules and the previous and next granule. This will help avoid toggleing + MS stereo off for a single frame. Long runs of MS stereo or regular + stereo will not be affected. + + also fixed a bug in frame analyzer - it was accessing l3_xmin in the last + scalefactor (l3_xmin and maskings are not computed for last scalefactor) + +1999-11-28 23:00 afaber + + * lame.c, lame.dsp, Dll/MP3EncDll.dsp: + + More fixes in order to compile under Win32 + +1999-11-28 22:42 afaber + + * lame.dsp, quantize-pvt.c: + + Fixes to compile under Win32 + +1999-11-28 22:21 afaber + + * Dll/: BladeMP3EncDLL.c, BladeMP3EncDLL.def, BladeMP3EncDLL.h, + MP3EncDll.dsp, MP3EncDll.dsw: + + Update of Blade DLL interface in order to support new lame features + +1999-11-28 06:45 markt + + * quantize-pvt.c: + + updated comments + +1999-11-28 06:36 markt + + * USAGE, quantize-pvt.c, quantize-pvt.h, vbrquantize.c: + + ASM routines (gcc & MSVC) for quantize_xrpow + +1999-11-28 01:01 markt + + * Makefile, TODO, lame.c, quantize-pvt.c, quantize-pvt.h, + quantize.c: + + If analog silence is detected, allow VBR code to over ride the VBR_min_bitrate + setting and encode at 32kbs. + +1999-11-27 23:39 markt + + * Makefile, formatBitstream.c, l3bitstream.c, lame.c, + quantize-pvt.c, quantize-pvt.h, quantize.c, util.c, + vbrquantize.c: + + More accurate quantization from Segher Boessenkool + +1999-11-25 19:27 markt + + * util.c: + + fixed allowable bitrate displays + +1999-11-24 08:43 markt + + * loopold.c, main.c, mlame, mp3x.c, timestatus.c, portableio.c, + portableio.h, reservoir.c, reservoir.h, tables.h, timestatus.h, + version.c, newmdct.h, quantize.h, takehiro.c, debugscalefac.c, + encoder.h, machine.h, filters.c, quantize-pvt.h, HACKING, + filters.h, vbrquantize.c, Dll/MP3EncDll.dsp, + Dll/BladeMP3EncDLL.c, Dll/BladeMP3EncDLL.def, + Dll/BladeMP3EncDLL.h, Dll/MP3EncDll.dsw, doc/html/index.html, + doc/html/lame.css, doc/html/node7.html, doc/html/node5.html, + doc/html/contributors.html, doc/html/node6.html, + doc/html/history.html, doc/html/switchs.html, doc/man/lame.1, + mpglib/Makefile, mpglib/README, mpglib/TODO, mpglib/common.c, + mpglib/dct64_i386.c, mpglib/decode_i386.c, mpglib/huffman.h, + mpglib/interface.c, mpglib/layer3.c, mpglib/main.c, + mpglib/mpglib.dsp, mpglib/mpg123.h, mpglib/mpglib.h, + mpglib/tabinit.c: + + Initial revision + +1999-11-24 08:43 markt + + * loopold.c, main.c, mlame, mp3x.c, timestatus.c, portableio.c, + portableio.h, reservoir.c, reservoir.h, tables.h, timestatus.h, + version.c, newmdct.h, quantize.h, takehiro.c, debugscalefac.c, + encoder.h, machine.h, filters.c, quantize-pvt.h, HACKING, + filters.h, vbrquantize.c, Dll/MP3EncDll.dsp, + Dll/BladeMP3EncDLL.c, Dll/BladeMP3EncDLL.def, + Dll/BladeMP3EncDLL.h, Dll/MP3EncDll.dsw, doc/html/index.html, + doc/html/lame.css, doc/html/node7.html, doc/html/node5.html, + doc/html/contributors.html, doc/html/node6.html, + doc/html/history.html, doc/html/switchs.html, doc/man/lame.1, + mpglib/Makefile, mpglib/README, mpglib/TODO, mpglib/common.c, + mpglib/dct64_i386.c, mpglib/decode_i386.c, mpglib/huffman.h, + mpglib/interface.c, mpglib/layer3.c, mpglib/main.c, + mpglib/mpglib.dsp, mpglib/mpg123.h, mpglib/mpglib.h, + mpglib/tabinit.c: + + initial checkin of LAME + Starting with LAME 3.57beta with some modifications + +1999-11-24 08:40 markt + + * COPYING, INSTALL, Makefile, Makefile.MSVC, tables.c, util.c, + README, README.WINGTK, TODO, USAGE, fft.c, VbrTag.c, VbrTag.h, + auenc, fft.h, psymodel.c, lame.dsp, util.h, formatBitstream.c, + formatBitstream.h, get_audio.c, lame.c, get_audio.h, + globalflags.h, gpkplotting.c, gpkplotting.h, gtkanal.c, + gtkanal.h, quantize.c, version.h, newmdct.c, id3tag.c, id3tag.h, + ieeefloat.c, ieeefloat.h, l3bitstream-pvt.h, l3bitstream.c, + l3bitstream.h, LICENSE, l3side.h, lame.dsw, quantize-pvt.c, + lame.h, psymodel.h: + + Initial revision + +1999-11-24 08:40 markt + + * COPYING, INSTALL, Makefile, Makefile.MSVC, tables.c, util.c, + README, README.WINGTK, TODO, USAGE, fft.c, VbrTag.c, VbrTag.h, + auenc, fft.h, psymodel.c, lame.dsp, util.h, formatBitstream.c, + formatBitstream.h, get_audio.c, lame.c, get_audio.h, + globalflags.h, gpkplotting.c, gpkplotting.h, gtkanal.c, + gtkanal.h, quantize.c, version.h, newmdct.c, id3tag.c, id3tag.h, + ieeefloat.c, ieeefloat.h, l3bitstream-pvt.h, l3bitstream.c, + l3bitstream.h, LICENSE, l3side.h, lame.dsw, quantize-pvt.c, + lame.h, psymodel.h: + + initial checkin of LAME + Starting with LAME 3.57beta with some modifications + diff --git a/DEFINES b/DEFINES new file mode 100644 index 0000000..b4fab79 --- /dev/null +++ b/DEFINES @@ -0,0 +1,45 @@ +$Id: DEFINES,v 1.23 2003/02/07 18:17:41 bouvigne Exp $ + +USE_FAST_LOG: + - use of log/log10 approximation (uses IEEE754 float format) + (absolute precision of log10 is then around 1e-6) + +KLEMM_36: + - portability fixes in the IO code + +NON_LINEAR_PSYMODEL + - use a non linear psymodel in the GPSYCHO case + +USE_GOGO_SUBBAND: + ? + +NOTABLES (default): + ? + +NEWS3: + ? + +NORES_TEST (allways on): + - don't let the 2nd granule use bits saved by the 1st granule + - useful for testing only + +NEW_DRAIN (theres a define above: NEW_DRAINXX): + ? + comment: + mdb_bytes = x/8; m ?= n ?= o ?= 8* mdb_bytes; p ?= mdb_bytes + ( ? == [+-] ) + - optimization should handle this, but it looks ugly + - do we lose precision here? + +LAME_STD_PRINT: + - more verbose output? + +PRECOMPUTE (always on, multiple defines): + - precomputes blackman window? + +USE_GNUC_ASM: + - speed optimization + (should move into configure.in) + +... alot of #if 0 / #if 1 not evaluated ... + diff --git a/Dll/BladeMP3EncDLL.c b/Dll/BladeMP3EncDLL.c new file mode 100644 index 0000000..4d9f3d9 --- /dev/null +++ b/Dll/BladeMP3EncDLL.c @@ -0,0 +1,1028 @@ +/* +* Blade DLL Interface for LAME. +* +* Copyright (c) 1999 - 2002 A.L. Faber +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Library General Public +* License as published by the Free Software Foundation; either +* version 2 of the License, or (at your option) any later version. +* +* This library 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 +* Library General Public License for more details. +* +* You should have received a copy of the GNU Library General Public +* License along with this library; if not, write to the +* Free Software Foundation, Inc., 59 Temple Place - Suite 330, +* Boston, MA 02111-1307, USA. +*/ + +#include +#include +#include "BladeMP3EncDLL.h" +#include +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define Min(A, B) ((A) < (B) ? (A) : (B)) +#define Max(A, B) ((A) > (B) ? (A) : (B)) + +#define _RELEASEDEBUG 0 + +// lame_enc DLL version number +const BYTE MAJORVERSION = 1; +const BYTE MINORVERSION = 32; + + +// Local variables +static DWORD dwSampleBufferSize=0; +static HMODULE gs_hModule=NULL; +static BOOL gs_bLogFile=FALSE; +static lame_global_flags* gfp_save = NULL; + +// Local function prototypes +static void dump_config( lame_global_flags* gfp ); +static void DebugPrintf( const char* pzFormat, ... ); +static void DispErr( char const* strErr ); +static void PresetOptions( lame_global_flags *gfp, LONG myPreset ); + + +static void DebugPrintf(const char* pzFormat, ...) +{ + char szBuffer[1024]={'\0',}; + char szFileName[MAX_PATH+1]={'\0',}; + va_list ap; + + // Get the full module (DLL) file name + GetModuleFileNameA( gs_hModule, + szFileName, + sizeof( szFileName ) ); + + // change file name extention + szFileName[ strlen(szFileName) - 3 ] = 't'; + szFileName[ strlen(szFileName) - 2 ] = 'x'; + szFileName[ strlen(szFileName) - 1 ] = 't'; + + // start at beginning of the list + va_start(ap, pzFormat); + + // copy it to the string buffer + _vsnprintf(szBuffer, sizeof(szBuffer), pzFormat, ap); + + // log it to the file? + if ( gs_bLogFile ) + { + FILE* fp = NULL; + + // try to open the log file + fp=fopen( szFileName, "a+" ); + + // check file open result + if (fp) + { + // write string to the file + fputs(szBuffer,fp); + + // close the file + fclose(fp); + } + } + +#if defined _DEBUG || defined _RELEASEDEBUG + OutputDebugStringA( szBuffer ); +#endif + + va_end(ap); +} + + +static void PresetOptions( lame_global_flags *gfp, LONG myPreset ) +{ + switch (myPreset) + { + /*-1*/case LQP_NOPRESET: + break; + + /*0*/case LQP_NORMAL_QUALITY: + /* lame_set_quality( gfp, 5 );*/ + break; + + /*1*/case LQP_LOW_QUALITY: + lame_set_quality( gfp, 9 ); + break; + + /*2*/case LQP_HIGH_QUALITY: + lame_set_quality( gfp, 2 ); + break; + + /*3*/case LQP_VOICE_QUALITY: // --voice flag for experimental voice mode + lame_set_mode( gfp, MONO ); + lame_set_preset( gfp, 56); + break; + + /*4*/case LQP_R3MIX: // --R3MIX + lame_set_preset( gfp, R3MIX); + break; + + /*5*/case LQP_VERYHIGH_QUALITY: + lame_set_quality( gfp, 0 ); + break; + + /*6*/case LQP_STANDARD: // --PRESET STANDARD + lame_set_preset( gfp, STANDARD); + break; + + /*7*/case LQP_FAST_STANDARD: // --PRESET FAST STANDARD + lame_set_preset( gfp, STANDARD_FAST); + break; + + /*8*/case LQP_EXTREME: // --PRESET EXTREME + lame_set_preset( gfp, EXTREME); + break; + + /*9*/case LQP_FAST_EXTREME: // --PRESET FAST EXTREME: + lame_set_preset( gfp, EXTREME_FAST); + break; + + /*10*/case LQP_INSANE: // --PRESET INSANE + lame_set_preset( gfp, INSANE); + break; + + /*11*/case LQP_ABR: // --PRESET ABR + // handled in beInitStream + break; + + /*12*/case LQP_CBR: // --PRESET CBR + // handled in beInitStream + break; + + /*13*/case LQP_MEDIUM: // --PRESET MEDIUM + lame_set_preset( gfp, MEDIUM); + break; + + /*14*/case LQP_FAST_MEDIUM: // --PRESET FAST MEDIUM + lame_set_preset( gfp, MEDIUM_FAST); + break; + + /*1000*/case LQP_PHONE: + lame_set_mode( gfp, MONO ); + lame_set_preset( gfp, 16); + break; + + /*2000*/case LQP_SW: + lame_set_mode( gfp, MONO ); + lame_set_preset( gfp, 24); + break; + + /*3000*/case LQP_AM: + lame_set_mode( gfp, MONO ); + lame_set_preset( gfp, 40); + break; + + /*4000*/case LQP_FM: + lame_set_preset( gfp, 112); + break; + + /*5000*/case LQP_VOICE: + lame_set_mode( gfp, MONO ); + lame_set_preset( gfp, 56); + break; + + /*6000*/case LQP_RADIO: + lame_set_preset( gfp, 112); + break; + + /*7000*/case LQP_TAPE: + lame_set_preset( gfp, 112); + break; + + /*8000*/case LQP_HIFI: + lame_set_preset( gfp, 160); + break; + + /*9000*/case LQP_CD: + lame_set_preset( gfp, 192); + break; + + /*10000*/case LQP_STUDIO: + lame_set_preset( gfp, 256); + break; + + } +} + + +__declspec(dllexport) BE_ERR beInitStream(PBE_CONFIG pbeConfig, PDWORD dwSamples, PDWORD dwBufferSize, PHBE_STREAM phbeStream) +{ + int actual_bitrate; + //2001-12-18 + BE_CONFIG lameConfig = { 0, }; + int nInitReturn = 0; + lame_global_flags* gfp = NULL; + + // Init the global flags structure + gfp = lame_init(); + *phbeStream = (HBE_STREAM)gfp; + + // clear out structure + memset(&lameConfig,0x00,CURRENT_STRUCT_SIZE); + + // Check if this is a regular BLADE_ENCODER header + if (pbeConfig->dwConfig!=BE_CONFIG_LAME) + { + int nCRC=pbeConfig->format.mp3.bCRC; + int nVBR=(nCRC>>12)&0x0F; + + // Copy parameter from old Blade structure + lameConfig.format.LHV1.dwSampleRate =pbeConfig->format.mp3.dwSampleRate; + //for low bitrates, LAME will automatically downsample for better + //sound quality. Forcing output samplerate = input samplerate is not a good idea + //unless the user specifically requests it: + //lameConfig.format.LHV1.dwReSampleRate=pbeConfig->format.mp3.dwSampleRate; + lameConfig.format.LHV1.nMode =(pbeConfig->format.mp3.byMode&0x0F); + lameConfig.format.LHV1.dwBitrate =pbeConfig->format.mp3.wBitrate; + lameConfig.format.LHV1.bPrivate =pbeConfig->format.mp3.bPrivate; + lameConfig.format.LHV1.bOriginal =pbeConfig->format.mp3.bOriginal; + lameConfig.format.LHV1.bCRC =nCRC&0x01; + lameConfig.format.LHV1.bCopyright =pbeConfig->format.mp3.bCopyright; + + // Fill out the unknowns + lameConfig.format.LHV1.dwStructSize=CURRENT_STRUCT_SIZE; + lameConfig.format.LHV1.dwStructVersion=CURRENT_STRUCT_VERSION; + + // Get VBR setting from fourth nibble + if ( nVBR>0 ) + { + lameConfig.format.LHV1.bWriteVBRHeader = TRUE; + lameConfig.format.LHV1.bEnableVBR = TRUE; + lameConfig.format.LHV1.nVBRQuality = nVBR-1; + } + + // Get Quality from third nibble + lameConfig.format.LHV1.nPreset=((nCRC>>8)&0x0F); + + } + else + { + // Copy the parameters + memcpy(&lameConfig,pbeConfig,pbeConfig->format.LHV1.dwStructSize); + } + + // --------------- Set arguments to LAME encoder ------------------------- + + // Set input sample frequency + lame_set_in_samplerate( gfp, lameConfig.format.LHV1.dwSampleRate ); + + // disable INFO/VBR tag by default. + // if this tag is used, the calling program must call beWriteVBRTag() + // after encoding. But the original DLL documentation does not + // require the + // app to call beWriteVBRTag() unless they have specifically + // set LHV1.bWriteVBRHeader=TRUE. Thus the default setting should + // be disabled. + lame_set_bWriteVbrTag( gfp, 0 ); + + //2001-12-18 Dibrom's ABR preset stuff + + if(lameConfig.format.LHV1.nPreset == LQP_ABR) // --ALT-PRESET ABR + { + actual_bitrate = lameConfig.format.LHV1.dwVbrAbr_bps / 1000; + + // limit range + if( actual_bitrate > 320) + { + actual_bitrate = 320; + } + + if( actual_bitrate < 8 ) + { + actual_bitrate = 8; + } + + lame_set_preset( gfp, actual_bitrate ); + } + + // end Dibrom's ABR preset 2001-12-18 ****** START OF CBR + + if(lameConfig.format.LHV1.nPreset == LQP_CBR) // --ALT-PRESET CBR + { + actual_bitrate = lameConfig.format.LHV1.dwBitrate; + lame_set_preset(gfp, actual_bitrate); + lame_set_VBR(gfp, vbr_off); + } + + // end Dibrom's CBR preset 2001-12-18 + + // The following settings only used when preset is not one of the LAME QUALITY Presets + if ( (int)lameConfig.format.LHV1.nPreset < (int) LQP_STANDARD ) + { + switch ( lameConfig.format.LHV1.nMode ) + { + case BE_MP3_MODE_STEREO: + lame_set_mode( gfp, STEREO ); + lame_set_num_channels( gfp, 2 ); + break; + case BE_MP3_MODE_JSTEREO: + lame_set_mode( gfp, JOINT_STEREO ); + //lame_set_force_ms( gfp, bForceMS ); // no check box to force this? + lame_set_num_channels( gfp, 2 ); + break; + case BE_MP3_MODE_MONO: + lame_set_mode( gfp, MONO ); + lame_set_num_channels( gfp, 1 ); + break; + case BE_MP3_MODE_DUALCHANNEL: + lame_set_mode( gfp, DUAL_CHANNEL ); + lame_set_num_channels( gfp, 2 ); + break; + default: + { + DebugPrintf("Invalid lameConfig.format.LHV1.nMode, value is %d\n",lameConfig.format.LHV1.nMode); + return BE_ERR_INVALID_FORMAT_PARAMETERS; + } + } + + if ( lameConfig.format.LHV1.bEnableVBR ) + { + /* set VBR quality */ + lame_set_VBR_q( gfp, lameConfig.format.LHV1.nVBRQuality ); + + /* select proper VBR method */ + switch ( lameConfig.format.LHV1.nVbrMethod) + { + case VBR_METHOD_NONE: + lame_set_VBR( gfp, vbr_off ); + break; + + case VBR_METHOD_DEFAULT: + lame_set_VBR( gfp, vbr_default ); + break; + + case VBR_METHOD_OLD: + lame_set_VBR( gfp, vbr_rh ); + break; + + case VBR_METHOD_MTRH: + case VBR_METHOD_NEW: + /* + * the --vbr-mtrh commandline switch is obsolete. + * now --vbr-mtrh is known as --vbr-new + */ + lame_set_VBR( gfp, vbr_mtrh ); + break; + + case VBR_METHOD_ABR: + lame_set_VBR( gfp, vbr_abr ); + break; + + default: + /* unsupported VBR method */ + assert( FALSE ); + } + } + else + { + /* use CBR encoding method, so turn off VBR */ + lame_set_VBR( gfp, vbr_off ); + } + + /* Set bitrate. (CDex users always specify bitrate=Min bitrate when using VBR) */ + lame_set_brate( gfp, lameConfig.format.LHV1.dwBitrate ); + + /* check if we have to use ABR, in order to backwards compatible, this + * condition should still be checked indepedent of the nVbrMethod method + */ + if (lameConfig.format.LHV1.dwVbrAbr_bps > 0 ) + { + /* set VBR method to ABR */ + lame_set_VBR( gfp, vbr_abr ); + + /* calculate to kbps, round to nearest kbps */ + lame_set_VBR_mean_bitrate_kbps( gfp, ( lameConfig.format.LHV1.dwVbrAbr_bps + 500 ) / 1000 ); + + /* limit range */ + if( lame_get_VBR_mean_bitrate_kbps( gfp ) > 320) + { + lame_set_VBR_mean_bitrate_kbps( gfp, 320 ); + } + + if( lame_get_VBR_mean_bitrate_kbps( gfp ) < 8 ) + { + lame_set_VBR_mean_bitrate_kbps( gfp, 8 ); + } + } + + } + + // First set all the preset options + if ( LQP_NOPRESET != lameConfig.format.LHV1.nPreset ) + { + PresetOptions( gfp, lameConfig.format.LHV1.nPreset ); + } + + + // Set frequency resampling rate, if specified + if ( lameConfig.format.LHV1.dwReSampleRate > 0 ) + { + lame_set_out_samplerate( gfp, lameConfig.format.LHV1.dwReSampleRate ); + } + + + switch ( lameConfig.format.LHV1.nMode ) + { + case BE_MP3_MODE_MONO: + lame_set_mode( gfp, MONO ); + lame_set_num_channels( gfp, 1 ); + break; + + default: + break; + } + + + // Use strict ISO encoding? + lame_set_strict_ISO( gfp, ( lameConfig.format.LHV1.bStrictIso ) ? 1 : 0 ); + + // Set copyright flag? + if ( lameConfig.format.LHV1.bCopyright ) + { + lame_set_copyright( gfp, 1 ); + } + + // Do we have to tag it as non original + if ( !lameConfig.format.LHV1.bOriginal ) + { + lame_set_original( gfp, 0 ); + } + else + { + lame_set_original( gfp, 1 ); + } + + // Add CRC? + if ( lameConfig.format.LHV1.bCRC ) + { + lame_set_error_protection( gfp, 1 ); + } + else + { + lame_set_error_protection( gfp, 0 ); + } + + // Set private bit? + if ( lameConfig.format.LHV1.bPrivate ) + { + lame_set_extension( gfp, 1 ); + } + else + { + lame_set_extension( gfp, 0 ); + } + + + // Set VBR min bitrate, if specified + if ( lameConfig.format.LHV1.dwBitrate > 0 ) + { + lame_set_VBR_min_bitrate_kbps( gfp, lameConfig.format.LHV1.dwBitrate ); + } + + // Set Maxbitrate, if specified + if ( lameConfig.format.LHV1.dwMaxBitrate > 0 ) + { + lame_set_VBR_max_bitrate_kbps( gfp, lameConfig.format.LHV1.dwMaxBitrate ); + } + // Set bit resovoir option + if ( lameConfig.format.LHV1.bNoRes ) + { + lame_set_disable_reservoir( gfp,1 ); + } + + // check if the VBR tag is required + if ( lameConfig.format.LHV1.bWriteVBRHeader ) + { + lame_set_bWriteVbrTag( gfp, 1 ); + } + else + { + lame_set_bWriteVbrTag( gfp, 0 ); + } + + // Override Quality setting, use HIGHBYTE = NOT LOWBYTE to be backwards compatible + if ( ( lameConfig.format.LHV1.nQuality & 0xFF ) == + ((~( lameConfig.format.LHV1.nQuality >> 8 )) & 0xFF) ) + { + lame_set_quality( gfp, lameConfig.format.LHV1.nQuality & 0xFF ); + } + + if ( 0 != ( nInitReturn = lame_init_params( gfp ) ) ) + { + return nInitReturn; + } + + //LAME encoding call will accept any number of samples. + if ( 0 == lame_get_version( gfp ) ) + { + // For MPEG-II, only 576 samples per frame per channel + *dwSamples= 576 * lame_get_num_channels( gfp ); + } + else + { + // For MPEG-I, 1152 samples per frame per channel + *dwSamples= 1152 * lame_get_num_channels( gfp ); + } + + // Set the input sample buffer size, so we know what we can expect + dwSampleBufferSize = *dwSamples; + + // Set MP3 buffer size, conservative estimate + *dwBufferSize=(DWORD)( 1.25 * ( *dwSamples / lame_get_num_channels( gfp ) ) + 7200 ); + + // For debugging purposes + dump_config( gfp ); + + // Everything went OK, thus return SUCCESSFUL + return BE_ERR_SUCCESSFUL; +} + + + +__declspec(dllexport) BE_ERR beFlushNoGap(HBE_STREAM hbeStream, PBYTE pOutput, PDWORD pdwOutput) +{ + int nOutputSamples = 0; + + lame_global_flags* gfp = (lame_global_flags*)hbeStream; + + // Init the global flags structure + nOutputSamples = lame_encode_flush_nogap( gfp, pOutput, LAME_MAXMP3BUFFER ); + + if ( nOutputSamples < 0 ) + { + *pdwOutput = 0; + return BE_ERR_BUFFER_TOO_SMALL; + } + else + { + *pdwOutput = nOutputSamples; + } + + return BE_ERR_SUCCESSFUL; +} + +__declspec(dllexport) BE_ERR beDeinitStream(HBE_STREAM hbeStream, PBYTE pOutput, PDWORD pdwOutput) +{ + int nOutputSamples = 0; + + lame_global_flags* gfp = (lame_global_flags*)hbeStream; + + nOutputSamples = lame_encode_flush( gfp, pOutput, 0 ); + + if ( nOutputSamples < 0 ) + { + *pdwOutput = 0; + return BE_ERR_BUFFER_TOO_SMALL; + } + else + { + *pdwOutput = nOutputSamples; + } + + return BE_ERR_SUCCESSFUL; +} + + +__declspec(dllexport) BE_ERR beCloseStream(HBE_STREAM hbeStream) +{ + lame_global_flags* gfp = (lame_global_flags*)hbeStream; + + // lame will be close in VbrWriteTag function + if ( !lame_get_bWriteVbrTag( gfp ) ) + { + // clean up of allocated memory + lame_close( gfp ); + + gfp_save = NULL; + } + else + { + gfp_save = (lame_global_flags*)hbeStream; + } + + // DeInit encoder + return BE_ERR_SUCCESSFUL; +} + + + +__declspec(dllexport) VOID beVersion(PBE_VERSION pbeVersion) +{ + // DLL Release date + char lpszDate[20] = { '\0', }; + char lpszTemp[5] = { '\0', }; + lame_version_t lv = { 0, }; + + + // Set DLL interface version + pbeVersion->byDLLMajorVersion=MAJORVERSION; + pbeVersion->byDLLMinorVersion=MINORVERSION; + + get_lame_version_numerical ( &lv ); + + // Set Engine version number (Same as Lame version) + pbeVersion->byMajorVersion = (BYTE)lv.major; + pbeVersion->byMinorVersion = (BYTE)lv.minor; + pbeVersion->byAlphaLevel = (BYTE)lv.alpha; + pbeVersion->byBetaLevel = (BYTE)lv.beta; + +#ifdef MMX_choose_table + pbeVersion->byMMXEnabled=1; +#else + pbeVersion->byMMXEnabled=0; +#endif + + memset( pbeVersion->btReserved, 0, sizeof( pbeVersion->btReserved ) ); + + // Get compilation date + strcpy(lpszDate,__DATE__); + + // Get the first three character, which is the month + strncpy(lpszTemp,lpszDate,3); + lpszTemp[3] = '\0'; + pbeVersion->byMonth=1; + + // Set month + if (strcmp(lpszTemp,"Jan")==0) pbeVersion->byMonth = 1; + if (strcmp(lpszTemp,"Feb")==0) pbeVersion->byMonth = 2; + if (strcmp(lpszTemp,"Mar")==0) pbeVersion->byMonth = 3; + if (strcmp(lpszTemp,"Apr")==0) pbeVersion->byMonth = 4; + if (strcmp(lpszTemp,"May")==0) pbeVersion->byMonth = 5; + if (strcmp(lpszTemp,"Jun")==0) pbeVersion->byMonth = 6; + if (strcmp(lpszTemp,"Jul")==0) pbeVersion->byMonth = 7; + if (strcmp(lpszTemp,"Aug")==0) pbeVersion->byMonth = 8; + if (strcmp(lpszTemp,"Sep")==0) pbeVersion->byMonth = 9; + if (strcmp(lpszTemp,"Oct")==0) pbeVersion->byMonth = 10; + if (strcmp(lpszTemp,"Nov")==0) pbeVersion->byMonth = 11; + if (strcmp(lpszTemp,"Dec")==0) pbeVersion->byMonth = 12; + + // Get day of month string (char [4..5]) + pbeVersion->byDay = (BYTE) atoi( lpszDate + 4 ); + + // Get year of compilation date (char [7..10]) + pbeVersion->wYear = (WORD) atoi( lpszDate + 7 ); + + memset( pbeVersion->zHomepage, 0x00, BE_MAX_HOMEPAGE ); + + strcpy( pbeVersion->zHomepage, "http://www.mp3dev.org/" ); +} + +__declspec(dllexport) BE_ERR beEncodeChunk(HBE_STREAM hbeStream, DWORD nSamples, + PSHORT pSamples, PBYTE pOutput, PDWORD pdwOutput) +{ + // Encode it + int dwSamples; + int nOutputSamples = 0; + lame_global_flags* gfp = (lame_global_flags*)hbeStream; + + dwSamples = nSamples / lame_get_num_channels( gfp ); + + // old versions of lame_enc.dll required exactly 1152 samples + // and worked even if nSamples accidently set to 2304 + // simulate this behavoir: + if ( 1 == lame_get_num_channels( gfp ) && nSamples == 2304) + { + dwSamples/= 2; + } + + + if ( 1 == lame_get_num_channels( gfp ) ) + { + nOutputSamples = lame_encode_buffer(gfp,pSamples,pSamples,dwSamples,pOutput,0); + } + else + { + nOutputSamples = lame_encode_buffer_interleaved(gfp,pSamples,dwSamples,pOutput,0); + } + + + if ( nOutputSamples < 0 ) + { + *pdwOutput=0; + return BE_ERR_BUFFER_TOO_SMALL; + } + else + { + *pdwOutput = (DWORD)nOutputSamples; + } + + return BE_ERR_SUCCESSFUL; +} + + +// accept floating point audio samples, scaled to the range of a signed 16-bit +// integer (within +/- 32768), in non-interleaved channels -- DSPguru, jd +__declspec(dllexport) BE_ERR beEncodeChunkFloatS16NI(HBE_STREAM hbeStream, DWORD nSamples, + PFLOAT buffer_l, PFLOAT buffer_r, PBYTE pOutput, PDWORD pdwOutput) +{ + int nOutputSamples; + lame_global_flags* gfp = (lame_global_flags*)hbeStream; + + nOutputSamples = lame_encode_buffer_float(gfp,buffer_l,buffer_r,nSamples,pOutput,0); + + if ( nOutputSamples >= 0 ) + { + *pdwOutput = (DWORD) nOutputSamples; + } + else + { + *pdwOutput=0; + return BE_ERR_BUFFER_TOO_SMALL; + } + + return BE_ERR_SUCCESSFUL; +} + +static int +maybeSyncWord(FILE* fpStream) +{ + unsigned char mp3_frame_header[4]; + size_t nbytes = fread(mp3_frame_header, 1, sizeof(mp3_frame_header), fpStream); + if ( nbytes != sizeof(mp3_frame_header) ) { + return -1; + } + if ( mp3_frame_header[0] != 0xffu ) { + return -1; /* doesn't look like a sync word */ + } + if ( (mp3_frame_header[1] & 0xE0u) != 0xE0u ) { + return -1; /* doesn't look like a sync word */ + } + return 0; +} + +static int +skipId3v2(FILE * fpStream, size_t lametag_frame_size) +{ + size_t nbytes; + size_t id3v2TagSize = 0; + unsigned char id3v2Header[10]; + + /* seek to the beginning of the stream */ + if (fseek(fpStream, 0, SEEK_SET) != 0) { + return -2; /* not seekable, abort */ + } + /* read 10 bytes in case there's an ID3 version 2 header here */ + nbytes = fread(id3v2Header, 1, sizeof(id3v2Header), fpStream); + if (nbytes != sizeof(id3v2Header)) { + return -3; /* not readable, maybe opened Write-Only */ + } + /* does the stream begin with the ID3 version 2 file identifier? */ + if (!strncmp((char *) id3v2Header, "ID3", 3)) { + /* the tag size (minus the 10-byte header) is encoded into four + * bytes where the most significant bit is clear in each byte + */ + id3v2TagSize = (((id3v2Header[6] & 0x7f) << 21) + | ((id3v2Header[7] & 0x7f) << 14) + | ((id3v2Header[8] & 0x7f) << 7) + | (id3v2Header[9] & 0x7f)) + + sizeof id3v2Header; + } + /* Seek to the beginning of the audio stream */ + if ( fseek(fpStream, id3v2TagSize, SEEK_SET) != 0 ) { + return -2; + } + if ( maybeSyncWord(fpStream) != 0) { + return -1; + } + if ( fseek(fpStream, id3v2TagSize+lametag_frame_size, SEEK_SET) != 0 ) { + return -2; + } + if ( maybeSyncWord(fpStream) != 0) { + return -1; + } + /* OK, it seems we found our LAME-Tag/Xing frame again */ + /* Seek to the beginning of the audio stream */ + if ( fseek(fpStream, id3v2TagSize, SEEK_SET) != 0 ) { + return -2; + } + return 0; +} + +static BE_ERR +updateLameTagFrame(lame_global_flags* gfp, FILE* fpStream) +{ + size_t n = lame_get_lametag_frame( gfp, 0, 0 ); /* ask for bufer size */ + + if ( n > 0 ) + { + unsigned char* buffer = 0; + size_t m = 1; + + if ( 0 != skipId3v2(fpStream, n) ) + { + DispErr( "Error updating LAME-tag frame:\n\n" + "can't locate old frame\n" ); + return BE_ERR_INVALID_FORMAT_PARAMETERS; + } + + buffer = (unsigned char*)malloc( n ); + + if ( buffer == 0 ) + { + DispErr( "Error updating LAME-tag frame:\n\n" + "can't allocate frame buffer\n" ); + return BE_ERR_INVALID_FORMAT_PARAMETERS; + } + + /* Put it all to disk again */ + n = lame_get_lametag_frame( gfp, buffer, n ); + if ( n > 0 ) + { + m = fwrite( buffer, n, 1, fpStream ); + } + free( buffer ); + + if ( m != 1 ) + { + DispErr( "Error updating LAME-tag frame:\n\n" + "couldn't write frame into file\n" ); + return BE_ERR_INVALID_FORMAT_PARAMETERS; + } + } + return BE_ERR_SUCCESSFUL; +} + +__declspec(dllexport) BE_ERR beWriteInfoTag( HBE_STREAM hbeStream, + LPCSTR lpszFileName ) +{ + FILE* fpStream = NULL; + BE_ERR beResult = BE_ERR_SUCCESSFUL; + + lame_global_flags* gfp = (lame_global_flags*)hbeStream; + + if ( NULL != gfp ) + { + // Do we have to write the VBR tag? + if ( lame_get_bWriteVbrTag( gfp ) ) + { + // Try to open the file + fpStream=fopen( lpszFileName, "rb+" ); + + // Check file open result + if ( NULL == fpStream ) + { + beResult = BE_ERR_INVALID_FORMAT_PARAMETERS; + DispErr( "Error updating LAME-tag frame:\n\n" + "can't open file for reading and writing\n" ); + } + else + { + beResult = updateLameTagFrame( gfp, fpStream ); + + // Close the file stream + fclose( fpStream ); + } + } + + // clean up of allocated memory + lame_close( gfp ); + } + else + { + beResult = BE_ERR_INVALID_FORMAT_PARAMETERS; + } + + // return result + return beResult; +} + +// for backwards compatiblity +__declspec(dllexport) BE_ERR beWriteVBRHeader(LPCSTR lpszFileName) +{ + return beWriteInfoTag( (HBE_STREAM)gfp_save, lpszFileName ); +} + + +BOOL APIENTRY DllMain(HANDLE hModule, + DWORD ul_reason_for_call, + LPVOID lpReserved) +{ + (void) lpReserved; + gs_hModule = (HMODULE) hModule; + + switch( ul_reason_for_call ) + { + case DLL_PROCESS_ATTACH: + // Enable debug/logging? + gs_bLogFile = GetPrivateProfileIntA("Debug","WriteLogFile",gs_bLogFile,"lame_enc.ini"); + break; + case DLL_THREAD_ATTACH: + break; + case DLL_THREAD_DETACH: + break; + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} + + +static void dump_config( lame_global_flags* gfp ) +{ + DebugPrintf("\n\nLame_enc configuration options:\n"); + DebugPrintf("==========================================================\n"); + + DebugPrintf("version =%d\n",lame_get_version( gfp ) ); + DebugPrintf("Layer =3\n"); + DebugPrintf("mode ="); + switch ( lame_get_mode( gfp ) ) + { + case STEREO: DebugPrintf( "Stereo\n" ); break; + case JOINT_STEREO: DebugPrintf( "Joint-Stereo\n" ); break; + case DUAL_CHANNEL: DebugPrintf( "Forced Stereo\n" ); break; + case MONO: DebugPrintf( "Mono\n" ); break; + case NOT_SET: /* FALLTROUGH */ + default: DebugPrintf( "Error (unknown)\n" ); break; + } + + DebugPrintf("Input sample rate =%.1f kHz\n", lame_get_in_samplerate( gfp ) /1000.0 ); + DebugPrintf("Output sample rate =%.1f kHz\n", lame_get_out_samplerate( gfp ) /1000.0 ); + + DebugPrintf("bitrate =%d kbps\n", lame_get_brate( gfp ) ); + DebugPrintf("Quality Setting =%d\n", lame_get_quality( gfp ) ); + + DebugPrintf("Low pass frequency =%d\n", lame_get_lowpassfreq( gfp ) ); + DebugPrintf("Low pass width =%d\n", lame_get_lowpasswidth( gfp ) ); + + DebugPrintf("High pass frequency =%d\n", lame_get_highpassfreq( gfp ) ); + DebugPrintf("High pass width =%d\n", lame_get_highpasswidth( gfp ) ); + + DebugPrintf("No short blocks =%d\n", lame_get_no_short_blocks( gfp ) ); + DebugPrintf("Force short blocks =%d\n", lame_get_force_short_blocks( gfp ) ); + + DebugPrintf("de-emphasis =%d\n", lame_get_emphasis( gfp ) ); + DebugPrintf("private flag =%d\n", lame_get_extension( gfp ) ); + + DebugPrintf("copyright flag =%d\n", lame_get_copyright( gfp ) ); + DebugPrintf("original flag =%d\n", lame_get_original( gfp ) ); + DebugPrintf("CRC =%s\n", lame_get_error_protection( gfp ) ? "on" : "off" ); + DebugPrintf("Fast mode =%s\n", ( lame_get_quality( gfp ) )? "enabled" : "disabled" ); + DebugPrintf("Force mid/side stereo =%s\n", ( lame_get_force_ms( gfp ) )?"enabled":"disabled" ); + DebugPrintf("Disable Reservoir =%d\n", lame_get_disable_reservoir( gfp ) ); + DebugPrintf("Allow diff-short =%d\n", lame_get_allow_diff_short( gfp ) ); + DebugPrintf("Interchannel masking =%f\n", lame_get_interChRatio( gfp ) ); + DebugPrintf("Strict ISO Encoding =%s\n", ( lame_get_strict_ISO( gfp ) ) ?"Yes":"No"); + DebugPrintf("Scale =%5.2f\n", lame_get_scale( gfp ) ); + + DebugPrintf("VBR =%s, VBR_q =%d, VBR method =", + ( lame_get_VBR( gfp ) !=vbr_off ) ? "enabled": "disabled", + lame_get_VBR_q( gfp ) ); + + switch ( lame_get_VBR( gfp ) ) + { + case vbr_off: DebugPrintf( "vbr_off\n" ); break; + case vbr_mt : DebugPrintf( "vbr_mt \n" ); break; + case vbr_rh : DebugPrintf( "vbr_rh \n" ); break; + case vbr_mtrh: DebugPrintf( "vbr_mtrh \n" ); break; + case vbr_abr: + DebugPrintf( "vbr_abr (average bitrate %d kbps)\n", lame_get_VBR_mean_bitrate_kbps( gfp ) ); + break; + default: + DebugPrintf("error, unknown VBR setting\n"); + break; + } + + DebugPrintf("Vbr Min bitrate =%d kbps\n", lame_get_VBR_min_bitrate_kbps( gfp ) ); + DebugPrintf("Vbr Max bitrate =%d kbps\n", lame_get_VBR_max_bitrate_kbps( gfp ) ); + + DebugPrintf("Write VBR Header =%s\n", ( lame_get_bWriteVbrTag( gfp ) ) ?"Yes":"No"); + DebugPrintf("VBR Hard min =%d\n", lame_get_VBR_hard_min( gfp ) ); + + DebugPrintf("ATH Only =%d\n", lame_get_ATHonly( gfp ) ); + DebugPrintf("ATH short =%d\n", lame_get_ATHshort( gfp ) ); + DebugPrintf("ATH no =%d\n", lame_get_noATH( gfp ) ); + DebugPrintf("ATH type =%d\n", lame_get_ATHtype( gfp ) ); + DebugPrintf("ATH lower =%f\n", lame_get_ATHlower( gfp ) ); + DebugPrintf("ATH aa =%d\n", lame_get_athaa_type( gfp ) ); + //DebugPrintf("ATH aa loudapprox =%d\n", lame_get_athaa_loudapprox( gfp ) ); + DebugPrintf("ATH aa sensitivity =%f\n", lame_get_athaa_sensitivity( gfp ) ); + + DebugPrintf("Experimental nspsytune =%d\n", lame_get_exp_nspsytune( gfp ) ); + DebugPrintf("Experimental X =%d\n", lame_get_experimentalX( gfp ) ); + DebugPrintf("Experimental Y =%d\n", lame_get_experimentalY( gfp ) ); + DebugPrintf("Experimental Z =%d\n", lame_get_experimentalZ( gfp ) ); +} + + +static void DispErr(char const* strErr) +{ + MessageBoxA(NULL,strErr,"LAME_ENC.DLL",MB_OK|MB_ICONHAND); +} + +#ifdef __cplusplus +} +#endif diff --git a/Dll/BladeMP3EncDLL.def b/Dll/BladeMP3EncDLL.def new file mode 100644 index 0000000..4a83415 --- /dev/null +++ b/Dll/BladeMP3EncDLL.def @@ -0,0 +1,36 @@ +LIBRARY lame_enc.DLL +EXPORTS + +beInitStream @1 +beEncodeChunk @2 +beDeinitStream @3 +beCloseStream @4 +beVersion @5 +beWriteVBRHeader @6 +beEncodeChunkFloatS16NI @7 +beFlushNoGap @8 +beWriteInfoTag @9 + +lame_init @100 +lame_close @101 +lame_init_params @102 +lame_encode_buffer_interleaved @110 +lame_encode_flush @120 +lame_mp3_tags_fid @130 + + +lame_set_num_samples @1000 +lame_get_num_samples @1001 +lame_set_in_samplerate @1002 +lame_get_in_samplerate @1003 +lame_set_num_channels @1004 +lame_get_num_channels @1005 +lame_set_scale @1006 +lame_get_scale @1007 +lame_set_scale_left @1008 +lame_get_scale_left @1009 +lame_set_scale_right @1010 +lame_get_scale_right @1011 +lame_set_out_samplerate @1012 +lame_get_out_samplerate @1013 + diff --git a/Dll/BladeMP3EncDLL.h b/Dll/BladeMP3EncDLL.h new file mode 100644 index 0000000..1b45a4d --- /dev/null +++ b/Dll/BladeMP3EncDLL.h @@ -0,0 +1,280 @@ +/* + * Blade Type of DLL Interface for Lame encoder + * + * Copyright (c) 1999-2002 A.L. Faber + * Based on bladedll.h version 1.0 written by Jukka Poikolainen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef ___BLADEDLL_H_INCLUDED___ +#define ___BLADEDLL_H_INCLUDED___ + +#ifdef __GNUC__ +#define ATTRIBUTE_PACKED __attribute__((packed)) +#else +#define ATTRIBUTE_PACKED +#pragma pack(push) +#pragma pack(1) +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* encoding formats */ + +#define BE_CONFIG_MP3 0 +#define BE_CONFIG_LAME 256 + +/* type definitions */ + +typedef void* HBE_STREAM; +typedef HBE_STREAM *PHBE_STREAM; +typedef unsigned long BE_ERR; + +/* error codes */ + +#define BE_ERR_SUCCESSFUL 0x00000000 +#define BE_ERR_INVALID_FORMAT 0x00000001 +#define BE_ERR_INVALID_FORMAT_PARAMETERS 0x00000002 +#define BE_ERR_NO_MORE_HANDLES 0x00000003 +#define BE_ERR_INVALID_HANDLE 0x00000004 +#define BE_ERR_BUFFER_TOO_SMALL 0x00000005 + +/* other constants */ + +#define BE_MAX_HOMEPAGE 128 + +/* format specific variables */ + +#define BE_MP3_MODE_STEREO 0 +#define BE_MP3_MODE_JSTEREO 1 +#define BE_MP3_MODE_DUALCHANNEL 2 +#define BE_MP3_MODE_MONO 3 + + + +#define MPEG1 1 +#define MPEG2 0 + +#ifdef _BLADEDLL +#undef FLOAT + #include +#endif + +#define CURRENT_STRUCT_VERSION 1 +#define CURRENT_STRUCT_SIZE sizeof(BE_CONFIG) // is currently 331 bytes + + +typedef enum +{ + VBR_METHOD_NONE = -1, + VBR_METHOD_DEFAULT = 0, + VBR_METHOD_OLD = 1, + VBR_METHOD_NEW = 2, + VBR_METHOD_MTRH = 3, + VBR_METHOD_ABR = 4 +} VBRMETHOD; + +typedef enum +{ + LQP_NOPRESET =-1, + + // QUALITY PRESETS + LQP_NORMAL_QUALITY = 0, + LQP_LOW_QUALITY = 1, + LQP_HIGH_QUALITY = 2, + LQP_VOICE_QUALITY = 3, + LQP_R3MIX = 4, + LQP_VERYHIGH_QUALITY = 5, + LQP_STANDARD = 6, + LQP_FAST_STANDARD = 7, + LQP_EXTREME = 8, + LQP_FAST_EXTREME = 9, + LQP_INSANE = 10, + LQP_ABR = 11, + LQP_CBR = 12, + LQP_MEDIUM = 13, + LQP_FAST_MEDIUM = 14, + + // NEW PRESET VALUES + LQP_PHONE =1000, + LQP_SW =2000, + LQP_AM =3000, + LQP_FM =4000, + LQP_VOICE =5000, + LQP_RADIO =6000, + LQP_TAPE =7000, + LQP_HIFI =8000, + LQP_CD =9000, + LQP_STUDIO =10000 + +} LAME_QUALITY_PRESET; + + + +typedef struct { + DWORD dwConfig; // BE_CONFIG_XXXXX + // Currently only BE_CONFIG_MP3 is supported + union { + + struct { + + DWORD dwSampleRate; // 48000, 44100 and 32000 allowed + BYTE byMode; // BE_MP3_MODE_STEREO, BE_MP3_MODE_DUALCHANNEL, BE_MP3_MODE_MONO + WORD wBitrate; // 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256 and 320 allowed + BOOL bPrivate; + BOOL bCRC; + BOOL bCopyright; + BOOL bOriginal; + + } mp3; // BE_CONFIG_MP3 + + struct + { + // STRUCTURE INFORMATION + DWORD dwStructVersion; + DWORD dwStructSize; + + // BASIC ENCODER SETTINGS + DWORD dwSampleRate; // SAMPLERATE OF INPUT FILE + DWORD dwReSampleRate; // DOWNSAMPLERATE, 0=ENCODER DECIDES + LONG nMode; // BE_MP3_MODE_STEREO, BE_MP3_MODE_DUALCHANNEL, BE_MP3_MODE_MONO + DWORD dwBitrate; // CBR bitrate, VBR min bitrate + DWORD dwMaxBitrate; // CBR ignored, VBR Max bitrate + LONG nPreset; // Quality preset, use one of the settings of the LAME_QUALITY_PRESET enum + DWORD dwMpegVersion; // FUTURE USE, MPEG-1 OR MPEG-2 + DWORD dwPsyModel; // FUTURE USE, SET TO 0 + DWORD dwEmphasis; // FUTURE USE, SET TO 0 + + // BIT STREAM SETTINGS + BOOL bPrivate; // Set Private Bit (TRUE/FALSE) + BOOL bCRC; // Insert CRC (TRUE/FALSE) + BOOL bCopyright; // Set Copyright Bit (TRUE/FALSE) + BOOL bOriginal; // Set Original Bit (TRUE/FALSE) + + // VBR STUFF + BOOL bWriteVBRHeader; // WRITE XING VBR HEADER (TRUE/FALSE) + BOOL bEnableVBR; // USE VBR ENCODING (TRUE/FALSE) + INT nVBRQuality; // VBR QUALITY 0..9 + DWORD dwVbrAbr_bps; // Use ABR in stead of nVBRQuality + VBRMETHOD nVbrMethod; + BOOL bNoRes; // Disable Bit resorvoir (TRUE/FALSE) + + // MISC SETTINGS + BOOL bStrictIso; // Use strict ISO encoding rules (TRUE/FALSE) + WORD nQuality; // Quality Setting, HIGH BYTE should be NOT LOW byte, otherwhise quality=5 + + // FUTURE USE, SET TO 0, align strucutre to 331 bytes + BYTE btReserved[255-4*sizeof(DWORD) - sizeof( WORD )]; + + } LHV1; // LAME header version 1 + + struct { + + DWORD dwSampleRate; + BYTE byMode; + WORD wBitrate; + BYTE byEncodingMethod; + + } aac; + + } format; + +} BE_CONFIG, *PBE_CONFIG ATTRIBUTE_PACKED; + + +typedef struct { + + // BladeEnc DLL Version number + + BYTE byDLLMajorVersion; + BYTE byDLLMinorVersion; + + // BladeEnc Engine Version Number + + BYTE byMajorVersion; + BYTE byMinorVersion; + + // DLL Release date + + BYTE byDay; + BYTE byMonth; + WORD wYear; + + // BladeEnc Homepage URL + + CHAR zHomepage[BE_MAX_HOMEPAGE + 1]; + + BYTE byAlphaLevel; + BYTE byBetaLevel; + BYTE byMMXEnabled; + + BYTE btReserved[125]; + + +} BE_VERSION, *PBE_VERSION ATTRIBUTE_PACKED; + +#ifndef _BLADEDLL + +typedef BE_ERR (*BEINITSTREAM) (PBE_CONFIG, PDWORD, PDWORD, PHBE_STREAM); +typedef BE_ERR (*BEENCODECHUNK) (HBE_STREAM, DWORD, PSHORT, PBYTE, PDWORD); + +// added for floating point audio -- DSPguru, jd +typedef BE_ERR (*BEENCODECHUNKFLOATS16NI) (HBE_STREAM, DWORD, PFLOAT, PFLOAT, PBYTE, PDWORD); +typedef BE_ERR (*BEDEINITSTREAM) (HBE_STREAM, PBYTE, PDWORD); +typedef BE_ERR (*BECLOSESTREAM) (HBE_STREAM); +typedef VOID (*BEVERSION) (PBE_VERSION); +typedef BE_ERR (*BEWRITEVBRHEADER) (LPCSTR); +typedef BE_ERR (*BEWRITEINFOTAG) (HBE_STREAM, LPCSTR ); + +#define TEXT_BEINITSTREAM "beInitStream" +#define TEXT_BEENCODECHUNK "beEncodeChunk" +#define TEXT_BEENCODECHUNKFLOATS16NI "beEncodeChunkFloatS16NI" +#define TEXT_BEDEINITSTREAM "beDeinitStream" +#define TEXT_BECLOSESTREAM "beCloseStream" +#define TEXT_BEVERSION "beVersion" +#define TEXT_BEWRITEVBRHEADER "beWriteVBRHeader" +#define TEXT_BEFLUSHNOGAP "beFlushNoGap" +#define TEXT_BEWRITEINFOTAG "beWriteInfoTag" + + +#else + +__declspec(dllexport) BE_ERR beInitStream(PBE_CONFIG pbeConfig, PDWORD dwSamples, PDWORD dwBufferSize, PHBE_STREAM phbeStream); +__declspec(dllexport) BE_ERR beEncodeChunk(HBE_STREAM hbeStream, DWORD nSamples, PSHORT pSamples, PBYTE pOutput, PDWORD pdwOutput); + +// added for floating point audio -- DSPguru, jd +__declspec(dllexport) BE_ERR beEncodeChunkFloatS16NI(HBE_STREAM hbeStream, DWORD nSamples, PFLOAT buffer_l, PFLOAT buffer_r, PBYTE pOutput, PDWORD pdwOutput); +__declspec(dllexport) BE_ERR beDeinitStream(HBE_STREAM hbeStream, PBYTE pOutput, PDWORD pdwOutput); +__declspec(dllexport) BE_ERR beCloseStream(HBE_STREAM hbeStream); +__declspec(dllexport) VOID beVersion(PBE_VERSION pbeVersion); +__declspec(dllexport) BE_ERR beWriteVBRHeader(LPCSTR lpszFileName); +__declspec(dllexport) BE_ERR beFlushNoGap(HBE_STREAM hbeStream, PBYTE pOutput, PDWORD pdwOutput); +__declspec(dllexport) BE_ERR beWriteInfoTag( HBE_STREAM hbeStream, LPCSTR lpszFileName ); + +#endif + +#ifdef __cplusplus +} +#endif + +#ifndef __GNUC__ +#pragma pack(pop) +#endif + +#endif diff --git a/Dll/Example.cpp b/Dll/Example.cpp new file mode 100644 index 0000000..47bb860 --- /dev/null +++ b/Dll/Example.cpp @@ -0,0 +1,292 @@ +/* + * LAME DLL Sample Code. + * + * Copyright (c) 2000 A.L. Faber + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + + +#include +#include +#include +#include +#include +#include "BladeMP3EncDLL.h" + +BEINITSTREAM beInitStream=NULL; +BEENCODECHUNK beEncodeChunk=NULL; +BEDEINITSTREAM beDeinitStream=NULL; +BECLOSESTREAM beCloseStream=NULL; +BEVERSION beVersion=NULL; +BEWRITEVBRHEADER beWriteVBRHeader=NULL; +BEWRITEINFOTAG beWriteInfoTag=NULL; + + +// Main program +int main(int argc, char *argv[]) +{ + HINSTANCE hDLL =NULL; + FILE* pFileIn =NULL; + FILE* pFileOut =NULL; + BE_VERSION Version ={0,}; + BE_CONFIG beConfig ={0,}; + + CHAR strFileIn[255] ={'0',}; + CHAR strFileOut[255] ={'0',}; + + DWORD dwSamples =0; + DWORD dwMP3Buffer =0; + HBE_STREAM hbeStream =0; + BE_ERR err =0; + + PBYTE pMP3Buffer =NULL; + PSHORT pWAVBuffer =NULL; + + // check number of arguments + if(argc != 2) + { + fprintf(stderr,"Usage: %s \n", argv[0]); + fprintf(stderr,"Descr: Short demo to show how to use the lame_enc.dll library file\n"); + fprintf(stderr,"Note : WAV file is assumed to to have the following parameters\n"); + fprintf(stderr," : 44100 Hz, stereo, 16 Bits per sample\n"); + return -1; + } + + // Setup the file names + strcpy(strFileIn ,argv[1]); + strcpy(strFileOut,argv[1]); + + // Add mp3 extention + strcat(strFileOut,".mp3"); + + // Load lame_enc.dll library (Make sure though that you set the + // project/settings/debug Working Directory correctly, otherwhise the DLL can't be loaded + + hDLL = LoadLibrary("lame_enc.dll"); + + if ( NULL == hDLL ) + { + hDLL = LoadLibrary("..\\..\\output\\lame_enc.dll"); + } + + if( NULL == hDLL ) + { + fprintf(stderr,"Error loading lame_enc.DLL"); + return -1; + } + + // Get Interface functions from the DLL + beInitStream = (BEINITSTREAM) GetProcAddress(hDLL, TEXT_BEINITSTREAM); + beEncodeChunk = (BEENCODECHUNK) GetProcAddress(hDLL, TEXT_BEENCODECHUNK); + beDeinitStream = (BEDEINITSTREAM) GetProcAddress(hDLL, TEXT_BEDEINITSTREAM); + beCloseStream = (BECLOSESTREAM) GetProcAddress(hDLL, TEXT_BECLOSESTREAM); + beVersion = (BEVERSION) GetProcAddress(hDLL, TEXT_BEVERSION); + beWriteVBRHeader= (BEWRITEVBRHEADER) GetProcAddress(hDLL,TEXT_BEWRITEVBRHEADER); + beWriteInfoTag = (BEWRITEINFOTAG) GetProcAddress(hDLL,TEXT_BEWRITEINFOTAG); + + // Check if all interfaces are present + if(!beInitStream || !beEncodeChunk || !beDeinitStream || !beCloseStream || !beVersion || !beWriteVBRHeader) + { + printf("Unable to get LAME interfaces"); + return -1; + } + + // Get the version number + beVersion( &Version ); + + printf( + "lame_enc.dll version %u.%02u (%u/%u/%u)\n" + "lame_enc Engine %u.%02u\n" + "lame_enc homepage at %s\n\n", + Version.byDLLMajorVersion, Version.byDLLMinorVersion, + Version.byDay, Version.byMonth, Version.wYear, + Version.byMajorVersion, Version.byMinorVersion, + Version.zHomepage); + + // Try to open the WAV file, be sure to open it as a binary file! + pFileIn = fopen( strFileIn, "rb" ); + + // Check file open result + if(pFileIn == NULL) + { + fprintf(stderr,"Error opening %s", argv[1]); + return -1; + } + + // Open MP3 file + pFileOut= fopen(strFileOut,"wb+"); + + // Check file open result + if(pFileOut == NULL) + { + fprintf(stderr,"Error creating file %s", strFileOut); + fclose(pFileIn); + return -1; + } + + memset(&beConfig,0,sizeof(beConfig)); // clear all fields + + // use the LAME config structure + beConfig.dwConfig = BE_CONFIG_LAME; + + // this are the default settings for testcase.wav + beConfig.format.LHV1.dwStructVersion = 1; + beConfig.format.LHV1.dwStructSize = sizeof(beConfig); + beConfig.format.LHV1.dwSampleRate = 44100; // INPUT FREQUENCY + beConfig.format.LHV1.dwReSampleRate = 0; // DON"T RESAMPLE + beConfig.format.LHV1.nMode = BE_MP3_MODE_JSTEREO; // OUTPUT IN STREO + beConfig.format.LHV1.dwBitrate = 128; // MINIMUM BIT RATE + beConfig.format.LHV1.nPreset = LQP_R3MIX; // QUALITY PRESET SETTING + beConfig.format.LHV1.dwMpegVersion = MPEG1; // MPEG VERSION (I or II) + beConfig.format.LHV1.dwPsyModel = 0; // USE DEFAULT PSYCHOACOUSTIC MODEL + beConfig.format.LHV1.dwEmphasis = 0; // NO EMPHASIS TURNED ON + beConfig.format.LHV1.bOriginal = TRUE; // SET ORIGINAL FLAG + beConfig.format.LHV1.bWriteVBRHeader = TRUE; // Write INFO tag + +// beConfig.format.LHV1.dwMaxBitrate = 320; // MAXIMUM BIT RATE +// beConfig.format.LHV1.bCRC = TRUE; // INSERT CRC +// beConfig.format.LHV1.bCopyright = TRUE; // SET COPYRIGHT FLAG +// beConfig.format.LHV1.bPrivate = TRUE; // SET PRIVATE FLAG +// beConfig.format.LHV1.bWriteVBRHeader = TRUE; // YES, WRITE THE XING VBR HEADER +// beConfig.format.LHV1.bEnableVBR = TRUE; // USE VBR +// beConfig.format.LHV1.nVBRQuality = 5; // SET VBR QUALITY + beConfig.format.LHV1.bNoRes = TRUE; // No Bit resorvoir + +// Preset Test +// beConfig.format.LHV1.nPreset = LQP_PHONE; + + // Init the MP3 Stream + err = beInitStream(&beConfig, &dwSamples, &dwMP3Buffer, &hbeStream); + + // Check result + if(err != BE_ERR_SUCCESSFUL) + { + fprintf(stderr,"Error opening encoding stream (%lu)", err); + fclose(pFileIn); + fclose(pFileOut); + return -1; + } + + + // Allocate MP3 buffer + pMP3Buffer = new BYTE[dwMP3Buffer]; + + // Allocate WAV buffer + pWAVBuffer = new SHORT[dwSamples]; + + // Check if Buffer are allocated properly + if(!pMP3Buffer || !pWAVBuffer) + { + printf("Out of memory"); + fclose(pFileIn); + fclose(pFileOut); + return -1; + } + + DWORD dwRead=0; + DWORD dwWrite=0; + DWORD dwDone=0; + DWORD dwFileSize=0; + + // Seek to end of file + fseek(pFileIn,0,SEEK_END); + + // Get the file size + dwFileSize=ftell(pFileIn); + + // Seek back to start of WAV file, + // but skip the first 44 bytes, since that's the WAV header + fseek(pFileIn,44,SEEK_SET); + + + // Convert All PCM samples + while ( (dwRead=fread(pWAVBuffer,sizeof(SHORT),dwSamples,pFileIn)) >0 ) + { + // Encode samples + err = beEncodeChunk(hbeStream, dwRead, pWAVBuffer, pMP3Buffer, &dwWrite); + + // Check result + if(err != BE_ERR_SUCCESSFUL) + { + beCloseStream(hbeStream); + fprintf(stderr,"beEncodeChunk() failed (%lu)", err); + return -1; + } + + // write dwWrite bytes that are returned in tehe pMP3Buffer to disk + if(fwrite(pMP3Buffer,1,dwWrite,pFileOut) != dwWrite) + { + fprintf(stderr,"Output file write error"); + return -1; + } + + dwDone += dwRead*sizeof(SHORT); + + printf("Done: %0.2f%% \r", 100 * (float)dwDone/(float)(dwFileSize)); + } + + // Deinit the stream + err = beDeinitStream(hbeStream, pMP3Buffer, &dwWrite); + + // Check result + if(err != BE_ERR_SUCCESSFUL) + { + + beCloseStream(hbeStream); + fprintf(stderr,"beExitStream failed (%lu)", err); + return -1; + } + + // Are there any bytes returned from the DeInit call? + // If so, write them to disk + if( dwWrite ) + { + if( fwrite( pMP3Buffer, 1, dwWrite, pFileOut ) != dwWrite ) + { + fprintf(stderr,"Output file write error"); + return -1; + } + } + + // close the MP3 Stream + beCloseStream( hbeStream ); + + // Delete WAV buffer + delete [] pWAVBuffer; + + // Delete MP3 Buffer + delete [] pMP3Buffer; + + // Close input file + fclose( pFileIn ); + + // Close output file + fclose( pFileOut ); + + if ( beWriteInfoTag ) + { + // Write the INFO Tag + beWriteInfoTag( hbeStream, strFileOut ); + } + else + { + beWriteVBRHeader( strFileOut ); + } + + // Were done, return OK result + return 0; +} diff --git a/Dll/LameDLLInterface.htm b/Dll/LameDLLInterface.htm new file mode 100644 index 0000000..a9f2add --- /dev/null +++ b/Dll/LameDLLInterface.htm @@ -0,0 +1,742 @@ + + + + + +Lame- + + + + +

 

+ +

Lame-enc DLL
+Interface version 1.32 (and above)
+(Lame engine version: 3.93 or higher)
+Programmers Manual

+ +

The lame_enc.dll and this manual is +copyright by Albert L Faber
+Originally the the DLL interface is modeled after the BladeEnc +DLL interface
+which is copyrighted by Tord Jansson and Jukka Poikolainen
+This document and the DLL interface may be distributed freely
+
+as long as modifications are released under the LGPL license. +

+ +

 

+ +

Homepage: http://www.cdex.n3.net
+E-mail: mailto: afaber@users.sourceforge.net +

+ +


+
+
+
+

+ +

Distribution

+ +

People and companies  who wants to distribute +lame_enc.dll with their commercial products are free to do so as +far as I'm concerned (LGPL license), but should be aware that +lame_enc.dll might infringe certain MP3 related software patents +held by Fraunhofer IIS in certain countries.

+ +


+ +

Disclaimer

+ +

lame_enc.dll and this manual is distributed 'as is' with no +warranty of any kind. The Author is not to be held responsible +for the result of any use or misuse of this product.

+ +

Current Bugs and Limitations

+ +

Although the interface is designed to be able to handle +multiple parallel streams it can't be done yet due to limitations +in the engine, only one stream is allowed.

+ +

Future Compatibility

+ +

This interface should be compatible with all future versions +of lame_enc.DLL without any need to recompile your programs. You +should therefore not check the version number upon start +and prevent users from running your program with a later version +of lame_enc.DLL.

+ +
+ +

How to use the DLL

+ +

1. Fill in a BE_CONFIG structure +and send it to beInitStream(). Make +sure that BE_ERR_SUCCESSFUL is returned.

+ +

2. Reserve at least the amount of memory returned in +dwBufferSize as your output buffer.

+ +

3. Call beEncodeChunk() until +you've encoded everything you want.

+ +

4. Call beDeinitStream() to +make sure that all encoded data is flushed out before closing the +stream.

+ +

5. Close the stream using beCloseStream() +

+ +

6. Finally, call the beWriteVBRHeader() +functions, to insert the INFO tag MP3 Header. This is an +extension of the Xing VBR tag which is also used for CBR +encodings. This call can only be omitted if the INFO tag was +explicilty disabled in the BE_CONFIG Structure.

+ +

A handy feature is the available Lame_enc.dll debug option, +which will dump the important lame internal settings to a text +file.

+ +

 

+ +

Return Values

+ +

See the header-file for a complete list of function return +values. All functions should return BE_ERR_SUCCESSFUL unless +something went wrong.

+ +
+ +

Type definitions

+ +

The DLL is by default compiled with the MS Visual C/C++ +compiler, which has the following type definitions:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Type Description
CHARsigned char (8 bits)
BYTEunsigned char (8 bits)
SHORTsigned short (16 bits)
WORDunsigned short (16 bits)
INTsigned long (32 bits)
LONGsigned long (32 bits)
BOOLsigned long (32 bits) (YES, 32 bits for a one bit + value)
+ TRUE = 0
+ FALSE=-1
DWORDunsigned long (32 bits)
FLOATfloating point (32 bits)
DOUBLEfloat point (64 bits)
LPCSTRconst char* (32 bits pointer to zero terminated + character string)
+ +

Within the lame_enc.dll All the structure elements are one +byte alligned (due to backwards compatibility with BladEnc.DLL!

+ +

 

+ +
+ +

The +BE_CONFIG Structure

+ +

Currently there the BE_CONFIG structure has to +varians, the old MP3 config structure that is truly compatible +with the old BladeEnc interface, and the new defined LHV1 +structure, which can set far more options in the lame encoder

+ +

 

+ +

The MP3 BE_CONFIG - structure (OBSOLETE)

+ +

This is the old structure as it was originally defined by the +BladeEnc.DLL interface. However, I do highly recommend to use the +new Lame specific config structure, since it gives you more +control over the Lame encoder settings.

+ +

These are the members of the BE_CONFIG structure you need to +fill in before you call beInitStream():

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
dwConfigSpecifies what kind of output you want. Since only + MP3 currently is supported you must set this to BE_CONFIG_MP3
format.mp3.dwSampleRate     Samplerate in Hz for MP3 file. This can be set to + either 32000, 44100 or 48000.
format.mp3.byModeStereomode for MP3 file. This can be either BE_MP3_MODE_STEREO, + BE_MP3_MODE_DUALCHANNEL or BE_MP3_MODE_MONO.
format.mp3.bitrateBitrate (i.e. size) of MP3 file in kBit/s. Allowed + bitrates are: 32, 40, 48, 56, 64, 80, 96, 112, 128, + 160, 192, 224, 256 and 320.
format.mp3.bCopyrightIf this is set to TRUE the Copyright bit in the MP3 + stream will be set.
format.mp3.bCRCSet this to TRUE in order to enable CRC-checksum in + the bitstream.
format.mp3.bOriginalIf this is set to TRUE the Original bit in the MP3 + stream will be set.
format.mp3.bPrivateIf this is set to TRUE the Private bit in the MP3 + stream will be set.
+ +

 

+ +

The LHV1 BE_CONFIG - structure (recommended)

+ +

These are the members of the LHV1 BE_CONFIG structure, you +need to fill in before you call beInitStream():
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
dwConfigSpecifies what kind of output you want. Since only + MP3 currently is supported you must set this to BE_CONFIG_LAME
  
format.LHV1.dwStructVersionIndicates the version number of the structure, + current version number is 1
format.LHV1.dwStructSizeSpecifies the size of the BE_CONFIG structure + (currently 331 bytes)
  
format.LHV1.dwSampleRate Samplerate in Hz for MP3 file. This can be set to + either:
+ 32000, 44100 or 48000 for MPEG-I
+ 16000, 22050 or 24000 for MPEG-I
+ 8000, 11025 or 12000 for MPEG-II.5
format.LHV1.dwReSampleRateSpecifies to which sample rate the input stream has + to be resampled, if set to 0, the encoder will decide + which ReSample rate to use
format.LHV1.nModeStereomode for MP3 file. This can be either BE_MP3_MODE_STEREO, + BE_MP3_MODE_JSTEREO, BE_MP3_MODE_DUALCHANNEL or BE_MP3_MODE_MONO.
format.LHV1.dwBitrateFor CBR, this specifies the actual bitrate, for VBR, + it specifies the minimum bitrate
+ Allowed bitrates are: 32, 40, 48, 56, 64, 80, 96, 112, + 128, 160, 192, 224, 256 and 320.for MPEG-I
+ Allowed bitrates are: 8, 16, 24, 32, 40, 48, 56, 64, + 80, 96, 112, 128, 144 and 160.for MPEG-II

Note: + dwBitrate is used as the minimum bitrate in the case of + using a VBR mode.

+
format.LHV1.dwMaxBitrateWhen VBR mode is enabled, it specifies the maximum + allowed bitrate (see also dwBitrate to specify the minium + bitrate), for CBR mode this setting is ignored.
format.LHV1.nPresetKeep in mind that the presets can overwrite some of + the other settings, since it is called right before the + encoder is initialized
+ + + + +
The nPreset option can be set to one of the + following presets values::
+

LQP_NOPRESET (don't use any presets)
+ LQP_NORMAL_QUALITY (quality is set to 5)
+ LQP_LOW_QUALITY (quality is set to 9)
+ LQP_HIGH_QUALITY (quality is set to 2)
+ LQP_VOICE_QUALITY (use for voice encoding)
+ LQP_R3MIX (r3mix preset option)
+ LQP_VERYHIGH_QUALITY (quality is set to 0)
+ LQP_STANDARD (lame command line alt-preset standard)
+ LQP_FAST_STANDARD (lame command line alt-preset fast + standard)
+ LQP_EXTREME (lame command line alt-preset extreme)
+ LQP_FAST_EXTREME (lame command line alt-preset fast + extreme)
+ LQP_INSANE (lame command line alt-preset insane)
+ LQP_ABR (lame command line alt-preset abr)
+ LQP_CBR(lame command line alt-preset cbr)
+
+ (old lame preset options)
+ LQP_PHONE
+ LQP_SW
+ LQP_AM
+ LQP_FM
+ LQP_VOICE
+ LQP_RADIO
+ LQP_TAPE
+ LQP_HIFI
+ LQP_CD
+ LQP_STUDIO

+
 
format.LHV1.bCopyrightIf this is set to TRUE the Copyright bit in the MP3 + stream will be set.
format.LHV1.bCRCSet this to TRUE in order to enable CRC-checksum in + the bitstream.
format.LHV1.bOriginalIf this is set to TRUE the Original bit in the MP3 + stream will be set.
format.LHV1.bPrivateIf this is set to TRUE the Private bit in the MP3 + stream will be set.
  
format.LHV1.nVbrMethodSepecifes if the VBR method to use, currently the + following settings are supported:

VBR_METHOD_NONE + (don't use VBR, use CBR encoding instead),
+ VBR_METHOD_DEFAULT (default VBR method)
+ VBR_METHOD_OLD (old VBR method, proven to be reliable)
+ VBR_METHOD_NEW (new VBR method, faster than + VBR_METHOD_OLD)
+ VBR_METHOD_MTRH (depreciated, same as VBR_METHOD_NEW)
+ VBR_METHOD_ABR (Average Bitrate Encoding, see also
format.LHV1.dwVbrAbr_bps)

+
format.LHV1.bWriteVBRHeaderSepecifes if the a XING VBR header should be written + or not. When this option is enabled, you have to call the + beWriteVBRHeader function when encoding + has been completed. Keep in mind that the VBR info tag + can also be written for CBR encoded files, the TAG info + can be useful for additional info like encoder delay and + the like.
format.LHV1.bEnableVBRSpecifies if VBR encoding option shall be used or + not, possible values are TRUE/FALSE
format.LHV1.nVBRQualityQuality option if VBR is enabled (0=highest quality, + 9 is lowest quality)
format.LHV1.dwVbrAbr_bpsIf the Average Bit Rate is specified, the lame + encoder ignores the nVBRQuality settings (However, bEnableVBR + must be set to TRUE and the format.LHV1.nVbrMethod + parameter should be set to VBR_METHOD_ABR). The allowed + range for the format.LHV1.dwVbrAbr_bps parameter + any integer value between:

MPEG-I: + 32000 .. 320000 bps
+
MPEG-II: 8000 .. 160000 bps

+
  
format.LHV1.bNoBitResDisables the bit-resorvoir and disables the insertion + of padded frames
format.LHV1.nQualityQuality Setting, HIGH BYTE should be NOT LOW byte, + otherwhise quality is set to 5. This is done to be + backward compatible. So to set quality to 3, you have to + set the nQuality parameter to 0xFC03.
format.mp3.btReservedFor future use, set all elements to zero
+ +

 

+ +

 

+ +
+ +

beInitStream() +

+ + + + + + + + + + + + + + +
Synopsis:BE_ERR beInitStream( + PBE_CONFIG pbeConfig, PDWORD dwSamples, + PDWORD dwBufferSize, PHBE_STREAM phbeStream + )
Parameters: + + + + + + + + + + + + + + + + +
pbeConfigPointer at the struct containing encoder + settings.
dwSamplesPointer at double word where number of + samples to send to each beEncodeChunk() is + returned.
dwBufferSizePointer at double word where minimum size in + bytes of output buffer is returned.
phbeStreamPointer at integer where Stream handle is + returned.
+
Description:This function is the first + to call before starting an encoding stream.
+ +
+ +

beEncodeChunk() +

+ + + + + + + + + + + + + + +
Synopsis:BE_ERR beEncodeChunk( + HBE_STREAM hbeStream, DWORD nSamples, + PSHORT pSamples, PBYTE pOutput, PDWORD pdwOutput + )
Parameters: + + + + + + + + + + + + + + + + + + + + +
hbeStreamHandle of the stream.
nSamplesNumber of samples to be encoded for this + call. This should be identical to what is + returned by beInitStream(), unless you are + encoding the last chunk, which might be smaller.
pSamplesPointer at the 16-bit signed samples to be + encoded. These should be in stereo when encoding + a stereo MP3 and mono when encoding a mono MP3.
pOutputWhere to write the encoded data. This buffer + should be at least of the minimum size returned + by beInitStream().
pdwOutputWhere to return number of bytes of encoded + data written. The amount of data written might + vary from chunk to chunk.
+
Description:Encodes a chunk of samples. Please + note that if you have set the output to generate mono MP3 + files you must feed beEncodeChunk() with mono samples!
+ +
+ +

beDeinitStream() +

+ + + + + + + + + + + + + + +
Synopsis:BE_ERR beDeinitStream( + HBE_STREAM hbeStream, PBYTE pOutput, PDWORD + pdwOutput )
Parameters: + + + + + + + + + + + + +
hbeStreamHandle of the stream.
pOutputWhere to write the encoded data. This buffer + should be at least of the minimum size returned + by beInitStream().
pdwOutputWhere to return number of bytes of encoded + data written.
+
Description:This function should be called after + encoding the last chunk in order to flush the encoder. It + writes any encoded data that still might be left inside + the encoder to the output buffer. This function should + NOT be called unless you have encoded all of the chunks + in your stream.
+ +
+ +

beCloseStream() +

+ + + + + + + + + + + + + + +
Synopsis:BE_ERR beCloseStream( HBE_STREAM hbeStream + )
Parameters: + + + + +
hbeStreamHandle of the stream.
+
Description:Last function to be called when finished + encoding a stream. Should unlike beDeinitStream() + also be called if the encoding is canceled.
+ +
+ +

beVersion()

+ + + + + + + + + + + + + + +
Synopsis:VOID beVersion( PBE_VERSION pbeVersion + )
Parameters: + + + + +
pbeVersionPointer at struct where version number, + release date and URL for homepage is returned.
+
Description:Returns information like version numbers + (both of the DLL and encoding engine), release date and + URL for lame_enc's homepage. All this information should + be made available to the user of your product through a + dialog box or something similar.
+ +

 

+ +
+ +

 

+ +

beWriteVBRHeader() +

+ + + + + + + + + + + + + + +
Synopsis:VOID beWriteVBRHeader( LPCSTR pszMP3FileName + )
Parameters: + + + + +
pszMP3FileNameConst Pointer zero terminated string, that + contains the MP3 file name.
+
Description:Writes a Xing Header in front of the MP3 + file. Make sure that the MP3 file is closed, and the the + beConfig.format.LHV1.bWriteVBRHeader has been set to + TRUE. In addition, it is always save to call + beWriteVBRHeader after the encoding has been finished, + even when the beConfig.format.LHV1.bWriteVBRHeader is not + set to TRUE
+ +

 

+ +

 

+ +
+ +

 

+ +

Lame_enc.dll debug option

+ +

The lame_enc.dll has a built-in debug option, that dumps all +the important internal settings to a text file. To enable this +feature, create a text file in the Windows directory which is +named lame_enc.ini, and should contain the following two lines

+ +

[debug]
+WriteLogFile=1

+ +

Save this text file, and each time you encode a file, the +settings are added to a file name lame_enc.txt, that is located +in the same directory as the lame_enc.dll

+ +

 

+ +


+ + diff --git a/Dll/MP3export.pas b/Dll/MP3export.pas new file mode 100644 index 0000000..ab55bba --- /dev/null +++ b/Dll/MP3export.pas @@ -0,0 +1,303 @@ +unit MP3export; + +interface + +Uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, +Forms, Dialogs, StdCtrls; + +type +//type definitions +//typedef unsigned long HBE_STREAM; +//typedef HBE_STREAM *PHBE_STREAM; +//typedef unsigned long BE_ERR; + THBE_STREAM = LongWord; + PHBE_STREAM = ^PHBE_STREAM; + BE_ERR = LongWord; + +const +// encoding formats +//#define BE_CONFIG_MP3 0 +//#define BE_CONFIG_LAME 256 + BE_CONFIG_MP3 = 0; + BE_CONFIG_LAME = 256; + + +// error codes +//#define BE_ERR_SUCCESSFUL 0x00000000 +//#define BE_ERR_INVALID_FORMAT 0x00000001 +//#define BE_ERR_INVALID_FORMAT_PARAMETERS 0x00000002 +//#define BE_ERR_NO_MORE_HANDLES 0x00000003 +//#define BE_ERR_INVALID_HANDLE 0x00000004 +BE_ERR_SUCCESSFUL: LongWord = 0; +BE_ERR_INVALID_FORMAT: LongWord = 1; +BE_ERR_INVALID_FORMAT_PARAMETERS: LongWord = 2; +BE_ERR_NO_MORE_HANDLES: LongWord = 3; +BE_ERR_INVALID_HANDLE: LongWord = 4; + +// other constants + +BE_MAX_HOMEPAGE = 256; + +// format specific variables + +BE_MP3_MODE_STEREO = 0; +BE_MP3_MODE_DUALCHANNEL = 2; +BE_MP3_MODE_MONO = 3; + +type + + TMP3 = packed record + dwSampleRate : LongWord; + byMode : Byte; + wBitRate : Word; + bPrivate : LongWord; + bCRC : LongWord; + bCopyright : LongWord; + bOriginal : LongWord; + end; + + TLHV1 = packed record + // STRUCTURE INFORMATION + dwStructVersion: DWORD; + dwStructSize: DWORD; + + // BASIC ENCODER SETTINGS + dwSampleRate: DWORD; // ALLOWED SAMPLERATE VALUES DEPENDS ON dwMPEGVersion + dwReSampleRate: DWORD; // DOWNSAMPLERATE, 0=ENCODER DECIDES + nMode: Integer; // BE_MP3_MODE_STEREO, BE_MP3_MODE_DUALCHANNEL, BE_MP3_MODE_MONO + dwBitrate: DWORD; // CBR bitrate, VBR min bitrate + dwMaxBitrate: DWORD; // CBR ignored, VBR Max bitrate + nQuality: Integer; // Quality setting (NORMAL,HIGH,LOW,VOICE) + dwMpegVersion: DWORD; // MPEG-1 OR MPEG-2 + dwPsyModel: DWORD; // FUTURE USE, SET TO 0 + dwEmphasis: DWORD; // FUTURE USE, SET TO 0 + + // BIT STREAM SETTINGS + bPrivate: LONGBOOL; // Set Private Bit (TRUE/FALSE) + bCRC: LONGBOOL; // Insert CRC (TRUE/FALSE) + bCopyright: LONGBOOL; // Set Copyright Bit (TRUE/FALSE) + bOriginal: LONGBOOL; // Set Original Bit (TRUE/FALSE_ + + // VBR STUFF + bWriteVBRHeader: LONGBOOL; // WRITE XING VBR HEADER (TRUE/FALSE) + bEnableVBR: LONGBOOL; // USE VBR ENCODING (TRUE/FALSE) + nVBRQuality: Integer; // VBR QUALITY 0..9 + + btReserved: array[0..255] of Byte; // FUTURE USE, SET TO 0 + end; + + TAAC = packed record + dwSampleRate : LongWord; + byMode : Byte; + wBitRate : Word; + byEncodingMethod : Byte; + end; + + TFormat = packed record + case byte of + 1 : (mp3 : TMP3); + 2 : (lhv1 : TLHV1); + 3 : (aac : TAAC); + end; + + TBE_Config = packed record + dwConfig : LongWord; + format : TFormat; + end; + + + PBE_Config = ^TBE_Config; + +//typedef struct { +// // BladeEnc DLL Version number +// +// BYTE byDLLMajorVersion; +// BYTE byDLLMinorVersion; +// +// // BladeEnc Engine Version Number +// +// BYTE byMajorVersion; +// BYTE byMinorVersion; +// +// // DLL Release date +// +// BYTE byDay; +// BYTE byMonth; +// WORD wYear; +// +// // BladeEnc Homepage URL +// +// CHAR zHomepage[BE_MAX_HOMEPAGE + 1]; +// +//} BE_VERSION, *PBE_VERSION; + + TBE_Version = record + byDLLMajorVersion : Byte; + byDLLMinorVersion : Byte; + + byMajorVersion : Byte; + byMinorVersion : Byte; + + byDay : Byte; + byMonth : Byte; + wYear : Word; + + zHomePage : Array[0..BE_MAX_HOMEPAGE + 1] of Char; + end; + + PBE_Version = ^TBE_Version; + +//__declspec(dllexport) BE_ERR beInitStream(PBE_CONFIG pbeConfig, PDWORD dwSamples, PDWORD dwBufferSize, PHBE_STREAM phbeStream); +//__declspec(dllexport) BE_ERR beEncodeChunk(HBE_STREAM hbeStream, DWORD nSamples, PSHORT pSamples, PBYTE pOutput, PDWORD pdwOutput); +//__declspec(dllexport) BE_ERR beDeinitStream(HBE_STREAM hbeStream, PBYTE pOutput, PDWORD pdwOutput); +//__declspec(dllexport) BE_ERR beCloseStream(HBE_STREAM hbeStream); +//__declspec(dllexport) VOID beVersion(PBE_VERSION pbeVersion); + +{ +Function beInitStream(var pbeConfig: TBE_CONFIG; var dwSample: LongWord; var dwBufferSize: LongWord; var phbeStream: THBE_STREAM ): BE_Err; cdecl; external 'Bladeenc.dll'; +//Function beEncodeChunk(hbeStream: THBE_STREAM; nSamples: LongWord; pSample: PSmallInt;pOutput: PByte; var pdwOutput: LongWord): BE_Err; cdecl; external 'Bladeenc.dll'; +Function beEncodeChunk(hbeStream: THBE_STREAM; nSamples: LongWord; var pSample;var pOutput; var pdwOutput: LongWord): BE_Err; stdcall; cdecl 'Bladeenc.dll'; +Function beDeinitStream(hbeStream: THBE_STREAM; var pOutput; var pdwOutput: LongWord): BE_Err; cdecl; external 'Bladeenc.dll'; +Function beCloseStream(hbeStream: THBE_STREAM): BE_Err; cdecl; external 'Bladeenc.dll'; +Procedure beVersion(var pbeVersion: TBE_VERSION); cdecl; external 'Bladeenc.dll'; +} + +Function beInitStream(var pbeConfig: TBE_CONFIG; var dwSample: LongWord; var dwBufferSize: LongWord; var phbeStream: THBE_STREAM ): BE_Err; cdecl; external 'Lame_enc.dll'; +//Function beEncodeChunk(hbeStream: THBE_STREAM; nSamples: LongWord; pSample: PSmallInt;pOutput: PByte; var pdwOutput: LongWord): BE_Err; cdecl; external 'Lame_enc.dll'; +Function beEncodeChunk(hbeStream: THBE_STREAM; nSamples: LongWord; var pSample;var pOutput; var pdwOutput: LongWord): BE_Err; cdecl; external 'Lame_enc.dll'; +Function beDeinitStream(hbeStream: THBE_STREAM; var pOutput; var pdwOutput: LongWord): BE_Err; cdecl; external 'Lame_enc.dll'; +Function beCloseStream(hbeStream: THBE_STREAM): BE_Err; cdecl; external 'Lame_enc.dll'; +Procedure beVersion(var pbeVersion: TBE_VERSION); cdecl; external 'Lame_enc.dll'; + +Procedure EncodeWavToMP3(fs, fd: Integer); +implementation + +Uses InternetSnd, TraiteWav; + +{----------------------------------------} +Procedure EncodeWavToMP3(fs, fd: Integer); +var + err: Integer; + beConfig: TBE_Config; + dwSamples, dwSamplesMP3 : LongWord; + hbeStream : THBE_STREAM; + error: BE_ERR; + pBuffer: PSmallInt; + pMP3Buffer: PByte; + Marque:PChar; + + done: LongWord; + dwWrite: LongWord; + ToRead: LongWord; + ToWrite: LongWord; + i:Integer; + +begin + beConfig.dwConfig := BE_CONFIG_LAME; + +{ + beConfig.Format.mp3.dwSampleRate := WavInfo.SamplesPerSec; + beConfig.Format.mp3.byMode := BE_MP3_MODE_STEREO; + beConfig.Format.mp3.wBitrate := strToInt(MainFrm.Mp3BitRate.Text); + beConfig.Format.mp3.bCopyright := 0; + beConfig.Format.mp3.bCRC := $00000000; + beConfig.Format.mp3.bOriginal := 0; + beConfig.Format.mp3.bPrivate := 0; +} +//Structure information + beConfig.Format.lhv1.dwStructVersion := 1; + beConfig.Format.lhv1.dwStructSize := SizeOf(beConfig); +//Basic encoder setting + beConfig.Format.lhv1.dwSampleRate := WavInfo.SamplesPerSec; + beConfig.Format.lhv1.dwReSampleRate := 44100; + beConfig.Format.lhv1.nMode := BE_MP3_MODE_STEREO; + beConfig.Format.lhv1.dwBitrate := strToInt(MainFrm.Mp3BitRate.Text); + beConfig.Format.lhv1.dwMaxBitrate := strToInt(MainFrm.Mp3BitRate.Text); + beConfig.Format.lhv1.nQuality := 2; + beConfig.Format.lhv1.dwMPegVersion := 1; //MPEG1 + beConfig.Format.lhv1.dwPsyModel := 0; + beConfig.Format.lhv1.dwEmphasis := 0; +//Bit Stream Settings + beConfig.Format.lhv1.bPrivate := False; + beConfig.Format.lhv1.bCRC := False; + beConfig.Format.lhv1.bCopyright := True; + beConfig.Format.lhv1.bOriginal := True; +//VBR Stuff + beConfig.Format.lhv1.bWriteVBRHeader := false; + beConfig.Format.lhv1.bEnableVBR := false; + beConfig.Format.lhv1.nVBRQuality := 0; + + i := 0; + error := beInitStream(beConfig, dwSamples, dwSamplesMP3, hbeStream); + if error = BE_ERR_SUCCESSFUL + then begin + pBuffer := AllocMem(dwSamples*2); + pMP3Buffer := AllocMem(dwSamplesMP3); + try + done := 0; + + error := FileSeek(fs, 0, 0); + While (done < TotalSize) do + begin + if (done + dwSamples*2 < TotalSize) + then ToRead := dwSamples*2 + else begin + ToRead := TotalSize-done; + //FillChar(buf[0],dwSamples*2,0); + FillChar(pbuffer^,dwSamples,0); + end; + + //if FileRead(fs, buf[0], toread) = -1 + if FileRead(fs, pbuffer^, toread) = -1 + then raise Exception.Create('Erreur de lecture'); + + //error := beEncodeChunk(hbeStream, toRead div 2, Buf[0], TmpBuf[0], toWrite); + error := beEncodeChunk(hbeStream, toRead div 2, pBuffer^, pMP3Buffer^, toWrite); + + if error <> BE_ERR_SUCCESSFUL + then begin + beCloseStream(hbeStream); + raise Exception.Create('Echec de l''encodage'); + end; + + //if FileWrite(fd, TmpBuf[0], toWrite) = -1 + if FileWrite(fd, pMP3Buffer^, toWrite) = -1 + then raise Exception.Create('Erreur d''�criture'); + + done := done + toread; + inc(i); + if i mod 64 = 0 + then begin + MainFrm.ProgressBar1.Position := round(100*done/Totalsize); + Application.ProcessMessages; + end; + end; + + error := beDeInitStream(hbeStream, pMP3Buffer^, dwWrite); + //error := beDeInitStream(hbeStream, TmpBuf[0], dwWrite); + + if error <> BE_ERR_SUCCESSFUL + then begin + beCloseStream(hbeStream); + raise Exception.Create('Echec � la sortie'); + end; + + if dwWrite <> 0 + then begin + //if FileWrite(fd, TmpBuf[0], dwWrite) = -1 + if FileWrite(fd, pMP3Buffer^, dwWrite) = -1 + then raise Exception.Create('Erreur � la derni�re �criture'); + end; + + beCloseStream(hbeStream); + finally + FreeMem(pBuffer); + FreeMem(pMP3Buffer); + end; + end + else begin + + end; +end; + +end. diff --git a/Dll/Makefile.am b/Dll/Makefile.am new file mode 100644 index 0000000..92f58c0 --- /dev/null +++ b/Dll/Makefile.am @@ -0,0 +1,11 @@ +## $Id: Makefile.am,v 1.11 2010/10/30 13:21:02 robert Exp $ + +include $(top_srcdir)/Makefile.am.global + +EXTRA_DIST = BladeMP3EncDLL.c \ + BladeMP3EncDLL.def \ + BladeMP3EncDLL.h \ + Example.cpp \ + LameDLLInterface.htm \ + MP3export.pas \ + Makefile.mingw32 diff --git a/Dll/Makefile.in b/Dll/Makefile.in new file mode 100644 index 0000000..b29a701 --- /dev/null +++ b/Dll/Makefile.in @@ -0,0 +1,478 @@ +# Makefile.in generated by automake 1.15.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2017 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# global section for every Makefile.am +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = Dll +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.global README +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_DEFS = @CONFIG_DEFS@ +CONFIG_MATH_LIB = @CONFIG_MATH_LIB@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CPUCCODE = @CPUCCODE@ +CPUTYPE = @CPUTYPE@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FRONTEND_CFLAGS = @FRONTEND_CFLAGS@ +FRONTEND_LDADD = @FRONTEND_LDADD@ +FRONTEND_LDFLAGS = @FRONTEND_LDFLAGS@ +GREP = @GREP@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_CONFIG = @GTK_CONFIG@ +GTK_LIBS = @GTK_LIBS@ +INCLUDES = @INCLUDES@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDADD = @LDADD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_MAJOR_VERSION = @LIB_MAJOR_VERSION@ +LIB_MINOR_VERSION = @LIB_MINOR_VERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEDEP = @MAKEDEP@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NASM = @NASM@ +NASM_FORMAT = @NASM_FORMAT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM_F = @RM_F@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_FRONTEND = @WITH_FRONTEND@ +WITH_MP3RTP = @WITH_MP3RTP@ +WITH_MP3X = @WITH_MP3X@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = 1.15 foreign +EXTRA_DIST = BladeMP3EncDLL.c \ + BladeMP3EncDLL.def \ + BladeMP3EncDLL.h \ + Example.cpp \ + LameDLLInterface.htm \ + MP3export.pas \ + Makefile.mingw32 + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.global $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Dll/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign Dll/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/Makefile.am.global $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# end global section + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Dll/Makefile.mingw32 b/Dll/Makefile.mingw32 new file mode 100644 index 0000000..788b8a7 --- /dev/null +++ b/Dll/Makefile.mingw32 @@ -0,0 +1,40 @@ +# This makefile compiles lame_enc.dll with mingw32 (and possibly cygwin) +# Of course, you must first build ../libmp3lame/libmp3lame.a. +# liblame_enc.a can be used to link the lame_enc.dll to your programs. +# Tested with EAC 0.9pb9 (my own favorite, http://www.exactaudiocopy.de/) +# example.exe compiles and works, too. +# Vladislav Naumov, +# +# PS: to 'make clean' you need rm. MS's del is unusable. +# PPS: quick build: +# make -fMakefile.mingw32 + +DLL_NAME = lame_enc +LAME_SRC_ROOT = .. +OFILES = BladeMP3EncDLL.o $(DLL_NAME)_exp.o +CFLAGS = -I$(LAME_SRC_ROOT)/include -I$(LAME_SRC_ROOT)/libmp3lame +CC = g++ +LD = g++ +DLLTOOL = dlltool +LFLAGS = -L$(LAME_SRC_ROOT)/libmp3lame/.libs -o $(DLL_NAME).dll -mdll -s +LIBS = -lmp3lame + +all: $(DLL_NAME).dll example.exe + +BladeMP3EncDLL.o: BladeMP3EncDLL.c BladeMP3EncDLL.h ../include/lame.h \ + ../libmp3lame/lame_global_flags.h ../libmp3lame/version.h + +$(DLL_NAME).dll : $(OFILES) + $(LD) $(LFLAGS) $(OFILES) $(LIBS) + +$(DLL_NAME)_exp.o : BladeMP3EncDLL.o + $(DLLTOOL) --input-def BladeMP3EncDLL.def --output-lib lib$(DLL_NAME).a --output-exp $(DLL_NAME)_exp.o --dllname $(DLL_NAME) BladeMP3EncDLL.o + +%.o : %.c + $(CC) $(CFLAGS) -c $< -o $@ + +example.exe : Example.cpp BladeMP3EncDLL.h + $(CC) Example.cpp -o example.exe + +clean : + rm -f $(DLL_NAME).dll $(OFILES) example.exe diff --git a/Dll/README b/Dll/README new file mode 100644 index 0000000..ed8467a --- /dev/null +++ b/Dll/README @@ -0,0 +1,21 @@ + +This directory contains a Windows DLL interface to the LAME +encoding engine. + +This DLL is compatible with the BladeEnc.dll. +See BladeMP3EncDLL.c for details of the calling +sequence, and BladeMP3EncDLL.h for details of the +data that must be passed to the DLL. + +As of yet, there is no other documentation. + +To use this DLL as a replacement for BladeEnc.dll, you +need to populate the 'mp3' struct. + +To use more advanced features of LAME, you need to +populate the LHV1 struct instead. + +Delphi 4 Users: Gabriel G�lin has +contributed a .PAS file, do you can access the DLL from +Delphi. See MP3export.pas. + diff --git a/HACKING b/HACKING new file mode 100644 index 0000000..5196b8d --- /dev/null +++ b/HACKING @@ -0,0 +1,121 @@ +First, see the file STYLEGUIDE + +************************************************************************ +TESTING +======= + +If you make changes, please test. There is a python script in the test/ +directory which will compare two versions of lame using a bunch of CBR +and ABR options. To run this script, copy your favorite (and short!) wav +file to the lame/test directory, and run: + +% cd lame/test +% ./lametest.py [-w] CBRABR.op castanets.wav lame_orig lame_new + + + +************************************************************************ +LAME API +======== + +For a general outline of the code, see the file API. +Also, frontend/main.c is a simple front end to libmp3lame.a + +The guts of the code are called from lame_encode_buffer(). + +lame_encode_buffer() handles buffering and resampling, and +then calls lame_encode_frame() for each frame. lame_encode_frame() +looks like this: + +lame_encode_frame_mp3(): + l3psycho_anal() compute masking thresholds + mdct_sub() compute MDCT coefficients + iteration_loop() choose scalefactors (via iteration) + which determine noise shapping, and + choose best huffman tables for lossless compression + format_bitstream format the bitstream. when data+headers are complete, + output to internal bit buffer. + copy_buffer() copy internal bit buffer into user's mp3 buffer + +************************************************************************ +ADDING NEW OPTIONS +================== + +control variable goes in lame_global_flags struct. +Assume the variable is called 'new_variable'. + +You also need to write (in set_get.c): + +lame_set_new_variable() +lame_get_new_variable() + +And then document the variable in the file USAGE as well as the +output of "lame --longhelp" + +And add a "--option" style command line option to enable this variable +in parse.c + +Note: for experimental features that you need to call from the frontend +but that should not be part of the official API, see the section at +the end of set_get.c. These functions should *NOT* be prototyped in +lame.h (since that would indicate to the world that they are part +of the API). + + +************************************************************************ +THREADSAFE: +=========== + +Lame should now be thread safe and re-entrant. The only problem seems to +be some OS's allocate small stacks (< 128K) to threads launched by +applications, and this is not enough for LAME. Fix is to increase the +stack space, or move some of our automatic variables onto the heap with +by using bug-proof malloc()'s and free(). + + +************************************************************************ +Global Variables: +================= + +There are two types of global variables. All data in both structs is +initialized to zero. + +1. lame_global_flags *gfp + +These are input parameters which are set by the calling program, and some +information which the calling program may be interested in. + +This struct instantiated by the call to lame_init(). + + +2. lame_internal_flags *gfc + +Most global variables go here. + +All internal data not set by the user. All 'static' data from +old non-reentrant code should be moved here. + +Defined in util.h. Data for which the size is known +in advance should be explicitly declaired (for example, +float xr[576]); Data which needs to be malloc'd is +handled by: + +1. in lame_init_params(), malloc the data +2. be sure to free the data in freegfc() + + +If the data to be malloc'd is large and only used in +certain conditions (like resampling), use the following: +this has the disadvantage that it is hard to catch and return error +flags all the way back up the call stack. + +1. Add an initialization variable to the gfc struct: lame_init_resample +2. In the resample routine, there should be some code like this: + + if (0==gfc->lame_init_resample) { + gfc->lame_init_resample=1; + /* initialization code: malloc() data, etc */ + } + +3. The data should be free'd in the routine freegfc(). + diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..ee0b544 --- /dev/null +++ b/INSTALL @@ -0,0 +1,194 @@ +LAME 3.xx January 2001 Mark Taylor (http://www.mp3dev.org) + + +======================================================================= +Compile time options +======================================================================= +There are serveral targets which can be built from this +source code: + +lame, lame.exe The command line encoder + +mp3x A GTK based graphical MP3 frame analyzer. For debugging, + development, and studing MP3 frames produced by any + encoder. + +lame_enc.dll a Windows DLL used by many GUIs which support lame. + (Can only be compiled by MSVC???) + +lame.acm *** DEPRECATED *** + a Windows ACM codec which can be used by many windows programs, + and any directshow program. See MSVC project files in ACM + directory. Right click on lame.inf to install. + +lame_enc.dshow a Windows direct show filter for lame. Potentially has + more flexability than the ACM codec, but code needs some + work. See MSVC project files in dshow directory + +libmp3lame.a the static encoding library used by all platforms, required + by all the above targets. + +libmp3lame.so shared version of libmp3lame.a for *NIX platforms + + +The following compile time options can be used. For libmp3lame.a and +lame_enc.dll, none are required. On non-unix systems, these options must +be set in config.h or in the IDE. +On unix systems, they are set via ./configure. + + +#define HAVE_MPGLIB compile in mpglib's mp3 *decoding* capibility +#define HAVE_VORBIS compile in Vorbis decoding capibility + (you need libvorbis already built) +#define NOANALYSIS do not compile in hooks used by the + MP3 frame analyzer. + +Options for the command line encoder: +#define LIBSNDFILE to use Erik de Castro Lopo's libsndfile + for input. + + +======================================================================= +Building the software on *NIX platforms using configure: +======================================================================= +Run the following commands: + +% ./configure +% make +% make install + +For a complete list of options, try "./configure --help" +Some of the more usefull options: + +For the encoding library: + + --enable-mp3x Build the mp3 frame analyzer, 'mp3x' + + --enable-mp3rtp Build the encode-to-RTP program, 'mp3rtp' + (broken as of August 2001) + + +For the LAME front end encoder: + + --with-fileio=lame Use lame's internal file io routines [default] + =sndfile Use Erik de Castro Lopo's libsndfile (Supports + many more input formats, but no stdin possible + currently) + + --with-sndfile-prefix=DIR Alternate location for libsndfile + (if --with-fileio=sndfile) + + +Other usefull configure options: + + --enable-debug Build a debug version + + --enable-expopt Enable some more optimizations flags for + the compiler, may or may not produce + faster code + + --prefix = PATH default is /usr/local + (LAME currently installs: + /usr/local/bin/lame + /usr/local/lib/libmp3lame.a + /usr/local/lib/libmp3lame.so + /usr/local/include/lame.h + + + --with-vorbis Enable Ogg Vorbis decoding support + --with-vorbis-prefix = PATH specify where to find Vorbis libs + + +Some more advanced ways to influence the build procedure +(experienced users only, use it at your own risk): + + - If you want to use some custom defines for building (e.g. some out + of the file "DEFINES") use: + + * bourne shell or compatible (ash, bash, zsh, ...): + CONFIG_DEFS="-Dmy_define" ./configure + + * C shell or compatible (csh, tcsh, ...): + setenv CONFIG_DEFS "-Dmy_define" + ./configure + + - If you want to use some additional options for the compiler: + + * bourne shell or compatible (ash, bash, zsh, ...): + CFLAGS="--my_flag" ./configure + + * C shell or compatible (csh, tcsh, ...): + setenv CFLAGS "--my_flag" + ./configure + + Or some combination of the above. + + Note: + If configure detects the presents of "nasm" some additional speed + improvements get compiled in (additional assembler code to detect + and use multimedia extensions of the used processor). + + +======================================================================= +Building the software on *NIX platforms without configure: +======================================================================= +% make -f Makefile.unix + + +======================================================================= +Building the software on Windows with MSVC: +(or MSVC + 3rd party C compiler such as ICL) +======================================================================= +There are MSVC project files, and a Makefile.MSVC included with the +project. For production use, be sure to compile a "Release" target, +with the "maximum speed" compile option, and #define NDEBUG. + +It is possible to compile the GTK frame analyzer under windows, see +README.WINGTK + +Various build options can be set in configMS.h + +Note: project files for building lame.exe seem to be broken or not +quite compatable with MSVC6. The most reliable way to build lame and +lame_enc.dll is to run the .bat script (comes with MSVC6) which sets +up your VC environment to work from the command line, and then: + +copy configMS.h config.h +nmake -f Makefile.MSVC comp=msvc asm=no + +Project files for the dll, ACM codec and directshow filter +seem to be in better sahpe. + + +======================================================================= +Building the software on Windows with free compilers: +======================================================================= +LAME can be compiled with various Windows ports (all free) of GCC (DJGPP, +Mingw32). See README.DJGPP. + +For Mingw32, you should now be able to use the Unix Makefile that +comes with LAME. Try: "make -f Makefile.unix UNAME=MSDOS" +You may need to remove these lines from brhist.c: + +#ifdef _WIN32 +COORD Pos; +HANDLE CH; +CONSOLE_SCREEN_BUFFER_INFO CSBI; +#endif + +Mingw32 users may also try to use the unix configure script (explained +above), it has _untested_ support for Mingw32. + +Cygwin users should use the unix configure script (explained above). If +you have problems with the configure script try: + CC=gcc ./configure +Patches to enable the build of the lame_enc.dll with Cygwin and autoconf / +automake / libtool are welcome! + +To use the Borland C compiler (now free!) see README.B32 and Makefile.B32. +Borland can also compile the lame_enc.dll, but this is untested. + +Can DJGPP or Mingw32 produce lame_enc.dll? + +Various build options can be set in configMS.h + diff --git a/INSTALL.configure b/INSTALL.configure new file mode 100644 index 0000000..50dbe43 --- /dev/null +++ b/INSTALL.configure @@ -0,0 +1,183 @@ +Basic Installation +================== + + These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, a file +`config.cache' that saves the results of its tests to speed up +reconfiguring, and a file `config.log' containing compiler output +(useful mainly for debugging `configure'). + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If at some point `config.cache' +contains results you don't want to keep, you may remove or edit it. + + The file `configure.in' is used to create `configure' by a program +called `autoconf'. You only need `configure.in' if you want to change +it or regenerate `configure' using a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. You can give `configure' +initial values for variables by setting them in the environment. Using +a Bourne-compatible shell, you can do that on the command line like +this: + CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure + +Or on systems that have the `env' program, you can do it like this: + env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not supports the `VPATH' +variable, you have to compile the package for one architecture at a time +in the source code directory. After you have installed the package for +one architecture, use `make distclean' before reconfiguring for another +architecture. + +Installation Names +================== + + By default, `make install' will install the package's files in +`/usr/local/bin', `/usr/local/man', etc. You can specify an +installation prefix other than `/usr/local' by giving `configure' the +option `--prefix=PATH'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=PATH' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + + There may be some features `configure' can not figure out +automatically, but needs to determine by the type of host the package +will run on. Usually `configure' can figure that out, but if it prints +a message saying it can not guess the host type, give it the +`--host=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name with three fields: + CPU-COMPANY-SYSTEM + +See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the host type. + + If you are building compiler tools for cross-compiling, you can also +use the `--target=TYPE' option to select the type of system they will +produce code for and the `--build=TYPE' option to select the type of +system on which you are compiling the package. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Operation Controls +================== + + `configure' recognizes the following options to control how it +operates. + +`--cache-file=FILE' + Use and save the results of the tests in FILE instead of + `./config.cache'. Set FILE to `/dev/null' to disable caching, for + debugging `configure'. + +`--help' + Print a summary of the options to `configure', and exit. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--version' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`configure' also accepts some other, not widely useful, options. + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..430a6a0 --- /dev/null +++ b/LICENSE @@ -0,0 +1,13 @@ +Can I use LAME in my commercial program? + +Yes, you can, under the restrictions of the LGPL (see COPYING +in this folder). The easiest way to do this is to: + +1. Link to LAME as separate library (libmp3lame.a on unix or + lame_enc.dll or libmp3lame.dll on windows) + +2. Fully acknowledge that you are using LAME, and give a link + to our web site, www.mp3dev.org + +3. If you make modifications to LAME, you *must* release these + modifications back to the LAME project, under the LGPL. diff --git a/Makefile.MSVC b/Makefile.MSVC new file mode 100644 index 0000000..6538911 --- /dev/null +++ b/Makefile.MSVC @@ -0,0 +1,705 @@ +# Makefile.MSVC: MSVC Makefile for LAME +# +# 2000-2010 Robert Hegemann +# dedicated to the LAME project http://www.mp3dev.org +############################################################################### + + + +#__ readme ____________________________________________________________________ +# nmake -f Makefile.MSVC +# -> build lame, but not mp3x +# -> use Robert's code modifications +# -> assume MSVC 6.0 compiler available +# -> assume NASM available +# -> assemble MMX code with NASM +# -> no compiler warnings +# -> use single precision float +# +# passing arguments, one can modify the default behaviour: +# COMP= -> use MS compiler +# WARN= -> give verbose compiler warnings +# ASM= -> no NASM nor MMX +# MMX= -> do not assemble MMX code +# CFG= -> disable Robert's modifications +# CPU=P1 -> optimize for Pentium instead of P II/III +# CPU=P2 -> optimize for Pentium II/III, you need a PII or better +# CPU=P3 -> optimize for Pentium III, you need a PIII or better +# GTK=YES -> have GTK, adds mp3x to default targets +# PREC= -> use double instead of single float +# SNDFILE= -> do not use LibSndfile for reading input files +# +# Example: +# nmake -f Makefile.MSVC CPU=P1 GTK=YES +#____________________________________________________________________ readme __ + + + +# targets <-> DOS filenames + +T_LAME = lame.exe +T_MP3X = mp3x.exe +T_MP3RTP = mp3rtp.exe +T_DLL = libmp3lame.dll +T_LIB_DYNAMIC = libmp3lame.lib +T_LIB_STATIC = libmp3lame-static.lib +T_LEGACY_DLL = lame_enc.dll + +TARGET_DIR = .\output\ + +# default targets + +PGM = $(T_LAME) + +# some default settings + +! IF "$(MSVCVER)" != "" +COMP = MS +! IF "$(MSVCVER)" == "Win64" +! IF "$(ASM)" == "" +ASM = NO # or it could be ML64 if we want to use it... +GTK = NO +! ENDIF +! ENDIF +! ELSE +! IF "$(COMP)" == "" +COMP = MSVC +! ENDIF +! ENDIF + +! IF "$(ASM)" == "" +ASM = YES +! ENDIF + +! IF "$(MMX)" == "" +MMX = YES +! ENDIF + +! IF "$(CFG)" == "" +CFG = RH +! ENDIF + +! IF "$(CPU)" == "" +CPU = P2auto +!if "$(PROCESSOR_LEVEL)"=="6" +CPU = P6 +!endif +! ENDIF + +! IF "$(WARN)" == "" +WARN = OFF +! ENDIF + +! IF "$(PREC)" == "" +PREC = SINGLE +! ENDIF + +! IF "$(SNDFILE)" == "" +SNDFILE = NO +! ENDIF + +OFF = win32 +MACHINE = /machine:I386 +LIB_OPTS = /nologo $(MACHINE) + +! MESSAGE ---------------------------------------------------------------------- +! IF "$(CFG)" == "" +! MESSAGE building LAME +! ELSE +! MESSAGE building LAME featuring $(CFG) +! ENDIF +! IF "$(ASM)" == "YES" +! MESSAGE + ASM +! IF "$(MMX)" == "YES" +! MESSAGE + MMX +! ENDIF +! ENDIF +! IF "$(GTK)" == "YES" +! MESSAGE + GTK +! ENDIF +! IF "$(COMP)" == "INTEL" +! MESSAGE using INTEL COMPILER +! IF "$(CPU)" == "P1" +! MESSAGE + optimizing for Pentium (MMX) +! ELSE +! IF "$(CPU)" == "P2" +! MESSAGE + you need a Pentium II or better +! ELSE +! IF "$(CPU)" == "P3" +! MESSAGE + you need a Pentium III or better +! ELSE +! MESSAGE + optimizing for Pentium II/III +! ENDIF +! ENDIF +! ENDIF +! ELSE +! IF "$(MSVCVER)" == "6.0" +! MESSAGE + using MSVC 6.0 32-Bit Compiler +! IF "$(CPU)" == "P1" +! MESSAGE + optimizing for Pentium (MMX) (may slow down PIII a few percent) +! ELSE +! MESSAGE + optimizing for Pentium II/III +! ENDIF +! ELSEIF "$(MSVCVER)" == "8.0" +! MESSAGE + using MSVC 8.0 32-Bit Compiler +! IF "$(CPU)" == "P1" +! MESSAGE + optimizing for Pentium (MMX) (may slow down PIII a few percent) +! ELSE +! MESSAGE + optimizing for Pentium II/III +! ENDIF +! ELSE +! IF "$(MSVCVER)" == "Win64" +! MESSAGE + using MS 64-Bit Compiler +! ELSE +! MESSAGE using MS COMPILER +! IF "$(CPU)" == "P1" +! MESSAGE + optimizing for Pentium (MMX) (may slow down PIII a few percent) +! ELSE +! MESSAGE + optimizing for Pentium II/III +! ENDIF +! ENDIF +! ENDIF +! ENDIF +! IF "$(PREC)" == "SINGLE" +! MESSAGE + using Single precision +! ENDIF +! IF "$(SNDFILE)" == "YES" +! MESSAGE + using LibSndfile reading input files +! ENDIF +! MESSAGE ---------------------------------------------------------------------- + +! IF "$(COMP)" != "INTEL" +! IF "$(COMP)" != "BCC" + +#__ Microsoft C options _______________________________________________________ +# +# /O2 maximize speed +# /Ob inline expansion +# /Og enable global optimizations +# /Oi enable intrinsic functions +# /Ot favor code speed +# /Oy enable frame pointer omission +# /G5 Pentium optimization +# /G6 Pentium II/III optimization +# /GA optimize for Windows Application +# /GF enable read-only string pooling +# /Gf enable string spooling +# /Gs disable stack checking calls +# /Gy separate functions for linker +# /QIfdiv generate code for Pentium FDIV fix +# /QI0f generate code for Pentium 0x0f erratum fix +# +# remarks: +# - aliasing options seem to break code +# - try to get the Intel compiler demonstration code! +# ICL produces faster code. + +# debugging options +# CC_OPTS = /nologo /Zi /Ge /GZ +# LN_OPTS = /nologo /debug:full /debugtype:cv /fixed:no + +# profiling options +# CC_OPTS = /nologo /Zi /O2b2gity /G6As /DNDEBUG +# LN_OPTS = /nologo /debug:full /debugtype:cv /fixed:no /profile + +# release options +! IF "$(MSVCVER)" == "Win64" +CC_OPTS = /nologo /DWin64 /O2b2ity /GAy /Gs1024 /Zp8 /GL /GS- /Zi +! ELSEIF "$(MSVCVER)" == "8.0" +CC_OPTS = /nologo /O2 /Wp64 /Oi /GL /arch:SSE /fp:precise +! ELSEif "$(CPU)"=="P6" +CC_OPTS = /nologo /O2 /Ob2 /GAy /Gs1024 /Zp8 /Zi +!else +CC_OPTS = /nologo /O2 /Ob2 /GAy /Gs1024 /QIfdiv /QI0f /YX +! ENDIF + +! IF "$(MSVCVER)" == "6.0" +! IF "$(CPU)" == "P1" +CC_OPTS = $(CC_OPTS) /G5 +! ELSE +CC_OPTS = $(CC_OPTS) /G6 +! ENDIF +! ENDIF + +! IF "$(WARN)" == "OFF" +CC_OPTS = $(CC_OPTS) /w +! ELSE +CC_OPTS = $(CC_OPTS) /W$(WARN) +! ENDIF + +! IF "$(PREC)" == "SINGLE" +CC_OPTS = $(CC_OPTS) /DFLOAT8=float /DREAL_IS_FLOAT=1 +! ENDIF + +# temporary remove NDEBUG, see configure.in +#CC_OPTS = $(CC_OPTS) /DNDEBUG /MT +CC_OPTS = $(CC_OPTS) /MT + +LN_OPTS = /nologo /pdb:none +LN_DLL = /nologo /DLL + +CC_OUT = /Fo +LN_OUT = /OUT: + +CC = cl +LN = link + +#_______________________________________________________ Microsoft C options __ + + +! ELSE + +#__ Borland BCC options _______________________________________________________ +# +# first draft, DLL not working, generates very slow code! +BCCINST = C:/Borland/BCC55 + +CC_OPTS = -pc -q -ff -fp -jb -j1 -tWC -tWM -O2 -OS -I$(BCCINST)/include -DNDEBUG -DWIN32 +# dll >> -tWD +LN_OPTS = -lGn -lGi -lap -lx -L$(BCCINST)/lib +# dll >> -Tpd +! IF "$(CPU)" == "P1" +CC_OPTS = $(CC_OPTS) -5 +! ELSE +CC_OPTS = $(CC_OPTS) -6 +! ENDIF + +! IF "$(WARN)" == "OFF" +CC_OPTS = $(CC_OPTS) -w- +! ELSE +CC_OPTS = $(CC_OPTS) +! ENDIF + +LN_DLL = +#$(CCINST)/lib/cw32R.lib +LN_OUT = -e +CC_OUT = -o + +CC = bcc32 +LN = bcc32 + +OFF = obj + +! ENDIF +#_______________________________________________________ Borland BCC options __ + + +! ELSE + +#__ Intel 4.5 options _________________________________________________________ +# +# /YX enable automatic precompiled header file creation/usage +# /Ox maximum optimization same as /O2 without /Gfy +# /O2 same as /Gfsy /Ob1gyti +# /Gd 1) make cdecl the default calling convention +# /G5 2) optimized for Pentium +# /G6 3) optimized for Pentium II/III +# /GA assume single threaded +# /Gs[n] disable stack checks for functions with &2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(am__DIST_COMMON) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = lame.spec +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + cscope distdir dist dist-all distcheck +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ + $(LISP)config.h.in +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +CSCOPE = cscope +DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \ + $(srcdir)/lame.spec.in $(top_srcdir)/Makefile.am.global \ + COPYING ChangeLog INSTALL README TODO compile config.guess \ + config.rpath config.sub depcomp install-sh ltmain.sh missing +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -rf "$(distdir)" \ + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi +am__post_remove_distdir = $(am__remove_distdir) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +DIST_TARGETS = dist-gzip +distuninstallcheck_listfiles = find . -type f -print +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ + | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_DEFS = @CONFIG_DEFS@ +CONFIG_MATH_LIB = @CONFIG_MATH_LIB@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CPUCCODE = @CPUCCODE@ +CPUTYPE = @CPUTYPE@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FRONTEND_CFLAGS = @FRONTEND_CFLAGS@ +FRONTEND_LDADD = @FRONTEND_LDADD@ +FRONTEND_LDFLAGS = @FRONTEND_LDFLAGS@ +GREP = @GREP@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_CONFIG = @GTK_CONFIG@ +GTK_LIBS = @GTK_LIBS@ +INCLUDES = @INCLUDES@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDADD = @LDADD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_MAJOR_VERSION = @LIB_MAJOR_VERSION@ +LIB_MINOR_VERSION = @LIB_MINOR_VERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEDEP = @MAKEDEP@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NASM = @NASM@ +NASM_FORMAT = @NASM_FORMAT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM_F = @RM_F@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_FRONTEND = @WITH_FRONTEND@ +WITH_MP3RTP = @WITH_MP3RTP@ +WITH_MP3X = @WITH_MP3X@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = 1.15 foreign +SUBDIRS = mpglib libmp3lame frontend Dll doc include misc dshow ACM \ + mac macosx vc_solution + +CLEANFILES = testcase.new.mp3 +EXTRA_DIST = \ + API \ + DEFINES \ + HACKING \ + INSTALL.configure \ + LICENSE \ + Makefile.MSVC \ + Makefile.unix \ + Makefile.am.global \ + README.WINGTK \ + STYLEGUIDE \ + USAGE \ + configMS.h \ + debian \ + lame.bat \ + lame.spec.in \ + lame.spec \ + testcase.mp3 \ + testcase.wav + +all: config.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +am--refresh: Makefile + @: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.global $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/Makefile.am.global $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +config.h: stamp-h1 + @test -f $@ || rm -f stamp-h1 + @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 + +stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config.h +$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f config.h stamp-h1 +lame.spec: $(top_builddir)/config.status $(srcdir)/lame.spec.in + cd $(top_builddir) && $(SHELL) ./config.status $@ + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool config.lt + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscope: cscope.files + test ! -s cscope.files \ + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) +clean-cscope: + -rm -f cscope.files +cscope.files: clean-cscope cscopelist +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files + +distdir: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz + $(am__post_remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__post_remove_distdir) + +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__post_remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__post_remove_distdir) + +dist-tarZ: distdir + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__post_remove_distdir) + +dist-shar: distdir + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz + $(am__post_remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__post_remove_distdir) + +dist dist-all: + $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' + $(am__post_remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lz*) \ + lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir) + chmod u+w $(distdir) + mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build/sub \ + && ../../configure \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + --srcdir=../.. --prefix="$$dc_install_base" \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__post_remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @test -n '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: trying to run $@ with an empty' \ + '$$(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + $(am__cd) '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am +check: check-recursive +all-am: Makefile config.h +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-hdr \ + distclean-libtool distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(am__recursive_targets) all install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ + am--refresh check check-am clean clean-cscope clean-generic \ + clean-libtool cscope cscopelist-am ctags ctags-am dist \ + dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \ + dist-xz dist-zip distcheck distclean distclean-generic \ + distclean-hdr distclean-libtool distclean-tags distcleancheck \ + distdir distuninstallcheck dvi dvi-am html html-am info \ + info-am install install-am install-data install-data-am \ + install-dvi install-dvi-am install-exec install-exec-am \ + install-html install-html-am install-info install-info-am \ + install-man install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am + +.PRECIOUS: Makefile + + +# end global section + +.PHONY: test + +# +# The differences depend on the used processor architecture, the used +# compiler and the used options for the compiler, so make test may +# show some differences. You should only be concerned if you are a +# LAME developer and the number of differences change after you +# modified the source. +# +testcase.new.mp3: testcase.wav frontend/lame$(EXEEXT) + time frontend/lame$(EXEEXT) --nores $(top_srcdir)/testcase.wav testcase.new.mp3 || $(RM_F) testcase.new.mp3 + +test: testcase.mp3 testcase.new.mp3 + @echo + @echo "The following output has value only for a LAME-developer, do not make _any_" + @echo "assumptions about what this number means. You do not need to care about it." + @cmp -l testcase.new.mp3 $(top_srcdir)/testcase.mp3 | wc -l + +testupdate: testcase.mp3 testcase.new.mp3 + cp testcase.new.mp3 $(top_srcdir)/testcase.mp3 + +testg: frontend/mp3x$(EXEEXT) $(top_srcdir)/../test/castanets.wav + frontend/mp3x$(EXEEXT) -h $(top_srcdir)/../test/castanets.wav + +update: + cd $(top_srcdir) && CVS_RSH=ssh cvs -z3 -q update -dAP || true + +diff: + cd $(top_srcdir) && CVS_RSH=ssh cvs -z3 diff -u || true + +frontend/lame$(EXEEXT): + $(MAKE) $(MAKEFLAGS) + +frontend/mp3x$(EXEEXT): frontend/lame$(EXEEXT) + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Makefile.unix b/Makefile.unix new file mode 100644 index 0000000..d2b984c --- /dev/null +++ b/Makefile.unix @@ -0,0 +1,668 @@ +# Makefile for LAME 3.xx -*- makefile -*- +# +# LAME is reported to work under: +# Linux (i86), NetBSD 1.3.2 (StrongARM), FreeBSD (i86) +# Compaq Alpha(OSF, Linux, Tru64 Unix), Sun Solaris, SGI IRIX, +# OS2 Warp, Macintosh PPC, BeOS, Amiga and even VC++ +# + +# these variables are available on command line: +# +# make UNAME=xxxxx ARCH=xxxxx - specify a type of host +# make PGM=lame_exp - specify a name of an executable file +# +# if you have mingw32-gcc, try: +# make -fMakefile.unix UNAME=MSDOS +# or if you get the error +# "process_begin: CreateProcess((null), copy configMS.h config.h, ...)": +# make -fMakefile.unix UNAME=MSDOS NOUNIXCMD=NO +# or if you have NASM: +# make -fMakefile.unix UNAME=MSDOS HAVE_NASM=YES +# + +ifeq ($(UNAME),MSDOS) + UNAME ?= UNKNOWN + ARCH = x86 + NOUNIXCMD = YES +else + UNAME = $(shell uname) + ARCH = $(shell uname -m) + iARCH = $(patsubst i%86,x86,$(ARCH)) +endif + +HAVE_NASM = NO +HAVE_NEWER_GLIBC = NO +NASM_FLAGS=elf + +# generic defaults. OS specific options go in versious sections below +PGM = lame +CC = gcc +CC_OPTS = -O +CPP_OPTS = -Iinclude -Impglib -Ifrontend -Ilibmp3lame +AR = ar +RANLIB = ranlib +GTK = +GTKLIBS = +LIBSNDFILE = +LIBS = -lm +MP3LIB = libmp3lame/libmp3lame.a +MP3LIB_SHARED = libmp3lame/libmp3lame.so +MAKEDEP = -M +BRHIST_SWITCH = +LIBTERMCAP = +RM = rm -f + +CPP_OPTS += -DHAVE_CONFIG_H -I. + +########################################################################## +# -DHAVEMPGLIB compiles the mpglib *decoding* library into libmp3lame +########################################################################## +CPP_OPTS += -DHAVE_MPGLIB + +########################################################################## +# -DTAKEHIRO_IEEE754_HACK enables Takehiro's IEEE hack +########################################################################## +ifeq ($(iARCH),x86) + ifeq ($(CFG),RH_SSE) +# SSE and IEEE754 HACK don't work together + else + CPP_OPTS += -DTAKEHIRO_IEEE754_HACK + endif +endif + +########################################################################## +# Define these in the OS specific sections below to compile in code +# for the optional VBR bitrate histogram. +# Requires ncurses, but libtermcap also works. +# If you have any trouble, just dont define these +# +# BRHIST_SWITCH = -DBRHIST -DHAVE_TERMCAP -DHAVE_{NCURSES_}TERMCAP_H +# LIBTERMCAP = -lncurses +# LIBTERMCAP = -ltermcap +# +# or, to try and simulate TERMCAP (ANSI), use: +# BRHIST_SWITCH = -DBRHIST +# +########################################################################## + + +########################################################################## +# Define these in the OS specific sections below to compile in code for: +# +# SNDLIB = -DLIBSNDFILE to use Erik de Castro Lopo's libsndfile +# http://www.zip.com.au/~erikd/libsndfile/ instead of LAME's internal +# routines. Also set: +# +# LIBSNDFILE = -lsndfile +# or +# LIBSNDFILE = -L/location_of_libsndfile -lsndfile +# +########################################################################## + + +########################################################################## +# Define these in the OS specific sections below to compile in code for +# the GTK mp3 frame analyzer +# +# Requires -DHAVE_MPGLIB +# +# GTK = -DHAVE_GTK `gtk-config --cflags` +# GTKLIBS = `gtk-config --libs` +# +########################################################################## + + + + +########################################################################## +# LINUX +########################################################################## +ifeq ($(UNAME),Linux) +# The frame analyzer depends on gtk1.2. Uncomment the next 2 lines to get it +# GTK = -DHAVE_GTK `gtk-config --cflags` +# GTKLIBS = `gtk-config --libs` +# Comment out next 2 lines if you want to remove VBR histogram capability + BRHIST_SWITCH = -DHAVE_TERMCAP -DHAVE_TERMCAP_H + LIBTERMCAP = -lncurses +# uncomment to use LIBSNDFILE +# SNDLIB = -DLIBSNDFILE +# LIBSNDFILE=-lsndfile + +# suggested for gcc-2.7.x +# CC_OPTS = -O3 -fomit-frame-pointer -funroll-loops -ffast-math -finline-functions -Wall -pedantic +# CC_OPTS = -O9 -fomit-frame-pointer -fno-strength-reduce -mpentiumpro -ffast-math -finline-functions -funroll-loops -Wall -malign-double -g -march=pentiumpro -mfancy-math-387 -pipe -pedantic + +# Suggested for GCC 4.* & machines with sse+sse2+sse3: -Os might reduce +# the use of the instruction cache and, thus, get better performance, +# but this should be experimented by the user. Customize at your own +# convenience. +# +#CC_OPTS = -pipe -O3 \ +# -Wall -Wextra -pedantic \ +# -Wmissing-declarations -Wfloat-equal -Wshadow \ +# -Wcast-qual -Wcast-align -Wdisabled-optimization \ +# -ffast-math -ftree-vectorize -ftree-vect-loop-version \ +# -mtune=nocona -march=nocona -mfpmath=sse -msse -msse2 -msse3 \ +# -malign-double -maccumulate-outgoing-args + +# for debugging: + CC_OPTS = -UNDEBUG -O -Wall -pedantic -ggdb -DABORTFP + +# for lots of debugging: +# CC_OPTS = -DDEBUG -UNDEBUG -O -Wall -pedantic -g -DABORTFP + + +ifeq ($(CFG),RH) + GTK = -DHAVE_GTK `gtk-config --cflags` + GTKLIBS = `gtk-config --libs` + CPP_OPTS += -DFLOAT8=float -DREAL_IS_FLOAT=1 -DHAVE_ICONV -DHAVE_XMMINTRIN_H -D_ALLOW_INTERNAL_OPTIONS +# these options for gcc-3.2 & AthlonXP + CC_OPTS = \ + -pipe -O3 \ + -Wall -W -Wmissing-declarations -Wfloat-equal -Wformat \ + -Wcast-qual -Wcast-align -Wdisabled-optimization -Wshadow \ + -march=athlon-xp \ + -malign-double \ + -maccumulate-outgoing-args +# -Wconversion -Wunreachable-code \ + + HAVE_NEWER_GLIBC = YES + HAVE_NASM = YES +endif + +ifeq ($(CFG),RH_SSE) + GTK = -DHAVE_GTK `gtk-config --cflags` + GTKLIBS = `gtk-config --libs` + CPP_OPTS += -DFLOAT8=float -DREAL_IS_FLOAT=1 -DHAVE_ICONV -DHAVE_XMMINTRIN_H -DMIN_ARCH_SSE -D_ALLOW_INTERNAL_OPTIONS +# these options for gcc-3.2 & AthlonXP + CC_OPTS = \ + -std=c99 -pipe -O3 -fstrict-aliasing \ + -Wall -W -Wmissing-declarations -Wfloat-equal -Wformat \ + -Wcast-qual -Wcast-align -Wdisabled-optimization -Wshadow \ + -Wunsafe-loop-optimizations \ + -march=k8 \ + -ffast-math \ + -mfpmath=sse -msse -msse2 \ + -malign-double \ + -funsafe-math-optimizations \ + -funsafe-loop-optimizations \ + -maccumulate-outgoing-args +# -Dpowf=pow -Dfabsf=fabs -Dlog10f=log10 +# -fsingle-precision-constant \ +# -Wconversion -Wunreachable-code \ +# -ftree-vectorizer-verbose=10 \ + + HAVE_NEWER_GLIBC = YES +# HAVE_NASM = YES + NASM_FLAGS = elf64 +endif + +ifeq ($(CFG),RH_INTEL) + CC=icc + GTK = -DHAVE_GTK `gtk-config --cflags` + GTKLIBS = `gtk-config --libs` + CPP_OPTS += -DFLOAT8=float -DREAL_IS_FLOAT=1 -DHAVE_ICONV -DHAVE_XMMINTRIN_H -DMIN_ARCH_SSE -D_ALLOW_INTERNAL_OPTIONS + + CC_OPTS = \ + -cxxlib-nostd \ + -O3 -fno-alias -ip -finline-limit=400 \ + -scalar-rep +# -vec_report5 -opt-report +# -parallel + +endif + +ifeq ($(CFG),PFK) + CPP_OPTS += -DKLEMM -DKLEMM_00 -DKLEMM_01 -DKLEMM_02 -DKLEMM_03 -DKLEMM_04 -DKLEMM_05 -DKLEMM_06 -DKLEMM_07 -DKLEMM_08 -DKLEMM_09 -DKLEMM_10 -DKLEMM_11 -DKLEMM_12 -DKLEMM_13 -DKLEMM_14 -DKLEMM_15 -DKLEMM_16 -DKLEMM_17 -DKLEMM_18 -DKLEMM_19 -DKLEMM_20 -DKLEMM_21 -DKLEMM_22 -DKLEMM_23 -DKLEMM_24 -DKLEMM_25 -DKLEMM_26 -DKLEMM_27 -DKLEMM_28 -DKLEMM_29 -DKLEMM_30 -DKLEMM_31 -DKLEMM_32 -DKLEMM_33 -DKLEMM_34 -DKLEMM_35 -DKLEMM_36 -DKLEMM_37 -DKLEMM_38 -DKLEMM_39 -DKLEMM_40 -DKLEMM_41 -DKLEMM_42 -DKLEMM_43 -DKLEMM_44 -DKLEMM_45 -DKLEMM_46 -DKLEMM_47 -DKLEMM_48 -DKLEMM_49 -DKLEMM_50 + CC_OPTS = \ + -Wall -O9 -fomit-frame-pointer -march=pentium \ + -finline-functions -fexpensive-optimizations \ + -funroll-loops -funroll-all-loops -pipe -fschedule-insns2 \ + -fstrength-reduce \ + -malign-double -mfancy-math-387 -ffast-math + + HAVE_NEWER_GLIBC = YES + HAVE_NASM = YES +endif + +########################################################################## +# LINUX on Digital/Compaq Alpha CPUs +########################################################################## +ifeq ($(ARCH),alpha) + +################################################################ +#### Check if 'ccc' is in our path +#### if not, use 'gcc' +################################################################ +ifeq ($(shell which ccc 2>/dev/null | grep -c ccc),0) + +# double is faster than float on Alpha +CC_OPTS = -O4 -pedantic -Wall -fomit-frame-pointer -ffast-math -funroll-loops \ + -mfp-regs -fschedule-insns -fschedule-insns2 \ + -finline-functions \ +# -DFLOAT=double +# add "-mcpu=21164a -Wa,-m21164a" to optimize for 21164a (ev56) CPU + +################################################################ +#### else, use 'ccc' +################################################################ +else + +# Compaq's C Compiler +CC = ccc + +################################################################ +#### set 'CC_OPTS = -arch host -tune host' to generate/tune instructions for this machine +#### 'CC_OPTS += -migrate -fast -inline speed -unroll 0' tweak to run as fast as possible :) +#### 'CC_OPTS += -w0 -pedantic -Wall' set warning and linking flags +################################################################ +CC_OPTS = -arch host -tune host +CC_OPTS += -migrate -fast -inline speed -unroll 0 +CC_OPTS += -w0 -pedantic -Wall + + +################################################################ +#### to debug, uncomment +################################################################ +# For Debugging +#CC_OPTS += -g3 + +################################################################ +#### define __DECALPHA__ (i was getting re-declaration warnings +#### in machine.h +################################################################ +# Define DEC Alpha +CPP_OPTS += -D__DECALPHA__ + +# standard Linux libm +#LIBS = -lm +# optimized libffm (free fast math library) +#LIBS = -lffm +# Compaq's fast math library +LIBS = -lcpml +endif # gcc or ccc? +endif # alpha +endif # linux + + + +########################################################################## +# FreeBSD +########################################################################## +ifeq ($(UNAME),FreeBSD) +# remove if you do not have GTK or do not want the GTK frame analyzer + GTK = -DHAVE_GTK `gtk12-config --cflags` + GTKLIBS = `gtk12-config --libs` +# Comment out next 2 lines if you want to remove VBR histogram capability + BRHIST_SWITCH = -DHAVE_TERMCAP -DHAVE_TERMCAP_H + LIBTERMCAP = -lncurses + +endif + + + +########################################################################## +# OpenBSD +########################################################################## +ifeq ($(UNAME),OpenBSD) +# remove if you do not have GTK or do not want the GTK frame analyzer + GTK = -DHAVE_GTK `gtk-config --cflags` + GTKLIBS = `gtk-config --libs` +# Comment out next 2 lines if you want to remove VBR histogram capability + BRHIST_SWITCH = -DHAVE_TERMCAP -DHAVE_TERMCAP_H + LIBTERMCAP = -lcurses +endif + + + + +########################################################################## +# SunOS +########################################################################## +ifeq ($(UNAME),SunOS) + CC = cc + CC_OPTS = -O -xCC + MAKEDEP = -xM +# for gcc, use instead: +# CC = gcc +# CC_OPTS = -O +# MAKEDEP = -M +endif + + + +########################################################################## +# SGI +########################################################################## +ifeq ($(UNAME),IRIX64) + CC = cc + CC_OPTS = -O3 -woff all + +#optonal: +# GTK = -DHAVE_GTK `gtk-config --cflags` +# GTKLIBS = `gtk-config --libs` +# BRHIST_SWITCH = -DBRHIST -DHAVE_TERMCAP -DHAVE_TERMCAP_H +# LIBTERMCAP = -lncurses + +endif +ifeq ($(UNAME),IRIX) + CC = cc + CC_OPTS = -O3 -woff all +endif + + + +########################################################################## +# Compaq Alpha running Dec Unix (OSF) +########################################################################## +ifeq ($(UNAME),OSF1) + CC = cc + CC_OPTS = -fast -O3 -std -g3 -non_shared +endif + +########################################################################## +# BeOS +########################################################################## +ifeq ($(UNAME),BeOS) + CC = $(BE_C_COMPILER) + LIBS = +ifeq ($(ARCH),BePC) + CC_OPTS = -O9 -fomit-frame-pointer -march=pentium \ + -mcpu=pentium -ffast-math -funroll-loops \ + -fprofile-arcs -fbranch-probabilities +else + CC_OPTS = -opt all + MAKEDEP = -make +endif +endif + +########################################################################### +# MOSXS (Rhapsody PPC) +########################################################################### +ifeq ($(UNAME),Rhapsody) + CC = cc + LIBS = + CC_OPTS = -O9 -ffast-math -funroll-loops -fomit-frame-pointer + MAKEDEP = -make + +endif +########################################################################## +# OS/2 +########################################################################## +# Properly installed EMX runtime & development package is a prerequisite. +# tools I used: make 3.76.1, uname 1.12, sed 2.05, PD-ksh 5.2.13 +# +########################################################################## +ifeq ($(UNAME),OS/2) + SHELL=sh + CC = gcc + CC_OPTS = -O3 -D__OS2__ + PGM = lame.exe + LIBS = + RANLIB = touch + +# I use the following for slightly better performance on my Pentium-II +# using pgcc-2.91.66: +# CC_OPTS = -O6 -ffast-math -funroll-loops -mpentiumpro -march=pentiumpro -D__OS2__ +# for the unfortunates with a regular pentium (using pgcc): +# CC_OPTS = -O6 -ffast-math -funroll-loops -mpentium -march=pentium -D__OS2__ + +# Comment out next 2 lines if you want to remove VBR histogram capability + BRHIST_SWITCH = -DHAVE_TERMCAP -DHAVE_{NCURSES_}TERMCAP_H + LIBTERMCAP = -lncurses + +# Uncomment & inspect the 2 GTK lines to use MP3x GTK frame analyzer. +# Properly installed XFree86/devlibs & GTK+ is a prerequisite. +# The following works for me using Xfree86/OS2 3.3.5 and GTK+ 1.2.3: +# GTK = -DHAVE_GTK -IC:/XFree86/include/gtk12 -Zmt -D__ST_MT_ERRNO__ -IC:/XFree86/include/glib12 -IC:/XFree86/include +# GTKLIBS = -LC:/XFree86/lib -Zmtd -Zsysv-signals -Zbin-files -lgtk12 -lgdk12 -lgmodule -lglib12 -lXext -lX11 -lshm -lbsd -lsocket -lm +endif + + + +########################################################################### +# MSDOS/Windows +########################################################################### +ifeq ($(UNAME),MSDOS) + RM = + CC_OPTS = \ + -Wall -pipe -O3 -fomit-frame-pointer -ffast-math -funroll-loops \ + -fschedule-insns2 -fmove-all-movables -freduce-all-givs \ + -mcpu=pentium -march=pentium -mfancy-math-387 + CC_OPTS += -D_cdecl=__cdecl + PGM = lame.exe +endif + + + +########################################################################### +# AmigaOS +########################################################################### +# Type 'Make ARCH=PPC' for PowerUP and 'Make ARCH=WOS' for WarpOS +# +########################################################################### +ifeq ($(UNAME),AmigaOS) + CC = gcc -noixemul + CC_OPTS = -O3 -ffast-math -funroll-loops -m68020-60 -m68881 + BRHIST_SWITCH = -DBRHIST + MAKEDEP = -MM + ifeq ($(ARCH),WOS) + CC = ppc-amigaos-gcc -warpup + CC_OPTS = -O3 -ffast-math -fomit-frame-pointer -funroll-loops \ + -mmultiple -mcpu=603e + AR = ppc-amigaos-ar + RANLIB = ppc-amigaos-ranlib + LIBS = + endif + ifeq ($(ARCH),PPC) + CC = ppc-amigaos-gcc + CC_OPTS = -O3 -ffast-math -fomit-frame-pointer -funroll-loops \ + -mmultiple -mcpu=603e + AR = ppc-amigaos-ar + RANLIB = ppc-amigaos-ranlib + LIBS = + endif +endif + + +# 10/99 added -D__NO_MATH_INLINES to fix a bug in *all* versions of +# gcc 2.8+ as of 10/99. + +ifeq ($(HAVE_NEWER_GLIBC),YES) +CC_SWITCHES = +else +CC_SWITCHES = -D__NO_MATH_INLINES # only needed by some older glibc +endif + +# temporary remove NDEBUG, see configure.in +#CC_SWITCHES += -DNDEBUG $(CC_OPTS) $(SNDLIB) $(BRHIST_SWITCH) +CC_SWITCHES += $(CC_OPTS) $(SNDLIB) $(BRHIST_SWITCH) +frontend_sources = \ + frontend/main.c \ + frontend/amiga_mpega.c \ + frontend/brhist.c \ + frontend/get_audio.c \ + frontend/lametime.c \ + frontend/parse.c \ + frontend/timestatus.c \ + frontend/console.c \ + +lib_sources = \ + libmp3lame/bitstream.c \ + libmp3lame/encoder.c \ + libmp3lame/fft.c \ + libmp3lame/gain_analysis.c \ + libmp3lame/id3tag.c \ + libmp3lame/lame.c \ + libmp3lame/newmdct.c \ + libmp3lame/psymodel.c \ + libmp3lame/quantize.c \ + libmp3lame/quantize_pvt.c \ + libmp3lame/set_get.c \ + libmp3lame/vbrquantize.c \ + libmp3lame/reservoir.c \ + libmp3lame/tables.c \ + libmp3lame/takehiro.c \ + libmp3lame/util.c \ + libmp3lame/mpglib_interface.c \ + libmp3lame/VbrTag.c \ + libmp3lame/version.c \ + libmp3lame/presets.c \ + libmp3lame/vector/xmm_quantize_sub.c \ + mpglib/common.c \ + mpglib/dct64_i386.c \ + mpglib/decode_i386.c \ + mpglib/layer1.c \ + mpglib/layer2.c \ + mpglib/layer3.c \ + mpglib/tabinit.c \ + mpglib/interface.c + + +#ifeq ($(UNAME),MSDOS) +# frontend_sources := $(subst /,\,$(frontend_sources)) +# lib_sources := $(subst /,\,$(lib_sources)) +#endif + +frontend_obj = $(frontend_sources:.c=.o) +lib_obj = $(lib_sources:.c=.o) + +DEP = $(frontend_sources:.c=.d) $(lib_sources:.c=.d ) + +gtk_sources = frontend/gtkanal.c frontend/gpkplotting.c frontend/mp3x.c +gtk_obj = $(gtk_sources:.c=.gtk.o) +gtk_dep = $(gtk_sources:.c=.d) + + + +NASM = nasm +ASFLAGS=-f $(NASM_FLAGS) -i libmp3lame/i386/ + +# for people with nasmw +ifeq ($(UNAME),MSDOS) + NASM = nasmw + ASFLAGS=-f win32 -DWIN32 -i libmp3lame/i386/ +endif + +%.o: %.nas + $(NASM) $(ASFLAGS) $< -o $@ +%.o: %.s + gcc -c $< -o $@ + + +#HAVE_NASM = YES + +ifeq ($(HAVE_NASM),YES) +## have NASM +CC_SWITCHES += -DHAVE_NASM +lib_obj += libmp3lame/i386/cpu_feat.o + +## use MMX extension. you need nasm and MMX supported CPU. +CC_SWITCHES += -DMMX_choose_table +lib_obj += libmp3lame/i386/choose_table.o + +## use 3DNow! extension. you need nasm and 3DNow! supported CPU. +lib_obj += libmp3lame/i386/fft3dn.o + +## use SSE extension. you need nasm and SSE supported CPU. +lib_obj += libmp3lame/i386/fftsse.o + +## not yet coded +#CC_SWITCHES += -DUSE_FFTFPU +#lib_obj += libmp3lame/i386/fftfpu.o +endif + + + +# +# Makefile rules---you probably won't have to modify below this line +# +%.o: %.c + $(CC) $(CPP_OPTS) $(CC_SWITCHES) -c $< -o $@ + +%.d: %.c + ifeq ($(NOUNIXCMD),YES) + $(CC) $(MAKEDEP) $(CPP_OPTS) $(CC_SWITCHES) $< > $@ + else + $(SHELL) -ec '$(CC) $(MAKEDEP) $(CPP_OPTS) $(CC_SWITCHES) $< | sed '\''s;$*.o;& $@;g'\'' > $@' + endif + +%.gtk.o: %.c + $(CC) $(CPP_OPTS) $(CC_SWITCHES) $(GTK) -c $< -o $@ + +all: frontend/$(PGM) + + +$(lib_sources) $(frontend_sources) $(gtk_sources) : config.h + +config.h: configMS.h + ifeq ($(NOUNIXCMD),YES) + copy configMS.h config.h + else + cp configMS.h config.h + endif + +frontend/$(PGM): frontend/lame_main.o $(frontend_obj) $(MP3LIB) + $(CC) $(CC_OPTS) -o frontend/$(PGM) frontend/lame_main.o $(frontend_obj) \ + $(MP3LIB) $(LIBS) $(LIBSNDFILE) $(LIBTERMCAP) + +mp3x: $(frontend_obj) $(gtk_obj) $(MP3LIB) + $(CC) $(CC_OPTS) -o frontend/mp3x $(frontend_obj) $(gtk_obj) \ + $(MP3LIB) $(LIBS) $(LIBSNDFILE) $(LIBTERMCAP) $(GTKLIBS) + +mp3rtp: frontend/rtp.o frontend/mp3rtp.o $(frontend_obj) $(MP3LIB) + $(CC) $(CC_OPTS) -o frontend/mp3rtp frontend/mp3rtp.o frontend/rtp.o $(frontend_obj) $(MP3LIB) \ + $(LIBS) $(LIBSNDFILE) $(LIBTERMCAP) + +libmp3lame/libmp3lame.a: $(lib_obj) + echo $(lib_obj) + $(AR) cr libmp3lame/libmp3lame.a $(lib_obj) + $(RANLIB) libmp3lame/libmp3lame.a + +#shared library. GNU specific? +libmp3lame/libmp3lame.so: $(lib_obj) + gcc -shared -Wl,-soname,libmp3lame/libmp3lame.so -o libmp3lame/libmp3lame.so $(lib_obj) + +install: frontend/$(PGM) #libmp3lame.a + cp frontend/$(PGM) /usr/bin + #cp libmp3lame.a /usr/lib + #cp lame.h /usr/lib + +clean: + ifeq ($(UNAME),MSDOS) + -del $(subst /,\,$(frontend_obj)) + -del $(subst /,\,$(lib_obj)) + -del $(subst /,\,$(gtk_obj)) + -del $(subst /,\,$(DEP)) + -del frontend\$(PGM) + -del frontend\main.o + -del libmp3lame\libmp3lame.a + else + -$(RM) $(gtk_obj) $(frontend_obj) $(lib_obj) $(DEP) frontend/$(PGM) \ + frontend/main.o frontend/lame libmp3lame/libmp3lame.a \ + frontend/mp3x.o frontend/mp3x + endif + + +tags: TAGS + +TAGS: ${c_sources} + etags -T ${c_sources} + +ifneq ($(MAKECMDGOALS),clean) + -include $(DEP) +endif + + +# +# testcase.mp3 is a 2926 byte file. The first number output by +# wc is the number of bytes which differ between new output +# and 'official' results. +# +# Because of compiler options and effects of roundoff, the +# number of bytes which are different may not be zero, but +# should be at most 30. +# +test: frontend/$(PGM) + frontend/$(PGM) --nores testcase.wav testcase.new.mp3 + cmp -l testcase.new.mp3 testcase.mp3 | wc -l diff --git a/README b/README new file mode 100644 index 0000000..77c6c47 --- /dev/null +++ b/README @@ -0,0 +1,44 @@ + LAME 3.xx + LAME Ain't an MP3 Encoder + http://lame.sf.net + May 2011 + +Originally developed by Mike Cheng (www.uq.net.au/~zzmcheng) and was +latter developed by Mark Taylor (www.mp3dev.org). Currently maintained +by The LAME Project. + +This code is distributed under the GNU LIBRARY GENERAL PUBLIC LICENSE +(LGPL, see www.gnu.org), version 2. + +As LAME may contain software for which some companies may claim software +patents, if you are in a location where software patents are recognized, it is +suggested that you seek legal advice before deploying and/or redistributing +LAME. + +In particular, it is suggested to visit + + http://www.mp3licensing.com/ + +if it applies to your jurisdiction. + +============================================================================ + +see the file "INSTALL" for installation (compiling) instructions. +see the file "USAGE" for the most up-to-date guide to the command line options. +see the file "LICENSE" for details on how to use LAME in non-GPL programs. +see the file "HACKING" if you are interested in working on LAME +see the file "API" for details of the LAME encoding library API + +There is HTML documentation and a man page in the doc directory. + +============================================================================ + +LAME uses the MPGLIB decoding engine, from the mpg123 package, written +by: Michael Hipp (www.mpg123.de) MPGLIB is released under the GPL. + +Copyrights (c) 1999-2011 by The LAME Project +Copyrights (c) 1999,2000,2001 by Mark Taylor +Copyrights (c) 1998 by Michael Cheng +Copyrights (c) 1995,1996,1997 by Michael Hipp: mpglib + +As well as additional copyrights as documented in the source code. diff --git a/README.WINGTK b/README.WINGTK new file mode 100644 index 0000000..826f155 --- /dev/null +++ b/README.WINGTK @@ -0,0 +1,60 @@ + Installation notes on MP3X (the LAME frame analyzer) for WIN32 + +=========================================================================== +Document History: +=========================================================================== + +Initial version by Albert Faber, March 30, 2000 + +Update by Albert Faber (Sept 07 2000), changed instructions +to compile with latest glib/gtk libraries. + +Update by Albert Faber (Sept 07 2000), changed instructions +to compile with latest glib/gtk libraries. + +Update by Albert Faber (Oct 20 2000), small adaptions to be conform +the new lame directory structure. + +Update by Gabriel Bouvigne (Jan 07 2004), changes to be conform to the +VC6 worspace structure. + +Update by Gabriel Bouvigne (Nov 11 2006), changes to be conform to the +VC8 worspace structure. Tested with gtk+-dev-1.3.0-20030115 and glib-dev-2.12.4 + + +=========================================================================== +How to compile the MP3 frame analyzer (MP3x): +=========================================================================== + +You first need to get hold of the latest GTK and GLIB include files and lib +files. You can download them freely from the WINGTK project WEB site. +(see http://www.gtk.org, and click on the WINGTK link.) + +Download: glib-dev-VERSION.zip, gtk+-dev-VERSION.zip and extralibs-dev-VERSION.zip +where VERSION indicates the release data, so it will look something like 20000805 + +unzip all three zip files in a WinGTK subdirectory, which is created from the lame +analyzer directory (for example, D:\CVS\lame\WinGtk) + +You will end up with the following directory tree + D:\CVS\lame\analyzer\WinGtk\src\glib + D:\CVS\lame\analyzer\WinGtk\src\gtk+\glib + D:\CVS\lame\analyzer\WinGtk\src\gtk+ + +Set Mp3x as your current active project, recompile everything, and you're done. + +=========================================================================== +How to run and use the MP3 Frame analyzer +=========================================================================== + +To run MP3x.exe, you need the GTK DLL files: Either instal them on your system, +or put them in the same directory mp3x.exe resides. + + +Example: +mp3x.exe myfile + +myfile can be a mp3 file, or a wav file. + + + === End of Document === diff --git a/STYLEGUIDE b/STYLEGUIDE new file mode 100644 index 0000000..e955dc5 --- /dev/null +++ b/STYLEGUIDE @@ -0,0 +1,187 @@ +* The LAME API is frozen. Poorly designed as it is, don't change it, + and add to it sparingly. + +* Don't take it upon yourself to go through LAME with the sole purpose + of updating everything to match this guide. Especially important: + don't change the spacing, indentation, curly braces, etc, + in routines you did not write. + +* If you want to make a change which effects many many functions, + please check with the maintainer first. + +* Respect the indentation of the author of the original function. + If the indentation is not consistent, use 4. + +* Don't use tabulators (the character with the value '\t') in source code, + especially these with a width of unequal 8. Lame sources are using + different sizes for tabulators. + +* Don't set the macro NDEBUG in alpha versons. + NDEBUG should be set for beta versions. + +* check important assumptions with an assert() + +* use int for all integer quantities. + LAME requires 32 bit ints, so you can assume int is at least 32 bits. + Don't use 'long'. Don't use 'unsigned' unless ABSOLUTELY necessary. + Don't use 'char' just to save bytes. If 64 bits is required, use int64. + + Annnotation: + ISO C calls the 64 bit int type not int64 but int64_t. + +* Avoid using float or double, and instead use: (defined in machine.h). + + FLOAT for variables which require at least 32bits + FLOAT8 for variables which require at least 64bits + + On some machines, 64bit will be faster than 32bit. Also, some math + routines require 64bit float, so setting FLOAT=float will result in a + lot of conversions. + + Annotation (pfk): + The new ISO C standard passed in autumn 1999 has defined new types for + exactly this reason. There are called float_least32_t and float_least64_t + and have at least the advantage that you not need to explain their + meaning. + + Annotation (mt): + we will adopt this convention in Jan 1, 2003. + + +* The internal representation of PCM samples in type 'sample_t', + currently this is a FLOAT. + +* Use SI base units. Lame mixes Hz, kHz, kbps, bps. This is mess. + + Example: + float wavelength_green = 555.e-9; + unsigned data_rate = 128000; + float lowpass_freq = 12500.; + + Converting between user input and internal representation should be done + near the user interface, not in the most inner loop of an utility + function. + +---------------------------------------------------------------------------------- +Edited version of the Linux Kernel Style Guide: +---------------------------------------------------------------------------------- + + Chapter 1: Indentation + +Respect the indentation of the author of the original function. +If the indentation is not consistent, don't change it. If +you are so anal-retentive about these things and you can't +bare to even look at code with poor indentation, change it to 4. + + + Chapter 2: Placing Braces + +The other issue that always comes up in C styling is the placement of +braces. Unlike the indent size, there are few technical reasons to +choose one placement strategy over the other, but the preferred way, as +shown to us by the prophets Kernighan and Ritchie, is to put the opening +brace last on the line, and put the closing brace first, thusly: + + if (x is true) { + we do y + } + +However, there is one special case, namely functions: they have the +opening brace at the beginning of the next line, thus: + + int function(int x) + { + body of function + } + +Heretic people all over the world have claimed that this inconsistency +is ... well ... inconsistent, but all right-thinking people know that +(a) K&R are _right_ and (b) K&R are right. Besides, functions are +special anyway (you can't nest them in C). + +Note that the closing brace is empty on a line of its own, _except_ in +the cases where it is followed by a continuation of the same statement, +ie a "while" in a do-statement or an "else" in an if-statement, like +this: + + do { + body of do-loop + } while (condition); + +and + + if (x == y) { + .. + } else if (x > y) { + ... + } else { + .... + } + +Rationale: K&R. + +Also, note that this brace-placement also minimizes the number of empty +(or almost empty) lines, without any loss of readability. Thus, as the +supply of new-lines on your screen is not a renewable resource (think +25-line terminal screens here), you have more empty lines to put +comments on. + + + Chapter 3: Naming + +C is a Spartan language, and so should your naming be. Unlike Modula-2 +and Pascal programmers, C programmers do not use cute names like +ThisVariableIsATemporaryCounter. A C programmer would call that +variable "tmp", which is much easier to write, and not the least more +difficult to understand. + +HOWEVER, while mixed-case names are frowned upon, descriptive names for +global variables are a must. To call a global function "foo" is a +shooting offense. + +GLOBAL variables (to be used only if you _really_ need them) need to +have descriptive names, as do global functions. If you have a function +that counts the number of active users, you should call that +"count_active_users()" or similar, you should _not_ call it "cntusr()". + +Encoding the type of a function into the name (so-called Hungarian +notation) is brain damaged - the compiler knows the types anyway and can +check those, and it only confuses the programmer. No wonder MicroSoft +makes buggy programs. + +LOCAL variable names should be short, and to the point. If you have +some random integer loop counter, it should probably be called "i". +Calling it "loop_counter" is non-productive, if there is no chance of it +being mis-understood. Similarly, "tmp" can be just about any type of +variable that is used to hold a temporary value. + + + + Chapter 4: Functions + +Document functions. + +Keep functions as modular as possible. But don't adhere to artificial +line number limitations. For example, lame_encode_frame() encodes a +single MP3 frame and is a long sequence of function calls. It makes +no sense to break this into two or more routines. + + + + Chapter 5: Commenting + +Comments are good, but there is also a danger of over-commenting. NEVER +try to explain HOW your code works in a comment: it's much better to +write the code so that the _working_ is obvious, and it's a waste of +time to explain badly written code. + +Generally, you want your comments to tell WHAT your code does, not HOW. +Also, try to avoid putting comments inside a function body: if the +function is so complex that you need to separately comment parts of it, +you should probably go back to chapter 4 for a while. You can make +small comments to note or warn about something particularly clever (or +ugly), but try to avoid excess. Instead, put the comments at the head +of the function, telling people what it does, and possibly WHY it does +it. + + diff --git a/TODO b/TODO new file mode 100644 index 0000000..dbd04b3 --- /dev/null +++ b/TODO @@ -0,0 +1,138 @@ +1. bug in resample code: downsampling from 44101 to 44100 causes + a seg fault. Workaround in place for now: resampling disabled + if input/output samplerates agree to 4 digits. + + +2. high bitrate encodings have trouble on some hardware players. + Track this down. Probably caused by --strictly-enforce-ISO and + IXMAX_VAL. Try setting IXMAX_VAL back to 8191 and/or + maxmp3buf=8*960 to see if there is a working combination. + + note: one of the decoder bugs was identified. It is caused by using + different block sizes on both channels. A parameter need to be + added to Lame to handle workarounds. + + +3 frontend: code is a complete mess. But it has so many debugged + features it will be a lot of work to re-write. + + +4. MSVC project files. It would be nice to create a working + MSVC6 workspace, which included all the projects as possible + targets: + lame.exe + mp3x.exe (require GTK libs) + lame_enc.dll + ACM codec + directshow codec + + I think the only MSVC5 project that we need to preserve is + for lame_enc.dll, since Albert Faber (still?) doesn't use VC6? + But no reason we cant have VC5 and VC6 project files for the dll. + + +5. NOGAP encoding: + + -nogap: more testing, fix options, test id3 tags? + Can we change id3 tags without reseting the encoder?? + At the end of encoding 1.wav, call lame_get_mf_samples_to_encode() + to find the number of non encoded buffered PCM samples. Then + encode samples from 2.wav until these PCM samples have been + encoded, *THEN* call lame_encode_flush_nogap() and close + out file 1.mp3. + + + NOGAP decoding: + lame --decode --nogap file1.mp3 file2.mp3 file3.mp3 + should also work. What needs to be done: + get_audio.c: We need a way to open a second mp3 file, without + calling lame_decode_init() and reinitializing mpglib. + And the mpglib needs to know to look for new Xing + tags at the beginning of file2.mp3 and file3.mp3. + + +6. Does stdin work when LAME is compiled to use libsndfile? + (new version of libsndfile will support this - try this out) + + +7. LAME has problems with pure DC input. i.e. a square wave with + a frequency well below 20 Hz. Not very important, but it should + be fixed. + + +8. mgplib has bugs with i-stereo. flag denoting invalid + i-stereo value (= frame is m/s stereo) is not correct. + + +9. lowpass filter: for M/S stereo, use more filtering for the side + channel, less filtering for mid channel. We need to first replace + the polyphase filter with an FIR lowpass filter with finer frequency + resolution before implementing this. + + +10. LAME has a 31 point FIR filter used for resampling, which + can also be used as a lowpass. When resampling is done, + use that filter to also lowpass instead of the polyphase filter. + + +11. Even when resampling is not needed, should we use an FIR filter + for the lowpass? If it is not too much slower, yes. If it + is slower, then it should be an option since it will produce + higher quality. + + +12. We should consider moving the experts options from the *long + help* text into an *experts only* help text. The average Joe gets + knocked down by the huge number of possibilities to setup lame. + + + +50. Better tonality estimation. + Gpsycho uses predictability, and so needs a delay to detect the tonality + of a sound. + Nspsytune seems to miss tonals when several of them are too narrow. + We would probably need the best of both. + + + +60. Different ATH handling for sfb21. We are using the minimum value of ath + in each whole sfb. in sfb21 this leads to very high bitrates. + We could perhaps use 2 or 3 ath partitions in sfb21 + + note: partially done + + + +70. Use mixed blocks. + + + +90. Use intensity stereo. This is a must-have for low bitrates, but if the + algorythm is very good it could also be used in every case. + Note: mpg123 (and all derivatives, like xmms and lame/mpglib) + have bugs in the intensity stereo decoding. Bugs have been there + for years since there are very few intensity stereo mp3's out there. + + + +95. Merge GOGO's fast assembler routines. + + + +96. It would be nice to save some information whilst encoding + a: wave -> mp3 + a RIFF/wave can contain LIST chunks with information + about author, title, etc. + ==> could go into TAG fields of resulting mp3 + b: mp3 -> mp3 + ==> we could copy the TAG directly + c: mp3 -> wave + ==> copy TAG into LIST chunk + + + +97. Integrate plusV extensions + + + +99. To be able to encode as fast as FastEnc diff --git a/USAGE b/USAGE new file mode 100644 index 0000000..e713498 --- /dev/null +++ b/USAGE @@ -0,0 +1,968 @@ + +% lame [options] inputfile [outputfile] + inputfile and/or outputfile can be "-", which means stdin/stdout. + +For more options, just type: +% lame --help or lame --longhelp + +Note: The HTML documentation is more complete than this text file. + + +======================================================================= +Constant Bitrate Examples: +======================================================================= +fixed bit rate jstereo 128 kbps encoding: +% lame -b128 sample.wav sample.mp3 + +Use highest quality mode, slowest: +% lame -q0 -b128 sample.wav sample.mp3 + +Use fast encode, low quality (no noise shaping) +% lame -f -b128 sample.wav sample.mp3 + + +======================================================================= +Variable Bitrate Examples: +======================================================================= +LAME has two types of variable bitrate: ABR and VBR. + +ABR is the type of variable bitrate encoding usually found in other +MP3 encoders, Vorbis and AAC. The number of bits is determined by +some metric (like perceptual entropy, or just the number of bits +needed for a certain set of encoding tables), and it is not based on +computing the actual encoding/quantization error. ABR should always +give results equal or better than CBR: + +ABR: (--abr means encode with an average bitrate of around x kbps) +% lame --abr 128 sample.wav sample.mp3 + +Another way to enable abr is: +% lame --preset 128 sample.wav sample.mp3 + + +VBR is a true variable bitrate mode which bases the number of bits for +each frame on the measured quantization error relative to the +estimated allowed masking. The value 0 is the highest quality, which +creates bigger files, and the lowest is 9.999, which creates the smallest +files. Decimal values can be specified, like: 4.51. +The resulting filesizes depend on the input material. On typical music +you can expect -V5 resulting in files averaging 132 kbps, -V2 averaging +200 kbps. + +Variable Bitrate (VBR): (use -V n to adjust quality/filesize) +% lame -V2 sample.wav sample.mp3 + + +======================================================================= +Low Bitrates +======================================================================= +At lower bitrates, (like 24 kbps per channel), it is recommended that +you use a 16 kHz sampling rate combined with lowpass filtering. LAME, +as well as commercial encoders (FhG, Xing) will do this automatically. +However, if you feel there is too much (or not enough) lowpass +filtering, you may need to try different values of the lowpass cutoff +and passband width (--resample, --lowpass and --lowpass-width options). + + +======================================================================= +Streaming Example +======================================================================= + +% cat inputfile | lame [options] - - > output + + +======================================================================= +Scripts are included (in the 'misc' subdirectory) +to run lame on multiple files: + +bash script: mlame Run "mlame -?" for instructions. +sh script: auenc Run auenc for instructions +sh script: mugeco.sh + +Perl script which will re-encode mp3 files and preserve id3 tags: +lameid3.pl + +Windows scripts: +lame4dos.bat +Lame.vbs (and an HTML frontend: LameGUI.html) + + +======================================================================= +options guide: +======================================================================= +These options are explained in detail below. + +By default, LAME accepts a PCM audio sample inside a .WAV container as the +input file, in 8, 16, 24 and 32 bits integer and in IEEE FLOAT. +If it is compiled with libsndfile, then it also supports the extra formats +that the library supports. +There is also support for raw PCM data and piped input + + +Input options: +--scale multiply PCM input by +--scale-l scale channel 0 (left) input (multiply PCM data) by +--scale-r scale channel 1 (right) input (multiply PCM data) by +--gain number apply Gain adjustment in decibels, range -20.0 to +12.0. +--swap-channel Swap Left and Right input channels +--mp1input input file is an MPEG 1 Layer I file. decode on the fly +--mp2input input file is an MPEG 1 Layer II file. decode on the fly +--mp3input input file is an MPEG 1 Layer III file. decode on the fly +--nogap <...> + gapless encoding for a set of contiguous files +--nogapout + output dir for gapless encoding (must precede --nogap) +--nogaptags allow the use of VBR tags in gapless encoding +--out-dir path If no explicit output file is specified, a file will be + written at given path. Ignored when using piped/streamed input + + +Input options for raw PCM: +-r read the input file as a raw (headerless) PCM stream +-s n input sampling frequency in kHz (Default 44.1Khz) +--signed input is signed (default) +--unsigned input is unsigned +--bitwidth w input bit width is w (default 16) +-x swap bytes of input file +--little-endian input is little-endian (default) +--big-endian input is big-endian +-a downmix stereo file to mono file for mono encoding. + Needed with raw input for the -mm mode to do the downmix. + +Resampling and filtering: +--lowpass Frequency(kHz), lowpass filter cutoff above freq. + Range [0.001..50]kHz or [50..50000]Hz +--lowpass-width + Frequency(kHz), lowpass window width. + Range [0.001..16]kHz or [16..50000]Hz + (See further restriction in the detailed explanation) +--highpass Frequency(kHz), highpass filter cutoff below freq. + Range [0.001..16]kHz or [16..50000]Hz + (See further restriction in the detailed explanation) +--highpass-width + Frequency(kHz), highpass window width + (See further restriction in the detailed explanation) +--resample n Sampling frequency of output file(kHz) + Default=automatic depending on settings like bitrate. + +Operational: +--preset type Enables some preconfigured settings. Check below for each + of the valid values +--decode assume input file is an mp3 file, and decode to wav. +--decode-mp3delay samples + Set the encoder delay to use to decode the input .mp3 file +-t disable writing of WAV header when using --decode + (decode to raw pcm, native endian format (use -x to swap)) + +-m m/s/j/f/a mode selection +-q n Internal algorithm quality setting 0..9. + 0 = slowest algorithms, but potentially highest quality + 9 = faster algorithms, very poor quality + Default is 3. Read the differences between VBR and CBR below. +-h same as -q2 +-f same as -q7 + +--priority + sets the process priority (Windows and OS/2-specific): + 0,1 = Low priority (IDLE_PRIORITY_CLASS) + 2 = normal priority (NORMAL_PRIORITY_CLASS, defaul + 3,4 = High priority (HIGH_PRIORITY_CLASS)) + Note: Calling '--priority' without a parameter will set it to 0. + + + +Constant Bit Rate (CBR) +-b n set bitrate (8, 16, 24, ..., 320) +--freeformat produce a free format bitstream. User must also specify + a bitrate with -b, between 8 and 640 kbps. + +Variable Bit Rate (VBR) +-v VBR ( alias of -V 4 ) +--vbr-old use old variable bitrate (VBR) routine +--vbr-new use new variable bitrate (VBR) routine (default) +-V n VBR quality setting (0=highest quality, 9.999=lowest) +-b n specify a minimum allowed bitrate (8,16,24,...,320) +-B n specify a maximum allowed bitrate (8,16,24,...,320) +-F strictly enforce minimum bitrate +-t disable VBR informational tag +--nohist disable display of VBR bitrate histogram + +--abr n specify average bitrate desired + + + +MP3 header/stream options: +-e n/5/c de-emphasis +-p add CRC error protection +-c mark the encoded file as copyrighted +-o mark the encoded file as a copy +-S don't print progress report, VBR histogram +--strictly-enforce-ISO comply as much as possible to ISO MPEG spec +--replaygain-fast compute RG fast but slightly inaccurately (default) +--replaygain-accurate compute RG more accurately and find the peak sample +--noreplaygain disable ReplayGain analysis +--clipdetect enable --replaygain-accurate and print a message whether + clipping occurs and how far the waveform is from full scale + + +ID3 tagging: + +--tt audio/song title (max 30 chars for version 1 tag) +--ta <artist> audio/song artist (max 30 chars for version 1 tag) +--tl <album> audio/song album (max 30 chars for version 1 tag) +--ty <year> audio/song year of issue (1 to 9999) +--tc <comment> user-defined text (max 30 chars for v1 tag, 28 for v1.1) +--tn <track[/total]> + audio/song track number (1 to 255, creates v1.1 tag. + adding a total force a version 2 tag) +--tg <genre> audio/song genre (name or number in list) +--ti <file> audio/song albumArt (jpeg/png/gif file, v2.3 tag) +--tv <id=value> user-defined frame specified by id and value (v2.3 tag) +--add-id3v2 force addition of version 2 tag +--id3v1-only add only a version 1 tag +--id3v2-only add only a version 2 tag +--id3v2-utf16 add following options in unicode text encoding +--id3v2-latin1 add following options in latin-1 text encoding +--space-id3v1 pad version 1 tag with spaces instead of nulls +--pad-id3v2 same as '--pad-id3v2-size 128' +--pad-id3v2-size <num> + adds version 2 tag, pad with extra <num> bytes +--genre-list print alphabetically sorted ID3 genre list and exit +--ignore-tag-errors + ignore errors in values passed for tags + +Note: A version 2 tag will NOT be added unless one of the input fields +won't fit in a version 1 tag (e.g. the title string is longer than 30 +characters), or the '--add-id3v2' or '--id3v2-only' options are used, +or output is redirected to stdout. + + +Verbosity: +--disptime secs Print progress report every secs seconds +--nohist Disable VBR histogram display +--silent Don't print anything on screen +--quiet Don't print anything on screen +--verbose Print a lot of useful information +--version Print License information +--license Print License information +--help Shows the common list of switches. + Add id3 or dev to get help for a specified topic +--usage Shows the common list of switches. + Add id3 or dev to get help for a specified topic +--longhelp Shows the complete list of switches + + + +======================================================================= +Detailed description of all options in alphabetical order +======================================================================= + + +======================================================================= +Downmix +======================================================================= +-a + +mix the stereo input file to mono and encode as mono. + +This option is only needed in the case of raw PCM stereo input +(because LAME cannot determine the number of channels in the input file). +To encode a stereo (RAW) PCM input file as mono, use "lame -m m -a" + +For WAV and AIFF input files, using "-m m" will always produce a +mono .mp3 file from both mono and stereo input. + + +======================================================================= +Average bitrate encoding (aka Safe VBR) +======================================================================= +--abr n + +turns on encoding with a targeted average bitrate of n kbps, allowing +to use frames of different sizes. The allowed range of n is 8...320 +kbps, you can use any integer value within that range. + + +======================================================================= +Use version 2 of the ID3 tag standard +======================================================================= + --add-id3v2 Force addition of version 2 tag + +Tells LAME to add the tag information as id3v2. This implies adding both, +a version 1 and a version 2 tag, if the values fit on a version 1 tag. +See --id3v1-only and --id3v2-only if you want a more fine-grained control. + + +======================================================================= +Bitrate +======================================================================= +-b n + +MPEG-1 layer III sample frequencies (kHz): 32 48 44.1 +bitrates (kbps): 32 40 48 56 64 80 96 112 128 160 192 224 256 320 + +MPEG-2 layer III sample frequencies (kHz): 16 24 22.05 +bitrates (kbps): 8 16 24 32 40 48 56 64 80 96 112 128 144 160 + +MPEG-2.5 layer III sample frequencies (kHz): 8 12 11.025 +bitrates (kbps): 8 16 24 32 40 48 56 64 + +The bitrate to be used. Default is 128kbps in MPEG1 (64 for mono), +64kbps in MPEG2 (32 for mono) and 32kbps in MPEG2.5 (16 for mono). + +When used with variable bitrate encodings (VBR), -b specifies the +minimum bitrate to use. This is useful only if you need to circumvent +a buggy hardware device with strange bitrate constrains. + + +======================================================================= +Max bitrate +======================================================================= +-B n + +see also option "-b" for allowed bitrates. + +Maximum allowed bitrate when using VBR/ABR. + +Using -B is NOT RECOMMENDED. A 128 kbps CBR bitstream, because of the +bit reservoir, can actually have frames which use as many bits as a +320 kbps frame. ABR/VBR modes minimize the use of the bit reservoir, and +thus need to allow 320 kbps frames to get the same flexability as CBR +streams. This is useful only if you need to circumvent a buggy hardware +device with strange bitrate constrains. + + +======================================================================= +Endianess, big. +======================================================================= + --big-endian Set the byte order to big-endian. + +This switch tells LAME that the RAW pcm input is encoded in big-endian +instead of little-endian. + + +======================================================================= +Sample bit with +======================================================================= +--bitwidth Sets the bitwidth value + +With RAW pcm input, this switch lets you specify the bitwidth of the same +(8 bits, 16 bits...) + + +======================================================================= +Copyright +======================================================================= +-c + +flag the encoded file as copyrighted + + +======================================================================= +Clipping detection +======================================================================= +--clipdetect + +Enable --replaygain-accurate and print a message whether clipping +occurs and how far in dB the waveform is from full scale. + +This option is not usable if the MP3 decoder was _explicitly_ disabled +in the build of LAME. + +See also: --replaygain-accurate + + +======================================================================= +MPEG audio decode capability +======================================================================= +--decode + +This uses LAME's HIP decoder to decode an MP3 file (layers 1, 2 and 3) to +a wav file. + +If -t is used (disable wav header), LAME will output +raw pcm in native endian format (use -x to swap bytes). + +This option is not usable if the MP3 decoder was _explicitly_ disabled +in the build of LAME. + +HIP stands for Hip Isn't a Player and is based off of Michael Hipp's mpglib 0.2a + + +======================================================================= +MPEG audio decode capability +======================================================================= +--decode-mp3delay x Indicate a different encoder delay for decoding + +When decoding an mp3 file, LAME automatically corrects for the start delay +that the encoder had to put into it. This setting lets you specify a different +delay than LAME's own one, so that it is possible to compensate for the delay +of mp3's generated with other encoders. + + +======================================================================= +De-emphasis +======================================================================= +-e n/5/c + + n = (none, default) + 5 = 0/15 microseconds + c = CCITT j.17 + +All this does is set a flag in the bitstream. If you have a PCM +input file where one of the above types of (obsolete) emphasis has +been applied, you can set this flag in LAME. Then the mp3 decoder +should de-emphasize the output during playback, although most +decoders ignore this flag. + +A better solution would be to apply the de-emphasis with a standalone +utility before encoding, and then encode without -e. + + +======================================================================= +Strictly enforce VBR minimum bitrate +======================================================================= +-F + +strictly enforce VBR minimum bitrate. Without this option, passages of +analog silence will be encoded at the minimum bitrate possible (32 or 8, +depending on MPEG version). + + +======================================================================= +Free format bitstreams +======================================================================= +--freeformat + +LAME will produce a fixed bitrate, free format bitstream. User must +specify the desired bitrate in kbps, which can be any integer between +8 and 640. + +Not supported by most decoders. Complient decoders (of which there +are few) are only required to support up to 320 kbps. + +Decoders known to handle free format: + + supports up to +mpg123 640 kbps +MAD 640 kbps +"lame --decode" 640 kbps +l3dec 310 kbps + + +======================================================================= +Gain +======================================================================= +--gain Apply gain in decibels. + +Apply Gain adjustment in decibels, range -20.0 to +12.0. 0dBFS means no +amplification. + + +======================================================================= +High pass filter +======================================================================= +--highpass number Use a highpass filter when encoding + +Enables a highpass filter of the specified frequency when encoding the source. + Range [0.001..50]kHz or [50..50000]Hz. +This is usually not required, and the gains are usually minimal. May be useful +to remove an interference signal on 50Hz or 60Hz, or a DC offset. +(default: disabled) +Note: The current implementation has a minimum highpass frequency of +(67.5/62)% of the sample rate (I.e. 481Hz at 44Khz). + + +======================================================================= +High pass filter +======================================================================= +--highpass-width width Set the width of the decaying curve. + +Specify the width in Hz of the decaying curve of the highpass. + Range [16..50000]Hz +The minimum (and default) width is 75% of a band's width (which is 1/64th of + the sample rate). +Note: See the remark in the --highpass command above. + + +======================================================================= +ID3 tag modes +======================================================================= +--id3v1-only Disable the use of id3v2. + +Put it before any tag setting. +This setting tells LAME to use ID3 v1 tag only, and not create an ID3v2 +even if it thinks it should. + +--id3v2-only Disable the user ov id3v1. + +Put it before any tag setting. +This setting tells LAME to use ID3 v2 tag only. An ID3 v1 tag would not +be written. + +--ignore-tag-errors Ignore tag information errors + +Put it before any tag setting. +This tells lame to ignore the tag information it sees as erroneous and +continue encoding without those. Without this setting, errors are reported +and encoding does not start. + + +======================================================================= +Endianess. little +======================================================================= +--little-endian Set the byte order to little-endian. + +This switch tells LAME that the RAW pcm input is encoded in little-endian. +It is the default setting. + + +======================================================================= +Low pass filter +======================================================================= +--lowpass number Use a lowpass filter when encoding + +Enables a lowpass filter of the specified frequency when encoding the source. + Range [0.001..50]kHz or [50..50000]Hz + +Using a lowpass filter helps reducing the amount of data to encode. This is +important in MP3 due to a limitation in very high frequencies (>16Khz). +The default value depends on the target bitrate/quality. It is not recommended +to change it as a general basis. + +--lowpass-width width Set the width of the decaying curve. + +Specify the width in Hz of the decaying curve of the lowpass. + Range [0.001..16]kHz or [16..50000]Hz +The lowpass is in the center of this curve. The minimum (and default) width +is 75% of a band's width (which is 1/64th of the sample rate). + + +======================================================================= +Modes: +======================================================================= +-m m mono +-m l get only the left channel of a stereo signal for a mono output +-m r get only the right channel of a stereo signal for a mono output +-m s (forced) L/R stereo +-m j joint stereo +-m f forced mid/side stereo +-m d dual (independent) channels. Its purpose was meant for dual language + streams where only one of them should be decoded. + Most decoders just decode them as a stereo stream. +-m a Currently, a synonym of m j. (In older releases it selected + different modes depending on the bitrate) + +MONO is the default mode for mono input files. If "-m m" is specified +for a stereo input file, the two channels will be averaged into a mono +signal. (Note: See comments about the -a switch for RAW PCM streams) + +(FORCED) L/R STEREO encodes the left and the right signals independently, +and gives more or less bits to each, depending on the currently available. + +JOINT STEREO is the default mode of encoding. +jstereo means the encoder can use (on a frame by frame basis) either +L/R stereo or mid/side stereo. In mid/side stereo, the mid(L+R) and side(L-R) +channels are encoded, and more bits are allocated to the mid channel +than the side channel. When there isn't too much stereo separation, this +effectively increases the bandwidth, so having higher quality with the same +amount of bits. + +Using mid/side stereo inappropriately can result in audible +compression artifacts. Too much switching between mid/side and L/R +stereo can also sound bad. To determine when to switch to mid/side +stereo, LAME uses a much more sophisticated algorithm than that +described in the ISO documentation. + +FORCED MID/SIDE STEREO forces all frames to be encoded mid/side stereo. It +should only be used if you are sure every frame of the input file +has very little stereo seperation. + +DUAL CHANNEL mode is similar to encode the left and right as two mono signals. +Its purpose was meant for Dual language streams where only one of them should +be decoded. Most decoders just decode them as a stereo stream + +INTENSITY STEREO + Not supported. + + +======================================================================= +MP3 input file +======================================================================= +--mp1input --mp2input --mp3input MPEG layer I, II or III input file + +Assume the input file is a MP1/2/3 file. LAME will decode the input file +before re-encoding it. Since MP3 is a lossy format, this is not recommended +in general. But it is useful for creating low bitrate mp3s from high bitrate +mp3s. If the filename ends in ".mp3" LAME will assume it is an MP3. For +stdin or MP3 files which dont end in .mp3 you need to use this switch. + + +======================================================================= +No Gap (continuous audio) encoding of multiple files +======================================================================= + --nogap file1 file2 [...] Encodes multiple continuous files. + +Encodes multiple files (ordered by position) which are meant to be played +gaplessly. + +By default, LAME will encode the files with accurate length, but the first +and last frame may contain a few erroneous samples for signals that don't +fade-in/out (as is the case of continuous playback). + +This setting solves that by using the samples from the next/previous file to +compute the encoding. + +--nogapout dir Specify a directory for the output of the files encoded + with --nogap + +This setting should precede --nogap, and is used to specify the alternate +directory where to store the encoded files. The default one is the input file +directory. + +--nogaptags Enables the use of VBR tags with files encoded with --nogap + +Tells LAME to put VBR tags to encoded files if they are encoded in VBR or ABR +modes. Else, using the --nogap option doesn't generate it. + + +======================================================================= +Disable historgram display +======================================================================= +--nohist + +By default, LAME will display a bitrate histogram while producing +VBR mp3 files. This will disable that feature. + + +======================================================================= +Disable ReplayGain analysis +======================================================================= +--noreplaygain + +By default ReplayGain analysis is enabled. This switch disables it. + +See also: --replaygain-accurate, --replaygain-fast + + +======================================================================= +Non-original +======================================================================= +-o + +mark the encoded file as a copy + + +======================================================================= +CRC error protection +======================================================================= +-p + +Turn on CRC error protection. +It will add a cyclic redundancy check (CRC) code in each frame, allowing +to detect transmission errors that could occur on the MP3 stream. However, +it takes 16 bits per frame that would otherwise be used for encoding, and +therefore will slightly reduce the sound quality. + + +======================================================================= +ID3 V2 padding +======================================================================= + --pad-id3v2 Pad ID3v2 tag. + +Pads the ID3v2 tag with extra 128bytes to allow it to expand. + + +======================================================================= +Preset system. +======================================================================= +--preset x Enable one of the presets + + Setting Meaning +--preset medium -V 5 +--preset standard -V 2 +--preset extreme -V 0 +--preset insane -b 320 +--preset fast xxx In versions older than LAME 3.98, "fast" was needed to + enable the vbr-new routine. It is no longer needed. +--preset number --abr number +--preset cbr number -b number + +Old compatibility settings. Meaningless +--preset phone -b 16 -m m +--preset phon+ / + lw / mw-eu -b 24 -m m +--preset mw-us -b 40 -m m +--preset voice -b 56 -m m +--preset fm / radio -b 112 +--preset hifi -b 160 +--preset cd -b 192 +--preset studio -b 256 + + +======================================================================= +Windows and OS/2 process priority control +======================================================================= +--priority <type> + +(Windows and OS/2 only) + +Sets the process priority for LAME while running under Windows or IBM OS/2. +This can be very useful to avoid the system becoming slow and/or unresponsive. +By setting LAME to run in a lower priority, you leave more time for the system +to update basic processing (drawing windows, polling keyboard/mouse, etc). The +impact in LAME's performance is minimal if you use priority 0 to 2. + +The valid parameters are: + + 0 = Low priority (IDLE, delta = 0) + 1 = Medium priority (IDLE, delta = +31) + 2 = Regular priority (REGULAR, delta = -31) + 3 = High priority (REGULAR, delta = 0) + 4 = Maximum priority (REGULAR, delta = +31) + +Note that if you call '--priority' without a parameter, priority 0 will be +assumed. + + +======================================================================= +Algorithm quality selection +======================================================================= +-q n + +Bitrate is of course the main influence on quality. The higher the bitrate, +the higher the quality. But for a given bitrate, we have a choice of algorithms +to determine the best scalefactors and Huffman coding (noise shaping). + +For CBR, ABR and --vbr-old modes, the following table applies + +-q 0 Use the best algorithms (Best Huffman coding search, full outer + loop, and the highest precision of several parameters). +-q 1 to -q 4 Similar to -q 0 without the full outer loop and decreasing + precision of parameters the further from q0. -q 3 is the default +-q 5 and -q 6 Same as -q 7, but enables noise shaping and increases subblock + gain +-q 7 to -q 9 Same as -f. Very fast, OK quality. Psychoacoustics are used for + pre-echo and mid/side stereo, but no noise-shaping is done. + +For the default VBR mode since LAME 3.98, the following table applies + +-q 0 to -q 4 include all features of the other modes and additionally use + the best search when applying Huffman coding. +-q 5 and -q 6 include all features of -q7, calculate and consider actual + quantisation noise, and additionally enable subblock gain. +-q 7 to -q 9 This level uses a psymodel but does not calculate quantisation + noise when encoding: it takes a quick guess. + + +======================================================================= +Input file is raw pcm +======================================================================= +-r + +Assume the input file is raw pcm. Sampling rate and mono/stereo/jstereo +must be specified on the command line. Without -r, LAME will perform +several fseek()'s on the input file looking for WAV and AIFF headers. + +Not supported if LAME is compiled to use LIBSNDFILE. + + +======================================================================= +Slightly more accurate ReplayGain analysis and finding the peak sample +======================================================================= +--replaygain-accurate + +Compute "Radio" ReplayGain on the decoded data stream. Find the peak sample +by decoding on the fly the encoded data stream and store it in the file. + + +ReplayGain analysis does _not_ affect the content of a compressed data +stream itself, it is a value stored in the header of a sound file. +Information on the purpose of ReplayGain and the algorithms used is +available from http://www.replaygain.org/ + +By default, LAME performs ReplayGain analysis on the input data (after +the user-specified volume scaling). This behaviour might give slightly +inaccurate results because the data on the output of a lossy +compression/decompression sequence differs from the initial input data. +When --replaygain-accurate is specified the mp3 stream gets decoded on +the fly and the analysis is performed on the decoded data stream. +Although theoretically this method gives more accurate results, it has +several disadvantages: + * tests have shown that the difference between the ReplayGain values + computed on the input data and decoded data is usually no greater + than 0.5dB, although the minimum volume difference the human ear + can perceive is about 1.0dB + * decoding on the fly significantly slows down the encoding process +The apparent advantage is that: + * with --replaygain-accurate the peak sample is determined and + stored in the file. The knowledge of the peak sample can be useful + to decoders (players) to prevent a negative effect called 'clipping' + that introduces distortion into sound. + + +Only the "Radio" ReplayGain value is computed. It is stored in the LAME tag. +The analysis is performed with the reference volume equal to 89dB. +Note: the reference volume has been changed from 83dB on transition from +version 3.95 to 3.95.1. + +This option is not usable if the MP3 decoder was _explicitly_ disabled +in the build of LAME. (Note: if LAME is compiled without the MP3 decoder, +ReplayGain analysis is performed on the input data after user-specified +volume scaling). + +See also: --replaygain-fast, --noreplaygain, --clipdetect + + +======================================================================= +Fast ReplayGain analysis +======================================================================= +--replaygain-fast + +Compute "Radio" ReplayGain of the input data stream after user-specified +volume scaling and/or resampling. + +ReplayGain analysis does _not_ affect the content of a compressed data +stream itself, it is a value stored in the header of a sound file. +Information on the purpose of ReplayGain and the algorithms used is +available from http://www.replaygain.org/ + +Only the "Radio" ReplayGain value is computed. It is stored in the LAME tag. +The analysis is performed with the reference volume equal to 89dB. +Note: the reference volume has been changed from 83dB on transition +from version 3.95 to 3.95.1. + +This switch is enabled by default. + +See also: --replaygain-accurate, --noreplaygain + + +======================================================================= +Output sampling frequency in kHz +======================================================================= +--resample n + +where n = 8, 11.025, 12, 16, 22.05, 24, 32, 44.1, 48. The values as Hz +instead of Khz are also supported. Else, the value will be ignored. + +Output sampling frequency. Resample the input if necessary. + +If not specified, LAME may sometimes resample automatically +when faced with extreme compression conditions (like encoding +a 44.1 kHz input file at 32 kbps). To disable this automatic +resampling, you have to use --resamle to set the output samplerate +equal to the input samplerate. In that case, LAME will not +perform any extra computations. + + +======================================================================= +Sampling frequency in kHz (for input RAW PCM) +======================================================================= +-s n + +where n = sampling rate in kHz. + +Required for raw PCM input files. Otherwise it will be determined +from the header information in the input file. + +LAME will automatically resample the input file to one of the +supported MP3 samplerates if necessary. + + +======================================================================= +Silent operation +======================================================================= +-S + +don't print progress report + + +======================================================================= +Scale +======================================================================= +--scale <arg> + +Scales input by <arg>. This just multiplies the PCM data +(after it has been converted to floating point) by <arg>. + +<arg> > 1: increase volume +<arg> = 1: no effect +<arg> < 1: reduce volume + +Use with care, since most MP3 decoders will truncate data +which decodes to values greater than 32768. + + +======================================================================= +Strict ISO complience +======================================================================= +--strictly-enforce-ISO + +With this option, LAME will enforce the 7680 bit limitation on +total frame size. This results in many wasted bits for +high bitrate encodings. + + +======================================================================= +Disable VBR tag/WAV header +======================================================================= +-t +This setting has two different uses: + +When encoding to VBR, this setting disables writing the VBR Tag (also +known as XING tag). This tag is embedded by default in the frame 0 of +MP3 file. It allows VBR aware players to accurately seek and compute playing +times in such files. + +When decoding MP3 to WAV using --decode, this flag will disable writing the +WAV header. The output will be raw pcm, native endian format. Use -x to swap +bytes. + + +======================================================================= +VBR quality setting +======================================================================= + -V n Enable VBR encoding + +Encodes using the VBR algorithm, at the indicated quality. +0=highest quality, bigger files. 9.999=lowest quality, smaller files. +Decimal values can be specified, like: 4.51 + +On average, the resulting bitrates are as follows: +Setting Average bitrate (kbps) + 0 245 + 2 190 + 3 175 + 4 165 + 5 130 + +Using -V 7 or higher (lower quality) is not recommended. +ABR usually produces better results. + + +======================================================================= +Swap bytes +======================================================================= +-x + +swap bytes in the input file (and output file when using --decode). +For sorting out little endian/big endian type problems. If your encodings +sound like static, try this first. + + +======================================================================= +Ignore scalefactor band 21 +======================================================================= +-Y Ignore noise in sbf21, like CBR mode does + +Allows -V2, -V1 and -V0 to not encode the highest frequencies accurately, +if doing so causes disproportional increases in bitrate. +This is the same that CBR and ABR modes do. + +Due to the design of the MP3 format, to keep precision in the last scalefactor +band, an encoder needs to increase the precision in all the bands (not only in +this one). +The consequence is an increase of bitrate (+60kbps in some cases) compared to +not keeping that precision. Generally, this band should allow for distortions, +so using this switch shouldn't cause harm. + diff --git a/acinclude.m4 b/acinclude.m4 new file mode 100644 index 0000000..eef0c3d --- /dev/null +++ b/acinclude.m4 @@ -0,0 +1,281 @@ +dnl acinclude.m4. Change *this* file to add new or change macros. +dnl When changes have been made, delete aclocal.m4 and run +dnl "aclocal". +dnl +dnl DO NOT change aclocal.m4 ! +dnl + +dnl * LA_SEARCH_FILE(variable, filename, PATH) +dnl * Search "filename" in the specified "PATH", "variable" will +dnl * contain the full pathname or the empty string +dnl * PATH is space-separated list of directories. +dnl * by Florian Bomers + +AC_DEFUN([LA_SEARCH_FILE],[ + $1= + dnl hack: eliminate line feeds in $2 + for FILE in $2; do + for DIR in $3; do + dnl use PATH in order + if test ".$1"="." && test -f "$DIR/$FILE"; then + $1=$DIR + fi + done + done +]) + +dnl * LA_SEARCH_LIB(lib-variable, include-variable, lib-filename, header-filename, prefix) +dnl * looks for "lib-filename" and "header-filename" in the area of "prefix". +dnl * if found, "lib-variable" and "include-variable" are set to the +dnl * respective paths. +dnl * prefix is a single path +dnl * libs are searched in prefix, prefix/lib, prefix/.., prefix/../lib +dnl * headers are searched in prefix, prefix/include, prefix/.., prefix/../include +dnl * +dnl * If one of them is not found, both "lib-variable", "include-variable" are +dnl * set to the empty string. +dnl * +dnl * TODO: assert function call to verify lib +dnl * +dnl * by Florian Bomers + +AC_DEFUN([LA_SEARCH_LIB],[ + dnl look for lib + LA_SEARCH_FILE($1, $3, $5 $5/lib $5/.. $5/../lib) + dnl look for header. + LA_SEARCH_FILE($2, $4, $5 $5/include $5/.. $5/../include) + if test ".$1" = "." || test ".$2" = "."; then + $1= + $2= + fi +]) + + + + +# alex_IEEE854_FLOAT80 +# ------------ +AC_DEFUN([alex_IEEE854_FLOAT80], +[AC_CACHE_CHECK(for IEEE854 compliant 80 bit floats, alex_cv_ieee854_float80, +[AC_TRY_RUN([ +int float2long_IEEE_compliance ( void ) +{ + struct { + long padding; /* to prevent unaligned access */ + float f; + } s; + s.f = 12582912.; if ( *(long*)(&s.f) != 1262485504l ) return 0; + s.f = 12615679.; if ( *(long*)(&s.f) != 1262518271l ) return 0; + s.f = 13582912.; if ( *(long*)(&s.f) != 1263485504l ) return 0; + s.f = 12550145.; if ( *(long*)(&s.f) != 1262452737l ) return 0; + s.f = 11582912.; if ( *(long*)(&s.f) != 1261485504l ) return 0; + return 1; +} + +int main(void) +{ + int retval; + + retval = float2long_IEEE_compliance(); + + /* no error return -> success */ + return !retval; +} +], alex_cv_ieee854_float80=yes, alex_cv_ieee854_float80=no, +[AC_MSG_WARN(can't check for IEEE854 compliant 80 bit floats)] +)])]) # alex_IEEE854_FLOAT80 + +# Configure paths for GTK+ +# Owen Taylor 97-11-3 + +dnl AM_PATH_GTK([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]]) +dnl Test for GTK, and define GTK_CFLAGS and GTK_LIBS +dnl +AC_DEFUN([AM_PATH_GTK], +[dnl +dnl Get the cflags and libraries from the gtk-config script +dnl +AC_ARG_WITH(gtk-prefix,[ --with-gtk-prefix=PFX Prefix where GTK is installed (optional)], + gtk_config_prefix="$withval", gtk_config_prefix="") +AC_ARG_WITH(gtk-exec-prefix,[ --with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional)], + gtk_config_exec_prefix="$withval", gtk_config_exec_prefix="") +AC_ARG_ENABLE(gtktest, [ --disable-gtktest Do not try to compile and run a test GTK program], + , enable_gtktest=yes) + + for module in . $4 + do + case "$module" in + gthread) + gtk_config_args="$gtk_config_args gthread" + ;; + esac + done + + if test x$gtk_config_exec_prefix != x ; then + gtk_config_args="$gtk_config_args --exec-prefix=$gtk_config_exec_prefix" + if test x${GTK_CONFIG+set} != xset ; then + GTK_CONFIG=$gtk_config_exec_prefix/bin/gtk-config + fi + fi + if test x$gtk_config_prefix != x ; then + gtk_config_args="$gtk_config_args --prefix=$gtk_config_prefix" + if test x${GTK_CONFIG+set} != xset ; then + GTK_CONFIG=$gtk_config_prefix/bin/gtk-config + fi + fi + + AC_PATH_PROG(GTK_CONFIG, gtk-config, no) + min_gtk_version=ifelse([$1], ,0.99.7,$1) + AC_MSG_CHECKING(for GTK - version >= $min_gtk_version) + no_gtk="" + if test "$GTK_CONFIG" = "no" ; then + no_gtk=yes + else + GTK_CFLAGS=`$GTK_CONFIG $gtk_config_args --cflags` + GTK_LIBS=`$GTK_CONFIG $gtk_config_args --libs` + gtk_config_major_version=`$GTK_CONFIG $gtk_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + gtk_config_minor_version=`$GTK_CONFIG $gtk_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + gtk_config_micro_version=`$GTK_CONFIG $gtk_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test "x$enable_gtktest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $GTK_CFLAGS" + LIBS="$GTK_LIBS $LIBS" +dnl +dnl Now check if the installed GTK is sufficiently new. (Also sanity +dnl checks the results of gtk-config to some extent +dnl + rm -f conf.gtktest + AC_TRY_RUN([ +#include <gtk/gtk.h> +#include <stdio.h> +#include <stdlib.h> + +int +main () +{ + int major, minor, micro; + char *tmp_version; + + system ("touch conf.gtktest"); + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = g_strdup("$min_gtk_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_gtk_version"); + exit(1); + } + + if ((gtk_major_version != $gtk_config_major_version) || + (gtk_minor_version != $gtk_config_minor_version) || + (gtk_micro_version != $gtk_config_micro_version)) + { + printf("\n*** 'gtk-config --version' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n", + $gtk_config_major_version, $gtk_config_minor_version, $gtk_config_micro_version, + gtk_major_version, gtk_minor_version, gtk_micro_version); + printf ("*** was found! If gtk-config was correct, then it is best\n"); + printf ("*** to remove the old version of GTK+. You may also be able to fix the error\n"); + printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n"); + printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); + printf("*** required on your system.\n"); + printf("*** If gtk-config was wrong, set the environment variable GTK_CONFIG\n"); + printf("*** to point to the correct copy of gtk-config, and remove the file config.cache\n"); + printf("*** before re-running configure\n"); + } +#if defined (GTK_MAJOR_VERSION) && defined (GTK_MINOR_VERSION) && defined (GTK_MICRO_VERSION) + else if ((gtk_major_version != GTK_MAJOR_VERSION) || + (gtk_minor_version != GTK_MINOR_VERSION) || + (gtk_micro_version != GTK_MICRO_VERSION)) + { + printf("*** GTK+ header files (version %d.%d.%d) do not match\n", + GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION); + printf("*** library (version %d.%d.%d)\n", + gtk_major_version, gtk_minor_version, gtk_micro_version); + } +#endif /* defined (GTK_MAJOR_VERSION) ... */ + else + { + if ((gtk_major_version > major) || + ((gtk_major_version == major) && (gtk_minor_version > minor)) || + ((gtk_major_version == major) && (gtk_minor_version == minor) && (gtk_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** An old version of GTK+ (%d.%d.%d) was found.\n", + gtk_major_version, gtk_minor_version, gtk_micro_version); + printf("*** You need a version of GTK+ newer than %d.%d.%d. The latest version of\n", + major, minor, micro); + printf("*** GTK+ is always available from ftp://ftp.gtk.org.\n"); + printf("***\n"); + printf("*** If you have already installed a sufficiently new version, this error\n"); + printf("*** probably means that the wrong copy of the gtk-config shell script is\n"); + printf("*** being found. The easiest way to fix this is to remove the old version\n"); + printf("*** of GTK+, but you can also set the GTK_CONFIG environment to point to the\n"); + printf("*** correct copy of gtk-config. (In this case, you will have to\n"); + printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); + printf("*** so that the correct libraries are found at run-time))\n"); + } + } + return 1; +} +],, no_gtk=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + if test "x$no_gtk" = x ; then + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) + else + AC_MSG_RESULT(no) + if test "$GTK_CONFIG" = "no" ; then + echo "*** The gtk-config script installed by GTK could not be found" + echo "*** If GTK was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the GTK_CONFIG environment variable to the" + echo "*** full path to gtk-config." + else + if test -f conf.gtktest ; then + : + else + echo "*** Could not run GTK test program, checking why..." + CFLAGS="$CFLAGS $GTK_CFLAGS" + LIBS="$LIBS $GTK_LIBS" + AC_TRY_LINK([ +#include <gtk/gtk.h> +#include <stdio.h> +], [ return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version)); ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding GTK or finding the wrong" + echo "*** version of GTK. If it is not finding GTK, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" + echo "***" + echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that" + echo "*** came with the system with the command" + echo "***" + echo "*** rpm --erase --nodeps gtk gtk-devel" ], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means GTK was incorrectly installed" + echo "*** or that you have moved GTK since it was installed. In the latter case, you" + echo "*** may want to edit the gtk-config script: $GTK_CONFIG" ]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + GTK_CFLAGS="" + GTK_LIBS="" + ifelse([$3], , :, [$3]) + fi + AC_SUBST(GTK_CFLAGS) + AC_SUBST(GTK_LIBS) + rm -f conf.gtktest +]) diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 0000000..6cb9103 --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,11980 @@ +# generated automatically by aclocal 1.15.1 -*- Autoconf -*- + +# Copyright (C) 1996-2017 Free Software Foundation, Inc. + +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, +[m4_warning([this file was generated for autoconf 2.69. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically 'autoreconf'.])]) + +# iconv.m4 serial 19 (gettext-0.18.2) +dnl Copyright (C) 2000-2002, 2007-2014, 2016 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], +[ + dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + + dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV + dnl accordingly. + AC_LIB_LINKFLAGS_BODY([iconv]) +]) + +AC_DEFUN([AM_ICONV_LINK], +[ + dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and + dnl those with the standalone portable GNU libiconv installed). + AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles + + dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV + dnl accordingly. + AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) + + dnl Add $INCICONV to CPPFLAGS before performing the following checks, + dnl because if the user has installed libiconv and not disabled its use + dnl via --without-libiconv-prefix, he wants to use it. The first + dnl AC_LINK_IFELSE will then fail, the second AC_LINK_IFELSE will succeed. + am_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) + + AC_CACHE_CHECK([for iconv], [am_cv_func_iconv], [ + am_cv_func_iconv="no, consider installing GNU libiconv" + am_cv_lib_iconv=no + AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [[ +#include <stdlib.h> +#include <iconv.h> + ]], + [[iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);]])], + [am_cv_func_iconv=yes]) + if test "$am_cv_func_iconv" != yes; then + am_save_LIBS="$LIBS" + LIBS="$LIBS $LIBICONV" + AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [[ +#include <stdlib.h> +#include <iconv.h> + ]], + [[iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);]])], + [am_cv_lib_iconv=yes] + [am_cv_func_iconv=yes]) + LIBS="$am_save_LIBS" + fi + ]) + if test "$am_cv_func_iconv" = yes; then + AC_CACHE_CHECK([for working iconv], [am_cv_func_iconv_works], [ + dnl This tests against bugs in AIX 5.1, AIX 6.1..7.1, HP-UX 11.11, + dnl Solaris 10. + am_save_LIBS="$LIBS" + if test $am_cv_lib_iconv = yes; then + LIBS="$LIBS $LIBICONV" + fi + am_cv_func_iconv_works=no + for ac_iconv_const in '' 'const'; do + AC_RUN_IFELSE( + [AC_LANG_PROGRAM( + [[ +#include <iconv.h> +#include <string.h> + +#ifndef ICONV_CONST +# define ICONV_CONST $ac_iconv_const +#endif + ]], + [[int result = 0; + /* Test against AIX 5.1 bug: Failures are not distinguishable from successful + returns. */ + { + iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); + if (cd_utf8_to_88591 != (iconv_t)(-1)) + { + static ICONV_CONST char input[] = "\342\202\254"; /* EURO SIGN */ + char buf[10]; + ICONV_CONST char *inptr = input; + size_t inbytesleft = strlen (input); + char *outptr = buf; + size_t outbytesleft = sizeof (buf); + size_t res = iconv (cd_utf8_to_88591, + &inptr, &inbytesleft, + &outptr, &outbytesleft); + if (res == 0) + result |= 1; + iconv_close (cd_utf8_to_88591); + } + } + /* Test against Solaris 10 bug: Failures are not distinguishable from + successful returns. */ + { + iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646"); + if (cd_ascii_to_88591 != (iconv_t)(-1)) + { + static ICONV_CONST char input[] = "\263"; + char buf[10]; + ICONV_CONST char *inptr = input; + size_t inbytesleft = strlen (input); + char *outptr = buf; + size_t outbytesleft = sizeof (buf); + size_t res = iconv (cd_ascii_to_88591, + &inptr, &inbytesleft, + &outptr, &outbytesleft); + if (res == 0) + result |= 2; + iconv_close (cd_ascii_to_88591); + } + } + /* Test against AIX 6.1..7.1 bug: Buffer overrun. */ + { + iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1"); + if (cd_88591_to_utf8 != (iconv_t)(-1)) + { + static ICONV_CONST char input[] = "\304"; + static char buf[2] = { (char)0xDE, (char)0xAD }; + ICONV_CONST char *inptr = input; + size_t inbytesleft = 1; + char *outptr = buf; + size_t outbytesleft = 1; + size_t res = iconv (cd_88591_to_utf8, + &inptr, &inbytesleft, + &outptr, &outbytesleft); + if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD) + result |= 4; + iconv_close (cd_88591_to_utf8); + } + } +#if 0 /* This bug could be worked around by the caller. */ + /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ + { + iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); + if (cd_88591_to_utf8 != (iconv_t)(-1)) + { + static ICONV_CONST char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; + char buf[50]; + ICONV_CONST char *inptr = input; + size_t inbytesleft = strlen (input); + char *outptr = buf; + size_t outbytesleft = sizeof (buf); + size_t res = iconv (cd_88591_to_utf8, + &inptr, &inbytesleft, + &outptr, &outbytesleft); + if ((int)res > 0) + result |= 8; + iconv_close (cd_88591_to_utf8); + } + } +#endif + /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is + provided. */ + if (/* Try standardized names. */ + iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) + /* Try IRIX, OSF/1 names. */ + && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) + /* Try AIX names. */ + && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) + /* Try HP-UX names. */ + && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) + result |= 16; + return result; +]])], + [am_cv_func_iconv_works=yes], , + [case "$host_os" in + aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; + *) am_cv_func_iconv_works="guessing yes" ;; + esac]) + test "$am_cv_func_iconv_works" = no || break + done + LIBS="$am_save_LIBS" + ]) + case "$am_cv_func_iconv_works" in + *no) am_func_iconv=no am_cv_lib_iconv=no ;; + *) am_func_iconv=yes ;; + esac + else + am_func_iconv=no am_cv_lib_iconv=no + fi + if test "$am_func_iconv" = yes; then + AC_DEFINE([HAVE_ICONV], [1], + [Define if you have the iconv() function and it works.]) + fi + if test "$am_cv_lib_iconv" = yes; then + AC_MSG_CHECKING([how to link with libiconv]) + AC_MSG_RESULT([$LIBICONV]) + else + dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV + dnl either. + CPPFLAGS="$am_save_CPPFLAGS" + LIBICONV= + LTLIBICONV= + fi + AC_SUBST([LIBICONV]) + AC_SUBST([LTLIBICONV]) +]) + +dnl Define AM_ICONV using AC_DEFUN_ONCE for Autoconf >= 2.64, in order to +dnl avoid warnings like +dnl "warning: AC_REQUIRE: `AM_ICONV' was expanded before it was required". +dnl This is tricky because of the way 'aclocal' is implemented: +dnl - It requires defining an auxiliary macro whose name ends in AC_DEFUN. +dnl Otherwise aclocal's initial scan pass would miss the macro definition. +dnl - It requires a line break inside the AC_DEFUN_ONCE and AC_DEFUN expansions. +dnl Otherwise aclocal would emit many "Use of uninitialized value $1" +dnl warnings. +m4_define([gl_iconv_AC_DEFUN], + m4_version_prereq([2.64], + [[AC_DEFUN_ONCE( + [$1], [$2])]], + [m4_ifdef([gl_00GNULIB], + [[AC_DEFUN_ONCE( + [$1], [$2])]], + [[AC_DEFUN( + [$1], [$2])]])])) +gl_iconv_AC_DEFUN([AM_ICONV], +[ + AM_ICONV_LINK + if test "$am_cv_func_iconv" = yes; then + AC_MSG_CHECKING([for iconv declaration]) + AC_CACHE_VAL([am_cv_proto_iconv], [ + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[ +#include <stdlib.h> +#include <iconv.h> +extern +#ifdef __cplusplus +"C" +#endif +#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus) +size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); +#else +size_t iconv(); +#endif + ]], + [[]])], + [am_cv_proto_iconv_arg1=""], + [am_cv_proto_iconv_arg1="const"]) + am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) + am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` + AC_MSG_RESULT([ + $am_cv_proto_iconv]) + AC_DEFINE_UNQUOTED([ICONV_CONST], [$am_cv_proto_iconv_arg1], + [Define as const if the declaration of iconv() needs const.]) + dnl Also substitute ICONV_CONST in the gnulib generated <iconv.h>. + m4_ifdef([gl_ICONV_H_DEFAULTS], + [AC_REQUIRE([gl_ICONV_H_DEFAULTS]) + if test -n "$am_cv_proto_iconv_arg1"; then + ICONV_CONST="const" + fi + ]) + fi +]) + +# lib-ld.m4 serial 6 +dnl Copyright (C) 1996-2003, 2009-2016 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl Subroutines of libtool.m4, +dnl with replacements s/_*LT_PATH/AC_LIB_PROG/ and s/lt_/acl_/ to avoid +dnl collision with libtool.m4. + +dnl From libtool-2.4. Sets the variable with_gnu_ld to yes or no. +AC_DEFUN([AC_LIB_PROG_LD_GNU], +[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], [acl_cv_prog_gnu_ld], +[# I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 </dev/null` in +*GNU* | *'with BFD'*) + acl_cv_prog_gnu_ld=yes + ;; +*) + acl_cv_prog_gnu_ld=no + ;; +esac]) +with_gnu_ld=$acl_cv_prog_gnu_ld +]) + +dnl From libtool-2.4. Sets the variable LD. +AC_DEFUN([AC_LIB_PROG_LD], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl + +AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld [default=no]])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which + # contains only /bin. Note that ksh looks also at the FPATH variable, + # so we have to set that as well for the test. + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ + && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ + || PATH_SEPARATOR=';' + } +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo "$ac_prog"| sed 's%\\\\%/%g'` + while echo "$ac_prog" | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL([acl_cv_path_LD], +[if test -z "$LD"; then + acl_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$acl_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + acl_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$acl_cv_path_LD" -v 2>&1 </dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break + ;; + *) + test "$with_gnu_ld" != yes && break + ;; + esac + fi + done + IFS="$acl_save_ifs" +else + acl_cv_path_LD="$LD" # Let the user override the test with a path. +fi]) +LD="$acl_cv_path_LD" +if test -n "$LD"; then + AC_MSG_RESULT([$LD]) +else + AC_MSG_RESULT([no]) +fi +test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) +AC_LIB_PROG_LD_GNU +]) + +# lib-link.m4 serial 26 (gettext-0.18.2) +dnl Copyright (C) 2001-2016 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +AC_PREREQ([2.54]) + +dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and +dnl the libraries corresponding to explicit and implicit dependencies. +dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and +dnl augments the CPPFLAGS variable. +dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname +dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem. +AC_DEFUN([AC_LIB_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + pushdef([Name],[m4_translit([$1],[./+-], [____])]) + pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) + AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + ac_cv_lib[]Name[]_libs="$LIB[]NAME" + ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" + ac_cv_lib[]Name[]_cppflags="$INC[]NAME" + ac_cv_lib[]Name[]_prefix="$LIB[]NAME[]_PREFIX" + ]) + LIB[]NAME="$ac_cv_lib[]Name[]_libs" + LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" + INC[]NAME="$ac_cv_lib[]Name[]_cppflags" + LIB[]NAME[]_PREFIX="$ac_cv_lib[]Name[]_prefix" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + AC_SUBST([LIB]NAME[_PREFIX]) + dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the + dnl results of this search when this library appears as a dependency. + HAVE_LIB[]NAME=yes + popdef([NAME]) + popdef([Name]) +]) + +dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode, [missing-message]) +dnl searches for libname and the libraries corresponding to explicit and +dnl implicit dependencies, together with the specified include files and +dnl the ability to compile and link the specified testcode. The missing-message +dnl defaults to 'no' and may contain additional hints for the user. +dnl If found, it sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} +dnl and LTLIB${NAME} variables and augments the CPPFLAGS variable, and +dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs +dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. +dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname +dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem. +AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + pushdef([Name],[m4_translit([$1],[./+-], [____])]) + pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) + + dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME + dnl accordingly. + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + + dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, + dnl because if the user has installed lib[]Name and not disabled its use + dnl via --without-lib[]Name-prefix, he wants to use it. + ac_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + + AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ + ac_save_LIBS="$LIBS" + dnl If $LIB[]NAME contains some -l options, add it to the end of LIBS, + dnl because these -l options might require -L options that are present in + dnl LIBS. -l options benefit only from the -L options listed before it. + dnl Otherwise, add it to the front of LIBS, because it may be a static + dnl library that depends on another static library that is present in LIBS. + dnl Static libraries benefit only from the static libraries listed after + dnl it. + case " $LIB[]NAME" in + *" -l"*) LIBS="$LIBS $LIB[]NAME" ;; + *) LIBS="$LIB[]NAME $LIBS" ;; + esac + AC_LINK_IFELSE( + [AC_LANG_PROGRAM([[$3]], [[$4]])], + [ac_cv_lib[]Name=yes], + [ac_cv_lib[]Name='m4_if([$5], [], [no], [[$5]])']) + LIBS="$ac_save_LIBS" + ]) + if test "$ac_cv_lib[]Name" = yes; then + HAVE_LIB[]NAME=yes + AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the lib][$1 library.]) + AC_MSG_CHECKING([how to link with lib[]$1]) + AC_MSG_RESULT([$LIB[]NAME]) + else + HAVE_LIB[]NAME=no + dnl If $LIB[]NAME didn't lead to a usable library, we don't need + dnl $INC[]NAME either. + CPPFLAGS="$ac_save_CPPFLAGS" + LIB[]NAME= + LTLIB[]NAME= + LIB[]NAME[]_PREFIX= + fi + AC_SUBST([HAVE_LIB]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + AC_SUBST([LIB]NAME[_PREFIX]) + popdef([NAME]) + popdef([Name]) +]) + +dnl Determine the platform dependent parameters needed to use rpath: +dnl acl_libext, +dnl acl_shlibext, +dnl acl_libname_spec, +dnl acl_library_names_spec, +dnl acl_hardcode_libdir_flag_spec, +dnl acl_hardcode_libdir_separator, +dnl acl_hardcode_direct, +dnl acl_hardcode_minus_L. +AC_DEFUN([AC_LIB_RPATH], +[ + dnl Tell automake >= 1.10 to complain if config.rpath is missing. + m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])]) + AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS + AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld + AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host + AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir + AC_CACHE_CHECK([for shared library run path origin], [acl_cv_rpath], [ + CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ + ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh + . ./conftest.sh + rm -f ./conftest.sh + acl_cv_rpath=done + ]) + wl="$acl_cv_wl" + acl_libext="$acl_cv_libext" + acl_shlibext="$acl_cv_shlibext" + acl_libname_spec="$acl_cv_libname_spec" + acl_library_names_spec="$acl_cv_library_names_spec" + acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" + acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" + acl_hardcode_direct="$acl_cv_hardcode_direct" + acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" + dnl Determine whether the user wants rpath handling at all. + AC_ARG_ENABLE([rpath], + [ --disable-rpath do not hardcode runtime library paths], + :, enable_rpath=yes) +]) + +dnl AC_LIB_FROMPACKAGE(name, package) +dnl declares that libname comes from the given package. The configure file +dnl will then not have a --with-libname-prefix option but a +dnl --with-package-prefix option. Several libraries can come from the same +dnl package. This declaration must occur before an AC_LIB_LINKFLAGS or similar +dnl macro call that searches for libname. +AC_DEFUN([AC_LIB_FROMPACKAGE], +[ + pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) + define([acl_frompackage_]NAME, [$2]) + popdef([NAME]) + pushdef([PACK],[$2]) + pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) + define([acl_libsinpackage_]PACKUP, + m4_ifdef([acl_libsinpackage_]PACKUP, [m4_defn([acl_libsinpackage_]PACKUP)[, ]],)[lib$1]) + popdef([PACKUP]) + popdef([PACK]) +]) + +dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and +dnl the libraries corresponding to explicit and implicit dependencies. +dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. +dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found +dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem. +AC_DEFUN([AC_LIB_LINKFLAGS_BODY], +[ + AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) + pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) + pushdef([PACK],[m4_ifdef([acl_frompackage_]NAME, [acl_frompackage_]NAME, lib[$1])]) + pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) + pushdef([PACKLIBS],[m4_ifdef([acl_frompackage_]NAME, [acl_libsinpackage_]PACKUP, lib[$1])]) + dnl Autoconf >= 2.61 supports dots in --with options. + pushdef([P_A_C_K],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[m4_translit(PACK,[.],[_])],PACK)]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_ARG_WITH(P_A_C_K[-prefix], +[[ --with-]]P_A_C_K[[-prefix[=DIR] search for ]PACKLIBS[ in DIR/include and DIR/lib + --without-]]P_A_C_K[[-prefix don't search for ]PACKLIBS[ in includedir and libdir]], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/$acl_libdirstem" + if test "$acl_libdirstem2" != "$acl_libdirstem" \ + && ! test -d "$withval/$acl_libdirstem"; then + additional_libdir="$withval/$acl_libdirstem2" + fi + fi + fi +]) + dnl Search the library and its dependencies in $additional_libdir and + dnl $LDFLAGS. Using breadth-first-seach. + LIB[]NAME= + LTLIB[]NAME= + INC[]NAME= + LIB[]NAME[]_PREFIX= + dnl HAVE_LIB${NAME} is an indicator that LIB${NAME}, LTLIB${NAME} have been + dnl computed. So it has to be reset here. + HAVE_LIB[]NAME= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='$1 $2' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + dnl See if it was already located by an earlier AC_LIB_LINKFLAGS + dnl or AC_LIB_HAVE_LINKFLAGS call. + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" + else + dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined + dnl that this library doesn't exist. So just drop it. + : + fi + else + dnl Search the library lib$name in $additional_libdir and $LDFLAGS + dnl and the already constructed $LIBNAME/$LTLIBNAME. + found_dir= + found_la= + found_so= + found_a= + eval libname=\"$acl_libname_spec\" # typically: libname=lib$name + if test -n "$acl_shlibext"; then + shrext=".$acl_shlibext" # typically: shrext=.so + else + shrext= + fi + if test $use_additional = yes; then + dir="$additional_libdir" + dnl The same code as in the loop below: + dnl First look for a shared library. + if test -n "$acl_shlibext"; then + if test -f "$dir/$libname$shrext"; then + found_dir="$dir" + found_so="$dir/$libname$shrext" + else + if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then + ver=`(cd "$dir" && \ + for f in "$libname$shrext".*; do echo "$f"; done \ + | sed -e "s,^$libname$shrext\\\\.,," \ + | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ + | sed 1q ) 2>/dev/null` + if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then + found_dir="$dir" + found_so="$dir/$libname$shrext.$ver" + fi + else + eval library_names=\"$acl_library_names_spec\" + for f in $library_names; do + if test -f "$dir/$f"; then + found_dir="$dir" + found_so="$dir/$f" + break + fi + done + fi + fi + fi + dnl Then look for a static library. + if test "X$found_dir" = "X"; then + if test -f "$dir/$libname.$acl_libext"; then + found_dir="$dir" + found_a="$dir/$libname.$acl_libext" + fi + fi + if test "X$found_dir" != "X"; then + if test -f "$dir/$libname.la"; then + found_la="$dir/$libname.la" + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + dnl First look for a shared library. + if test -n "$acl_shlibext"; then + if test -f "$dir/$libname$shrext"; then + found_dir="$dir" + found_so="$dir/$libname$shrext" + else + if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then + ver=`(cd "$dir" && \ + for f in "$libname$shrext".*; do echo "$f"; done \ + | sed -e "s,^$libname$shrext\\\\.,," \ + | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ + | sed 1q ) 2>/dev/null` + if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then + found_dir="$dir" + found_so="$dir/$libname$shrext.$ver" + fi + else + eval library_names=\"$acl_library_names_spec\" + for f in $library_names; do + if test -f "$dir/$f"; then + found_dir="$dir" + found_so="$dir/$f" + break + fi + done + fi + fi + fi + dnl Then look for a static library. + if test "X$found_dir" = "X"; then + if test -f "$dir/$libname.$acl_libext"; then + found_dir="$dir" + found_a="$dir/$libname.$acl_libext" + fi + fi + if test "X$found_dir" != "X"; then + if test -f "$dir/$libname.la"; then + found_la="$dir/$libname.la" + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + dnl Found the library. + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + dnl Linking with a shared library. We attempt to hardcode its + dnl directory into the executable's runpath, unless it's the + dnl standard /usr/lib. + if test "$enable_rpath" = no \ + || test "X$found_dir" = "X/usr/$acl_libdirstem" \ + || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then + dnl No hardcoding is needed. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + dnl Use an explicit option to hardcode DIR into the resulting + dnl binary. + dnl Potentially add DIR to ltrpathdirs. + dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + dnl The hardcoding into $LIBNAME is system dependent. + if test "$acl_hardcode_direct" = yes; then + dnl Using DIR/libNAME.so during linking hardcodes DIR into the + dnl resulting binary. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then + dnl Use an explicit option to hardcode DIR into the resulting + dnl binary. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + dnl Potentially add DIR to rpathdirs. + dnl The rpathdirs will be appended to $LIBNAME at the end. + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + dnl Rely on "-L$found_dir". + dnl But don't add it if it's already contained in the LDFLAGS + dnl or the already constructed $LIBNAME + haveit= + for x in $LDFLAGS $LIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" + fi + if test "$acl_hardcode_minus_L" != no; then + dnl FIXME: Not sure whether we should use + dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" + dnl here. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH + dnl here, because this doesn't fit in flags passed to the + dnl compiler. So give up. No hardcoding. This affects only + dnl very old systems. + dnl FIXME: Not sure whether we should use + dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" + dnl here. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + dnl Linking with a static library. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" + else + dnl We shouldn't come here, but anyway it's good to have a + dnl fallback. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" + fi + fi + dnl Assume the include files are nearby. + additional_includedir= + case "$found_dir" in + */$acl_libdirstem | */$acl_libdirstem/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` + if test "$name" = '$1'; then + LIB[]NAME[]_PREFIX="$basedir" + fi + additional_includedir="$basedir/include" + ;; + */$acl_libdirstem2 | */$acl_libdirstem2/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` + if test "$name" = '$1'; then + LIB[]NAME[]_PREFIX="$basedir" + fi + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + dnl Potentially add $additional_includedir to $INCNAME. + dnl But don't add it + dnl 1. if it's the standard /usr/include, + dnl 2. if it's /usr/local/include and we are using GCC on Linux, + dnl 3. if it's already present in $CPPFLAGS or the already + dnl constructed $INCNAME, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INC[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + dnl Really add $additional_includedir to $INCNAME. + INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + dnl Look for dependencies. + if test -n "$found_la"; then + dnl Read the .la file. It defines the variables + dnl dlname, library_names, old_library, dependency_libs, current, + dnl age, revision, installed, dlopen, dlpreopen, libdir. + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + dnl We use only dependency_libs. + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. + dnl But don't add it + dnl 1. if it's the standard /usr/lib, + dnl 2. if it's /usr/local/lib and we are using GCC on Linux, + dnl 3. if it's already present in $LDFLAGS or the already + dnl constructed $LIBNAME, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ + && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ + || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LIBNAME. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LTLIBNAME. + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + dnl Potentially add DIR to rpathdirs. + dnl The rpathdirs will be appended to $LIBNAME at the end. + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + dnl Potentially add DIR to ltrpathdirs. + dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + dnl Handle this in the next round. + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + dnl Handle this in the next round. Throw away the .la's + dnl directory; it is already contained in a preceding -L + dnl option. + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + dnl Most likely an immediate library name. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" + ;; + esac + done + fi + else + dnl Didn't find the library; assume it is in the system directories + dnl known to the linker and runtime loader. (All the system + dnl directories known to the linker should also be known to the + dnl runtime loader, otherwise the system is severely misconfigured.) + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$acl_hardcode_libdir_separator"; then + dnl Weird platform: only the last -rpath option counts, the user must + dnl pass all path elements in one option. We can arrange that for a + dnl single library, but not when more than one $LIBNAMEs are used. + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" + done + dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl. + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + else + dnl The -rpath options are cumulative. + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + dnl When using libtool, the option that works for both libraries and + dnl executables is -R. The -R options are cumulative. + for found_dir in $ltrpathdirs; do + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" + done + fi + popdef([P_A_C_K]) + popdef([PACKLIBS]) + popdef([PACKUP]) + popdef([PACK]) + popdef([NAME]) +]) + +dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, +dnl unless already present in VAR. +dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes +dnl contains two or three consecutive elements that belong together. +AC_DEFUN([AC_LIB_APPENDTOVAR], +[ + for element in [$2]; do + haveit= + for x in $[$1]; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + [$1]="${[$1]}${[$1]:+ }$element" + fi + done +]) + +dnl For those cases where a variable contains several -L and -l options +dnl referring to unknown libraries and directories, this macro determines the +dnl necessary additional linker options for the runtime path. +dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL]) +dnl sets LDADDVAR to linker options needed together with LIBSVALUE. +dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed, +dnl otherwise linking without libtool is assumed. +AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS], +[ + AC_REQUIRE([AC_LIB_RPATH]) + AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) + $1= + if test "$enable_rpath" != no; then + if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then + dnl Use an explicit option to hardcode directories into the resulting + dnl binary. + rpathdirs= + next= + for opt in $2; do + if test -n "$next"; then + dir="$next" + dnl No need to hardcode the standard /usr/lib. + if test "X$dir" != "X/usr/$acl_libdirstem" \ + && test "X$dir" != "X/usr/$acl_libdirstem2"; then + rpathdirs="$rpathdirs $dir" + fi + next= + else + case $opt in + -L) next=yes ;; + -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'` + dnl No need to hardcode the standard /usr/lib. + if test "X$dir" != "X/usr/$acl_libdirstem" \ + && test "X$dir" != "X/usr/$acl_libdirstem2"; then + rpathdirs="$rpathdirs $dir" + fi + next= ;; + *) next= ;; + esac + fi + done + if test "X$rpathdirs" != "X"; then + if test -n ""$3""; then + dnl libtool is used for linking. Use -R options. + for dir in $rpathdirs; do + $1="${$1}${$1:+ }-R$dir" + done + else + dnl The linker is used for linking directly. + if test -n "$acl_hardcode_libdir_separator"; then + dnl Weird platform: only the last -rpath option counts, the user + dnl must pass all path elements in one option. + alldirs= + for dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir" + done + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + $1="$flag" + else + dnl The -rpath options are cumulative. + for dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$dir" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + $1="${$1}${$1:+ }$flag" + done + fi + fi + fi + fi + fi + AC_SUBST([$1]) +]) + +# lib-prefix.m4 serial 7 (gettext-0.18) +dnl Copyright (C) 2001-2005, 2008-2016 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and +dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't +dnl require excessive bracketing. +ifdef([AC_HELP_STRING], +[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])], +[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])]) + +dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed +dnl to access previously installed libraries. The basic assumption is that +dnl a user will want packages to use other packages he previously installed +dnl with the same --prefix option. +dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate +dnl libraries, but is otherwise very convenient. +AC_DEFUN([AC_LIB_PREFIX], +[ + AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([AC_CANONICAL_HOST]) + AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_LIB_ARG_WITH([lib-prefix], +[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib + --without-lib-prefix don't search for libraries in includedir and libdir], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/$acl_libdirstem" + fi + fi +]) + if test $use_additional = yes; then + dnl Potentially add $additional_includedir to $CPPFLAGS. + dnl But don't add it + dnl 1. if it's the standard /usr/include, + dnl 2. if it's already present in $CPPFLAGS, + dnl 3. if it's /usr/local/include and we are using GCC on Linux, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + for x in $CPPFLAGS; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + dnl Really add $additional_includedir to $CPPFLAGS. + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" + fi + fi + fi + fi + dnl Potentially add $additional_libdir to $LDFLAGS. + dnl But don't add it + dnl 1. if it's the standard /usr/lib, + dnl 2. if it's already present in $LDFLAGS, + dnl 3. if it's /usr/local/lib and we are using GCC on Linux, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then + haveit= + for x in $LDFLAGS; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LDFLAGS. + LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" + fi + fi + fi + fi + fi +]) + +dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, +dnl acl_final_exec_prefix, containing the values to which $prefix and +dnl $exec_prefix will expand at the end of the configure script. +AC_DEFUN([AC_LIB_PREPARE_PREFIX], +[ + dnl Unfortunately, prefix and exec_prefix get only finally determined + dnl at the end of configure. + if test "X$prefix" = "XNONE"; then + acl_final_prefix="$ac_default_prefix" + else + acl_final_prefix="$prefix" + fi + if test "X$exec_prefix" = "XNONE"; then + acl_final_exec_prefix='${prefix}' + else + acl_final_exec_prefix="$exec_prefix" + fi + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" + prefix="$acl_save_prefix" +]) + +dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the +dnl variables prefix and exec_prefix bound to the values they will have +dnl at the end of the configure script. +AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], +[ + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + $1 + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" +]) + +dnl AC_LIB_PREPARE_MULTILIB creates +dnl - a variable acl_libdirstem, containing the basename of the libdir, either +dnl "lib" or "lib64" or "lib/64", +dnl - a variable acl_libdirstem2, as a secondary possible value for +dnl acl_libdirstem, either the same as acl_libdirstem or "lib/sparcv9" or +dnl "lib/amd64". +AC_DEFUN([AC_LIB_PREPARE_MULTILIB], +[ + dnl There is no formal standard regarding lib and lib64. + dnl On glibc systems, the current practice is that on a system supporting + dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under + dnl $prefix/lib64 and 32-bit libraries go under $prefix/lib. We determine + dnl the compiler's default mode by looking at the compiler's library search + dnl path. If at least one of its elements ends in /lib64 or points to a + dnl directory whose absolute pathname ends in /lib64, we assume a 64-bit ABI. + dnl Otherwise we use the default, namely "lib". + dnl On Solaris systems, the current practice is that on a system supporting + dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under + dnl $prefix/lib/64 (which is a symlink to either $prefix/lib/sparcv9 or + dnl $prefix/lib/amd64) and 32-bit libraries go under $prefix/lib. + AC_REQUIRE([AC_CANONICAL_HOST]) + acl_libdirstem=lib + acl_libdirstem2= + case "$host_os" in + solaris*) + dnl See Solaris 10 Software Developer Collection > Solaris 64-bit Developer's Guide > The Development Environment + dnl <http://docs.sun.com/app/docs/doc/816-5138/dev-env?l=en&a=view>. + dnl "Portable Makefiles should refer to any library directories using the 64 symbolic link." + dnl But we want to recognize the sparcv9 or amd64 subdirectory also if the + dnl symlink is missing, so we set acl_libdirstem2 too. + AC_CACHE_CHECK([for 64-bit host], [gl_cv_solaris_64bit], + [AC_EGREP_CPP([sixtyfour bits], [ +#ifdef _LP64 +sixtyfour bits +#endif + ], [gl_cv_solaris_64bit=yes], [gl_cv_solaris_64bit=no]) + ]) + if test $gl_cv_solaris_64bit = yes; then + acl_libdirstem=lib/64 + case "$host_cpu" in + sparc*) acl_libdirstem2=lib/sparcv9 ;; + i*86 | x86_64) acl_libdirstem2=lib/amd64 ;; + esac + fi + ;; + *) + searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` + if test -n "$searchpath"; then + acl_save_IFS="${IFS= }"; IFS=":" + for searchdir in $searchpath; do + if test -d "$searchdir"; then + case "$searchdir" in + */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; + */../ | */.. ) + # Better ignore directories of this form. They are misleading. + ;; + *) searchdir=`cd "$searchdir" && pwd` + case "$searchdir" in + */lib64 ) acl_libdirstem=lib64 ;; + esac ;; + esac + fi + done + IFS="$acl_save_IFS" + fi + ;; + esac + test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem" +]) + +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +m4_define([_LT_COPYING], [dnl +# Copyright (C) 2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool 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 2 of of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. +# +# GNU Libtool 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 this program. If not, see <http://www.gnu.org/licenses/>. +]) + +# serial 58 LT_INIT + + +# LT_PREREQ(VERSION) +# ------------------ +# Complain and exit if this libtool version is less that VERSION. +m4_defun([LT_PREREQ], +[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, + [m4_default([$3], + [m4_fatal([Libtool version $1 or higher is required], + 63)])], + [$2])]) + + +# _LT_CHECK_BUILDDIR +# ------------------ +# Complain if the absolute build directory name contains unusual characters +m4_defun([_LT_CHECK_BUILDDIR], +[case `pwd` in + *\ * | *\ *) + AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; +esac +]) + + +# LT_INIT([OPTIONS]) +# ------------------ +AC_DEFUN([LT_INIT], +[AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK +AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +AC_BEFORE([$0], [LT_LANG])dnl +AC_BEFORE([$0], [LT_OUTPUT])dnl +AC_BEFORE([$0], [LTDL_INIT])dnl +m4_require([_LT_CHECK_BUILDDIR])dnl + +dnl Autoconf doesn't catch unexpanded LT_ macros by default: +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +dnl unless we require an AC_DEFUNed macro: +AC_REQUIRE([LTOPTIONS_VERSION])dnl +AC_REQUIRE([LTSUGAR_VERSION])dnl +AC_REQUIRE([LTVERSION_VERSION])dnl +AC_REQUIRE([LTOBSOLETE_VERSION])dnl +m4_require([_LT_PROG_LTMAIN])dnl + +_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) + +dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS=$ltmain + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +_LT_SETUP + +# Only expand once: +m4_define([LT_INIT]) +])# LT_INIT + +# Old names: +AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) +AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PROG_LIBTOOL], []) +dnl AC_DEFUN([AM_PROG_LIBTOOL], []) + + +# _LT_PREPARE_CC_BASENAME +# ----------------------- +m4_defun([_LT_PREPARE_CC_BASENAME], [ +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in @S|@*""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} +])# _LT_PREPARE_CC_BASENAME + + +# _LT_CC_BASENAME(CC) +# ------------------- +# It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, +# but that macro is also expanded into generated libtool script, which +# arranges for $SED and $ECHO to be set by different means. +m4_defun([_LT_CC_BASENAME], +[m4_require([_LT_PREPARE_CC_BASENAME])dnl +AC_REQUIRE([_LT_DECL_SED])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl +func_cc_basename $1 +cc_basename=$func_cc_basename_result +]) + + +# _LT_FILEUTILS_DEFAULTS +# ---------------------- +# It is okay to use these file commands and assume they have been set +# sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'. +m4_defun([_LT_FILEUTILS_DEFAULTS], +[: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} +])# _LT_FILEUTILS_DEFAULTS + + +# _LT_SETUP +# --------- +m4_defun([_LT_SETUP], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl + +_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl +dnl +_LT_DECL([], [host_alias], [0], [The host system])dnl +_LT_DECL([], [host], [0])dnl +_LT_DECL([], [host_os], [0])dnl +dnl +_LT_DECL([], [build_alias], [0], [The build system])dnl +_LT_DECL([], [build], [0])dnl +_LT_DECL([], [build_os], [0])dnl +dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +test -z "$LN_S" && LN_S="ln -s" +_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl +dnl +AC_REQUIRE([LT_CMD_MAX_LEN])dnl +_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl +_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl +dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl +m4_require([_LT_CMD_RELOAD])dnl +m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl +m4_require([_LT_CMD_OLD_ARCHIVE])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_WITH_SYSROOT])dnl +m4_require([_LT_CMD_TRUNCATE])dnl + +_LT_CONFIG_LIBTOOL_INIT([ +# See if we are running on zsh, and set the options that allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi +]) +if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + +_LT_CHECK_OBJDIR + +m4_require([_LT_TAG_COMPILER])dnl + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a '.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld=$lt_cv_prog_gnu_ld + +old_CC=$CC +old_CFLAGS=$CFLAGS + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + _LT_PATH_MAGIC + fi + ;; +esac + +# Use C for the default configuration in the libtool script +LT_SUPPORTED_TAG([CC]) +_LT_LANG_C_CONFIG +_LT_LANG_DEFAULT_CONFIG +_LT_CONFIG_COMMANDS +])# _LT_SETUP + + +# _LT_PREPARE_SED_QUOTE_VARS +# -------------------------- +# Define a few sed substitution that help us do robust quoting. +m4_defun([_LT_PREPARE_SED_QUOTE_VARS], +[# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([["`\\]]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' +]) + +# _LT_PROG_LTMAIN +# --------------- +# Note that this code is called both from 'configure', and 'config.status' +# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, +# 'config.status' has no value for ac_aux_dir unless we are using Automake, +# so we pass a copy along to make sure it has a sensible value anyway. +m4_defun([_LT_PROG_LTMAIN], +[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl +_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) +ltmain=$ac_aux_dir/ltmain.sh +])# _LT_PROG_LTMAIN + + + +# So that we can recreate a full libtool script including additional +# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS +# in macros and then make a single call at the end using the 'libtool' +# label. + + +# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) +# ---------------------------------------- +# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL_INIT], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_INIT], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_INIT]) + + +# _LT_CONFIG_LIBTOOL([COMMANDS]) +# ------------------------------ +# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) + + +# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) +# ----------------------------------------------------- +m4_defun([_LT_CONFIG_SAVE_COMMANDS], +[_LT_CONFIG_LIBTOOL([$1]) +_LT_CONFIG_LIBTOOL_INIT([$2]) +]) + + +# _LT_FORMAT_COMMENT([COMMENT]) +# ----------------------------- +# Add leading comment marks to the start of each line, and a trailing +# full-stop to the whole comment if one is not present already. +m4_define([_LT_FORMAT_COMMENT], +[m4_ifval([$1], [ +m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], + [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) +)]) + + + + + +# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) +# ------------------------------------------------------------------- +# CONFIGNAME is the name given to the value in the libtool script. +# VARNAME is the (base) name used in the configure script. +# VALUE may be 0, 1 or 2 for a computed quote escaped value based on +# VARNAME. Any other value will be used directly. +m4_define([_LT_DECL], +[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], + [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], + [m4_ifval([$1], [$1], [$2])]) + lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) + m4_ifval([$4], + [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) + lt_dict_add_subkey([lt_decl_dict], [$2], + [tagged?], [m4_ifval([$5], [yes], [no])])]) +]) + + +# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) +# -------------------------------------------------------- +m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) + + +# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_tag_varnames], +[_lt_decl_filter([tagged?], [yes], $@)]) + + +# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) +# --------------------------------------------------------- +m4_define([_lt_decl_filter], +[m4_case([$#], + [0], [m4_fatal([$0: too few arguments: $#])], + [1], [m4_fatal([$0: too few arguments: $#: $1])], + [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], + [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], + [lt_dict_filter([lt_decl_dict], $@)])[]dnl +]) + + +# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) +# -------------------------------------------------- +m4_define([lt_decl_quote_varnames], +[_lt_decl_filter([value], [1], $@)]) + + +# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_dquote_varnames], +[_lt_decl_filter([value], [2], $@)]) + + +# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_varnames_tagged], +[m4_assert([$# <= 2])dnl +_$0(m4_quote(m4_default([$1], [[, ]])), + m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), + m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) +m4_define([_lt_decl_varnames_tagged], +[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) + + +# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_all_varnames], +[_$0(m4_quote(m4_default([$1], [[, ]])), + m4_if([$2], [], + m4_quote(lt_decl_varnames), + m4_quote(m4_shift($@))))[]dnl +]) +m4_define([_lt_decl_all_varnames], +[lt_join($@, lt_decl_varnames_tagged([$1], + lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl +]) + + +# _LT_CONFIG_STATUS_DECLARE([VARNAME]) +# ------------------------------------ +# Quote a variable value, and forward it to 'config.status' so that its +# declaration there will have the same value as in 'configure'. VARNAME +# must have a single quote delimited value for this to work. +m4_define([_LT_CONFIG_STATUS_DECLARE], +[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) + + +# _LT_CONFIG_STATUS_DECLARATIONS +# ------------------------------ +# We delimit libtool config variables with single quotes, so when +# we write them to config.status, we have to be sure to quote all +# embedded single quotes properly. In configure, this macro expands +# each variable declared with _LT_DECL (and _LT_TAGDECL) into: +# +# <var>='`$ECHO "$<var>" | $SED "$delay_single_quote_subst"`' +m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], +[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), + [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAGS +# ---------------- +# Output comment and list of tags supported by the script +m4_defun([_LT_LIBTOOL_TAGS], +[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl +available_tags='_LT_TAGS'dnl +]) + + +# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) +# ----------------------------------- +# Extract the dictionary values for VARNAME (optionally with TAG) and +# expand to a commented shell variable setting: +# +# # Some comment about what VAR is for. +# visible_name=$lt_internal_name +m4_define([_LT_LIBTOOL_DECLARE], +[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], + [description])))[]dnl +m4_pushdef([_libtool_name], + m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl +m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), + [0], [_libtool_name=[$]$1], + [1], [_libtool_name=$lt_[]$1], + [2], [_libtool_name=$lt_[]$1], + [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl +m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl +]) + + +# _LT_LIBTOOL_CONFIG_VARS +# ----------------------- +# Produce commented declarations of non-tagged libtool config variables +# suitable for insertion in the LIBTOOL CONFIG section of the 'libtool' +# script. Tagged libtool config variables (even for the LIBTOOL CONFIG +# section) are produced by _LT_LIBTOOL_TAG_VARS. +m4_defun([_LT_LIBTOOL_CONFIG_VARS], +[m4_foreach([_lt_var], + m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAG_VARS(TAG) +# ------------------------- +m4_define([_LT_LIBTOOL_TAG_VARS], +[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) + + +# _LT_TAGVAR(VARNAME, [TAGNAME]) +# ------------------------------ +m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) + + +# _LT_CONFIG_COMMANDS +# ------------------- +# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of +# variables for single and double quote escaping we saved from calls +# to _LT_DECL, we can put quote escaped variables declarations +# into 'config.status', and then the shell code to quote escape them in +# for loops in 'config.status'. Finally, any additional code accumulated +# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. +m4_defun([_LT_CONFIG_COMMANDS], +[AC_PROVIDE_IFELSE([LT_OUTPUT], + dnl If the libtool generation code has been placed in $CONFIG_LT, + dnl instead of duplicating it all over again into config.status, + dnl then we will have config.status run $CONFIG_LT later, so it + dnl needs to know what name is stored there: + [AC_CONFIG_COMMANDS([libtool], + [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], + dnl If the libtool generation code is destined for config.status, + dnl expand the accumulated commands and init code now: + [AC_CONFIG_COMMANDS([libtool], + [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) +])#_LT_CONFIG_COMMANDS + + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], +[ + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +_LT_CONFIG_STATUS_DECLARATIONS +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$[]1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_quote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_dquote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +_LT_OUTPUT_LIBTOOL_INIT +]) + +# _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) +# ------------------------------------ +# Generate a child script FILE with all initialization necessary to +# reuse the environment learned by the parent script, and make the +# file executable. If COMMENT is supplied, it is inserted after the +# '#!' sequence but before initialization text begins. After this +# macro, additional text can be appended to FILE to form the body of +# the child script. The macro ends with non-zero status if the +# file could not be fully written (such as if the disk is full). +m4_ifdef([AS_INIT_GENERATED], +[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], +[m4_defun([_LT_GENERATED_FILE_INIT], +[m4_require([AS_PREPARE])]dnl +[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl +[lt_write_fail=0 +cat >$1 <<_ASEOF || lt_write_fail=1 +#! $SHELL +# Generated by $as_me. +$2 +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$1 <<\_ASEOF || lt_write_fail=1 +AS_SHELL_SANITIZE +_AS_PREPARE +exec AS_MESSAGE_FD>&1 +_ASEOF +test 0 = "$lt_write_fail" && chmod +x $1[]dnl +m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT + +# LT_OUTPUT +# --------- +# This macro allows early generation of the libtool script (before +# AC_OUTPUT is called), incase it is used in configure for compilation +# tests. +AC_DEFUN([LT_OUTPUT], +[: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], +[# Run this file to recreate a libtool stub with the current configuration.]) + +cat >>"$CONFIG_LT" <<\_LTEOF +lt_cl_silent=false +exec AS_MESSAGE_LOG_FD>>config.log +{ + echo + AS_BOX([Running $as_me.]) +} >&AS_MESSAGE_LOG_FD + +lt_cl_help="\ +'$as_me' creates a local libtool stub from the current configuration, +for use in further configure time tests before the real libtool is +generated. + +Usage: $[0] [[OPTIONS]] + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + +Report bugs to <bug-libtool@gnu.org>." + +lt_cl_version="\ +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +configured by $[0], generated by m4_PACKAGE_STRING. + +Copyright (C) 2011 Free Software Foundation, Inc. +This config.lt script is free software; the Free Software Foundation +gives unlimited permision to copy, distribute and modify it." + +while test 0 != $[#] +do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; + --help | --h* | -h ) + echo "$lt_cl_help"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --quiet | --q* | --silent | --s* | -q ) + lt_cl_silent=: ;; + + -*) AC_MSG_ERROR([unrecognized option: $[1] +Try '$[0] --help' for more information.]) ;; + + *) AC_MSG_ERROR([unrecognized argument: $[1] +Try '$[0] --help' for more information.]) ;; + esac + shift +done + +if $lt_cl_silent; then + exec AS_MESSAGE_FD>/dev/null +fi +_LTEOF + +cat >>"$CONFIG_LT" <<_LTEOF +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AC_MSG_NOTICE([creating $ofile]) +_LT_OUTPUT_LIBTOOL_COMMANDS +AS_EXIT(0) +_LTEOF +chmod +x "$CONFIG_LT" + +# configure is writing to config.log, but config.lt does its own redirection, +# appending to config.log, which fails on DOS, as config.log is still kept +# open by configure. Here we exec the FD to /dev/null, effectively closing +# config.log, so it can be properly (re)opened and appended to by config.lt. +lt_cl_success=: +test yes = "$silent" && + lt_config_lt_args="$lt_config_lt_args --quiet" +exec AS_MESSAGE_LOG_FD>/dev/null +$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false +exec AS_MESSAGE_LOG_FD>>config.log +$lt_cl_success || AS_EXIT(1) +])# LT_OUTPUT + + +# _LT_CONFIG(TAG) +# --------------- +# If TAG is the built-in tag, create an initial libtool script with a +# default configuration from the untagged config vars. Otherwise add code +# to config.status for appending the configuration named by TAG from the +# matching tagged config vars. +m4_defun([_LT_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_CONFIG_SAVE_COMMANDS([ + m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl + m4_if(_LT_TAG, [C], [ + # See if we are running on zsh, and set the options that allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST + fi + + cfgfile=${ofile}T + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL +# Generated automatically by $as_me ($PACKAGE) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +_LT_COPYING +_LT_LIBTOOL_TAGS + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + +# ### BEGIN LIBTOOL CONFIG +_LT_LIBTOOL_CONFIG_VARS +_LT_LIBTOOL_TAG_VARS +# ### END LIBTOOL CONFIG + +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +_LT_PREPARE_MUNGE_PATH_LIST +_LT_PREPARE_CC_BASENAME + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + _LT_PROG_LTMAIN + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +], +[cat <<_LT_EOF >> "$ofile" + +dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded +dnl in a comment (ie after a #). +# ### BEGIN LIBTOOL TAG CONFIG: $1 +_LT_LIBTOOL_TAG_VARS(_LT_TAG) +# ### END LIBTOOL TAG CONFIG: $1 +_LT_EOF +])dnl /m4_if +], +[m4_if([$1], [], [ + PACKAGE='$PACKAGE' + VERSION='$VERSION' + RM='$RM' + ofile='$ofile'], []) +])dnl /_LT_CONFIG_SAVE_COMMANDS +])# _LT_CONFIG + + +# LT_SUPPORTED_TAG(TAG) +# --------------------- +# Trace this macro to discover what tags are supported by the libtool +# --tag option, using: +# autoconf --trace 'LT_SUPPORTED_TAG:$1' +AC_DEFUN([LT_SUPPORTED_TAG], []) + + +# C support is built-in for now +m4_define([_LT_LANG_C_enabled], []) +m4_define([_LT_TAGS], []) + + +# LT_LANG(LANG) +# ------------- +# Enable libtool support for the given language if not already enabled. +AC_DEFUN([LT_LANG], +[AC_BEFORE([$0], [LT_OUTPUT])dnl +m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], + [Go], [_LT_LANG(GO)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl +])# LT_LANG + + +# _LT_LANG(LANGNAME) +# ------------------ +m4_defun([_LT_LANG], +[m4_ifdef([_LT_LANG_]$1[_enabled], [], + [LT_SUPPORTED_TAG([$1])dnl + m4_append([_LT_TAGS], [$1 ])dnl + m4_define([_LT_LANG_]$1[_enabled], [])dnl + _LT_LANG_$1_CONFIG($1)])dnl +])# _LT_LANG + + +m4_ifndef([AC_PROG_GO], [ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_GO. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +m4_defun([AC_PROG_GO], +[AC_LANG_PUSH(Go)dnl +AC_ARG_VAR([GOC], [Go compiler command])dnl +AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl +_AC_ARG_VAR_LDFLAGS()dnl +AC_CHECK_TOOL(GOC, gccgo) +if test -z "$GOC"; then + if test -n "$ac_tool_prefix"; then + AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) + fi +fi +if test -z "$GOC"; then + AC_CHECK_PROG(GOC, gccgo, gccgo, false) +fi +])#m4_defun +])#m4_ifndef + + +# _LT_LANG_DEFAULT_CONFIG +# ----------------------- +m4_defun([_LT_LANG_DEFAULT_CONFIG], +[AC_PROVIDE_IFELSE([AC_PROG_CXX], + [LT_LANG(CXX)], + [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) + +AC_PROVIDE_IFELSE([AC_PROG_F77], + [LT_LANG(F77)], + [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) + +AC_PROVIDE_IFELSE([AC_PROG_FC], + [LT_LANG(FC)], + [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) + +dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal +dnl pulling things in needlessly. +AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([LT_PROG_GCJ], + [LT_LANG(GCJ)], + [m4_ifdef([AC_PROG_GCJ], + [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([A][M_PROG_GCJ], + [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([LT_PROG_GCJ], + [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) + +AC_PROVIDE_IFELSE([AC_PROG_GO], + [LT_LANG(GO)], + [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) + +AC_PROVIDE_IFELSE([LT_PROG_RC], + [LT_LANG(RC)], + [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) +])# _LT_LANG_DEFAULT_CONFIG + +# Obsolete macros: +AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_CXX], []) +dnl AC_DEFUN([AC_LIBTOOL_F77], []) +dnl AC_DEFUN([AC_LIBTOOL_FC], []) +dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) +dnl AC_DEFUN([AC_LIBTOOL_RC], []) + + +# _LT_TAG_COMPILER +# ---------------- +m4_defun([_LT_TAG_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl +_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl +_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl +_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_TAG_COMPILER + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +m4_defun([_LT_COMPILER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +m4_defun([_LT_LINKER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* +])# _LT_LINKER_BOILERPLATE + +# _LT_REQUIRED_DARWIN_CHECKS +# ------------------------- +m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + AC_CHECK_TOOL([LIPO], [lipo], [:]) + AC_CHECK_TOOL([OTOOL], [otool], [:]) + AC_CHECK_TOOL([OTOOL64], [otool64], [:]) + _LT_DECL([], [DSYMUTIL], [1], + [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) + _LT_DECL([], [NMEDIT], [1], + [Tool to change global to local symbols on Mac OS X]) + _LT_DECL([], [LIPO], [1], + [Tool to manipulate fat objects and archives on Mac OS X]) + _LT_DECL([], [OTOOL], [1], + [ldd/readelf like tool for Mach-O binaries on Mac OS X]) + _LT_DECL([], [OTOOL64], [1], + [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [lt_cv_apple_cc_single_mod=no + if test -z "$LT_MULTI_MODULE"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi]) + + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS=$save_LDFLAGS + ]) + + AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], + [lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD + echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD + $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD + echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD + $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + ]) + case $host_os in + rhapsody* | darwin1.[[012]]) + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + 10.[[012]][[,.]]*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' + fi + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +]) + + +# _LT_DARWIN_LINKER_FEATURES([TAG]) +# --------------------------------- +# Checks for linker and compiler features on darwin +m4_defun([_LT_DARWIN_LINKER_FEATURES], +[ + m4_require([_LT_REQUIRED_DARWIN_CHECKS]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_automatic, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + if test yes = "$lt_cv_ld_force_load"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], + [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + m4_if([$1], [CXX], +[ if test yes != "$lt_cv_apple_cc_single_mod"; then + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" + fi +],[]) + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi +]) + +# _LT_SYS_MODULE_PATH_AIX([TAGNAME]) +# ---------------------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +# Store the results from the different compilers for each TAGNAME. +# Allow to override them for all tags through lt_cv_aix_libpath. +m4_defun([_LT_SYS_MODULE_PATH_AIX], +[m4_require([_LT_DECL_SED])dnl +if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], + [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ + lt_aix_libpath_sed='[ + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }]' + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi],[]) + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib + fi + ]) + aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) +fi +])# _LT_SYS_MODULE_PATH_AIX + + +# _LT_SHELL_INIT(ARG) +# ------------------- +m4_define([_LT_SHELL_INIT], +[m4_divert_text([M4SH-INIT], [$1 +])])# _LT_SHELL_INIT + + + +# _LT_PROG_ECHO_BACKSLASH +# ----------------------- +# Find how we can fake an echo command that does not interpret backslash. +# In particular, with Autoconf 2.60 or later we add some code to the start +# of the generated configure script that will find a shell with a builtin +# printf (that we can use as an echo command). +m4_defun([_LT_PROG_ECHO_BACKSLASH], +[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +AC_MSG_CHECKING([how to print strings]) +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$[]1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +case $ECHO in + printf*) AC_MSG_RESULT([printf]) ;; + print*) AC_MSG_RESULT([print -r]) ;; + *) AC_MSG_RESULT([cat]) ;; +esac + +m4_ifdef([_AS_DETECT_SUGGESTED], +[_AS_DETECT_SUGGESTED([ + test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test "X`printf %s $ECHO`" = "X$ECHO" \ + || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) + +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) +])# _LT_PROG_ECHO_BACKSLASH + + +# _LT_WITH_SYSROOT +# ---------------- +AC_DEFUN([_LT_WITH_SYSROOT], +[AC_MSG_CHECKING([for sysroot]) +AC_ARG_WITH([sysroot], +[AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@], + [Search for dependent libraries within DIR (or the compiler's sysroot + if not specified).])], +[], [with_sysroot=no]) + +dnl lt_sysroot will always be passed unquoted. We quote it here +dnl in case the user passed a directory name. +lt_sysroot= +case $with_sysroot in #( + yes) + if test yes = "$GCC"; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + AC_MSG_RESULT([$with_sysroot]) + AC_MSG_ERROR([The sysroot must be an absolute path.]) + ;; +esac + + AC_MSG_RESULT([${lt_sysroot:-no}]) +_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl +[dependent libraries, and where our libraries should be installed.])]) + +# _LT_ENABLE_LOCK +# --------------- +m4_defun([_LT_ENABLE_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AS_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test no = "$enable_libtool_lock" || enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out what ABI is being produced by ac_compile, and set mode + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE=32 + ;; + *ELF-64*) + HPUX_IA64_MODE=64 + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test yes = "$lt_cv_prog_gnu_ld"; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + emul=elf + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*|x86_64-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD=${LD-ld}_sol2 + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks=$enable_libtool_lock +])# _LT_ENABLE_LOCK + + +# _LT_PROG_AR +# ----------- +m4_defun([_LT_PROG_AR], +[AC_CHECK_TOOLS(AR, [ar], false) +: ${AR=ar} +: ${AR_FLAGS=cru} +_LT_DECL([], [AR], [1], [The archiver]) +_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) + +AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], + [lt_cv_ar_at_file=no + AC_COMPILE_IFELSE([AC_LANG_PROGRAM], + [echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([lt_ar_try]) + if test 0 -eq "$ac_status"; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + AC_TRY_EVAL([lt_ar_try]) + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + ]) + ]) + +if test no = "$lt_cv_ar_at_file"; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi +_LT_DECL([], [archiver_list_spec], [1], + [How to feed a file listing to the archiver]) +])# _LT_PROG_AR + + +# _LT_CMD_OLD_ARCHIVE +# ------------------- +m4_defun([_LT_CMD_OLD_ARCHIVE], +[_LT_PROG_AR + +AC_CHECK_TOOL(STRIP, strip, :) +test -z "$STRIP" && STRIP=: +_LT_DECL([], [STRIP], [1], [A symbol stripping program]) + +AC_CHECK_TOOL(RANLIB, ranlib, :) +test -z "$RANLIB" && RANLIB=: +_LT_DECL([], [RANLIB], [1], + [Commands used to install an old-style archive]) + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + bitrig* | openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac +_LT_DECL([], [old_postinstall_cmds], [2]) +_LT_DECL([], [old_postuninstall_cmds], [2]) +_LT_TAGDECL([], [old_archive_cmds], [2], + [Commands used to build an old-style archive]) +_LT_DECL([], [lock_old_archive_extraction], [0], + [Whether to use a lock for old archive extraction]) +])# _LT_CMD_OLD_ARCHIVE + + +# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([_LT_COMPILER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test yes = "[$]$2"; then + m4_if([$5], , :, [$5]) +else + m4_if([$6], , :, [$6]) +fi +])# _LT_COMPILER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) + + +# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------- +# Check whether the given linker option works +AC_DEFUN([_LT_LINKER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS +]) + +if test yes = "[$]$2"; then + m4_if([$4], , :, [$4]) +else + m4_if([$5], , :, [$5]) +fi +])# _LT_LINKER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) + + +# LT_CMD_MAX_LEN +#--------------- +AC_DEFUN([LT_CMD_MAX_LEN], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring=ABCD + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test X`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test 17 != "$i" # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac +]) +if test -n "$lt_cv_sys_max_cmd_len"; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +max_cmd_len=$lt_cv_sys_max_cmd_len +_LT_DECL([], [max_cmd_len], [0], + [What is the maximum length of a command?]) +])# LT_CMD_MAX_LEN + +# Old name: +AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) + + +# _LT_HEADER_DLFCN +# ---------------- +m4_defun([_LT_HEADER_DLFCN], +[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl +])# _LT_HEADER_DLFCN + + +# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ---------------------------------------------------------------- +m4_defun([_LT_TRY_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test yes = "$cross_compiling"; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +[#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include <dlfcn.h> +#endif + +#include <stdio.h> + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +}] +_LT_EOF + if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_TRY_DLOPEN_SELF + + +# LT_SYS_DLOPEN_SELF +# ------------------ +AC_DEFUN([LT_SYS_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test yes != "$enable_dlopen"; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen=load_add_on + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen=LoadLibrary + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[ + lt_cv_dlopen=dyld + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen=shl_load], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen=dlopen], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS=$LDFLAGS + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS=$LIBS + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test yes = "$lt_cv_dlopen_self"; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +_LT_DECL([dlopen_support], [enable_dlopen], [0], + [Whether dlopen is supported]) +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], + [Whether dlopen of programs is supported]) +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], + [Whether dlopen of statically linked programs is supported]) +])# LT_SYS_DLOPEN_SELF + +# Old name: +AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) + + +# _LT_COMPILER_C_O([TAGNAME]) +# --------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler. +# This macro does not hard code the compiler like AC_PROG_CC_C_O. +m4_defun([_LT_COMPILER_C_O], +[m4_require([_LT_DECL_SED])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* +]) +_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], + [Does compiler simultaneously support -c and -o options?]) +])# _LT_COMPILER_C_O + + +# _LT_COMPILER_FILE_LOCKS([TAGNAME]) +# ---------------------------------- +# Check to see if we can do hard links to lock some files if needed +m4_defun([_LT_COMPILER_FILE_LOCKS], +[m4_require([_LT_ENABLE_LOCK])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_COMPILER_C_O([$1]) + +hard_links=nottested +if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test no = "$hard_links"; then + AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) +])# _LT_COMPILER_FILE_LOCKS + + +# _LT_CHECK_OBJDIR +# ---------------- +m4_defun([_LT_CHECK_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +_LT_DECL([], [objdir], [0], + [The name of the directory that contains temporary libtool files])dnl +m4_pattern_allow([LT_OBJDIR])dnl +AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/", + [Define to the sub-directory where libtool stores uninstalled libraries.]) +])# _LT_CHECK_OBJDIR + + +# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) +# -------------------------------------- +# Check hardcoding attributes. +m4_defun([_LT_LINKER_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || + test -n "$_LT_TAGVAR(runpath_var, $1)" || + test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then + + # We can hardcode non-existent directories. + if test no != "$_LT_TAGVAR(hardcode_direct, $1)" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" && + test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then + # Linking always hardcodes the temporary library directory. + _LT_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) + +if test relink = "$_LT_TAGVAR(hardcode_action, $1)" || + test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi +_LT_TAGDECL([], [hardcode_action], [0], + [How to hardcode a shared library path into an executable]) +])# _LT_LINKER_HARDCODE_LIBPATH + + +# _LT_CMD_STRIPLIB +# ---------------- +m4_defun([_LT_CMD_STRIPLIB], +[m4_require([_LT_DECL_EGREP]) +striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP"; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) +_LT_DECL([], [striplib], [1]) +])# _LT_CMD_STRIPLIB + + +# _LT_PREPARE_MUNGE_PATH_LIST +# --------------------------- +# Make sure func_munge_path_list() is defined correctly. +m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], +[[# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x@S|@2 in + x) + ;; + *:) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" + ;; + x:*) + eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" + ;; + *) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + esac +} +]])# _LT_PREPARE_PATH_LIST + + +# _LT_SYS_DYNAMIC_LINKER([TAG]) +# ----------------------------- +# PORTME Fill in your ld.so characteristics +m4_defun([_LT_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_OBJDUMP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +m4_if([$1], + [], [ +if test yes = "$GCC"; then + case $host_os in + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary... + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" + elif test -n "$lt_multi_os_dir"; then + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS = " "; FS = "/|\n";} { + lt_foo = ""; + lt_count = 0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo = "/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +AC_ARG_VAR([LT_SYS_LIBRARY_PATH], +[User-defined run-time library search path.]) + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[[4-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib<name>.so + # instead of lib<name>.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a[(]lib.so.V[)]' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[23]].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[[3-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], + [lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ + LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], + [lt_cv_shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + ]) + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + +_LT_DECL([], [variables_saved_for_relink], [1], + [Variables whose values should be saved in libtool wrapper scripts and + restored at link time]) +_LT_DECL([], [need_lib_prefix], [0], + [Do we need the "lib" prefix for modules?]) +_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) +_LT_DECL([], [version_type], [0], [Library versioning type]) +_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) +_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) +_LT_DECL([], [shlibpath_overrides_runpath], [0], + [Is shlibpath searched before the hard-coded library search path?]) +_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) +_LT_DECL([], [library_names_spec], [1], + [[List of archive names. First name is the real one, the rest are links. + The last name is the one that the linker finds with -lNAME]]) +_LT_DECL([], [soname_spec], [1], + [[The coded name of the library, if different from the real name]]) +_LT_DECL([], [install_override_mode], [1], + [Permission mode override for installation of shared libraries]) +_LT_DECL([], [postinstall_cmds], [2], + [Command to use after installation of a shared archive]) +_LT_DECL([], [postuninstall_cmds], [2], + [Command to use after uninstallation of a shared archive]) +_LT_DECL([], [finish_cmds], [2], + [Commands used to finish a libtool library installation in a directory]) +_LT_DECL([], [finish_eval], [1], + [[As "finish_cmds", except a single script fragment to be evaled but + not shown]]) +_LT_DECL([], [hardcode_into_libs], [0], + [Whether we should hardcode library paths into libraries]) +_LT_DECL([], [sys_lib_search_path_spec], [2], + [Compile-time system search path for libraries]) +_LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2], + [Detected run-time system search path for libraries]) +_LT_DECL([], [configure_time_lt_sys_library_path], [2], + [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) +])# _LT_SYS_DYNAMIC_LINKER + + +# _LT_PATH_TOOL_PREFIX(TOOL) +# -------------------------- +# find a file program that can recognize shared library +AC_DEFUN([_LT_PATH_TOOL_PREFIX], +[m4_require([_LT_DECL_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="m4_if([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$1"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac]) +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +_LT_DECL([], [MAGIC_CMD], [0], + [Used to examine libraries when file_magic_cmd begins with "file"])dnl +])# _LT_PATH_TOOL_PREFIX + +# Old name: +AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) + + +# _LT_PATH_MAGIC +# -------------- +# find a file program that can recognize a shared library +m4_defun([_LT_PATH_MAGIC], +[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# _LT_PATH_MAGIC + + +# LT_PATH_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([LT_PATH_LD], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PROG_ECHO_BACKSLASH])dnl + +AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test no = "$withval" || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in + *GNU* | *'with BFD'*) + test no != "$with_gnu_ld" && break + ;; + *) + test yes != "$with_gnu_ld" && break + ;; + esac + fi + done + IFS=$lt_save_ifs +else + lt_cv_path_LD=$LD # Let the user override the test with a path. +fi]) +LD=$lt_cv_path_LD +if test -n "$LD"; then + AC_MSG_RESULT($LD) +else + AC_MSG_RESULT(no) +fi +test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) +_LT_PATH_LD_GNU +AC_SUBST([LD]) + +_LT_TAGDECL([], [LD], [1], [The linker used to build libraries]) +])# LT_PATH_LD + +# Old names: +AU_ALIAS([AM_PROG_LD], [LT_PATH_LD]) +AU_ALIAS([AC_PROG_LD], [LT_PATH_LD]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_PROG_LD], []) +dnl AC_DEFUN([AC_PROG_LD], []) + + +# _LT_PATH_LD_GNU +#- -------------- +m4_defun([_LT_PATH_LD_GNU], +[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld, +[# I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 </dev/null` in +*GNU* | *'with BFD'*) + lt_cv_prog_gnu_ld=yes + ;; +*) + lt_cv_prog_gnu_ld=no + ;; +esac]) +with_gnu_ld=$lt_cv_prog_gnu_ld +])# _LT_PATH_LD_GNU + + +# _LT_CMD_RELOAD +# -------------- +# find reload flag for linker +# -- PORTME Some linkers may need a different reload flag. +m4_defun([_LT_CMD_RELOAD], +[AC_CACHE_CHECK([for $LD option to reload object files], + lt_cv_ld_reload_flag, + [lt_cv_ld_reload_flag='-r']) +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + if test yes != "$GCC"; then + reload_cmds=false + fi + ;; + darwin*) + if test yes = "$GCC"; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac +_LT_TAGDECL([], [reload_flag], [1], [How to create reloadable object files])dnl +_LT_TAGDECL([], [reload_cmds], [2])dnl +])# _LT_CMD_RELOAD + + +# _LT_PATH_DD +# ----------- +# find a working dd +m4_defun([_LT_PATH_DD], +[AC_CACHE_CHECK([for a working dd], [ac_cv_path_lt_DD], +[printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd], +[if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi]) +rm -f conftest.i conftest2.i conftest.out]) +])# _LT_PATH_DD + + +# _LT_CMD_TRUNCATE +# ---------------- +# find command to truncate a binary pipe +m4_defun([_LT_CMD_TRUNCATE], +[m4_require([_LT_PATH_DD]) +AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin], +[printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"]) +_LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1], + [Command to truncate a binary pipe]) +])# _LT_CMD_TRUNCATE + + +# _LT_CHECK_MAGIC_METHOD +# ---------------------- +# how to check for library dependencies +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_MAGIC_METHOD], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +AC_CACHE_CHECK([how to recognize dependent libraries], +lt_cv_deplibs_check_method, +[lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# 'unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# that responds to the $file_magic_cmd with a given extended regex. +# If you have 'file' or equivalent on your system and you're not sure +# whether 'pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[[4-9]]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[[45]]*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[[3-9]]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +_LT_DECL([], [deplibs_check_method], [1], + [Method to check whether dependent libraries are shared objects]) +_LT_DECL([], [file_magic_cmd], [1], + [Command to use when deplibs_check_method = "file_magic"]) +_LT_DECL([], [file_magic_glob], [1], + [How to find potential files when deplibs_check_method = "file_magic"]) +_LT_DECL([], [want_nocaseglob], [1], + [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) +])# _LT_CHECK_MAGIC_METHOD + + +# LT_PATH_NM +# ---------- +# find the pathname to a BSD- or MS-compatible name lister +AC_DEFUN([LT_PATH_NM], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM=$NM +else + lt_nm_to_check=${ac_tool_prefix}nm + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/$lt_tmp_nm + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the 'sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS=$lt_save_ifs + done + : ${lt_cv_path_NM=no} +fi]) +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + DUMPBIN=: + ;; + esac + fi + AC_SUBST([DUMPBIN]) + if test : != "$DUMPBIN"; then + NM=$DUMPBIN + fi +fi +test -z "$NM" && NM=nm +AC_SUBST([NM]) +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) +])# LT_PATH_NM + +# Old names: +AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) +AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_PROG_NM], []) +dnl AC_DEFUN([AC_PROG_NM], []) + +# _LT_CHECK_SHAREDLIB_FROM_LINKLIB +# -------------------------------- +# how to determine the name of the shared library +# associated with a specific link library. +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +m4_require([_LT_DECL_DLLTOOL]) +AC_CACHE_CHECK([how to associate runtime and link libraries], +lt_cv_sharedlib_from_linklib_cmd, +[lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd=$ECHO + ;; +esac +]) +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + +_LT_DECL([], [sharedlib_from_linklib_cmd], [1], + [Command to associate shared and link libraries]) +])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB + + +# _LT_PATH_MANIFEST_TOOL +# ---------------------- +# locate the manifest tool +m4_defun([_LT_PATH_MANIFEST_TOOL], +[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], + [lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&AS_MESSAGE_LOG_FD + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest*]) +if test yes != "$lt_cv_path_mainfest_tool"; then + MANIFEST_TOOL=: +fi +_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl +])# _LT_PATH_MANIFEST_TOOL + + +# _LT_DLL_DEF_P([FILE]) +# --------------------- +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with func_dll_def_p in the libtool script +AC_DEFUN([_LT_DLL_DEF_P], +[dnl + test DEF = "`$SED -n dnl + -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace + -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments + -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl + -e q dnl Only consider the first "real" line + $1`" dnl +])# _LT_DLL_DEF_P + + +# LT_LIB_M +# -------- +# check for math library +AC_DEFUN([LT_LIB_M], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw) + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM=-lm) + ;; +esac +AC_SUBST([LIBM]) +])# LT_LIB_M + +# Old name: +AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_CHECK_LIBM], []) + + +# _LT_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------- +m4_defun([_LT_COMPILER_NO_RTTI], +[m4_require([_LT_TAG_COMPILER])dnl + +_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test yes = "$GCC"; then + case $cc_basename in + nvcc*) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; + *) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; + esac + + _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], + [Compiler flag to turn off builtin functions]) +])# _LT_COMPILER_NO_RTTI + + +# _LT_CMD_GLOBAL_SYMBOLS +# ---------------------- +m4_defun([_LT_CMD_GLOBAL_SYMBOLS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([LT_PATH_NM])dnl +AC_REQUIRE([LT_PATH_LD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_TAG_COMPILER])dnl + +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) + if test ia64 = "$host_cpu"; then + symcode='[[ABCDEGRST]]' + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK ['"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx]" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT@&t@_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT@&t@_DLSYM_CONST +#else +# define LT@&t@_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT@&t@_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[[]] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS=conftstm.$ac_objext + CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test yes = "$pipe_works"; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + +_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], + [Take the output of nm and produce a listing of raw symbols and C names]) +_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], + [Transform the output of nm in a proper C declaration]) +_LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1], + [Transform the output of nm into a list of symbols to manually relocate]) +_LT_DECL([global_symbol_to_c_name_address], + [lt_cv_sys_global_symbol_to_c_name_address], [1], + [Transform the output of nm in a C name address pair]) +_LT_DECL([global_symbol_to_c_name_address_lib_prefix], + [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], + [Transform the output of nm in a C name address pair when lib prefix is needed]) +_LT_DECL([nm_interface], [lt_cv_nm_interface], [1], + [The name lister interface]) +_LT_DECL([], [nm_file_list_spec], [1], + [Specify filename containing input files for $NM]) +]) # _LT_CMD_GLOBAL_SYMBOLS + + +# _LT_COMPILER_PIC([TAGNAME]) +# --------------------------- +m4_defun([_LT_COMPILER_PIC], +[m4_require([_LT_TAG_COMPILER])dnl +_LT_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_TAGVAR(lt_prog_compiler_static, $1)= + +m4_if([$1], [CXX], [ + # C++ specific cases for pic, static, wl, etc. + if test yes = "$GXX"; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + if test ia64 != "$host_cpu"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64, which still supported -KPIC. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test yes = "$GCC"; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' + if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + + hpux9* | hpux10* | hpux11*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' + _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' + ;; + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + *Sun\ F* | *Sun*Fortran*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + *Intel*\ [[CF]]*Compiler*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + *Portland\ Group*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" + ;; +esac + +AC_CACHE_CHECK([for $compiler option to produce PIC], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], + [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], + [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], + [Additional compiler flags for building library objects]) + +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) +# +# Check to make sure the static flag actually works. +# +wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" +_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) +_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], + [Compiler flag to prevent dynamic linking]) +])# _LT_COMPILER_PIC + + +# _LT_LINKER_SHLIBS([TAGNAME]) +# ---------------------------- +# See if the linker supports building shared libraries. +m4_defun([_LT_LINKER_SHLIBS], +[AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +m4_if([$1], [CXX], [ + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + case $host_os in + aix[[4-9]]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + ;; + esac + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +], [ + runpath_var= + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_cmds, $1)= + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(compiler_needs_object, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(old_archive_from_new_cmds, $1)= + _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_TAGVAR(thread_safe_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. +dnl Note also adjust exclude_expsyms for C++ above. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + with_gnu_ld=no + ;; + esac + + _LT_TAGVAR(ld_shlibs, $1)=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; + *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test yes = "$lt_use_gnu_ld_interface"; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='$wl' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test ia64 != "$host_cpu"; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach <jrb3@best.com> says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + _LT_TAGVAR(whole_archive_flag_spec, $1)= + tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + tcc*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then + runpath_var= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix[[4-9]]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac + + if test yes = "$GCC"; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + bsdi[[45]]*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + esac + ;; + + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + ;; + + hpux10*) + if test yes,no = "$GCC,$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test yes,no = "$GCC,$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + m4_if($1, [], [ + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + _LT_LINKER_OPTION([if $CC understands -b], + _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], + [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) + ;; + esac + fi + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], + [lt_cv_irix_exported_symbol], + [save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" + AC_LINK_IFELSE( + [AC_LANG_SOURCE( + [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], + [C++], [[int foo (void) { return 0; }]], + [Fortran 77], [[ + subroutine foo + end]], + [Fortran], [[ + subroutine foo + end]])])], + [lt_cv_irix_exported_symbol=yes], + [lt_cv_irix_exported_symbol=no]) + LDFLAGS=$save_LDFLAGS]) + if test yes = "$lt_cv_irix_exported_symbol"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(ld_shlibs, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *nto* | *qnx*) + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + fi + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + osf3*) + if test yes = "$GCC"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test yes = "$GCC"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' + if test yes = "$GCC"; then + wlarc='$wl' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='$wl' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. GCC discards it without '$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test yes = "$GCC"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test sequent = "$host_vendor"; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + if test sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym' + ;; + esac + fi + fi +]) +AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) +test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no + +_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld + +_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl +_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl +_LT_DECL([], [extract_expsyms_cmds], [2], + [The commands to extract the exported symbol list from a shared archive]) + +# +# Do we need to explicitly link libc? +# +case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $_LT_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_CACHE_CHECK([whether -lc should be explicitly linked in], + [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), + [$RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) + _LT_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) + then + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no + else + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + ]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) + ;; + esac + fi + ;; +esac + +_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], + [Whether or not to add -lc for building shared libraries]) +_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], + [enable_shared_with_static_runtimes], [0], + [Whether or not to disallow shared libs when runtime libs are static]) +_LT_TAGDECL([], [export_dynamic_flag_spec], [1], + [Compiler flag to allow reflexive dlopens]) +_LT_TAGDECL([], [whole_archive_flag_spec], [1], + [Compiler flag to generate shared objects directly from archives]) +_LT_TAGDECL([], [compiler_needs_object], [1], + [Whether the compiler copes with passing no objects directly]) +_LT_TAGDECL([], [old_archive_from_new_cmds], [2], + [Create an old-style archive from a shared archive]) +_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], + [Create a temporary old-style archive to link instead of a shared archive]) +_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) +_LT_TAGDECL([], [archive_expsym_cmds], [2]) +_LT_TAGDECL([], [module_cmds], [2], + [Commands used to build a loadable module if different from building + a shared archive.]) +_LT_TAGDECL([], [module_expsym_cmds], [2]) +_LT_TAGDECL([], [with_gnu_ld], [1], + [Whether we are building with GNU ld or not]) +_LT_TAGDECL([], [allow_undefined_flag], [1], + [Flag that allows shared libraries with undefined symbols to be built]) +_LT_TAGDECL([], [no_undefined_flag], [1], + [Flag that enforces no undefined symbols]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], + [Flag to hardcode $libdir into a binary during linking. + This must work even if $libdir does not exist]) +_LT_TAGDECL([], [hardcode_libdir_separator], [1], + [Whether we need a single "-rpath" flag with a separated argument]) +_LT_TAGDECL([], [hardcode_direct], [0], + [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes + DIR into the resulting binary]) +_LT_TAGDECL([], [hardcode_direct_absolute], [0], + [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes + DIR into the resulting binary and the resulting library dependency is + "absolute", i.e impossible to change by setting $shlibpath_var if the + library is relocated]) +_LT_TAGDECL([], [hardcode_minus_L], [0], + [Set to "yes" if using the -LDIR flag during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_shlibpath_var], [0], + [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_automatic], [0], + [Set to "yes" if building a shared library automatically hardcodes DIR + into the library and all subsequent libraries and executables linked + against it]) +_LT_TAGDECL([], [inherit_rpath], [0], + [Set to yes if linker adds runtime paths of dependent libraries + to runtime path list]) +_LT_TAGDECL([], [link_all_deplibs], [0], + [Whether libtool must link a program against all its dependency libraries]) +_LT_TAGDECL([], [always_export_symbols], [0], + [Set to "yes" if exported symbols are required]) +_LT_TAGDECL([], [export_symbols_cmds], [2], + [The commands to list exported symbols]) +_LT_TAGDECL([], [exclude_expsyms], [1], + [Symbols that should not be listed in the preloaded symbols]) +_LT_TAGDECL([], [include_expsyms], [1], + [Symbols that must always be exported]) +_LT_TAGDECL([], [prelink_cmds], [2], + [Commands necessary for linking programs (against libraries) with templates]) +_LT_TAGDECL([], [postlink_cmds], [2], + [Commands necessary for finishing linking programs]) +_LT_TAGDECL([], [file_list_spec], [1], + [Specify filename containing input files]) +dnl FIXME: Not yet implemented +dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], +dnl [Compiler flag to generate thread safe objects]) +])# _LT_LINKER_SHLIBS + + +# _LT_LANG_C_CONFIG([TAG]) +# ------------------------ +# Ensure that the configuration variables for a C compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_C_CONFIG], +[m4_require([_LT_DECL_EGREP])dnl +lt_save_CC=$CC +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + +_LT_TAG_COMPILER +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + LT_SYS_DLOPEN_SELF + _LT_CMD_STRIPLIB + + # Report what library types will actually be built + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_CONFIG($1) +fi +AC_LANG_POP +CC=$lt_save_CC +])# _LT_LANG_C_CONFIG + + +# _LT_LANG_CXX_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a C++ compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_CXX_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +if test -n "$CXX" && ( test no != "$CXX" && + ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || + (test g++ != "$CXX"))); then + AC_PROG_CXXCPP +else + _lt_caught_CXX_error=yes +fi + +AC_LANG_PUSH(C++) +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(compiler_needs_object, $1)=no +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_caught_CXX_error"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test yes = "$GXX"; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + else + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + fi + + if test yes = "$GXX"; then + # Set up default GNU C++ configuration + + LT_PATH_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test yes = "$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='$wl' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) + _LT_TAGVAR(ld_shlibs, $1)=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aix[[4-9]]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac + + if test yes = "$GXX"; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag=$shared_flag' $wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + # The "-G" linker flag allows undefined symbols. + _LT_TAGVAR(no_undefined_flag, $1)='-bernotok' + # Determine the default libpath from the value encoded in an empty + # executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared + # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach <jrb3@best.com> says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + freebsd-elf*) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + hpux9*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' + fi + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) + _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + case $host in + osf3*) + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + ;; + *) + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ + $RM $lib.exp' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes,no = "$GXX,$with_gnu_ld"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + case $host in + osf3*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test yes,no = "$GXX,$with_gnu_ld"; then + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require '-G' NOT '-shared' on this + # platform. + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ + '"$_LT_TAGVAR(old_archive_cmds, $1)" + _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ + '"$_LT_TAGVAR(reload_cmds, $1)" + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) + test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no + + _LT_TAGVAR(GCC, $1)=$GXX + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test yes != "$_lt_caught_CXX_error" + +AC_LANG_POP +])# _LT_LANG_CXX_CONFIG + + +# _LT_FUNC_STRIPNAME_CNF +# ---------------------- +# func_stripname_cnf prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# +# This function is identical to the (non-XSI) version of func_stripname, +# except this one can be used by m4 code that may be executed by configure, +# rather than the libtool script. +m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl +AC_REQUIRE([_LT_DECL_SED]) +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) +func_stripname_cnf () +{ + case @S|@2 in + .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; + *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;; + esac +} # func_stripname_cnf +])# _LT_FUNC_STRIPNAME_CNF + + +# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) +# --------------------------------- +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +m4_defun([_LT_SYS_HIDDEN_LIBDEPS], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl +# Dependencies to place before and after the object being linked: +_LT_TAGVAR(predep_objects, $1)= +_LT_TAGVAR(postdep_objects, $1)= +_LT_TAGVAR(predeps, $1)= +_LT_TAGVAR(postdeps, $1)= +_LT_TAGVAR(compiler_lib_search_path, $1)= + +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF +int a; +void foo (void) { a = 0; } +_LT_EOF +], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF +], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer*4 a + a=0 + return + end +_LT_EOF +], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer a + a=0 + return + end +_LT_EOF +], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF +public class foo { + private int a; + public void bar (void) { + a = 0; + } +}; +_LT_EOF +], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF +package foo +func foo() { +} +_LT_EOF +]) + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +dnl Parse the compiler output and extract the necessary +dnl objects, libraries and library flags. +if AC_TRY_EVAL(ac_compile); then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $prev$p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test x-L = "$p" || + test x-R = "$p"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test no = "$pre_test_object_deps_done"; then + case $prev in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p + else + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$_LT_TAGVAR(postdeps, $1)"; then + _LT_TAGVAR(postdeps, $1)=$prev$p + else + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test no = "$pre_test_object_deps_done"; then + if test -z "$_LT_TAGVAR(predep_objects, $1)"; then + _LT_TAGVAR(predep_objects, $1)=$p + else + _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" + fi + else + if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then + _LT_TAGVAR(postdep_objects, $1)=$p + else + _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling $1 test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +m4_if([$1], [CXX], +[case $host_os in +interix[[3-9]]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_TAGVAR(predep_objects,$1)= + _LT_TAGVAR(postdep_objects,$1)= + _LT_TAGVAR(postdeps,$1)= + ;; +esac +]) + +case " $_LT_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac + _LT_TAGVAR(compiler_lib_search_dirs, $1)= +if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'` +fi +_LT_TAGDECL([], [compiler_lib_search_dirs], [1], + [The directories searched by this compiler when creating a shared library]) +_LT_TAGDECL([], [predep_objects], [1], + [Dependencies to place before and after the objects being linked to + create a shared library]) +_LT_TAGDECL([], [postdep_objects], [1]) +_LT_TAGDECL([], [predeps], [1]) +_LT_TAGDECL([], [postdeps], [1]) +_LT_TAGDECL([], [compiler_lib_search_path], [1], + [The library search path used internally by the compiler when linking + a shared library]) +])# _LT_SYS_HIDDEN_LIBDEPS + + +# _LT_LANG_F77_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a Fortran 77 compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_F77_CONFIG], +[AC_LANG_PUSH(Fortran 77) +if test -z "$F77" || test no = "$F77"; then + _lt_disable_F77=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the F77 compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_disable_F77"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${F77-"f77"} + CFLAGS=$FFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + GCC=$G77 + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)=$G77 + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test yes != "$_lt_disable_F77" + +AC_LANG_POP +])# _LT_LANG_F77_CONFIG + + +# _LT_LANG_FC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for a Fortran compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_FC_CONFIG], +[AC_LANG_PUSH(Fortran) + +if test -z "$FC" || test no = "$FC"; then + _lt_disable_FC=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for fc test sources. +ac_ext=${ac_fc_srcext-f} + +# Object file extension for compiled fc test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the FC compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_disable_FC"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${FC-"f95"} + CFLAGS=$FCFLAGS + compiler=$CC + GCC=$ac_cv_fc_compiler_gnu + + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test yes != "$_lt_disable_FC" + +AC_LANG_POP +])# _LT_LANG_FC_CONFIG + + +# _LT_LANG_GCJ_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Java Compiler compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_GCJ_CONFIG], +[AC_REQUIRE([LT_PROG_GCJ])dnl +AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GCJ-"gcj"} +CFLAGS=$GCJFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)=$LD +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GCJ_CONFIG + + +# _LT_LANG_GO_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Go compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_GO_CONFIG], +[AC_REQUIRE([LT_PROG_GO])dnl +AC_LANG_SAVE + +# Source file extension for Go test sources. +ac_ext=go + +# Object file extension for compiled Go test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="package main; func main() { }" + +# Code to be used in simple link tests +lt_simple_link_test_code='package main; func main() { }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GOC-"gccgo"} +CFLAGS=$GOFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)=$LD +_LT_CC_BASENAME([$compiler]) + +# Go did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GO_CONFIG + + +# _LT_LANG_RC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for the Windows resource compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_RC_CONFIG], +[AC_REQUIRE([LT_PROG_RC])dnl +AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code=$lt_simple_compile_test_code + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC= +CC=${RC-"windres"} +CFLAGS= +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +if test -n "$compiler"; then + : + _LT_CONFIG($1) +fi + +GCC=$lt_save_GCC +AC_LANG_RESTORE +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_RC_CONFIG + + +# LT_PROG_GCJ +# ----------- +AC_DEFUN([LT_PROG_GCJ], +[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj,) + test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS)])])[]dnl +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_GCJ], []) + + +# LT_PROG_GO +# ---------- +AC_DEFUN([LT_PROG_GO], +[AC_CHECK_TOOL(GOC, gccgo,) +]) + + +# LT_PROG_RC +# ---------- +AC_DEFUN([LT_PROG_RC], +[AC_CHECK_TOOL(RC, windres,) +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_RC], []) + + +# _LT_DECL_EGREP +# -------------- +# If we don't have a new enough Autoconf to choose the best grep +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_EGREP], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_REQUIRE([AC_PROG_FGREP])dnl +test -z "$GREP" && GREP=grep +_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) +_LT_DECL([], [EGREP], [1], [An ERE matcher]) +_LT_DECL([], [FGREP], [1], [A literal string matcher]) +dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too +AC_SUBST([GREP]) +]) + + +# _LT_DECL_OBJDUMP +# -------------- +# If we don't have a new enough Autoconf to choose the best objdump +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_OBJDUMP], +[AC_CHECK_TOOL(OBJDUMP, objdump, false) +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) +AC_SUBST([OBJDUMP]) +]) + +# _LT_DECL_DLLTOOL +# ---------------- +# Ensure DLLTOOL variable is set. +m4_defun([_LT_DECL_DLLTOOL], +[AC_CHECK_TOOL(DLLTOOL, dlltool, false) +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program]) +AC_SUBST([DLLTOOL]) +]) + +# _LT_DECL_SED +# ------------ +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +m4_defun([_LT_DECL_SED], +[AC_PROG_SED +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" +_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) +_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], + [Sed that helps us avoid accidentally triggering echo(1) options like -n]) +])# _LT_DECL_SED + +m4_ifndef([AC_PROG_SED], [ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # + +m4_defun([AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f "$lt_ac_sed" && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test 10 -lt "$lt_ac_count" && break + lt_ac_count=`expr $lt_ac_count + 1` + if test "$lt_ac_count" -gt "$lt_ac_max"; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_SUBST([SED]) +AC_MSG_RESULT([$SED]) +])#AC_PROG_SED +])#m4_ifndef + +# Old name: +AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_SED], []) + + +# _LT_CHECK_SHELL_FEATURES +# ------------------------ +# Find out whether the shell is Bourne or XSI compatible, +# or has some other useful features. +m4_defun([_LT_CHECK_SHELL_FEATURES], +[if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi +_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac +_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl +_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl +])# _LT_CHECK_SHELL_FEATURES + + +# _LT_PATH_CONVERSION_FUNCTIONS +# ----------------------------- +# Determine what file name conversion functions should be used by +# func_to_host_file (and, implicitly, by func_to_host_path). These are needed +# for certain cross-compile configurations and native mingw. +m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_MSG_CHECKING([how to convert $build file names to $host format]) +AC_CACHE_VAL(lt_cv_to_host_file_cmd, +[case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac +]) +to_host_file_cmd=$lt_cv_to_host_file_cmd +AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) +_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], + [0], [convert $build file names to $host format])dnl + +AC_MSG_CHECKING([how to convert $build file names to toolchain format]) +AC_CACHE_VAL(lt_cv_to_tool_file_cmd, +[#assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac +]) +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) +_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], + [0], [convert $build files to toolchain format])dnl +])# _LT_PATH_CONVERSION_FUNCTIONS + +# Helper functions for option handling. -*- Autoconf -*- +# +# Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software +# Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 8 ltoptions.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) + + +# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) +# ------------------------------------------ +m4_define([_LT_MANGLE_OPTION], +[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) + + +# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) +# --------------------------------------- +# Set option OPTION-NAME for macro MACRO-NAME, and if there is a +# matching handler defined, dispatch to it. Other OPTION-NAMEs are +# saved as a flag. +m4_define([_LT_SET_OPTION], +[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl +m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), + _LT_MANGLE_DEFUN([$1], [$2]), + [m4_warning([Unknown $1 option '$2'])])[]dnl +]) + + +# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) +# ------------------------------------------------------------ +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +m4_define([_LT_IF_OPTION], +[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) + + +# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) +# ------------------------------------------------------- +# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME +# are set. +m4_define([_LT_UNLESS_OPTIONS], +[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), + [m4_define([$0_found])])])[]dnl +m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 +])[]dnl +]) + + +# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) +# ---------------------------------------- +# OPTION-LIST is a space-separated list of Libtool options associated +# with MACRO-NAME. If any OPTION has a matching handler declared with +# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about +# the unknown option and exit. +m4_defun([_LT_SET_OPTIONS], +[# Set options +m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [_LT_SET_OPTION([$1], _LT_Option)]) + +m4_if([$1],[LT_INIT],[ + dnl + dnl Simply set some default values (i.e off) if boolean options were not + dnl specified: + _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no + ]) + _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no + ]) + dnl + dnl If no reference was made to various pairs of opposing options, then + dnl we run the default mode handler for the pair. For example, if neither + dnl 'shared' nor 'disable-shared' was passed, we enable building of shared + dnl archives by default: + _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) + _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], + [_LT_ENABLE_FAST_INSTALL]) + _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4], + [_LT_WITH_AIX_SONAME([aix])]) + ]) +])# _LT_SET_OPTIONS + + + +# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) +# ----------------------------------------- +m4_define([_LT_MANGLE_DEFUN], +[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) + + +# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) +# ----------------------------------------------- +m4_define([LT_OPTION_DEFINE], +[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl +])# LT_OPTION_DEFINE + + +# dlopen +# ------ +LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes +]) + +AU_DEFUN([AC_LIBTOOL_DLOPEN], +[_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'dlopen' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) + + +# win32-dll +# --------- +# Declare package support for building win32 dll's. +LT_OPTION_DEFINE([LT_INIT], [win32-dll], +[enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; +esac + +test -z "$AS" && AS=as +_LT_DECL([], [AS], [1], [Assembler program])dnl + +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl + +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl +])# win32-dll + +AU_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'win32-dll' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) + + +# _LT_ENABLE_SHARED([DEFAULT]) +# ---------------------------- +# implement the --enable-shared flag, and supports the 'shared' and +# 'disable-shared' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_SHARED], +[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([shared], + [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) + + _LT_DECL([build_libtool_libs], [enable_shared], [0], + [Whether or not to build shared libraries]) +])# _LT_ENABLE_SHARED + +LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) +]) + +AC_DEFUN([AC_DISABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], [disable-shared]) +]) + +AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_SHARED], []) +dnl AC_DEFUN([AM_DISABLE_SHARED], []) + + + +# _LT_ENABLE_STATIC([DEFAULT]) +# ---------------------------- +# implement the --enable-static flag, and support the 'static' and +# 'disable-static' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_STATIC], +[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([static], + [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [enable_static=]_LT_ENABLE_STATIC_DEFAULT) + + _LT_DECL([build_old_libs], [enable_static], [0], + [Whether or not to build static libraries]) +])# _LT_ENABLE_STATIC + +LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) +]) + +AC_DEFUN([AC_DISABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], [disable-static]) +]) + +AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_STATIC], []) +dnl AC_DEFUN([AM_DISABLE_STATIC], []) + + + +# _LT_ENABLE_FAST_INSTALL([DEFAULT]) +# ---------------------------------- +# implement the --enable-fast-install flag, and support the 'fast-install' +# and 'disable-fast-install' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_FAST_INSTALL], +[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([fast-install], + [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) + +_LT_DECL([fast_install], [enable_fast_install], [0], + [Whether or not to optimize for fast installation])dnl +])# _LT_ENABLE_FAST_INSTALL + +LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) + +# Old names: +AU_DEFUN([AC_ENABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the 'fast-install' option into LT_INIT's first parameter.]) +]) + +AU_DEFUN([AC_DISABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the 'disable-fast-install' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) +dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) + + +# _LT_WITH_AIX_SONAME([DEFAULT]) +# ---------------------------------- +# implement the --with-aix-soname flag, and support the `aix-soname=aix' +# and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT +# is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'. +m4_define([_LT_WITH_AIX_SONAME], +[m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl +shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[[5-9]]*,yes) + AC_MSG_CHECKING([which variant of shared library versioning to provide]) + AC_ARG_WITH([aix-soname], + [AS_HELP_STRING([--with-aix-soname=aix|svr4|both], + [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])], + [case $withval in + aix|svr4|both) + ;; + *) + AC_MSG_ERROR([Unknown argument to --with-aix-soname]) + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname], + [AC_CACHE_VAL([lt_cv_with_aix_soname], + [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT) + with_aix_soname=$lt_cv_with_aix_soname]) + AC_MSG_RESULT([$with_aix_soname]) + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + +_LT_DECL([], [shared_archive_member_spec], [0], + [Shared archive member basename, for filename based shared library versioning on AIX])dnl +])# _LT_WITH_AIX_SONAME + +LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])]) + + +# _LT_WITH_PIC([MODE]) +# -------------------- +# implement the --with-pic flag, and support the 'pic-only' and 'no-pic' +# LT_INIT options. +# MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'. +m4_define([_LT_WITH_PIC], +[AC_ARG_WITH([pic], + [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for lt_pkg in $withval; do + IFS=$lt_save_ifs + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [pic_mode=m4_default([$1], [default])]) + +_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl +])# _LT_WITH_PIC + +LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) + +# Old name: +AU_DEFUN([AC_LIBTOOL_PICMODE], +[_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'pic-only' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) + + +m4_define([_LTDL_MODE], []) +LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], + [m4_define([_LTDL_MODE], [nonrecursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [recursive], + [m4_define([_LTDL_MODE], [recursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [subproject], + [m4_define([_LTDL_MODE], [subproject])]) + +m4_define([_LTDL_TYPE], []) +LT_OPTION_DEFINE([LTDL_INIT], [installable], + [m4_define([_LTDL_TYPE], [installable])]) +LT_OPTION_DEFINE([LTDL_INIT], [convenience], + [m4_define([_LTDL_TYPE], [convenience])]) + +# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- +# +# Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software +# Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 6 ltsugar.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) + + +# lt_join(SEP, ARG1, [ARG2...]) +# ----------------------------- +# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their +# associated separator. +# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier +# versions in m4sugar had bugs. +m4_define([lt_join], +[m4_if([$#], [1], [], + [$#], [2], [[$2]], + [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) +m4_define([_lt_join], +[m4_if([$#$2], [2], [], + [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) + + +# lt_car(LIST) +# lt_cdr(LIST) +# ------------ +# Manipulate m4 lists. +# These macros are necessary as long as will still need to support +# Autoconf-2.59, which quotes differently. +m4_define([lt_car], [[$1]]) +m4_define([lt_cdr], +[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], + [$#], 1, [], + [m4_dquote(m4_shift($@))])]) +m4_define([lt_unquote], $1) + + +# lt_append(MACRO-NAME, STRING, [SEPARATOR]) +# ------------------------------------------ +# Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'. +# Note that neither SEPARATOR nor STRING are expanded; they are appended +# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). +# No SEPARATOR is output if MACRO-NAME was previously undefined (different +# than defined and empty). +# +# This macro is needed until we can rely on Autoconf 2.62, since earlier +# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. +m4_define([lt_append], +[m4_define([$1], + m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) + + + +# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) +# ---------------------------------------------------------- +# Produce a SEP delimited list of all paired combinations of elements of +# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list +# has the form PREFIXmINFIXSUFFIXn. +# Needed until we can rely on m4_combine added in Autoconf 2.62. +m4_define([lt_combine], +[m4_if(m4_eval([$# > 3]), [1], + [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl +[[m4_foreach([_Lt_prefix], [$2], + [m4_foreach([_Lt_suffix], + ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, + [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) + + +# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) +# ----------------------------------------------------------------------- +# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited +# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. +m4_define([lt_if_append_uniq], +[m4_ifdef([$1], + [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], + [lt_append([$1], [$2], [$3])$4], + [$5])], + [lt_append([$1], [$2], [$3])$4])]) + + +# lt_dict_add(DICT, KEY, VALUE) +# ----------------------------- +m4_define([lt_dict_add], +[m4_define([$1($2)], [$3])]) + + +# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) +# -------------------------------------------- +m4_define([lt_dict_add_subkey], +[m4_define([$1($2:$3)], [$4])]) + + +# lt_dict_fetch(DICT, KEY, [SUBKEY]) +# ---------------------------------- +m4_define([lt_dict_fetch], +[m4_ifval([$3], + m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), + m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) + + +# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) +# ----------------------------------------------------------------- +m4_define([lt_if_dict_fetch], +[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], + [$5], + [$6])]) + + +# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) +# -------------------------------------------------------------- +m4_define([lt_dict_filter], +[m4_if([$5], [], [], + [lt_join(m4_quote(m4_default([$4], [[, ]])), + lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), + [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl +]) + +# ltversion.m4 -- version numbers -*- Autoconf -*- +# +# Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# @configure_input@ + +# serial 4179 ltversion.m4 +# This file is part of GNU Libtool + +m4_define([LT_PACKAGE_VERSION], [2.4.6]) +m4_define([LT_PACKAGE_REVISION], [2.4.6]) + +AC_DEFUN([LTVERSION_VERSION], +[macro_version='2.4.6' +macro_revision='2.4.6' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +]) + +# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- +# +# Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software +# Foundation, Inc. +# Written by Scott James Remnant, 2004. +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 5 lt~obsolete.m4 + +# These exist entirely to fool aclocal when bootstrapping libtool. +# +# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN), +# which have later been changed to m4_define as they aren't part of the +# exported API, or moved to Autoconf or Automake where they belong. +# +# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN +# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us +# using a macro with the same name in our local m4/libtool.m4 it'll +# pull the old libtool.m4 in (it doesn't see our shiny new m4_define +# and doesn't know about Autoconf macros at all.) +# +# So we provide this file, which has a silly filename so it's always +# included after everything else. This provides aclocal with the +# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything +# because those macros already exist, or will be overwritten later. +# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. +# +# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. +# Yes, that means every name once taken will need to remain here until +# we give up compatibility with versions before 1.7, at which point +# we need to keep only those names which we still refer to. + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) + +m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) +m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) +m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) +m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) +m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) +m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) +m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) +m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) +m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) +m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) +m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) +m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) +m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) +m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) +m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) +m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) +m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) +m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) +m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) +m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) +m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) +m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) +m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) +m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) +m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) +m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) +m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) +m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) +m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) +m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) +m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) +m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) +m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) +m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) +m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) +m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) +m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) +m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) +m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) +m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) +m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) +m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) +m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) +m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) +m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) +m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) +m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) +m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) +m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) +m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) + +# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +# serial 11 (pkg-config-0.29.1) + +dnl Copyright © 2004 Scott James Remnant <scott@netsplit.com>. +dnl Copyright © 2012-2015 Dan Nicholson <dbn.lists@gmail.com> +dnl +dnl This program is free software; you can redistribute it and/or modify +dnl it under the terms of the GNU General Public License as published by +dnl the Free Software Foundation; either version 2 of the License, or +dnl (at your option) any later version. +dnl +dnl This program is distributed in the hope that it will be useful, but +dnl WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl General Public License for more details. +dnl +dnl You should have received a copy of the GNU General Public License +dnl along with this program; if not, write to the Free Software +dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +dnl 02111-1307, USA. +dnl +dnl As a special exception to the GNU General Public License, if you +dnl distribute this file as part of a program that contains a +dnl configuration script generated by Autoconf, you may include it under +dnl the same distribution terms that you use for the rest of that +dnl program. + +dnl PKG_PREREQ(MIN-VERSION) +dnl ----------------------- +dnl Since: 0.29 +dnl +dnl Verify that the version of the pkg-config macros are at least +dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's +dnl installed version of pkg-config, this checks the developer's version +dnl of pkg.m4 when generating configure. +dnl +dnl To ensure that this macro is defined, also add: +dnl m4_ifndef([PKG_PREREQ], +dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) +dnl +dnl See the "Since" comment for each macro you use to see what version +dnl of the macros you require. +m4_defun([PKG_PREREQ], +[m4_define([PKG_MACROS_VERSION], [0.29.1]) +m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, + [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) +])dnl PKG_PREREQ + +dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) +dnl ---------------------------------- +dnl Since: 0.16 +dnl +dnl Search for the pkg-config tool and set the PKG_CONFIG variable to +dnl first found in the path. Checks that the version of pkg-config found +dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is +dnl used since that's the first version where most current features of +dnl pkg-config existed. +AC_DEFUN([PKG_PROG_PKG_CONFIG], +[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) +m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) +m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) +AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) +AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) +AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=m4_default([$1], [0.9.0]) + AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + PKG_CONFIG="" + fi +fi[]dnl +])dnl PKG_PROG_PKG_CONFIG + +dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ------------------------------------------------------------------- +dnl Since: 0.18 +dnl +dnl Check to see whether a particular set of modules exists. Similar to +dnl PKG_CHECK_MODULES(), but does not set variables or print errors. +dnl +dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +dnl only at the first occurence in configure.ac, so if the first place +dnl it's called might be skipped (such as if it is within an "if", you +dnl have to call PKG_CHECK_EXISTS manually +AC_DEFUN([PKG_CHECK_EXISTS], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +if test -n "$PKG_CONFIG" && \ + AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then + m4_default([$2], [:]) +m4_ifvaln([$3], [else + $3])dnl +fi]) + +dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) +dnl --------------------------------------------- +dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting +dnl pkg_failed based on the result. +m4_define([_PKG_CONFIG], +[if test -n "$$1"; then + pkg_cv_[]$1="$$1" + elif test -n "$PKG_CONFIG"; then + PKG_CHECK_EXISTS([$3], + [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes ], + [pkg_failed=yes]) + else + pkg_failed=untried +fi[]dnl +])dnl _PKG_CONFIG + +dnl _PKG_SHORT_ERRORS_SUPPORTED +dnl --------------------------- +dnl Internal check to see if pkg-config supports short errors. +AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi[]dnl +])dnl _PKG_SHORT_ERRORS_SUPPORTED + + +dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +dnl [ACTION-IF-NOT-FOUND]) +dnl -------------------------------------------------------------- +dnl Since: 0.4.0 +dnl +dnl Note that if there is a possibility the first call to +dnl PKG_CHECK_MODULES might not happen, you should be sure to include an +dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac +AC_DEFUN([PKG_CHECK_MODULES], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl +AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl + +pkg_failed=no +AC_MSG_CHECKING([for $1]) + +_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) +_PKG_CONFIG([$1][_LIBS], [libs], [$2]) + +m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS +and $1[]_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details.]) + +if test $pkg_failed = yes; then + AC_MSG_RESULT([no]) + _PKG_SHORT_ERRORS_SUPPORTED + if test $_pkg_short_errors_supported = yes; then + $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` + else + $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD + + m4_default([$4], [AC_MSG_ERROR( +[Package requirements ($2) were not met: + +$$1_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +_PKG_TEXT])[]dnl + ]) +elif test $pkg_failed = untried; then + AC_MSG_RESULT([no]) + m4_default([$4], [AC_MSG_FAILURE( +[The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +_PKG_TEXT + +To get pkg-config, see <http://pkg-config.freedesktop.org/>.])[]dnl + ]) +else + $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS + $1[]_LIBS=$pkg_cv_[]$1[]_LIBS + AC_MSG_RESULT([yes]) + $3 +fi[]dnl +])dnl PKG_CHECK_MODULES + + +dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +dnl [ACTION-IF-NOT-FOUND]) +dnl --------------------------------------------------------------------- +dnl Since: 0.29 +dnl +dnl Checks for existence of MODULES and gathers its build flags with +dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags +dnl and VARIABLE-PREFIX_LIBS from --libs. +dnl +dnl Note that if there is a possibility the first call to +dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to +dnl include an explicit call to PKG_PROG_PKG_CONFIG in your +dnl configure.ac. +AC_DEFUN([PKG_CHECK_MODULES_STATIC], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +_save_PKG_CONFIG=$PKG_CONFIG +PKG_CONFIG="$PKG_CONFIG --static" +PKG_CHECK_MODULES($@) +PKG_CONFIG=$_save_PKG_CONFIG[]dnl +])dnl PKG_CHECK_MODULES_STATIC + + +dnl PKG_INSTALLDIR([DIRECTORY]) +dnl ------------------------- +dnl Since: 0.27 +dnl +dnl Substitutes the variable pkgconfigdir as the location where a module +dnl should install pkg-config .pc files. By default the directory is +dnl $libdir/pkgconfig, but the default can be changed by passing +dnl DIRECTORY. The user can override through the --with-pkgconfigdir +dnl parameter. +AC_DEFUN([PKG_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([pkgconfigdir], + [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, + [with_pkgconfigdir=]pkg_default) +AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +])dnl PKG_INSTALLDIR + + +dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) +dnl -------------------------------- +dnl Since: 0.27 +dnl +dnl Substitutes the variable noarch_pkgconfigdir as the location where a +dnl module should install arch-independent pkg-config .pc files. By +dnl default the directory is $datadir/pkgconfig, but the default can be +dnl changed by passing DIRECTORY. The user can override through the +dnl --with-noarch-pkgconfigdir parameter. +AC_DEFUN([PKG_NOARCH_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([noarch-pkgconfigdir], + [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, + [with_noarch_pkgconfigdir=]pkg_default) +AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +])dnl PKG_NOARCH_INSTALLDIR + + +dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, +dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ------------------------------------------- +dnl Since: 0.28 +dnl +dnl Retrieves the value of the pkg-config variable for the given module. +AC_DEFUN([PKG_CHECK_VAR], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl + +_PKG_CONFIG([$1], [variable="][$3]["], [$2]) +AS_VAR_COPY([$1], [pkg_cv_][$1]) + +AS_VAR_IF([$1], [""], [$5], [$4])dnl +])dnl PKG_CHECK_VAR + +dnl PKG_WITH_MODULES(VARIABLE-PREFIX, MODULES, +dnl [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND], +dnl [DESCRIPTION], [DEFAULT]) +dnl ------------------------------------------ +dnl +dnl Prepare a "--with-" configure option using the lowercase +dnl [VARIABLE-PREFIX] name, merging the behaviour of AC_ARG_WITH and +dnl PKG_CHECK_MODULES in a single macro. +AC_DEFUN([PKG_WITH_MODULES], +[ +m4_pushdef([with_arg], m4_tolower([$1])) + +m4_pushdef([description], + [m4_default([$5], [build with ]with_arg[ support])]) + +m4_pushdef([def_arg], [m4_default([$6], [auto])]) +m4_pushdef([def_action_if_found], [AS_TR_SH([with_]with_arg)=yes]) +m4_pushdef([def_action_if_not_found], [AS_TR_SH([with_]with_arg)=no]) + +m4_case(def_arg, + [yes],[m4_pushdef([with_without], [--without-]with_arg)], + [m4_pushdef([with_without],[--with-]with_arg)]) + +AC_ARG_WITH(with_arg, + AS_HELP_STRING(with_without, description[ @<:@default=]def_arg[@:>@]),, + [AS_TR_SH([with_]with_arg)=def_arg]) + +AS_CASE([$AS_TR_SH([with_]with_arg)], + [yes],[PKG_CHECK_MODULES([$1],[$2],$3,$4)], + [auto],[PKG_CHECK_MODULES([$1],[$2], + [m4_n([def_action_if_found]) $3], + [m4_n([def_action_if_not_found]) $4])]) + +m4_popdef([with_arg]) +m4_popdef([description]) +m4_popdef([def_arg]) + +])dnl PKG_WITH_MODULES + +dnl PKG_HAVE_WITH_MODULES(VARIABLE-PREFIX, MODULES, +dnl [DESCRIPTION], [DEFAULT]) +dnl ----------------------------------------------- +dnl +dnl Convenience macro to trigger AM_CONDITIONAL after PKG_WITH_MODULES +dnl check._[VARIABLE-PREFIX] is exported as make variable. +AC_DEFUN([PKG_HAVE_WITH_MODULES], +[ +PKG_WITH_MODULES([$1],[$2],,,[$3],[$4]) + +AM_CONDITIONAL([HAVE_][$1], + [test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"]) +])dnl PKG_HAVE_WITH_MODULES + +dnl PKG_HAVE_DEFINE_WITH_MODULES(VARIABLE-PREFIX, MODULES, +dnl [DESCRIPTION], [DEFAULT]) +dnl ------------------------------------------------------ +dnl +dnl Convenience macro to run AM_CONDITIONAL and AC_DEFINE after +dnl PKG_WITH_MODULES check. HAVE_[VARIABLE-PREFIX] is exported as make +dnl and preprocessor variable. +AC_DEFUN([PKG_HAVE_DEFINE_WITH_MODULES], +[ +PKG_HAVE_WITH_MODULES([$1],[$2],[$3],[$4]) + +AS_IF([test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"], + [AC_DEFINE([HAVE_][$1], 1, [Enable ]m4_tolower([$1])[ support])]) +])dnl PKG_HAVE_DEFINE_WITH_MODULES + +# Copyright (C) 2002-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.15' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.15.1], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.15.1])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to +# '$srcdir', '$srcdir/..', or '$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is '.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ([2.52])dnl + m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], + [$1], [CXX], [depcc="$CXX" am_compiler_list=], + [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], + [$1], [UPC], [depcc="$UPC" am_compiler_list=], + [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES. +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE([dependency-tracking], [dnl +AS_HELP_STRING( + [--enable-dependency-tracking], + [do not reject slow dependency extractors]) +AS_HELP_STRING( + [--disable-dependency-tracking], + [speeds up one-time build])]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "$am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each '.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + + +# Copyright (C) 1996-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +AC_DEFUN([AM_WITH_DMALLOC], +[AC_MSG_CHECKING([if malloc debugging is wanted]) +AC_ARG_WITH([dmalloc], +[AS_HELP_STRING([--with-dmalloc], + [use dmalloc, as in http://www.dmalloc.com])], +[if test "$withval" = yes; then + AC_MSG_RESULT([yes]) + AC_DEFINE([WITH_DMALLOC], [1], + [Define if using the dmalloc debugging malloc package]) + LIBS="$LIBS -ldmalloc" + LDFLAGS="$LDFLAGS -g" +else + AC_MSG_RESULT([no]) +fi], [AC_MSG_RESULT([no])]) +]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. +m4_define([AC_PROG_CC], +m4_defn([AC_PROG_CC]) +[_AM_PROG_CC_C_O +]) + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.65])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[AC_DIAGNOSE([obsolete], + [$0: two- and three-arguments forms are deprecated.]) +m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if( + m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), + [ok:ok],, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) + AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +AM_MISSING_PROG([AUTOCONF], [autoconf]) +AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +AM_MISSING_PROG([AUTOHEADER], [autoheader]) +AM_MISSING_PROG([MAKEINFO], [makeinfo]) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html> +# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html> +AC_SUBST([mkdir_p], ['$(MKDIR_P)']) +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES([CC])], + [m4_define([AC_PROG_CC], + m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES([CXX])], + [m4_define([AC_PROG_CXX], + m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES([OBJC])], + [m4_define([AC_PROG_OBJC], + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES([OBJCXX])], + [m4_define([AC_PROG_OBJCXX], + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl +]) +AC_REQUIRE([AM_SILENT_RULES])dnl +dnl The testsuite driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542> + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: <http://www.gnu.org/software/coreutils/>. + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) + fi +fi +dnl The trailing newline in this macro's definition is deliberate, for +dnl backward compatibility and to allow trailing 'dnl'-style comments +dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. +]) + +dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST([install_sh])]) + +# Copyright (C) 2003-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Add --enable-maintainer-mode option to configure. -*- Autoconf -*- +# From Jim Meyering + +# Copyright (C) 1996-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MAINTAINER_MODE([DEFAULT-MODE]) +# ---------------------------------- +# Control maintainer-specific portions of Makefiles. +# Default is to disable them, unless 'enable' is passed literally. +# For symmetry, 'disable' may be passed as well. Anyway, the user +# can override the default with the --enable/--disable switch. +AC_DEFUN([AM_MAINTAINER_MODE], +[m4_case(m4_default([$1], [disable]), + [enable], [m4_define([am_maintainer_other], [disable])], + [disable], [m4_define([am_maintainer_other], [enable])], + [m4_define([am_maintainer_other], [enable]) + m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) +AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) + dnl maintainer-mode's default is 'disable' unless 'enable' is passed + AC_ARG_ENABLE([maintainer-mode], + [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], + am_maintainer_other[ make rules and dependencies not useful + (and sometimes confusing) to the casual installer])], + [USE_MAINTAINER_MODE=$enableval], + [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) + AC_MSG_RESULT([$USE_MAINTAINER_MODE]) + AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) + MAINT=$MAINTAINER_MODE_TRUE + AC_SUBST([MAINT])dnl +] +) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it is modern enough. +# If it is, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + AC_MSG_WARN(['missing' script is too old or missing]) +fi +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# -------------------- +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) + +# _AM_SET_OPTIONS(OPTIONS) +# ------------------------ +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Copyright (C) 1999-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_CC_C_O +# --------------- +# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC +# to automatically call this. +AC_DEFUN([_AM_PROG_CC_C_O], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +AC_LANG_PUSH([C])dnl +AC_CACHE_CHECK( + [whether $CC understands -c and -o together], + [am_cv_prog_cc_c_o], + [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i]) +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +AC_LANG_POP([C])]) + +# For backward compatibility. +AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) + +# Copyright (C) 2001-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_RUN_LOG(COMMAND) +# ------------------- +# Run COMMAND, save the exit status in ac_status, and log it. +# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) +AC_DEFUN([AM_RUN_LOG], +[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken + alias in your environment]) + fi + if test "$[2]" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT([yes]) +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi +AC_CONFIG_COMMANDS_PRE( + [AC_MSG_CHECKING([that generated files are newer than configure]) + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + AC_MSG_RESULT([done])]) +rm -f conftest.file +]) + +# Copyright (C) 2009-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# ("yes" being less verbose, "no" or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + +# Copyright (C) 2001-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor 'install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in "make install-strip", and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# -------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of 'v7', 'ustar', or 'pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +# +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' + +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + + [m4_case([$1], + [ustar], + [# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) + if test $am_uid -le $am_max_uid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi + AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) + if test $am_gid -le $am_max_gid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi], + + [pax], + [], + + [m4_fatal([Unknown tar format])]) + + AC_MSG_CHECKING([how to create a $1 tar archive]) + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_$1-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar <conftest.tar]) + AM_RUN_LOG([cat conftest.dir/file]) + grep GrepMe conftest.dir/file >/dev/null 2>&1 && break + fi + done + rm -rf conftest.dir + + AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) + AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +m4_include([acinclude.m4]) diff --git a/compile b/compile new file mode 100755 index 0000000..2ab71e4 --- /dev/null +++ b/compile @@ -0,0 +1,348 @@ +#! /bin/sh +# Wrapper for compilers which do not understand '-c -o'. + +scriptversion=2016-01-11.22; # UTC + +# Copyright (C) 1999-2017 Free Software Foundation, Inc. +# Written by Tom Tromey <tromey@cygnus.com>. +# +# This program 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 2, or (at your option) +# any later version. +# +# This program 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 this program. If not, see <http://www.gnu.org/licenses/>. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to <bug-automake@gnu.org> or send patches to +# <automake-patches@gnu.org>. + +nl=' +' + +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent tools from complaining about whitespace usage. +IFS=" "" $nl" + +file_conv= + +# func_file_conv build_file lazy +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. If the determined conversion +# type is listed in (the comma separated) LAZY, no conversion will +# take place. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv/,$2, in + *,$file_conv,*) + ;; + mingw/*) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin/*) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine/*) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_cl_dashL linkdir +# Make cl look for libraries in LINKDIR +func_cl_dashL () +{ + func_file_conv "$1" + if test -z "$lib_path"; then + lib_path=$file + else + lib_path="$lib_path;$file" + fi + linker_opts="$linker_opts -LIBPATH:$file" +} + +# func_cl_dashl library +# Do a library search-path lookup for cl +func_cl_dashl () +{ + lib=$1 + found=no + save_IFS=$IFS + IFS=';' + for dir in $lib_path $LIB + do + IFS=$save_IFS + if $shared && test -f "$dir/$lib.dll.lib"; then + found=yes + lib=$dir/$lib.dll.lib + break + fi + if test -f "$dir/$lib.lib"; then + found=yes + lib=$dir/$lib.lib + break + fi + if test -f "$dir/lib$lib.a"; then + found=yes + lib=$dir/lib$lib.a + break + fi + done + IFS=$save_IFS + + if test "$found" != yes; then + lib=$lib.lib + fi +} + +# func_cl_wrapper cl arg... +# Adjust compile command to suit cl +func_cl_wrapper () +{ + # Assume a capable shell + lib_path= + shared=: + linker_opts= + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + eat=1 + case $2 in + *.o | *.[oO][bB][jJ]) + func_file_conv "$2" + set x "$@" -Fo"$file" + shift + ;; + *) + func_file_conv "$2" + set x "$@" -Fe"$file" + shift + ;; + esac + ;; + -I) + eat=1 + func_file_conv "$2" mingw + set x "$@" -I"$file" + shift + ;; + -I*) + func_file_conv "${1#-I}" mingw + set x "$@" -I"$file" + shift + ;; + -l) + eat=1 + func_cl_dashl "$2" + set x "$@" "$lib" + shift + ;; + -l*) + func_cl_dashl "${1#-l}" + set x "$@" "$lib" + shift + ;; + -L) + eat=1 + func_cl_dashL "$2" + ;; + -L*) + func_cl_dashL "${1#-L}" + ;; + -static) + shared=false + ;; + -Wl,*) + arg=${1#-Wl,} + save_ifs="$IFS"; IFS=',' + for flag in $arg; do + IFS="$save_ifs" + linker_opts="$linker_opts $flag" + done + IFS="$save_ifs" + ;; + -Xlinker) + eat=1 + linker_opts="$linker_opts $2" + ;; + -*) + set x "$@" "$1" + shift + ;; + *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) + func_file_conv "$1" + set x "$@" -Tp"$file" + shift + ;; + *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) + func_file_conv "$1" mingw + set x "$@" "$file" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift + done + if test -n "$linker_opts"; then + linker_opts="-link$linker_opts" + fi + exec "$@" $linker_opts + exit 1 +} + +eat= + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand '-c -o'. +Remove '-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file 'INSTALL'. + +Report bugs to <bug-automake@gnu.org>. +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ + icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) + func_cl_wrapper "$@" # Doesn't return... + ;; +esac + +ofile= +cfile= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no '-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # '.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use '[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/config.guess b/config.guess new file mode 100755 index 0000000..0bb53ae --- /dev/null +++ b/config.guess @@ -0,0 +1,1433 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright 1992-2015 Free Software Foundation, Inc. + +timestamp='2015-03-04' + +# This file 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. +# +# This program 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 this program; if not, see <http://www.gnu.org/licenses/>. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). +# +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. +# +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD +# +# Please send patches to <config-patches@gnu.org>. + + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to <config-patches@gnu.org>." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright 1992-2015 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +case "${UNAME_SYSTEM}" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + eval $set_cc_for_build + cat <<-EOF > $dummy.c + #include <features.h> + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #else + LIBC=gnu + #endif + EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` + ;; +esac + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + /sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || \ + echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + earmv*) + arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'` + machine=${arch}${endian}-unknown + ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|earm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # Determine ABI tags. + case "${UNAME_MACHINE_ARCH}" in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"` + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}${abi}" + exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux${UNAME_RELEASE} + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval $set_cc_for_build + SUN_ARCH="i386" + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH="x86_64" + fi + fi + echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include <stdio.h> /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include <sys/systemcfg.h> + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/lslpp ] ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include <stdlib.h> + #include <unistd.h> + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include <unistd.h> + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`/usr/bin/uname -p` + echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW64*:*) + echo ${UNAME_MACHINE}-pc-mingw64 + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + *:MSYS*:*) + echo ${UNAME_MACHINE}-pc-msys + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-unknown-interix${UNAME_RELEASE} + exit ;; + esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + 8664:Windows_NT:*) + echo x86_64-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + aarch64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC="gnulibc1" ; fi + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi + else + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf + fi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + cris:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-${LIBC} + exit ;; + crisv32:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-${LIBC} + exit ;; + e2k:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + frv:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + hexagon:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + i*86:Linux:*:*) + echo ${UNAME_MACHINE}-pc-linux-${LIBC} + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } + ;; + openrisc*:Linux:*:*) + echo or1k-unknown-linux-${LIBC} + exit ;; + or32:Linux:*:* | or1k*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-${LIBC} + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-${LIBC} + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; + PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; + *) echo hppa-unknown-linux-${LIBC} ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-${LIBC} + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-${LIBC} + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-${LIBC} + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-${LIBC} + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux-${LIBC} + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + tile*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-${LIBC} + exit ;; + x86_64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name` + echo ${UNAME_MACHINE}-pc-isc$UNAME_REL + elif /bin/uname -X 2>/dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configury will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says <Richard.M.Bartel@ccMail.Census.GOV> + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes <hewes@openmarket.com>. + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + eval $set_cc_for_build + if test "$UNAME_PROCESSOR" = unknown ; then + UNAME_PROCESSOR=powerpc + fi + if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # Avoid executing cc on OS X 10.9, as it ships with a stub + # that puts up a graphical alert prompting to install + # developer tools. Any system running Mac OS X 10.7 or + # later (Darwin 11 and later) is required to have a 64-bit + # processor. This is not true of the ARM version of Darwin + # that Apple uses in portable devices. + UNAME_PROCESSOR=x86_64 + fi + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NEO-?:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk${UNAME_RELEASE} + exit ;; + NSE-*:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; + i*86:AROS:*:*) + echo ${UNAME_MACHINE}-pc-aros + exit ;; + x86_64:VMkernel:*:*) + echo ${UNAME_MACHINE}-unknown-esx + exit ;; +esac + +cat >&2 <<EOF +$0: unable to guess system type + +This script, last modified $timestamp, has failed to recognize +the operating system you are using. It is advised that you +download the most up to date version of the config scripts from + + http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD +and + http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD + +If the version you run ($0) is already up to date, please +send the following data and any information you think might be +pertinent to <config-patches@gnu.org> in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/config.h.in b/config.h.in new file mode 100644 index 0000000..93b80c0 --- /dev/null +++ b/config.h.in @@ -0,0 +1,371 @@ +/* config.h.in. Generated from configure.in by autoheader. */ + + +#ifndef LAME_CONFIG_H +#define LAME_CONFIG_H + + +/* debug define */ +#undef ABORTFP + +/* Define if building universal (internal helper macro) */ +#undef AC_APPLE_UNIVERSAL_BUILD + +/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP + systems. This function is required for `alloca.c' support on those systems. + */ +#undef CRAY_STACKSEG_END + +/* Define to 1 if using `alloca.c'. */ +#undef C_ALLOCA + +/* alot of debug output */ +#undef DEBUG + +/* allow to compute a more accurate replaygain value */ +#undef DECODE_ON_THE_FLY + +/* double is faster than float on Alpha */ +#undef FLOAT + +/* Define to 1 if you have `alloca', as a function or macro. */ +#undef HAVE_ALLOCA + +/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix). + */ +#undef HAVE_ALLOCA_H + +/* Define to 1 if you have the <dlfcn.h> header file. */ +#undef HAVE_DLFCN_H + +/* we link against libefence */ +#undef HAVE_EFENCE + +/* Define to 1 if you have the <errno.h> header file. */ +#undef HAVE_ERRNO_H + +/* Define to 1 if you have the <fcntl.h> header file. */ +#undef HAVE_FCNTL_H + +/* Define to 1 if you have the `gettimeofday' function. */ +#undef HAVE_GETTIMEOFDAY + +/* Define if you have the iconv() function and it works. */ +#undef HAVE_ICONV + +/* add ieee754_float32_t type */ +#undef HAVE_IEEE754_FLOAT32_T +#ifndef HAVE_IEEE754_FLOAT32_T + typedef float ieee754_float32_t; +#endif + +/* add ieee754_float64_t type */ +#undef HAVE_IEEE754_FLOAT64_T +#ifndef HAVE_IEEE754_FLOAT64_T + typedef double ieee754_float64_t; +#endif + +/* system has 80 bit floats */ +#undef HAVE_IEEE854_FLOAT80 + +/* add ieee854_float80_t type */ +#undef HAVE_IEEE854_FLOAT80_T +#ifndef HAVE_IEEE854_FLOAT80_T + typedef long double ieee854_float80_t; +#endif + +/* add int16_t type */ +#undef HAVE_INT16_T +#ifndef HAVE_INT16_T + typedef short int16_t; +#endif + +/* add int32_t type */ +#undef HAVE_INT32_T +#ifndef HAVE_INT32_T +#undef A_INT32_T + typedef A_INT32_T int32_t; +#endif + +/* add int64_t type */ +#undef HAVE_INT64_T +#ifndef HAVE_INT64_T +#undef A_INT64_T + typedef A_INT64_T int64_t; +#endif + +/* add int8_t type */ +#undef HAVE_INT8_T +#ifndef HAVE_INT8_T + typedef char int8_t; +#endif + +/* Define to 1 if you have the <inttypes.h> header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the <limits.h> header file. */ +#undef HAVE_LIMITS_H + +/* Define to 1 if you have the <linux/soundcard.h> header file. */ +#undef HAVE_LINUX_SOUNDCARD_H + +/* Define to 1 if the type `long double' works and has more range or precision + than `double'. */ +#undef HAVE_LONG_DOUBLE + +/* Define to 1 if the type `long double' works and has more range or precision + than `double'. */ +#undef HAVE_LONG_DOUBLE_WIDER + +/* Define to 1 if you have the <memory.h> header file. */ +#undef HAVE_MEMORY_H + +/* build with mpglib support */ +#undef HAVE_MPGLIB + +/* have nasm */ +#undef HAVE_NASM + +/* Define to 1 if you have the <ncurses/termcap.h> header file. */ +#undef HAVE_NCURSES_TERMCAP_H + +/* Define to 1 if you have the `socket' function. */ +#undef HAVE_SOCKET + +/* Define to 1 if you have the <stdint.h> header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the <stdlib.h> header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the <strings.h> header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the <string.h> header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the `strtol' function. */ +#undef HAVE_STRTOL + +/* Define to 1 if you have the <sys/soundcard.h> header file. */ +#undef HAVE_SYS_SOUNDCARD_H + +/* Define to 1 if you have the <sys/stat.h> header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the <sys/time.h> header file. */ +#undef HAVE_SYS_TIME_H + +/* Define to 1 if you have the <sys/types.h> header file. */ +#undef HAVE_SYS_TYPES_H + +/* have termcap */ +#undef HAVE_TERMCAP + +/* Define to 1 if you have the <termcap.h> header file. */ +#undef HAVE_TERMCAP_H + +/* add uint16_t type */ +#undef HAVE_UINT16_T +#ifndef HAVE_UINT16_T + typedef unsigned short uint16_t; +#endif + +/* add uint32_t type */ +#undef HAVE_UINT32_T +#ifndef HAVE_UINT32_T +#undef A_UINT32_T + typedef A_UINT32_T uint32_t; +#endif + +/* add uint64_t type */ +#undef HAVE_UINT64_T +#ifndef HAVE_UINT64_T +#undef A_UINT64_T + typedef A_UINT64_T uint64_t; +#endif + +/* add uint8_t type */ +#undef HAVE_UINT8_T +#ifndef HAVE_UINT8_T + typedef unsigned char uint8_t; +#endif + +/* Define to 1 if you have the <unistd.h> header file. */ +#undef HAVE_UNISTD_H + +/* Define if SSE intrinsics work. */ +#undef HAVE_XMMINTRIN_H + +/* Define as const if the declaration of iconv() needs const. */ +#undef ICONV_CONST + +/* requested by Frank, seems to be temporary needed for a smooth transition */ +#undef LAME_LIBRARY_BUILD + +/* set to 1 if you have libsndfile */ +#undef LIBSNDFILE + +/* Define to the sub-directory where libtool stores uninstalled libraries. */ +#undef LT_OBJDIR + +/* use MMX version of choose_table */ +#undef MMX_choose_table + +/* build without hooks for analyzer */ +#undef NOANALYSIS + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* The size of `double', as computed by sizeof. */ +#undef SIZEOF_DOUBLE + +/* The size of `float', as computed by sizeof. */ +#undef SIZEOF_FLOAT + +/* The size of `int', as computed by sizeof. */ +#undef SIZEOF_INT + +/* The size of `long', as computed by sizeof. */ +#undef SIZEOF_LONG + +/* The size of `long double', as computed by sizeof. */ +#undef SIZEOF_LONG_DOUBLE + +/* The size of `long long', as computed by sizeof. */ +#undef SIZEOF_LONG_LONG + +/* The size of `short', as computed by sizeof. */ +#undef SIZEOF_SHORT + +/* The size of `unsigned int', as computed by sizeof. */ +#undef SIZEOF_UNSIGNED_INT + +/* The size of `unsigned long', as computed by sizeof. */ +#undef SIZEOF_UNSIGNED_LONG + +/* The size of `unsigned long long', as computed by sizeof. */ +#undef SIZEOF_UNSIGNED_LONG_LONG + +/* The size of `unsigned short', as computed by sizeof. */ +#undef SIZEOF_UNSIGNED_SHORT + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at runtime. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +#undef STACK_DIRECTION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* IEEE754 compatible machine */ +#undef TAKEHIRO_IEEE754_HACK + +/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */ +#undef TIME_WITH_SYS_TIME + +/* faster log implementation with less but enough precission */ +#undef USE_FAST_LOG + +/* Enable extensions on AIX 3, Interix. */ +#ifndef _ALL_SOURCE +# undef _ALL_SOURCE +#endif +/* Enable GNU extensions on systems that have them. */ +#ifndef _GNU_SOURCE +# undef _GNU_SOURCE +#endif +/* Enable threading extensions on Solaris. */ +#ifndef _POSIX_PTHREAD_SEMANTICS +# undef _POSIX_PTHREAD_SEMANTICS +#endif +/* Enable extensions on HP NonStop. */ +#ifndef _TANDEM_SOURCE +# undef _TANDEM_SOURCE +#endif +/* Enable general extensions on Solaris. */ +#ifndef __EXTENSIONS__ +# undef __EXTENSIONS__ +#endif + + +/* Version number of package */ +#undef VERSION + +/* Define if using the dmalloc debugging malloc package */ +#undef WITH_DMALLOC + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +# undef WORDS_BIGENDIAN +# endif +#endif + +/* Enable large inode numbers on Mac OS X 10.5. */ +#ifndef _DARWIN_USE_64_BIT_INODE +# define _DARWIN_USE_64_BIT_INODE 1 +#endif + +/* Number of bits in a file offset, on hosts where this is settable. */ +#undef _FILE_OFFSET_BITS + +/* Define for large files, on AIX-style hosts. */ +#undef _LARGE_FILES + +/* Define to 1 if on MINIX. */ +#undef _MINIX + +/* Define to 2 if the system does not provide POSIX.1 features except with + this defined. */ +#undef _POSIX_1_SOURCE + +/* Define to 1 if you need to in order for `stat' and other things to work. */ +#undef _POSIX_SOURCE + +/* we're on DEC Alpha */ +#undef __DECALPHA__ + +/* work around a glibc bug */ +#undef __NO_MATH_INLINES + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +#undef inline +#endif + +/* Define to `unsigned int' if <sys/types.h> does not define. */ +#undef size_t + +#endif /* LAME_CONFIG_H */ diff --git a/config.rpath b/config.rpath new file mode 100755 index 0000000..17298f2 --- /dev/null +++ b/config.rpath @@ -0,0 +1,672 @@ +#! /bin/sh +# Output a system dependent set of variables, describing how to set the +# run time search path of shared libraries in an executable. +# +# Copyright 1996-2010 Free Software Foundation, Inc. +# Taken from GNU libtool, 2001 +# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. +# +# The first argument passed to this file is the canonical host specification, +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld +# should be set by the caller. +# +# The set of defined variables is at the end of this script. + +# Known limitations: +# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer +# than 256 bytes, otherwise the compiler driver will dump core. The only +# known workaround is to choose shorter directory names for the build +# directory and/or the installation directory. + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a +shrext=.so + +host="$1" +host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +# Code taken from libtool.m4's _LT_CC_BASENAME. + +for cc_temp in $CC""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'` + +# Code taken from libtool.m4's _LT_COMPILER_PIC. + +wl= +if test "$GCC" = yes; then + wl='-Wl,' +else + case "$host_os" in + aix*) + wl='-Wl,' + ;; + darwin*) + case $cc_basename in + xlc*) + wl='-Wl,' + ;; + esac + ;; + mingw* | cygwin* | pw32* | os2* | cegcc*) + ;; + hpux9* | hpux10* | hpux11*) + wl='-Wl,' + ;; + irix5* | irix6* | nonstopux*) + wl='-Wl,' + ;; + newsos6) + ;; + linux* | k*bsd*-gnu) + case $cc_basename in + ecc*) + wl='-Wl,' + ;; + icc* | ifort*) + wl='-Wl,' + ;; + lf95*) + wl='-Wl,' + ;; + pgcc | pgf77 | pgf90) + wl='-Wl,' + ;; + ccc*) + wl='-Wl,' + ;; + como) + wl='-lopt=' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + wl='-Wl,' + ;; + esac + ;; + esac + ;; + osf3* | osf4* | osf5*) + wl='-Wl,' + ;; + rdos*) + ;; + solaris*) + wl='-Wl,' + ;; + sunos4*) + wl='-Qoption ld ' + ;; + sysv4 | sysv4.2uw2* | sysv4.3*) + wl='-Wl,' + ;; + sysv4*MP*) + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + wl='-Wl,' + ;; + unicos*) + wl='-Wl,' + ;; + uts4*) + ;; + esac +fi + +# Code taken from libtool.m4's _LT_LINKER_SHLIBS. + +hardcode_libdir_flag_spec= +hardcode_libdir_separator= +hardcode_direct=no +hardcode_minus_L=no + +case "$host_os" in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; +esac + +ld_shlibs=yes +if test "$with_gnu_ld" = yes; then + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + # Unlike libtool, we use -rpath here, not --rpath, since the documented + # option of GNU ld is called -rpath, not --rpath. + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + case "$host_os" in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + fi + ;; + amigaos*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we cannot use + # them. + ld_shlibs=no + ;; + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + cygwin* | mingw* | pw32* | cegcc*) + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + interix[3-9]*) + hardcode_direct=no + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + gnu* | linux* | k*bsd*-gnu) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + netbsd*) + ;; + solaris*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + else + ld_shlibs=no + fi + ;; + esac + ;; + sunos4*) + hardcode_direct=yes + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + esac + if test "$ld_shlibs" = no; then + hardcode_libdir_flag_spec= + fi +else + case "$host_os" in + aix3*) + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + else + aix_use_runtimelinking=no + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + fi + hardcode_direct=yes + hardcode_libdir_separator=':' + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + fi + # Begin _LT_AC_SYS_LIBPATH_AIX. + echo 'int main () { return 0; }' > conftest.c + ${CC} ${LDFLAGS} conftest.c -o conftest + aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` + if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` + fi + if test -z "$aix_libpath"; then + aix_libpath="/usr/lib:/lib" + fi + rm -f conftest.c conftest + # End _LT_AC_SYS_LIBPATH_AIX. + if test "$aix_use_runtimelinking" = yes; then + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + else + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + fi + fi + ;; + amigaos*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + bsdi[45]*) + ;; + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + libext=lib + ;; + darwin* | rhapsody*) + hardcode_direct=no + if test "$GCC" = yes ; then + : + else + case $cc_basename in + xlc*) + ;; + *) + ld_shlibs=no + ;; + esac + fi + ;; + dgux*) + hardcode_libdir_flag_spec='-L$libdir' + ;; + freebsd1*) + ld_shlibs=no + ;; + freebsd2.2*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + freebsd2*) + hardcode_direct=yes + hardcode_minus_L=yes + ;; + freebsd* | dragonfly*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + hpux9*) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + hpux10*) + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + hpux11*) + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + ;; + *) + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + irix5* | irix6* | nonstopux*) + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + netbsd*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + newsos6) + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + else + case "$host_os" in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + else + ld_shlibs=no + fi + ;; + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + osf3*) + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + osf4* | osf5*) + if test "$GCC" = yes; then + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + # Both cc and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + ;; + solaris*) + hardcode_libdir_flag_spec='-R$libdir' + ;; + sunos4*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + ;; + sysv4) + case $host_vendor in + sni) + hardcode_direct=yes # is this really true??? + ;; + siemens) + hardcode_direct=no + ;; + motorola) + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + ;; + sysv4.3*) + ;; + sysv4*MP*) + if test -d /usr/nec; then + ld_shlibs=yes + fi + ;; + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + ;; + sysv5* | sco3.2v5* | sco5v6*) + hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + hardcode_libdir_separator=':' + ;; + uts4*) + hardcode_libdir_flag_spec='-L$libdir' + ;; + *) + ld_shlibs=no + ;; + esac +fi + +# Check dynamic linker characteristics +# Code taken from libtool.m4's _LT_SYS_DYNAMIC_LINKER. +# Unlike libtool.m4, here we don't care about _all_ names of the library, but +# only about the one the linker finds when passed -lNAME. This is the last +# element of library_names_spec in libtool.m4, or possibly two of them if the +# linker has special search rules. +library_names_spec= # the last element of library_names_spec in libtool.m4 +libname_spec='lib$name' +case "$host_os" in + aix3*) + library_names_spec='$libname.a' + ;; + aix[4-9]*) + library_names_spec='$libname$shrext' + ;; + amigaos*) + library_names_spec='$libname.a' + ;; + beos*) + library_names_spec='$libname$shrext' + ;; + bsdi[45]*) + library_names_spec='$libname$shrext' + ;; + cygwin* | mingw* | pw32* | cegcc*) + shrext=.dll + library_names_spec='$libname.dll.a $libname.lib' + ;; + darwin* | rhapsody*) + shrext=.dylib + library_names_spec='$libname$shrext' + ;; + dgux*) + library_names_spec='$libname$shrext' + ;; + freebsd1*) + ;; + freebsd* | dragonfly*) + case "$host_os" in + freebsd[123]*) + library_names_spec='$libname$shrext$versuffix' ;; + *) + library_names_spec='$libname$shrext' ;; + esac + ;; + gnu*) + library_names_spec='$libname$shrext' + ;; + hpux9* | hpux10* | hpux11*) + case $host_cpu in + ia64*) + shrext=.so + ;; + hppa*64*) + shrext=.sl + ;; + *) + shrext=.sl + ;; + esac + library_names_spec='$libname$shrext' + ;; + interix[3-9]*) + library_names_spec='$libname$shrext' + ;; + irix5* | irix6* | nonstopux*) + library_names_spec='$libname$shrext' + case "$host_os" in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; + *) libsuff= shlibsuff= ;; + esac + ;; + esac + ;; + linux*oldld* | linux*aout* | linux*coff*) + ;; + linux* | k*bsd*-gnu) + library_names_spec='$libname$shrext' + ;; + knetbsd*-gnu) + library_names_spec='$libname$shrext' + ;; + netbsd*) + library_names_spec='$libname$shrext' + ;; + newsos6) + library_names_spec='$libname$shrext' + ;; + nto-qnx*) + library_names_spec='$libname$shrext' + ;; + openbsd*) + library_names_spec='$libname$shrext$versuffix' + ;; + os2*) + libname_spec='$name' + shrext=.dll + library_names_spec='$libname.a' + ;; + osf3* | osf4* | osf5*) + library_names_spec='$libname$shrext' + ;; + rdos*) + ;; + solaris*) + library_names_spec='$libname$shrext' + ;; + sunos4*) + library_names_spec='$libname$shrext$versuffix' + ;; + sysv4 | sysv4.3*) + library_names_spec='$libname$shrext' + ;; + sysv4*MP*) + library_names_spec='$libname$shrext' + ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + library_names_spec='$libname$shrext' + ;; + uts4*) + library_names_spec='$libname$shrext' + ;; +esac + +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' +escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` +shlibext=`echo "$shrext" | sed -e 's,^\.,,'` +escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` +escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` +escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` + +LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF + +# How to pass a linker flag through the compiler. +wl="$escaped_wl" + +# Static library suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally "so"). +shlibext="$shlibext" + +# Format of library name prefix. +libname_spec="$escaped_libname_spec" + +# Library names that the linker finds when passed -lNAME. +library_names_spec="$escaped_library_names_spec" + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec" + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator="$hardcode_libdir_separator" + +# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the +# resulting binary. +hardcode_direct="$hardcode_direct" + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L="$hardcode_minus_L" + +EOF diff --git a/config.sub b/config.sub new file mode 100755 index 0000000..3580aaf --- /dev/null +++ b/config.sub @@ -0,0 +1,1804 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright 1992-2015 Free Software Foundation, Inc. + +timestamp='2015-03-08' + +# This file 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. +# +# This program 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 this program; if not, see <http://www.gnu.org/licenses/>. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). + + +# Please send patches to <config-patches@gnu.org>. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to <config-patches@gnu.org>." + +version="\ +GNU config.sub ($timestamp) + +Copyright 1992-2015 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ + linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ + knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ + kopensolaris*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + android-linux) + os=-linux-android + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray | -microblaze*) + os= + basic_machine=$1 + ;; + -bluegene*) + os=-cnk + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*178) + os=-lynxos178 + ;; + -lynx*5) + os=-lynxos5 + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | aarch64 | aarch64_be \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arceb \ + | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ + | avr | avr32 \ + | be32 | be64 \ + | bfin \ + | c4x | c8051 | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | e2k | epiphany \ + | fido | fr30 | frv | ft32 \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | hexagon \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | k1om \ + | le32 | le64 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa32r6 | mipsisa32r6el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64r6 | mipsisa64r6el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipsr5900 | mipsr5900el \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nds32 | nds32le | nds32be \ + | nios | nios2 | nios2eb | nios2el \ + | ns16k | ns32k \ + | open8 | or1k | or1knd | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \ + | pyramid \ + | riscv32 | riscv64 \ + | rl78 | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu \ + | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ + | visium \ + | we32k \ + | x86 | xc16x | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + c54x) + basic_machine=tic54x-unknown + ;; + c55x) + basic_machine=tic55x-unknown + ;; + c6x) + basic_machine=tic6x-unknown + ;; + leon|leon[3-9]) + basic_machine=sparc-$basic_machine + ;; + m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + strongarm | thumb | xscale) + basic_machine=arm-unknown + ;; + xgate) + basic_machine=$basic_machine-unknown + os=-none + ;; + xscaleeb) + basic_machine=armeb-unknown + ;; + + xscaleel) + basic_machine=armel-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | aarch64-* | aarch64_be-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | amd64-* | arc-* | arceb-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | be32-* | be64-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* \ + | c8051-* | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | e2k-* | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | hexagon-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | k1om-* \ + | le32-* | le64-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ + | microblaze-* | microblazeel-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa32r6-* | mipsisa32r6el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64r6-* | mipsisa64r6el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipsr5900-* | mipsr5900el-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nds32-* | nds32le-* | nds32be-* \ + | nios-* | nios2-* | nios2eb-* | nios2el-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | open8-* \ + | or1k*-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | powerpcspe-* \ + | pyramid-* \ + | rl78-* | romp-* | rs6000-* | rx-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ + | tahoe-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tile*-* \ + | tron-* \ + | ubicom32-* \ + | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ + | vax-* \ + | visium-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + asmjs) + basic_machine=asmjs-unknown + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; + c54x-*) + basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c55x-*) + basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c6x-*) + basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16 | cr16-*) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + leon-*|leon[3-9]-*) + basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'` + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + microblaze*) + basic_machine=microblaze-xilinx + ;; + mingw64) + basic_machine=x86_64-pc + os=-mingw64 + ;; + mingw32) + basic_machine=i686-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + moxiebox) + basic_machine=moxie-unknown + os=-moxiebox + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + msys) + basic_machine=i686-pc + os=-msys + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + nacl) + basic_machine=le32-unknown + os=-nacl + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + neo-tandem) + basic_machine=neo-tandem + ;; + nse-tandem) + basic_machine=nse-tandem + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc | ppcbe) basic_machine=powerpc-unknown + ;; + ppc-* | ppcbe-*) + basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + os=-rdos + ;; + rdos32) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + strongarm-* | thumb-*) + basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tile*) + basic_machine=$basic_machine-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + xscale-* | xscalee[bl]-*) + basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + z80-*-coff) + basic_machine=z80-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux + ;; + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* | -plan9* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* | -cloudabi* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -bitrig* | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* \ + | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -linux-musl* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -nacl*) + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + c8051-*) + os=-elf + ;; + hexagon-*) + os=-elf + ;; + tic54x-*) + os=-coff + ;; + tic55x-*) + os=-coff + ;; + tic6x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -cnk*|-aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/configMS.h b/configMS.h new file mode 100644 index 0000000..b533a1e --- /dev/null +++ b/configMS.h @@ -0,0 +1,120 @@ +#ifndef CONFIGMS_H_INCLUDED +#define CONFIGMS_H_INCLUDED + +/* The number of bytes in a double. */ +#define SIZEOF_DOUBLE 8 + +/* The number of bytes in a float. */ +#define SIZEOF_FLOAT 4 + +/* The number of bytes in a int. */ +#define SIZEOF_INT 4 + +/* The number of bytes in a long. */ +#define SIZEOF_LONG 4 + +/* The number of bytes in a long double. */ +#define SIZEOF_LONG_DOUBLE 12 + +/* The number of bytes in a short. */ +#define SIZEOF_SHORT 2 + +/* The number of bytes in a unsigned int. */ +#define SIZEOF_UNSIGNED_INT 4 + +/* The number of bytes in a unsigned long. */ +#define SIZEOF_UNSIGNED_LONG 4 + +/* The number of bytes in a unsigned short. */ +#define SIZEOF_UNSIGNED_SHORT 2 + +/* Define if you have the ANSI C header files. */ +#define STDC_HEADERS + +/* Define if you have the <errno.h> header file. */ +#define HAVE_ERRNO_H + +/* Define if you have the <fcntl.h> header file. */ +#define HAVE_FCNTL_H + +/* Define if you have the <limits.h> header file. */ +#define HAVE_LIMITS_H + +/* Name of package */ +#define PACKAGE "lame" + +/* Define if compiler has function prototypes */ +#define PROTOTYPES 1 + +/* faster log implementation with less but enough precission */ +#define USE_FAST_LOG 1 + +#define HAVE_STRCHR +#define HAVE_MEMCPY + +#if defined(_MSC_VER) || defined(__BORLANDC__) +#pragma warning( disable : 4305 ) + typedef __int8 int8_t; + typedef __int16 int16_t; + typedef __int32 int32_t; + typedef __int64 int64_t; + + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; + typedef unsigned __int64 uint64_t; + + typedef float float32_t; + typedef double float64_t; +#elif defined (__GNUC__) +#define __int8_t_defined +#define uint8_t unsigned char +#define uint16_t unsigned short +#define uint32_t unsigned int +#define uint64_t unsigned long long + +#define int8_t signed char +#define int16_t signed short +#define int32_t signed int +#define int64_t signed long long +#endif + +typedef long double ieee854_float80_t; +typedef double ieee754_float64_t; +typedef float ieee754_float32_t; + +#ifdef HAVE_MPGLIB +# define DECODE_ON_THE_FLY 1 +#endif + +#ifdef LAME_ACM +/* memory hacking for driver purposes */ +#define calloc(x,y) acm_Calloc(x,y) +#define free(x) acm_Free(x) +#define malloc(x) acm_Malloc(x) + +#include <stddef.h> +void *acm_Calloc( size_t num, size_t size ); +void *acm_Malloc( size_t size ); +void acm_Free( void * mem); +#endif /* LAME_ACM */ + +#define LAME_LIBRARY_BUILD + + +#ifdef HAVE_NASM + #if (defined(__ICL) && (__ICL >= 450)) + #define HAVE_XMMINTRIN_H + #elif defined(_MSC_VER) + #include <malloc.h> + #ifdef _mm_malloc + #define HAVE_XMMINTRIN_H + #endif + #endif +#endif + +#if defined(_M_X64) && !defined(HAVE_XMMINTRIN_H) + #define HAVE_XMMINTRIN_H +#endif + +#endif diff --git a/configure b/configure new file mode 100755 index 0000000..52dbf02 --- /dev/null +++ b/configure @@ -0,0 +1,20185 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69 for lame 3.100. +# +# Report bugs to <lame-dev@lists.sf.net>. +# +# +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1 + + test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ + || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and +$0: lame-dev@lists.sf.net about your system, including any +$0: error possibly output before this message. Then install +$0: a modern shell, or manually run the script under such a +$0: shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + +SHELL=${CONFIG_SHELL-/bin/sh} + + +test -n "$DJDIR" || exec 7<&0 </dev/null +exec 6>&1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='lame' +PACKAGE_TARNAME='lame' +PACKAGE_VERSION='3.100' +PACKAGE_STRING='lame 3.100' +PACKAGE_BUGREPORT='lame-dev@lists.sf.net' +PACKAGE_URL='' + +ac_unique_file="libmp3lame/lame.c" +# Factoring default headers for most tests. +ac_includes_default="\ +#include <stdio.h> +#ifdef HAVE_SYS_TYPES_H +# include <sys/types.h> +#endif +#ifdef HAVE_SYS_STAT_H +# include <sys/stat.h> +#endif +#ifdef STDC_HEADERS +# include <stdlib.h> +# include <stddef.h> +#else +# ifdef HAVE_STDLIB_H +# include <stdlib.h> +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include <memory.h> +# endif +# include <string.h> +#endif +#ifdef HAVE_STRINGS_H +# include <strings.h> +#endif +#ifdef HAVE_INTTYPES_H +# include <inttypes.h> +#endif +#ifdef HAVE_STDINT_H +# include <stdint.h> +#endif +#ifdef HAVE_UNISTD_H +# include <unistd.h> +#endif" + +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +CONFIG_DEFS +CPUCCODE +CPUTYPE +WITH_MP3RTP +WITH_MP3X +WITH_FRONTEND +RM_F +MAKEDEP +NASM_FORMAT +LIB_MINOR_VERSION +LIB_MAJOR_VERSION +LDADD +CONFIG_MATH_LIB +FRONTEND_LDADD +FRONTEND_CFLAGS +FRONTEND_LDFLAGS +INCLUDES +HAVE_NASM_FALSE +HAVE_NASM_TRUE +NASM +WITH_VECTOR_FALSE +WITH_VECTOR_TRUE +WITH_XMM_FALSE +WITH_XMM_TRUE +LIB_WITH_DECODER_FALSE +LIB_WITH_DECODER_TRUE +SNDFILE_LIBS +SNDFILE_CFLAGS +PKG_CONFIG_LIBDIR +PKG_CONFIG_PATH +PKG_CONFIG +GTK_LIBS +GTK_CFLAGS +GTK_CONFIG +LTLIBICONV +LIBICONV +ALLOCA +LIBTOOL_DEPS +LT_SYS_LIBRARY_PATH +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +MANIFEST_TOOL +RANLIB +ac_ct_AR +AR +DLLTOOL +OBJDUMP +LN_S +NM +ac_ct_DUMPBIN +DUMPBIN +LD +FGREP +SED +LIBTOOL +EGREP +GREP +CPP +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +am__quote +am__include +MAINT +MAINTAINER_MODE_FALSE +MAINTAINER_MODE_TRUE +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_silent_rules +enable_maintainer_mode +enable_dependency_tracking +enable_shared +enable_static +with_pic +enable_fast_install +with_aix_soname +with_gnu_ld +with_sysroot +enable_libtool_lock +with_dmalloc +enable_largefile +enable_nasm +enable_rpath +with_libiconv_prefix +enable_cpml +with_gtk_prefix +with_gtk_exec_prefix +enable_gtktest +enable_efence +with_fileio +enable_analyzer_hooks +enable_decoder +enable_frontend +enable_mp3x +enable_mp3rtp +enable_dynamic_frontends +enable_expopt +enable_debug +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP +LT_SYS_LIBRARY_PATH +PKG_CONFIG +PKG_CONFIG_PATH +PKG_CONFIG_LIBDIR +SNDFILE_CFLAGS +SNDFILE_LIBS' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures lame 3.100 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/lame] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of lame 3.100:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --enable-maintainer-mode + enable make rules and dependencies not useful (and + sometimes confusing) to the casual installer + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build + --enable-shared[=PKGS] build shared libraries [default=yes] + --enable-static[=PKGS] build static libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --disable-libtool-lock avoid locking (might break parallel builds) + --disable-largefile omit support for large files + --enable-nasm Allow the use of nasm if available + --disable-rpath do not hardcode runtime library paths + --disable-cpml Do not use Compaq's fast Math Library + --disable-gtktest Do not try to compile and run a test GTK program + --enable-efence Use ElectricFence for malloc debugging + --disable-analyzer-hooks Exclude analyzer hooks + --disable-decoder Exclude mpg123 decoder + --disable-frontend Do not build the lame executable default=build + --enable-mp3x Build GTK frame analyzer default=no + --enable-mp3rtp Build mp3rtp default=no + --enable-dynamic-frontends Link frontends against shared libraries default=no + --enable-expopt=full,norm Whether to enable experimental optimizations + default=no + --enable-debug=alot,norm Enable debugging (disables optimizations) + default=no + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use + both] + --with-aix-soname=aix|svr4|both + shared library versioning (aka "SONAME") variant to + provide on AIX, [default=aix]. + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-sysroot[=DIR] Search for dependent libraries within DIR (or the + compiler's sysroot if not specified). + --with-dmalloc use dmalloc, as in http://www.dmalloc.com + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib + --without-libiconv-prefix don't search for libiconv in includedir and libdir + --with-gtk-prefix=PFX Prefix where GTK is installed (optional) + --with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional) + --with-fileio=lame Use lame's internal file io routines default + =sndfile Use Erik de Castro Lopo's libsndfile + (no stdin possible currently) + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a + nonstandard directory <lib dir> + LIBS libraries to pass to the linker, e.g. -l<library> + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if + you have headers in a nonstandard directory <include dir> + CPP C preprocessor + LT_SYS_LIBRARY_PATH + User-defined run-time library search path. + PKG_CONFIG path to pkg-config utility + PKG_CONFIG_PATH + directories to add to pkg-config's search path + PKG_CONFIG_LIBDIR + path overriding pkg-config's built-in search path + SNDFILE_CFLAGS + C compiler flags for SNDFILE, overriding pkg-config + SNDFILE_LIBS + linker flags for SNDFILE, overriding pkg-config + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to <lame-dev@lists.sf.net>. +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +lame configure 3.100 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +( $as_echo "## ------------------------------------ ## +## Report this to lame-dev@lists.sf.net ## +## ------------------------------------ ##" + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case <limits.h> declares $2. + For example, HP-UX 11i <limits.h> declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + <limits.h> exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES +# -------------------------------------------- +# Tries to find the compile-time value of EXPR in a program that includes +# INCLUDES, setting VAR accordingly. Returns whether the value could be +# computed +ac_fn_c_compute_int () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) >= 0)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_lo=0 ac_mid=0 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=$ac_mid; break +else + as_fn_arith $ac_mid + 1 && ac_lo=$as_val + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) < 0)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=-1 ac_mid=-1 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) >= $ac_mid)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_lo=$ac_mid; break +else + as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + ac_lo= ac_hi= +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=$ac_mid +else + as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in #(( +?*) eval "$3=\$ac_lo"; ac_retval=0 ;; +'') ac_retval=1 ;; +esac + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +static long int longval () { return $2; } +static unsigned long int ulongval () { return $2; } +#include <stdio.h> +#include <stdlib.h> +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (($2) < 0) + { + long int i = longval (); + if (i != ($2)) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ($2)) + return 1; + fprintf (f, "%lu", i); + } + /* Do not output a trailing newline, as this causes \r\n confusion + on some platforms. */ + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + echo >>conftest.val; read $3 <conftest.val; ac_retval=0 +else + ac_retval=1 +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f conftest.val + + fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_compute_int + +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_type +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by lame $as_me 3.100, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + + +am__api_version='1.15' + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='lame' + VERSION='3.100' + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html> +# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html> +mkdir_p='$(MKDIR_P)' + +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar pax cpio none' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + + + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542> + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: <http://www.gnu.org/software/coreutils/>. + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 + fi +fi + +ac_config_headers="$ac_config_headers config.h" + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 +$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } + # Check whether --enable-maintainer-mode was given. +if test "${enable_maintainer_mode+set}" = set; then : + enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval +else + USE_MAINTAINER_MODE=no +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 +$as_echo "$USE_MAINTAINER_MODE" >&6; } + if test $USE_MAINTAINER_MODE = yes; then + MAINTAINER_MODE_TRUE= + MAINTAINER_MODE_FALSE='#' +else + MAINTAINER_MODE_TRUE='#' + MAINTAINER_MODE_FALSE= +fi + + MAINT=$MAINTAINER_MODE_TRUE + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + + +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <stdio.h> +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <stdarg.h> +#include <stdio.h> +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + # <limits.h> exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <ac_nonexistent.h> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + # <limits.h> exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <ac_nonexistent.h> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <stdlib.h> +#include <stdarg.h> +#include <string.h> +#include <float.h> + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <string.h> + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <stdlib.h> + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <ctype.h> +#include <stdlib.h> +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" +if test "x$ac_cv_header_minix_config_h" = xyes; then : + MINIX=yes +else + MINIX= +fi + + + if test "$MINIX" = yes; then + +$as_echo "#define _POSIX_SOURCE 1" >>confdefs.h + + +$as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h + + +$as_echo "#define _MINIX 1" >>confdefs.h + + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 +$as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } +if ${ac_cv_safe_to_define___extensions__+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +# define __EXTENSIONS__ 1 + $ac_includes_default +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_safe_to_define___extensions__=yes +else + ac_cv_safe_to_define___extensions__=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 +$as_echo "$ac_cv_safe_to_define___extensions__" >&6; } + test $ac_cv_safe_to_define___extensions__ = yes && + $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h + + $as_echo "#define _ALL_SOURCE 1" >>confdefs.h + + $as_echo "#define _GNU_SOURCE 1" >>confdefs.h + + $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h + + $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing strerror" >&5 +$as_echo_n "checking for library containing strerror... " >&6; } +if ${ac_cv_search_strerror+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char strerror (); +int +main () +{ +return strerror (); + ; + return 0; +} +_ACEOF +for ac_lib in '' cposix; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_strerror=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_strerror+:} false; then : + break +fi +done +if ${ac_cv_search_strerror+:} false; then : + +else + ac_cv_search_strerror=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_strerror" >&5 +$as_echo "$ac_cv_search_strerror" >&6; } +ac_res=$ac_cv_search_strerror +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + + +case $host_os in + *cygwin* ) CYGWIN=yes;; + * ) CYGWIN=no;; +esac + +# AC_DISABLE_SHARED +case `pwd` in + *\ * | *\ *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac + + + +macro_version='2.4.6' +macro_revision='2.4.6' + + + + + + + + + + + + + +ltmain=$ac_aux_dir/ltmain.sh + +# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +$as_echo_n "checking how to print strings... " >&6; } +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "" +} + +case $ECHO in + printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +$as_echo "printf" >&6; } ;; + print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +$as_echo "print -r" >&6; } ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +$as_echo "cat" >&6; } ;; +esac + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_SED" || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +$as_echo_n "checking for fgrep... " >&6; } +if ${ac_cv_path_FGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in fgrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_FGREP" || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_FGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +$as_echo "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +test -z "$GREP" && GREP=grep + + + + + + + + + + + + + + + + + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in + *GNU* | *'with BFD'*) + test no != "$with_gnu_ld" && break + ;; + *) + test yes != "$with_gnu_ld" && break + ;; + esac + fi + done + IFS=$lt_save_ifs +else + lt_cv_path_LD=$LD # Let the user override the test with a path. +fi +fi + +LD=$lt_cv_path_LD +if test -n "$LD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 </dev/null` in +*GNU* | *'with BFD'*) + lt_cv_prog_gnu_ld=yes + ;; +*) + lt_cv_prog_gnu_ld=no + ;; +esac +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if ${lt_cv_path_NM+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM=$NM +else + lt_nm_to_check=${ac_tool_prefix}nm + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/$lt_tmp_nm + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the 'sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS=$lt_save_ifs + done + : ${lt_cv_path_NM=no} +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + if test -n "$ac_tool_prefix"; then + for ac_prog in dumpbin "link -dump" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DUMPBIN"; then + ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DUMPBIN=$ac_cv_prog_DUMPBIN +if test -n "$DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +$as_echo "$DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$DUMPBIN" && break + done +fi +if test -z "$DUMPBIN"; then + ac_ct_DUMPBIN=$DUMPBIN + for ac_prog in dumpbin "link -dump" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DUMPBIN"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +if test -n "$ac_ct_DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +$as_echo "$ac_ct_DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_DUMPBIN" && break +done + + if test "x$ac_ct_DUMPBIN" = x; then + DUMPBIN=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DUMPBIN=$ac_ct_DUMPBIN + fi +fi + + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + DUMPBIN=: + ;; + esac + fi + + if test : != "$DUMPBIN"; then + NM=$DUMPBIN + fi +fi +test -z "$NM" && NM=nm + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +$as_echo_n "checking the name lister ($NM) interface... " >&6; } +if ${lt_cv_nm_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +$as_echo "$lt_cv_nm_interface" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + +# find the maximum length of command line arguments +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if ${lt_cv_sys_max_cmd_len+:} false; then : + $as_echo_n "(cached) " >&6 +else + i=0 + teststring=ABCD + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test X`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test 17 != "$i" # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac + +fi + +if test -n "$lt_cv_sys_max_cmd_len"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } +fi +max_cmd_len=$lt_cv_sys_max_cmd_len + + + + + + +: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi + + + + + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +$as_echo_n "checking how to convert $build file names to $host format... " >&6; } +if ${lt_cv_to_host_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac + +fi + +to_host_file_cmd=$lt_cv_to_host_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +$as_echo "$lt_cv_to_host_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } +if ${lt_cv_to_tool_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + #assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac + +fi + +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +$as_echo "$lt_cv_to_tool_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if ${lt_cv_ld_reload_flag+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + if test yes != "$GCC"; then + reload_cmds=false + fi + ;; + darwin*) + if test yes = "$GCC"; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +$as_echo_n "checking how to recognize dependent libraries... " >&6; } +if ${lt_cv_deplibs_check_method+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# 'unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# that responds to the $file_magic_cmd with a given extended regex. +# If you have 'file' or equivalent on your system and you're not sure +# whether 'pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + + + + + + + + + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +$as_echo_n "checking how to associate runtime and link libraries... " >&6; } +if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd=$ECHO + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + + + + + + + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} +: ${AR_FLAGS=cru} + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +$as_echo_n "checking for archiver @FILE support... " >&6; } +if ${lt_cv_ar_at_file+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ar_at_file=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -eq "$ac_status"; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +$as_echo "$lt_cv_ar_at_file" >&6; } + +if test no = "$lt_cv_ar_at_file"; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +test -z "$STRIP" && STRIP=: + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +test -z "$RANLIB" && RANLIB=: + + + + + + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + bitrig* | openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if ${lt_cv_sys_global_symbol_pipe+:} false; then : + $as_echo_n "(cached) " >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[ABCDGISTW]' + ;; +hpux*) + if test ia64 = "$host_cpu"; then + symcode='[ABCDEGRST]' + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK '"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 + (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS=conftstm.$ac_objext + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest$ac_exeext; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test yes = "$pipe_works"; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +$as_echo "failed" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +$as_echo_n "checking for sysroot... " >&6; } + +# Check whether --with-sysroot was given. +if test "${with_sysroot+set}" = set; then : + withval=$with_sysroot; +else + with_sysroot=no +fi + + +lt_sysroot= +case $with_sysroot in #( + yes) + if test yes = "$GCC"; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 +$as_echo "$with_sysroot" >&6; } + as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 + ;; +esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +$as_echo "${lt_sysroot:-no}" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 +$as_echo_n "checking for a working dd... " >&6; } +if ${ac_cv_path_lt_DD+:} false; then : + $as_echo_n "(cached) " >&6 +else + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +if test -z "$lt_DD"; then + ac_path_lt_DD_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in dd; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_lt_DD" || continue +if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi + $ac_path_lt_DD_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_lt_DD"; then + : + fi +else + ac_cv_path_lt_DD=$lt_DD +fi + +rm -f conftest.i conftest2.i conftest.out +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 +$as_echo "$ac_cv_path_lt_DD" >&6; } + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 +$as_echo_n "checking how to truncate binary pipes... " >&6; } +if ${lt_cv_truncate_bin+:} false; then : + $as_echo_n "(cached) " >&6 +else + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 +$as_echo "$lt_cv_truncate_bin" >&6; } + + + + + + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi + +test no = "$enable_libtool_lock" || enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out what ABI is being produced by ac_compile, and set mode + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE=32 + ;; + *ELF-64*) + HPUX_IA64_MODE=64 + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test yes = "$lt_cv_prog_gnu_ld"; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + emul=elf + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -belf" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if ${lt_cv_cc_needs_belf+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_cc_needs_belf=yes +else + lt_cv_cc_needs_belf=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } + if test yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*|x86_64-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD=${LD-ld}_sol2 + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks=$enable_libtool_lock + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. +set dummy ${ac_tool_prefix}mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MANIFEST_TOOL"; then + ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL +if test -n "$MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +$as_echo "$MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_MANIFEST_TOOL"; then + ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL + # Extract the first word of "mt", so it can be a program name with args. +set dummy mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_MANIFEST_TOOL"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL +if test -n "$ac_ct_MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_MANIFEST_TOOL" = x; then + MANIFEST_TOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + fi +else + MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" +fi + +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if ${lt_cv_path_mainfest_tool+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&5 + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +$as_echo "$lt_cv_path_mainfest_tool" >&6; } +if test yes != "$lt_cv_path_mainfest_tool"; then + MANIFEST_TOOL=: +fi + + + + + + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +$as_echo "$DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +$as_echo "$ac_ct_DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +$as_echo "$NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +$as_echo "$ac_ct_NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +set dummy ${ac_tool_prefix}lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +LIPO=$ac_cv_prog_LIPO +if test -n "$LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +$as_echo "$LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. +set dummy lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_LIPO="lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +if test -n "$ac_ct_LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +$as_echo "$ac_ct_LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_LIPO" = x; then + LIPO=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + LIPO=$ac_ct_LIPO + fi +else + LIPO="$ac_cv_prog_LIPO" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL=$ac_cv_prog_OTOOL +if test -n "$OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +$as_echo "$OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL="otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +if test -n "$ac_ct_OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +$as_echo "$ac_ct_OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL=$ac_ct_OTOOL + fi +else + OTOOL="$ac_cv_prog_OTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL64=$ac_cv_prog_OTOOL64 +if test -n "$OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +$as_echo "$OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. +set dummy otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +if test -n "$ac_ct_OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +$as_echo "$ac_ct_OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL64=$ac_ct_OTOOL64 + fi +else + OTOOL64="$ac_cv_prog_OTOOL64" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +$as_echo_n "checking for -single_module linker flag... " >&6; } +if ${lt_cv_apple_cc_single_mod+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_apple_cc_single_mod=no + if test -z "$LT_MULTI_MODULE"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&5 + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +$as_echo "$lt_cv_apple_cc_single_mod" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +if ${lt_cv_ld_exported_symbols_list+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_ld_exported_symbols_list=yes +else + lt_cv_ld_exported_symbols_list=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +$as_echo_n "checking for -force_load linker flag... " >&6; } +if ${lt_cv_ld_force_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 + echo "$AR cru libconftest.a conftest.o" >&5 + $AR cru libconftest.a conftest.o 2>&5 + echo "$RANLIB libconftest.a" >&5 + $RANLIB libconftest.a 2>&5 + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&5 + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&5 + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +$as_echo "$lt_cv_ld_force_load" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[91]*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + 10.[012][,.]*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' + fi + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + +for ac_header in dlfcn.h +do : + ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DLFCN_H 1 +_ACEOF + +fi + +done + + + + + +# Set options + + + + enable_dlopen=no + + + enable_win32_dll=no + + + # Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + enable_shared=yes +fi + + + + + + + + + + # Check whether --enable-static was given. +if test "${enable_static+set}" = set; then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + enable_static=yes +fi + + + + + + + + + + +# Check whether --with-pic was given. +if test "${with_pic+set}" = set; then : + withval=$with_pic; lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for lt_pkg in $withval; do + IFS=$lt_save_ifs + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + pic_mode=default +fi + + + + + + + + + # Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then : + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + enable_fast_install=yes +fi + + + + + + + + + shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[5-9]*,yes) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 +$as_echo_n "checking which variant of shared library versioning to provide... " >&6; } + +# Check whether --with-aix-soname was given. +if test "${with_aix_soname+set}" = set; then : + withval=$with_aix_soname; case $withval in + aix|svr4|both) + ;; + *) + as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname +else + if ${lt_cv_with_aix_soname+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_with_aix_soname=aix +fi + + with_aix_soname=$lt_cv_with_aix_soname +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 +$as_echo "$with_aix_soname" >&6; } + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + + + + + + + + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS=$ltmain + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +test -z "$LN_S" && LN_S="ln -s" + + + + + + + + + + + + + + +if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if ${lt_cv_objdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +cat >>confdefs.h <<_ACEOF +#define LT_OBJDIR "$lt_cv_objdir/" +_ACEOF + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a '.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld=$lt_cv_prog_gnu_ld + +old_CC=$CC +old_CFLAGS=$CFLAGS + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +func_cc_basename $compiler +cc_basename=$func_cc_basename_result + + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/${ac_tool_prefix}file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac +fi + +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac +fi + +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +# Use C for the default configuration in the libtool script + +lt_save_CC=$CC +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + +if test -n "$compiler"; then + +lt_prog_compiler_no_builtin_flag= + +if test yes = "$GCC"; then + case $cc_basename in + nvcc*) + lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; + *) + lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + + + + + + + lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + + + if test yes = "$GCC"; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + lt_prog_compiler_pic='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl='-Xlinker ' + if test -n "$lt_prog_compiler_pic"; then + lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='$wl-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +$as_echo "$lt_cv_prog_compiler_pic" >&6; } +lt_prog_compiler_pic=$lt_cv_prog_compiler_pic + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if ${lt_cv_prog_compiler_pic_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_pic_works"; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi + + + + + + + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +$as_echo "$lt_cv_prog_compiler_static_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_static_works"; then + : +else + lt_prog_compiler_static= +fi + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + +hard_links=nottested +if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test no = "$hard_links"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + always_export_symbols=no + archive_cmds= + archive_expsym_cmds= + compiler_needs_object=no + enable_shared_with_static_runtimes=no + export_dynamic_flag_spec= + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic=no + hardcode_direct=no + hardcode_direct_absolute=no + hardcode_libdir_flag_spec= + hardcode_libdir_separator= + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + inherit_rpath=no + link_all_deplibs=unknown + module_cmds= + module_expsym_cmds= + old_archive_from_new_cmds= + old_archive_from_expsyms_cmds= + thread_safe_flag_spec= + whole_archive_flag_spec= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + with_gnu_ld=no + ;; + esac + + ld_shlibs=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test yes = "$lt_use_gnu_ld_interface"; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='$wl' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + export_dynamic_flag_spec='$wl--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test ia64 != "$host_cpu"; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach <jrb3@best.com> says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + export_dynamic_flag_spec='$wl--export-all-symbols' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + haiku*) + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + link_all_deplibs=yes + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + ;; + + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + tcc*) + export_dynamic_flag_spec='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test no = "$ld_shlibs"; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix[4-9]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_direct_absolute=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + file_list_spec='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct=no + hardcode_direct_absolute=no + ;; + esac + + if test yes = "$GCC"; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + export_dynamic_flag_spec='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' $wl-bernotok' + allow_undefined_flag=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + fi + archive_cmds_need_lc=yes + archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + always_export_symbols=yes + file_list_spec='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, )='true' + enable_shared_with_static_runtimes=yes + exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds='chmod 644 $oldlib' + postlink_cmds='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + enable_shared_with_static_runtimes=yes + ;; + esac + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + if test yes = "$lt_cv_ld_force_load"; then + whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec='' + fi + link_all_deplibs=yes + allow_undefined_flag=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + + else + ld_shlibs=no + fi + + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test yes = "$GCC"; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='$wl-E' + ;; + + hpux10*) + if test yes,no = "$GCC,$with_gnu_ld"; then + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='$wl-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) + if test yes,no = "$GCC,$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +$as_echo_n "checking if $CC understands -b... " >&6; } +if ${lt_cv_prog_compiler__b+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler__b=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -b" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler__b=yes + fi + else + lt_cv_prog_compiler__b=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +$as_echo "$lt_cv_prog_compiler__b" >&6; } + +if test yes = "$lt_cv_prog_compiler__b"; then + archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' +fi + + ;; + esac + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='$wl-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test yes = "$GCC"; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if ${lt_cv_irix_exported_symbol+:} false; then : + $as_echo_n "(cached) " >&6 +else + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo (void) { return 0; } +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_irix_exported_symbol=yes +else + lt_cv_irix_exported_symbol=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +$as_echo "$lt_cv_irix_exported_symbol" >&6; } + if test yes = "$lt_cv_irix_exported_symbol"; then + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + inherit_rpath=yes + link_all_deplibs=yes + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + ld_shlibs=yes + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + *nto* | *qnx*) + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + hardcode_direct_absolute=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' + else + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + ;; + + osf3*) + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + archive_cmds_need_lc='no' + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z defs' + if test yes = "$GCC"; then + wlarc='$wl' + archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='$wl' + archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. GCC discards it without '$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test yes = "$GCC"; then + whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test sequent = "$host_vendor"; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='$wl-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='$wl-z,text' + allow_undefined_flag='$wl-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='$wl-R,$libdir' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + + if test sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec='$wl-Blargedynsym' + ;; + esac + fi + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +$as_echo "$ld_shlibs" >&6; } +test no = "$ld_shlibs" && can_build_shared=no + +with_gnu_ld=$with_gnu_ld + + + + + + + + + + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } + archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +if test yes = "$GCC"; then + case $host_os in + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary... + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" + elif test -n "$lt_multi_os_dir"; then + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS = " "; FS = "/|\n";} { + lt_foo = ""; + lt_count = 0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo = "/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's|/\([A-Za-z]:\)|\1|g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + + + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib<name>.so + # instead of lib<name>.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + hardcode_libdir_flag_spec='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test yes = "$hardcode_automatic"; then + + # We can hardcode non-existent directories. + if test no != "$hardcode_direct" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && + test no != "$hardcode_minus_L"; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +$as_echo "$hardcode_action" >&6; } + +if test relink = "$hardcode_action" || + test yes = "$inherit_rpath"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + if test yes != "$enable_dlopen"; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen=load_add_on + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen=LoadLibrary + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else + + lt_cv_dlopen=dyld + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes; then : + lt_cv_dlopen=shl_load +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if ${ac_cv_lib_dld_shl_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_shl_load=yes +else + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes; then : + lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld +else + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes; then : + lt_cv_dlopen=dlopen +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if ${ac_cv_lib_svld_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_svld_dlopen=yes +else + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if ${ac_cv_lib_dld_dld_link+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (); +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_dld_link=yes +else + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes; then : + lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS=$LDFLAGS + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS=$LIBS + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include <dlfcn.h> +#endif + +#include <stdio.h> + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test yes = "$lt_cv_dlopen_self"; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self_static+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include <dlfcn.h> +#endif + +#include <stdio.h> + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + + + + + + + + + + + + + + + + +striplib= +old_striplib= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP"; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + + + + + + + + + + + + + # Report what library types will actually be built + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + + + + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC=$lt_save_CC + + + + + + + + + + + + + + + + ac_config_commands="$ac_config_commands libtool" + + + + +# Only expand once: + + + +CFLAGS="${ac_save_CFLAGS}" + +# increase this when the shared lib becomes totally incompatible +LIB_MAJOR_VERSION=0 + +# increase this when changes are made, but they are upward compatible +# to previous versions +LIB_MINOR_VERSION=0 + +if test "${ac_cv_cygwin}" = "yes"; then + if test "${CC}" != "gcc"; then + as_fn_error $? "Please use + CC=gcc ./configure + Abort this configure run and add \"CC=gcc\" or you will + see errors and no lame.exe will be build." "$LINENO" 5 + fi +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <stdarg.h> +#include <stdio.h> +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + +if test "x${GCC}" = "xyes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking compiler" >&5 +$as_echo_n "checking compiler... " >&6; } + COMPILER_TYPE="`${CC} --version | head -1 | sed -e '1,$s/version.*//g'`" + case "${COMPILER_TYPE}" in + *gcc*) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: gcc" >&5 +$as_echo "gcc" >&6; } + HAVE_GCC=yes + HAVE_CLANG=no + ;; + *clang*) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: clang" >&5 +$as_echo "clang" >&6; } + HAVE_CLANG=yes + HAVE_GCC=no + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5 +$as_echo "unknown" >&6; } + HAVE_GCC=no + HAVE_CLANG=no + ;; + esac + + if test "${HAVE_GCC}" = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking version of GCC" >&5 +$as_echo_n "checking version of GCC... " >&6; } + GCC_version="`${CC} --version | sed -n '1s/^[^ ]* (.*) //;s/ .*$//;1p'`" + case "${GCC_version}" in + 0-9*0-9*) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${GCC_version}" >&5 +$as_echo "${GCC_version}" >&6; } + ;; + *) + # probably not gcc... + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown compiler version pattern" >&5 +$as_echo "unknown compiler version pattern" >&6; } + HAVE_GCC=no + ;; + esac + fi + + if test "${HAVE_CLANG}" = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking version of clang" >&5 +$as_echo_n "checking version of clang... " >&6; } + CLANG_version="`${CC} --version | sed -n 's/.*clang version //;s/ .*$//;1p'`" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${CLANG_version}" >&5 +$as_echo "${CLANG_version}" >&6; } + fi +fi + + + +ac_fn_c_check_header_mongrel "$LINENO" "dmalloc.h" "ac_cv_header_dmalloc_h" "$ac_includes_default" +if test "x$ac_cv_header_dmalloc_h" = xyes; then : + +fi + + +if test "${ac_cv_header_dmalloc_h}" = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if malloc debugging is wanted" >&5 +$as_echo_n "checking if malloc debugging is wanted... " >&6; } + +# Check whether --with-dmalloc was given. +if test "${with_dmalloc+set}" = set; then : + withval=$with_dmalloc; if test "$withval" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +$as_echo "#define WITH_DMALLOC 1" >>confdefs.h + + LIBS="$LIBS -ldmalloc" + LDFLAGS="$LDFLAGS -g" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <stdlib.h> +#include <stdarg.h> +#include <string.h> +#include <float.h> + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <string.h> + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <stdlib.h> + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <ctype.h> +#include <stdlib.h> +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +for ac_header in \ + errno.h \ + fcntl.h \ + limits.h \ + stdint.h \ + string.h \ + sys/soundcard.h \ + sys/time.h \ + unistd.h \ + linux/soundcard.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking working SSE intrinsics" >&5 +$as_echo_n "checking working SSE intrinsics... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <xmmintrin.h> +int +main () +{ +_mm_sfence(); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +$as_echo "#define HAVE_XMMINTRIN_H 1" >>confdefs.h + + ac_cv_header_xmmintrin_h=yes +else + ac_cv_header_xmmintrin_h=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ac_cv_header_xmmintrin_h}" >&5 +$as_echo "${ac_cv_header_xmmintrin_h}" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 +$as_echo_n "checking for an ANSI C-conforming const... " >&6; } +if ${ac_cv_c_const+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + +#ifndef __cplusplus + /* Ultrix mips cc rejects this sort of thing. */ + typedef int charset[2]; + const charset cs = { 0, 0 }; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *pcpcc; + char **ppc; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + pcpcc = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++pcpcc; + ppc = (char**) pcpcc; + pcpcc = (char const *const *) ppc; + { /* SCO 3.2v4 cc rejects this sort of thing. */ + char tx; + char *t = &tx; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + if (s) return 0; + } + { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; + } + { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; + } + { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; } bx; + struct s *b = &bx; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + if (!foo) return 0; + } + return !cs[0] && !zero.x; +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_const=yes +else + ac_cv_c_const=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 +$as_echo "$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +$as_echo "#define const /**/" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +$as_echo_n "checking for inline... " >&6; } +if ${ac_cv_c_inline+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo () {return 0; } +$ac_kw foo_t foo () {return 0; } +#endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_inline=$ac_kw +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_inline" != no && break +done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +$as_echo "$ac_cv_c_inline" >&6; } + +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac + +if test ${cross_compiling} = "no"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 +$as_echo_n "checking whether byte ordering is bigendian... " >&6; } +if ${ac_cv_c_bigendian+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_bigendian=unknown + # See if we're dealing with a universal compiler. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __APPLE_CC__ + not a universal capable compiler + #endif + typedef int dummy; + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + # Check for potential -arch flags. It is not universal unless + # there are at least two -arch flags with different values. + ac_arch= + ac_prev= + for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do + if test -n "$ac_prev"; then + case $ac_word in + i?86 | x86_64 | ppc | ppc64) + if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then + ac_arch=$ac_word + else + ac_cv_c_bigendian=universal + break + fi + ;; + esac + ac_prev= + elif test "x$ac_word" = "x-arch"; then + ac_prev=arch + fi + done +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if test $ac_cv_c_bigendian = unknown; then + # See if sys/param.h defines the BYTE_ORDER macro. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <sys/types.h> + #include <sys/param.h> + +int +main () +{ +#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ + && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ + && LITTLE_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + # It does; now see whether it defined to BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <sys/types.h> + #include <sys/param.h> + +int +main () +{ +#if BYTE_ORDER != BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_bigendian=yes +else + ac_cv_c_bigendian=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <limits.h> + +int +main () +{ +#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + # It does; now see whether it defined to _BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <limits.h> + +int +main () +{ +#ifndef _BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_bigendian=yes +else + ac_cv_c_bigendian=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # Compile a test program. + if test "$cross_compiling" = yes; then : + # Try to guess by grepping values from an object file. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +short int ascii_mm[] = + { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; + short int ascii_ii[] = + { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; + int use_ascii (int i) { + return ascii_mm[i] + ascii_ii[i]; + } + short int ebcdic_ii[] = + { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; + short int ebcdic_mm[] = + { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; + int use_ebcdic (int i) { + return ebcdic_mm[i] + ebcdic_ii[i]; + } + extern int foo; + +int +main () +{ +return use_ascii (foo) == use_ebcdic (foo); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then + ac_cv_c_bigendian=yes + fi + if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then + if test "$ac_cv_c_bigendian" = unknown; then + ac_cv_c_bigendian=no + else + # finding both strings is unlikely to happen, but who knows? + ac_cv_c_bigendian=unknown + fi + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ + + /* Are we little or big endian? From Harbison&Steele. */ + union + { + long int l; + char c[sizeof (long int)]; + } u; + u.l = 1; + return u.c[sizeof (long int) - 1] == 1; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_c_bigendian=no +else + ac_cv_c_bigendian=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 +$as_echo "$ac_cv_c_bigendian" >&6; } + case $ac_cv_c_bigendian in #( + yes) + $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h +;; #( + no) + ;; #( + universal) + +$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h + + ;; #( + *) + as_fn_error $? "unknown endianness + presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; + esac + +fi + +# Check whether --enable-largefile was given. +if test "${enable_largefile+set}" = set; then : + enableval=$enable_largefile; +fi + +if test "$enable_largefile" != no; then + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 +$as_echo_n "checking for special C compiler options needed for large files... " >&6; } +if ${ac_cv_sys_largefile_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_sys_largefile_CC=no + if test "$GCC" != yes; then + ac_save_CC=$CC + while :; do + # IRIX 6.2 and later do not support large files by default, + # so use the C compiler's -n32 option if that helps. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <sys/types.h> + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF + if ac_fn_c_try_compile "$LINENO"; then : + break +fi +rm -f core conftest.err conftest.$ac_objext + CC="$CC -n32" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_largefile_CC=' -n32'; break +fi +rm -f core conftest.err conftest.$ac_objext + break + done + CC=$ac_save_CC + rm -f conftest.$ac_ext + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 +$as_echo "$ac_cv_sys_largefile_CC" >&6; } + if test "$ac_cv_sys_largefile_CC" != no; then + CC=$CC$ac_cv_sys_largefile_CC + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 +$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } +if ${ac_cv_sys_file_offset_bits+:} false; then : + $as_echo_n "(cached) " >&6 +else + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <sys/types.h> + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_file_offset_bits=no; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _FILE_OFFSET_BITS 64 +#include <sys/types.h> + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_file_offset_bits=64; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cv_sys_file_offset_bits=unknown + break +done +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 +$as_echo "$ac_cv_sys_file_offset_bits" >&6; } +case $ac_cv_sys_file_offset_bits in #( + no | unknown) ;; + *) +cat >>confdefs.h <<_ACEOF +#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits +_ACEOF +;; +esac +rm -rf conftest* + if test $ac_cv_sys_file_offset_bits = unknown; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 +$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } +if ${ac_cv_sys_large_files+:} false; then : + $as_echo_n "(cached) " >&6 +else + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <sys/types.h> + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_large_files=no; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _LARGE_FILES 1 +#include <sys/types.h> + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_large_files=1; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cv_sys_large_files=unknown + break +done +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 +$as_echo "$ac_cv_sys_large_files" >&6; } +case $ac_cv_sys_large_files in #( + no | unknown) ;; + *) +cat >>confdefs.h <<_ACEOF +#define _LARGE_FILES $ac_cv_sys_large_files +_ACEOF +;; +esac +rm -rf conftest* + fi + + +fi + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5 +$as_echo_n "checking size of short... " >&6; } +if ${ac_cv_sizeof_short+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_short" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (short) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_short=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5 +$as_echo "$ac_cv_sizeof_short" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_SHORT $ac_cv_sizeof_short +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned short" >&5 +$as_echo_n "checking size of unsigned short... " >&6; } +if ${ac_cv_sizeof_unsigned_short+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned short))" "ac_cv_sizeof_unsigned_short" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_unsigned_short" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (unsigned short) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_unsigned_short=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_short" >&5 +$as_echo "$ac_cv_sizeof_unsigned_short" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_UNSIGNED_SHORT $ac_cv_sizeof_unsigned_short +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 +$as_echo_n "checking size of int... " >&6; } +if ${ac_cv_sizeof_int+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_int" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (int) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_int=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 +$as_echo "$ac_cv_sizeof_int" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_INT $ac_cv_sizeof_int +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned int" >&5 +$as_echo_n "checking size of unsigned int... " >&6; } +if ${ac_cv_sizeof_unsigned_int+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned int))" "ac_cv_sizeof_unsigned_int" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_unsigned_int" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (unsigned int) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_unsigned_int=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_int" >&5 +$as_echo "$ac_cv_sizeof_unsigned_int" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_UNSIGNED_INT $ac_cv_sizeof_unsigned_int +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5 +$as_echo_n "checking size of long... " >&6; } +if ${ac_cv_sizeof_long+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_long" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (long) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_long=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5 +$as_echo "$ac_cv_sizeof_long" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_LONG $ac_cv_sizeof_long +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned long" >&5 +$as_echo_n "checking size of unsigned long... " >&6; } +if ${ac_cv_sizeof_unsigned_long+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned long))" "ac_cv_sizeof_unsigned_long" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_unsigned_long" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (unsigned long) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_unsigned_long=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_long" >&5 +$as_echo "$ac_cv_sizeof_unsigned_long" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_UNSIGNED_LONG $ac_cv_sizeof_unsigned_long +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5 +$as_echo_n "checking size of long long... " >&6; } +if ${ac_cv_sizeof_long_long+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_long_long" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (long long) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_long_long=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5 +$as_echo "$ac_cv_sizeof_long_long" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned long long" >&5 +$as_echo_n "checking size of unsigned long long... " >&6; } +if ${ac_cv_sizeof_unsigned_long_long+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned long long))" "ac_cv_sizeof_unsigned_long_long" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_unsigned_long_long" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (unsigned long long) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_unsigned_long_long=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_long_long" >&5 +$as_echo "$ac_cv_sizeof_unsigned_long_long" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_UNSIGNED_LONG_LONG $ac_cv_sizeof_unsigned_long_long +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of float" >&5 +$as_echo_n "checking size of float... " >&6; } +if ${ac_cv_sizeof_float+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (float))" "ac_cv_sizeof_float" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_float" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (float) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_float=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_float" >&5 +$as_echo "$ac_cv_sizeof_float" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_FLOAT $ac_cv_sizeof_float +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of double" >&5 +$as_echo_n "checking size of double... " >&6; } +if ${ac_cv_sizeof_double+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (double))" "ac_cv_sizeof_double" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_double" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (double) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_double=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_double" >&5 +$as_echo "$ac_cv_sizeof_double" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_DOUBLE $ac_cv_sizeof_double +_ACEOF + + + +if test $ac_cv_sizeof_short -eq 0 \ + -o $ac_cv_sizeof_unsigned_short -eq 0 \ + -o $ac_cv_sizeof_int -eq 0 \ + -o $ac_cv_sizeof_unsigned_int -eq 0 \ + -o $ac_cv_sizeof_long -eq 0 \ + -o $ac_cv_sizeof_unsigned_long -eq 0 \ + -o $ac_cv_sizeof_long_long -eq 0 \ + -o $ac_cv_sizeof_unsigned_long_long -eq 0 \ + -o $ac_cv_sizeof_float -eq 0 \ + -o $ac_cv_sizeof_double -eq 0; then + echo '*** I have a problem determining the size of some variable types. Either' + echo '*** you compiler is broken, or your system+compiler combination is not' + echo '*** supportet by the "autoconf" framework we use to generate this' + echo '*** configure script.' + exit 1 +fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long double with more range or precision than double" >&5 +$as_echo_n "checking for long double with more range or precision than double... " >&6; } +if ${ac_cv_type_long_double_wider+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <float.h> + long double const a[] = + { + 0.0L, DBL_MIN, DBL_MAX, DBL_EPSILON, + LDBL_MIN, LDBL_MAX, LDBL_EPSILON + }; + long double + f (long double x) + { + return ((x + (unsigned long int) 10) * (-1 / x) + a[0] + + (x ? f (x) : 'c')); + } + +int +main () +{ +static int test_array [1 - 2 * !((0 < ((DBL_MAX_EXP < LDBL_MAX_EXP) + + (DBL_MANT_DIG < LDBL_MANT_DIG) + - (LDBL_MAX_EXP < DBL_MAX_EXP) + - (LDBL_MANT_DIG < DBL_MANT_DIG))) + && (int) LDBL_EPSILON == 0 + )]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_type_long_double_wider=yes +else + ac_cv_type_long_double_wider=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_long_double_wider" >&5 +$as_echo "$ac_cv_type_long_double_wider" >&6; } + if test $ac_cv_type_long_double_wider = yes; then + +$as_echo "#define HAVE_LONG_DOUBLE_WIDER 1" >>confdefs.h + + fi + + ac_cv_c_long_double=$ac_cv_type_long_double_wider + if test $ac_cv_c_long_double = yes; then + +$as_echo "#define HAVE_LONG_DOUBLE 1" >>confdefs.h + + fi + +if test "${ac_cv_c_have_long_double}" = "yes" ; then + # The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long double" >&5 +$as_echo_n "checking size of long double... " >&6; } +if ${ac_cv_sizeof_long_double+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long double))" "ac_cv_sizeof_long_double" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_long_double" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (long double) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_long_double=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_double" >&5 +$as_echo "$ac_cv_sizeof_long_double" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_LONG_DOUBLE $ac_cv_sizeof_long_double +_ACEOF + + +fi + +ac_fn_c_check_type "$LINENO" "uint8_t" "ac_cv_type_uint8_t" "$ac_includes_default" +if test "x$ac_cv_type_uint8_t" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_UINT8_T 1 +_ACEOF + + +fi +ac_fn_c_check_type "$LINENO" "int8_t" "ac_cv_type_int8_t" "$ac_includes_default" +if test "x$ac_cv_type_int8_t" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_INT8_T 1 +_ACEOF + + +fi +ac_fn_c_check_type "$LINENO" "uint16_t" "ac_cv_type_uint16_t" "$ac_includes_default" +if test "x$ac_cv_type_uint16_t" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_UINT16_T 1 +_ACEOF + + +fi +ac_fn_c_check_type "$LINENO" "int16_t" "ac_cv_type_int16_t" "$ac_includes_default" +if test "x$ac_cv_type_int16_t" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_INT16_T 1 +_ACEOF + + +fi +ac_fn_c_check_type "$LINENO" "uint32_t" "ac_cv_type_uint32_t" "$ac_includes_default" +if test "x$ac_cv_type_uint32_t" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_UINT32_T 1 +_ACEOF + + +fi +ac_fn_c_check_type "$LINENO" "int32_t" "ac_cv_type_int32_t" "$ac_includes_default" +if test "x$ac_cv_type_int32_t" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_INT32_T 1 +_ACEOF + + +fi +ac_fn_c_check_type "$LINENO" "uint64_t" "ac_cv_type_uint64_t" "$ac_includes_default" +if test "x$ac_cv_type_uint64_t" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_UINT64_T 1 +_ACEOF + + +fi +ac_fn_c_check_type "$LINENO" "int64_t" "ac_cv_type_int64_t" "$ac_includes_default" +if test "x$ac_cv_type_int64_t" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_INT64_T 1 +_ACEOF + + +fi + + + + + + + + + + +if test "${HAVE_INT32_T}" = yes; then + $as_echo "#define A_UINT32_T unsigned int32_t" >>confdefs.h + +else + if test "${ac_cv_sizeof_unsigned_short}" = "4"; then + $as_echo "#define A_UINT32_T unsigned short" >>confdefs.h + + else + if test "${ac_cv_sizeof_unsigned_int}" = "4"; then + $as_echo "#define A_UINT32_T unsigned int" >>confdefs.h + + else + if test "${ac_cv_sizeof_unsigned_long}" = "4"; then + $as_echo "#define A_UINT32_T unsigned long" >>confdefs.h + + else + as_fn_error $? "CHECK_TYPE_uint32_t - please report to lame-dev@lists.sourceforge.net" "$LINENO" 5 + fi + fi + fi +fi + + + +if test "${ac_cv_sizeof_short}" = "4"; then + $as_echo "#define A_INT32_T short" >>confdefs.h + +else + if test "${ac_cv_sizeof_int}" = "4"; then + $as_echo "#define A_INT32_T int" >>confdefs.h + + else + if test "${ac_cv_sizeof_long}" = "4"; then + $as_echo "#define A_INT32_T long" >>confdefs.h + + else + as_fn_error $? "CHECK_TYPE_int32_t - please report to lame-dev@lists.sourceforge.net" "$LINENO" 5 + fi + fi +fi + + + +if test "${HAVE_INT64_T}" = yes; then + $as_echo "#define A_UINT64_T unsigned int64_t" >>confdefs.h + +else + if test "${ac_cv_sizeof_unsigned_int}" = "8"; then + $as_echo "#define A_UINT64_T unsigned int" >>confdefs.h + + else + if test "${ac_cv_sizeof_unsigned_long}" = "8"; then + $as_echo "#define A_UINT64_T unsigned long" >>confdefs.h + + else + if test "${ac_cv_sizeof_unsigned_long_long}" = "8"; then + $as_echo "#define A_UINT64_T unsigned long long" >>confdefs.h + + else + as_fn_error $? "CHECK_TYPE_uint64_t - please report to lame-dev@lists.sourceforge.net" "$LINENO" 5 + fi + fi + fi +fi + + + +if test "${ac_cv_sizeof_int}" = "8"; then + $as_echo "#define A_INT64_T int" >>confdefs.h + +else + if test "${ac_cv_sizeof_long}" = "8"; then + $as_echo "#define A_INT64_T long" >>confdefs.h + + else + if test "${ac_cv_sizeof_long_long}" = "8"; then + $as_echo "#define A_INT64_T long long" >>confdefs.h + + else + as_fn_error $? "CHECK_TYPE_int64_t - please report to lame-dev@lists.sourceforge.net" "$LINENO" 5 + fi + fi +fi + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for IEEE854 compliant 80 bit floats" >&5 +$as_echo_n "checking for IEEE854 compliant 80 bit floats... " >&6; } +if ${alex_cv_ieee854_float80+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: can't check for IEEE854 compliant 80 bit floats" >&5 +$as_echo "$as_me: WARNING: can't check for IEEE854 compliant 80 bit floats" >&2;} + +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int float2long_IEEE_compliance ( void ) +{ + struct { + long padding; /* to prevent unaligned access */ + float f; + } s; + s.f = 12582912.; if ( *(long*)(&s.f) != 1262485504l ) return 0; + s.f = 12615679.; if ( *(long*)(&s.f) != 1262518271l ) return 0; + s.f = 13582912.; if ( *(long*)(&s.f) != 1263485504l ) return 0; + s.f = 12550145.; if ( *(long*)(&s.f) != 1262452737l ) return 0; + s.f = 11582912.; if ( *(long*)(&s.f) != 1261485504l ) return 0; + return 1; +} + +int main(void) +{ + int retval; + + retval = float2long_IEEE_compliance(); + + /* no error return -> success */ + return !retval; +} + +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + alex_cv_ieee854_float80=yes +else + alex_cv_ieee854_float80=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $alex_cv_ieee854_float80" >&5 +$as_echo "$alex_cv_ieee854_float80" >&6; } +if test "${alex_cv_ieee854_float80}" = "yes" ; then + if test "${ac_cv_c_long_double}" = "yes" ; then + ac_fn_c_check_type "$LINENO" "ieee854_float80_t" "ac_cv_type_ieee854_float80_t" "$ac_includes_default" +if test "x$ac_cv_type_ieee854_float80_t" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_IEEE854_FLOAT80_T 1 +_ACEOF + +long double +fi + + + + +$as_echo "#define HAVE_IEEE854_FLOAT80 1" >>confdefs.h + + fi +fi +ac_fn_c_check_type "$LINENO" "ieee754_float64_t" "ac_cv_type_ieee754_float64_t" "$ac_includes_default" +if test "x$ac_cv_type_ieee754_float64_t" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_IEEE754_FLOAT64_T 1 +_ACEOF + + +fi +ac_fn_c_check_type "$LINENO" "ieee754_float32_t" "ac_cv_type_ieee754_float32_t" "$ac_includes_default" +if test "x$ac_cv_type_ieee754_float32_t" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_IEEE754_FLOAT32_T 1 +_ACEOF + + +fi + + + + + + + +$as_echo "#define LAME_LIBRARY_BUILD 1" >>confdefs.h + + + +if test ${cross_compiling} = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: + ************************************************************************** + * * + * You are cross compiling: * + * - I did not have a change to determine * + * + the size of: * + * - short * + * - unsigned short * + * - int * + * - unsigned int * + * - long * + * - unsigned long * + * - float * + * - double * + * - long double * + * + the endianess of the system * + * - You have to provide appropriate defines for them in config.h, e.g. * + * + define SIZEOF_SHORT to 2 if the size of a short is 2 * + * + define WORDS_BIGENDIAN if your system is a big endian system * + * * + **************************************************************************" >&5 +$as_echo "$as_me: WARNING: + ************************************************************************** + * * + * You are cross compiling: * + * - I did not have a change to determine * + * + the size of: * + * - short * + * - unsigned short * + * - int * + * - unsigned int * + * - long * + * - unsigned long * + * - float * + * - double * + * - long double * + * + the endianess of the system * + * - You have to provide appropriate defines for them in config.h, e.g. * + * + define SIZEOF_SHORT to 2 if the size of a short is 2 * + * + define WORDS_BIGENDIAN if your system is a big endian system * + * * + **************************************************************************" >&2;} +fi + +ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" +if test "x$ac_cv_type_size_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define size_t unsigned int +_ACEOF + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 +$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } +if ${ac_cv_header_time+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <sys/types.h> +#include <sys/time.h> +#include <time.h> + +int +main () +{ +if ((struct tm *) 0) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_time=yes +else + ac_cv_header_time=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 +$as_echo "$ac_cv_header_time" >&6; } +if test $ac_cv_header_time = yes; then + +$as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h + +fi + + +# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works +# for constant arguments. Useless! +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5 +$as_echo_n "checking for working alloca.h... " >&6; } +if ${ac_cv_working_alloca_h+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <alloca.h> +int +main () +{ +char *p = (char *) alloca (2 * sizeof (int)); + if (p) return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_working_alloca_h=yes +else + ac_cv_working_alloca_h=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5 +$as_echo "$ac_cv_working_alloca_h" >&6; } +if test $ac_cv_working_alloca_h = yes; then + +$as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5 +$as_echo_n "checking for alloca... " >&6; } +if ${ac_cv_func_alloca_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __GNUC__ +# define alloca __builtin_alloca +#else +# ifdef _MSC_VER +# include <malloc.h> +# define alloca _alloca +# else +# ifdef HAVE_ALLOCA_H +# include <alloca.h> +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca /* predefined by HP cc +Olibcalls */ +void *alloca (size_t); +# endif +# endif +# endif +# endif +#endif + +int +main () +{ +char *p = (char *) alloca (1); + if (p) return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_func_alloca_works=yes +else + ac_cv_func_alloca_works=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5 +$as_echo "$ac_cv_func_alloca_works" >&6; } + +if test $ac_cv_func_alloca_works = yes; then + +$as_echo "#define HAVE_ALLOCA 1" >>confdefs.h + +else + # The SVR3 libPW and SVR4 libucb both contain incompatible functions +# that cause trouble. Some versions do not even contain alloca or +# contain a buggy version. If you still want to use their alloca, +# use ar to extract alloca.o from them instead of compiling alloca.c. + +ALLOCA=\${LIBOBJDIR}alloca.$ac_objext + +$as_echo "#define C_ALLOCA 1" >>confdefs.h + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5 +$as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; } +if ${ac_cv_os_cray+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#if defined CRAY && ! defined CRAY2 +webecray +#else +wenotbecray +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "webecray" >/dev/null 2>&1; then : + ac_cv_os_cray=yes +else + ac_cv_os_cray=no +fi +rm -f conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5 +$as_echo "$ac_cv_os_cray" >&6; } +if test $ac_cv_os_cray = yes; then + for ac_func in _getb67 GETB67 getb67; do + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + +cat >>confdefs.h <<_ACEOF +#define CRAY_STACKSEG_END $ac_func +_ACEOF + + break +fi + + done +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5 +$as_echo_n "checking stack direction for C alloca... " >&6; } +if ${ac_cv_c_stack_direction+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ac_cv_c_stack_direction=0 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +find_stack_direction (int *addr, int depth) +{ + int dir, dummy = 0; + if (! addr) + addr = &dummy; + *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1; + dir = depth ? find_stack_direction (addr, depth - 1) : 0; + return dir + dummy; +} + +int +main (int argc, char **argv) +{ + return find_stack_direction (0, argc + !argv + 20) < 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_c_stack_direction=1 +else + ac_cv_c_stack_direction=-1 +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5 +$as_echo "$ac_cv_c_stack_direction" >&6; } +cat >>confdefs.h <<_ACEOF +#define STACK_DIRECTION $ac_cv_c_stack_direction +_ACEOF + + +fi + +for ac_func in gettimeofday strtol +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +if test "X${ac_cv_func_strtol}" != "Xyes"; then + as_fn_error $? "function strtol is mandatory" "$LINENO" 5 +fi + +SOCKETFUNCTION=unknown +for ac_func in socket +do : + ac_fn_c_check_func "$LINENO" "socket" "ac_cv_func_socket" +if test "x$ac_cv_func_socket" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SOCKET 1 +_ACEOF + +fi +done + +if test $ac_cv_func_socket = no; then + # maybe it is in libsocket + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for socket in -lsocket" >&5 +$as_echo_n "checking for socket in -lsocket... " >&6; } +if ${ac_cv_lib_socket_socket+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char socket (); +int +main () +{ +return socket (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_socket_socket=yes +else + ac_cv_lib_socket_socket=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_socket" >&5 +$as_echo "$ac_cv_lib_socket_socket" >&6; } +if test "x$ac_cv_lib_socket_socket" = xyes; then : + $as_echo "#define HAVE_SOCKET 1" >>confdefs.h + + LIBS="$LIBS -lsocket" +fi + + if test "X${ac_cv_lib_socket_socket}" != "Xyes"; then + SOCKETFUNCTION=NO + else + case ${host_os} in + *solaris*) + LIBS="$LIBS -lnsl" + ;; + esac + fi +fi + +CFLAGS=${CFLAGS} +CONFIG_DEFS=${CONFIG_DEFS} +NASM= +INCLUDES="-I\$(top_srcdir)/include -I\$(srcdir)" +FRONTEND_LDFLAGS= +FRONTEND_CFLAGS= +LIB_SOURCES= +MAKEDEP="-M" +RM_F="rm -f" + +# Check whether --enable-nasm was given. +if test "${enable_nasm+set}" = set; then : + enableval=$enable_nasm; ASM_FOR_ARCH="i386" +else + ASM_FOR_ARCH="" +fi + + + +for ac_header in termcap.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "termcap.h" "ac_cv_header_termcap_h" "$ac_includes_default" +if test "x$ac_cv_header_termcap_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_TERMCAP_H 1 +_ACEOF + +fi + +done + +for ac_header in ncurses/termcap.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "ncurses/termcap.h" "ac_cv_header_ncurses_termcap_h" "$ac_includes_default" +if test "x$ac_cv_header_ncurses_termcap_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_NCURSES_TERMCAP_H 1 +_ACEOF + +fi + +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for initscr in -ltermcap" >&5 +$as_echo_n "checking for initscr in -ltermcap... " >&6; } +if ${ac_cv_lib_termcap_initscr+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ltermcap $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char initscr (); +int +main () +{ +return initscr (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_termcap_initscr=yes +else + ac_cv_lib_termcap_initscr=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_termcap_initscr" >&5 +$as_echo "$ac_cv_lib_termcap_initscr" >&6; } +if test "x$ac_cv_lib_termcap_initscr" = xyes; then : + HAVE_TERMCAP="termcap" +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for initscr in -lcurses" >&5 +$as_echo_n "checking for initscr in -lcurses... " >&6; } +if ${ac_cv_lib_curses_initscr+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lcurses $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char initscr (); +int +main () +{ +return initscr (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_curses_initscr=yes +else + ac_cv_lib_curses_initscr=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_initscr" >&5 +$as_echo "$ac_cv_lib_curses_initscr" >&6; } +if test "x$ac_cv_lib_curses_initscr" = xyes; then : + HAVE_TERMCAP="curses" +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for initscr in -lncurses" >&5 +$as_echo_n "checking for initscr in -lncurses... " >&6; } +if ${ac_cv_lib_ncurses_initscr+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lncurses $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char initscr (); +int +main () +{ +return initscr (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_ncurses_initscr=yes +else + ac_cv_lib_ncurses_initscr=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ncurses_initscr" >&5 +$as_echo "$ac_cv_lib_ncurses_initscr" >&6; } +if test "x$ac_cv_lib_ncurses_initscr" = xyes; then : + HAVE_TERMCAP="ncurses" +fi + + + + if test "X$prefix" = "XNONE"; then + acl_final_prefix="$ac_default_prefix" + else + acl_final_prefix="$prefix" + fi + if test "X$exec_prefix" = "XNONE"; then + acl_final_exec_prefix='${prefix}' + else + acl_final_exec_prefix="$exec_prefix" + fi + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" + prefix="$acl_save_prefix" + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which + # contains only /bin. Note that ksh looks also at the FPATH variable, + # so we have to set that as well for the test. + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ + && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ + || PATH_SEPARATOR=';' + } +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo "$ac_prog"| sed 's%\\\\%/%g'` + while echo "$ac_prog" | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${acl_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + acl_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$acl_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + acl_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$acl_cv_path_LD" -v 2>&1 </dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break + ;; + *) + test "$with_gnu_ld" != yes && break + ;; + esac + fi + done + IFS="$acl_save_ifs" +else + acl_cv_path_LD="$LD" # Let the user override the test with a path. +fi +fi + +LD="$acl_cv_path_LD" +if test -n "$LD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${acl_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 </dev/null` in +*GNU* | *'with BFD'*) + acl_cv_prog_gnu_ld=yes + ;; +*) + acl_cv_prog_gnu_ld=no + ;; +esac +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_prog_gnu_ld" >&5 +$as_echo "$acl_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$acl_cv_prog_gnu_ld + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5 +$as_echo_n "checking for shared library run path origin... " >&6; } +if ${acl_cv_rpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + + CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ + ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh + . ./conftest.sh + rm -f ./conftest.sh + acl_cv_rpath=done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5 +$as_echo "$acl_cv_rpath" >&6; } + wl="$acl_cv_wl" + acl_libext="$acl_cv_libext" + acl_shlibext="$acl_cv_shlibext" + acl_libname_spec="$acl_cv_libname_spec" + acl_library_names_spec="$acl_cv_library_names_spec" + acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" + acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" + acl_hardcode_direct="$acl_cv_hardcode_direct" + acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" + # Check whether --enable-rpath was given. +if test "${enable_rpath+set}" = set; then : + enableval=$enable_rpath; : +else + enable_rpath=yes +fi + + + + + acl_libdirstem=lib + acl_libdirstem2= + case "$host_os" in + solaris*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit host" >&5 +$as_echo_n "checking for 64-bit host... " >&6; } +if ${gl_cv_solaris_64bit+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef _LP64 +sixtyfour bits +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "sixtyfour bits" >/dev/null 2>&1; then : + gl_cv_solaris_64bit=yes +else + gl_cv_solaris_64bit=no +fi +rm -f conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_solaris_64bit" >&5 +$as_echo "$gl_cv_solaris_64bit" >&6; } + if test $gl_cv_solaris_64bit = yes; then + acl_libdirstem=lib/64 + case "$host_cpu" in + sparc*) acl_libdirstem2=lib/sparcv9 ;; + i*86 | x86_64) acl_libdirstem2=lib/amd64 ;; + esac + fi + ;; + *) + searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` + if test -n "$searchpath"; then + acl_save_IFS="${IFS= }"; IFS=":" + for searchdir in $searchpath; do + if test -d "$searchdir"; then + case "$searchdir" in + */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; + */../ | */.. ) + # Better ignore directories of this form. They are misleading. + ;; + *) searchdir=`cd "$searchdir" && pwd` + case "$searchdir" in + */lib64 ) acl_libdirstem=lib64 ;; + esac ;; + esac + fi + done + IFS="$acl_save_IFS" + fi + ;; + esac + test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem" + + + + + + + + + + + + + use_additional=yes + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + +# Check whether --with-libiconv-prefix was given. +if test "${with_libiconv_prefix+set}" = set; then : + withval=$with_libiconv_prefix; + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + else + additional_includedir="$withval/include" + additional_libdir="$withval/$acl_libdirstem" + if test "$acl_libdirstem2" != "$acl_libdirstem" \ + && ! test -d "$withval/$acl_libdirstem"; then + additional_libdir="$withval/$acl_libdirstem2" + fi + fi + fi + +fi + + LIBICONV= + LTLIBICONV= + INCICONV= + LIBICONV_PREFIX= + HAVE_LIBICONV= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='iconv ' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value" + else + : + fi + else + found_dir= + found_la= + found_so= + found_a= + eval libname=\"$acl_libname_spec\" # typically: libname=lib$name + if test -n "$acl_shlibext"; then + shrext=".$acl_shlibext" # typically: shrext=.so + else + shrext= + fi + if test $use_additional = yes; then + dir="$additional_libdir" + if test -n "$acl_shlibext"; then + if test -f "$dir/$libname$shrext"; then + found_dir="$dir" + found_so="$dir/$libname$shrext" + else + if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then + ver=`(cd "$dir" && \ + for f in "$libname$shrext".*; do echo "$f"; done \ + | sed -e "s,^$libname$shrext\\\\.,," \ + | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ + | sed 1q ) 2>/dev/null` + if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then + found_dir="$dir" + found_so="$dir/$libname$shrext.$ver" + fi + else + eval library_names=\"$acl_library_names_spec\" + for f in $library_names; do + if test -f "$dir/$f"; then + found_dir="$dir" + found_so="$dir/$f" + break + fi + done + fi + fi + fi + if test "X$found_dir" = "X"; then + if test -f "$dir/$libname.$acl_libext"; then + found_dir="$dir" + found_a="$dir/$libname.$acl_libext" + fi + fi + if test "X$found_dir" != "X"; then + if test -f "$dir/$libname.la"; then + found_la="$dir/$libname.la" + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + if test -n "$acl_shlibext"; then + if test -f "$dir/$libname$shrext"; then + found_dir="$dir" + found_so="$dir/$libname$shrext" + else + if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then + ver=`(cd "$dir" && \ + for f in "$libname$shrext".*; do echo "$f"; done \ + | sed -e "s,^$libname$shrext\\\\.,," \ + | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ + | sed 1q ) 2>/dev/null` + if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then + found_dir="$dir" + found_so="$dir/$libname$shrext.$ver" + fi + else + eval library_names=\"$acl_library_names_spec\" + for f in $library_names; do + if test -f "$dir/$f"; then + found_dir="$dir" + found_so="$dir/$f" + break + fi + done + fi + fi + fi + if test "X$found_dir" = "X"; then + if test -f "$dir/$libname.$acl_libext"; then + found_dir="$dir" + found_a="$dir/$libname.$acl_libext" + fi + fi + if test "X$found_dir" != "X"; then + if test -f "$dir/$libname.la"; then + found_la="$dir/$libname.la" + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + if test "$enable_rpath" = no \ + || test "X$found_dir" = "X/usr/$acl_libdirstem" \ + || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + else + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + if test "$acl_hardcode_direct" = yes; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + else + if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + haveit= + for x in $LDFLAGS $LIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir" + fi + if test "$acl_hardcode_minus_L" != no; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a" + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name" + fi + fi + additional_includedir= + case "$found_dir" in + */$acl_libdirstem | */$acl_libdirstem/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` + if test "$name" = 'iconv'; then + LIBICONV_PREFIX="$basedir" + fi + additional_includedir="$basedir/include" + ;; + */$acl_libdirstem2 | */$acl_libdirstem2/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` + if test "$name" = 'iconv'; then + LIBICONV_PREFIX="$basedir" + fi + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INCICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + if test -n "$found_la"; then + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ + && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ + || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + LIBICONV="${LIBICONV}${LIBICONV:+ }$dep" + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep" + ;; + esac + done + fi + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$acl_hardcode_libdir_separator"; then + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" + done + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" + else + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + for found_dir in $ltrpathdirs; do + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir" + done + fi + + + + + + + + + + + + + am_save_CPPFLAGS="$CPPFLAGS" + + for element in $INCICONV; do + haveit= + for x in $CPPFLAGS; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" + fi + done + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5 +$as_echo_n "checking for iconv... " >&6; } +if ${am_cv_func_iconv+:} false; then : + $as_echo_n "(cached) " >&6 +else + + am_cv_func_iconv="no, consider installing GNU libiconv" + am_cv_lib_iconv=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include <stdlib.h> +#include <iconv.h> + +int +main () +{ +iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + am_cv_func_iconv=yes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test "$am_cv_func_iconv" != yes; then + am_save_LIBS="$LIBS" + LIBS="$LIBS $LIBICONV" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include <stdlib.h> +#include <iconv.h> + +int +main () +{ +iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + am_cv_lib_iconv=yes + am_cv_func_iconv=yes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$am_save_LIBS" + fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5 +$as_echo "$am_cv_func_iconv" >&6; } + if test "$am_cv_func_iconv" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5 +$as_echo_n "checking for working iconv... " >&6; } +if ${am_cv_func_iconv_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + + am_save_LIBS="$LIBS" + if test $am_cv_lib_iconv = yes; then + LIBS="$LIBS $LIBICONV" + fi + am_cv_func_iconv_works=no + for ac_iconv_const in '' 'const'; do + if test "$cross_compiling" = yes; then : + case "$host_os" in + aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; + *) am_cv_func_iconv_works="guessing yes" ;; + esac +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include <iconv.h> +#include <string.h> + +#ifndef ICONV_CONST +# define ICONV_CONST $ac_iconv_const +#endif + +int +main () +{ +int result = 0; + /* Test against AIX 5.1 bug: Failures are not distinguishable from successful + returns. */ + { + iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); + if (cd_utf8_to_88591 != (iconv_t)(-1)) + { + static ICONV_CONST char input[] = "\342\202\254"; /* EURO SIGN */ + char buf[10]; + ICONV_CONST char *inptr = input; + size_t inbytesleft = strlen (input); + char *outptr = buf; + size_t outbytesleft = sizeof (buf); + size_t res = iconv (cd_utf8_to_88591, + &inptr, &inbytesleft, + &outptr, &outbytesleft); + if (res == 0) + result |= 1; + iconv_close (cd_utf8_to_88591); + } + } + /* Test against Solaris 10 bug: Failures are not distinguishable from + successful returns. */ + { + iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646"); + if (cd_ascii_to_88591 != (iconv_t)(-1)) + { + static ICONV_CONST char input[] = "\263"; + char buf[10]; + ICONV_CONST char *inptr = input; + size_t inbytesleft = strlen (input); + char *outptr = buf; + size_t outbytesleft = sizeof (buf); + size_t res = iconv (cd_ascii_to_88591, + &inptr, &inbytesleft, + &outptr, &outbytesleft); + if (res == 0) + result |= 2; + iconv_close (cd_ascii_to_88591); + } + } + /* Test against AIX 6.1..7.1 bug: Buffer overrun. */ + { + iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1"); + if (cd_88591_to_utf8 != (iconv_t)(-1)) + { + static ICONV_CONST char input[] = "\304"; + static char buf[2] = { (char)0xDE, (char)0xAD }; + ICONV_CONST char *inptr = input; + size_t inbytesleft = 1; + char *outptr = buf; + size_t outbytesleft = 1; + size_t res = iconv (cd_88591_to_utf8, + &inptr, &inbytesleft, + &outptr, &outbytesleft); + if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD) + result |= 4; + iconv_close (cd_88591_to_utf8); + } + } +#if 0 /* This bug could be worked around by the caller. */ + /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ + { + iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); + if (cd_88591_to_utf8 != (iconv_t)(-1)) + { + static ICONV_CONST char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; + char buf[50]; + ICONV_CONST char *inptr = input; + size_t inbytesleft = strlen (input); + char *outptr = buf; + size_t outbytesleft = sizeof (buf); + size_t res = iconv (cd_88591_to_utf8, + &inptr, &inbytesleft, + &outptr, &outbytesleft); + if ((int)res > 0) + result |= 8; + iconv_close (cd_88591_to_utf8); + } + } +#endif + /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is + provided. */ + if (/* Try standardized names. */ + iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) + /* Try IRIX, OSF/1 names. */ + && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) + /* Try AIX names. */ + && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) + /* Try HP-UX names. */ + && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) + result |= 16; + return result; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + am_cv_func_iconv_works=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + test "$am_cv_func_iconv_works" = no || break + done + LIBS="$am_save_LIBS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5 +$as_echo "$am_cv_func_iconv_works" >&6; } + case "$am_cv_func_iconv_works" in + *no) am_func_iconv=no am_cv_lib_iconv=no ;; + *) am_func_iconv=yes ;; + esac + else + am_func_iconv=no am_cv_lib_iconv=no + fi + if test "$am_func_iconv" = yes; then + +$as_echo "#define HAVE_ICONV 1" >>confdefs.h + + fi + if test "$am_cv_lib_iconv" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5 +$as_echo_n "checking how to link with libiconv... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5 +$as_echo "$LIBICONV" >&6; } + else + CPPFLAGS="$am_save_CPPFLAGS" + LIBICONV= + LTLIBICONV= + fi + + + + if test "$am_cv_func_iconv" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv declaration" >&5 +$as_echo_n "checking for iconv declaration... " >&6; } + if ${am_cv_proto_iconv+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include <stdlib.h> +#include <iconv.h> +extern +#ifdef __cplusplus +"C" +#endif +#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus) +size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); +#else +size_t iconv(); +#endif + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + am_cv_proto_iconv_arg1="" +else + am_cv_proto_iconv_arg1="const" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);" +fi + + am_cv_proto_iconv=`echo "$am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: + $am_cv_proto_iconv" >&5 +$as_echo " + $am_cv_proto_iconv" >&6; } + +cat >>confdefs.h <<_ACEOF +#define ICONV_CONST $am_cv_proto_iconv_arg1 +_ACEOF + + + fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 +$as_echo_n "checking for cos in -lm... " >&6; } +if ${ac_cv_lib_m_cos+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char cos (); +int +main () +{ +return cos (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_m_cos=yes +else + ac_cv_lib_m_cos=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5 +$as_echo "$ac_cv_lib_m_cos" >&6; } +if test "x$ac_cv_lib_m_cos" = xyes; then : + USE_LIBM="-lm" +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lffm" >&5 +$as_echo_n "checking for cos in -lffm... " >&6; } +if ${ac_cv_lib_ffm_cos+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lffm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char cos (); +int +main () +{ +return cos (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_ffm_cos=yes +else + ac_cv_lib_ffm_cos=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ffm_cos" >&5 +$as_echo "$ac_cv_lib_ffm_cos" >&6; } +if test "x$ac_cv_lib_ffm_cos" = xyes; then : + USE_LIBM="-lffm -lm" +fi + +# Check whether --enable-cpml was given. +if test "${enable_cpml+set}" = set; then : + enableval=$enable_cpml; CONFIG_CPML="no" +else + CONFIG_CPML="yes" +fi + +if test "${CONFIG_CPML}" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lcpml" >&5 +$as_echo_n "checking for cos in -lcpml... " >&6; } +if ${ac_cv_lib_cpml_cos+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lcpml $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char cos (); +int +main () +{ +return cos (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_cpml_cos=yes +else + ac_cv_lib_cpml_cos=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cpml_cos" >&5 +$as_echo "$ac_cv_lib_cpml_cos" >&6; } +if test "x$ac_cv_lib_cpml_cos" = xyes; then : + USE_LIBM="-lcpml" +fi + +fi +CONFIG_MATH_LIB="${USE_LIBM}" + + + +# Check whether --with-gtk-prefix was given. +if test "${with_gtk_prefix+set}" = set; then : + withval=$with_gtk_prefix; gtk_config_prefix="$withval" +else + gtk_config_prefix="" +fi + + +# Check whether --with-gtk-exec-prefix was given. +if test "${with_gtk_exec_prefix+set}" = set; then : + withval=$with_gtk_exec_prefix; gtk_config_exec_prefix="$withval" +else + gtk_config_exec_prefix="" +fi + +# Check whether --enable-gtktest was given. +if test "${enable_gtktest+set}" = set; then : + enableval=$enable_gtktest; +else + enable_gtktest=yes +fi + + + for module in . + do + case "$module" in + gthread) + gtk_config_args="$gtk_config_args gthread" + ;; + esac + done + + if test x$gtk_config_exec_prefix != x ; then + gtk_config_args="$gtk_config_args --exec-prefix=$gtk_config_exec_prefix" + if test x${GTK_CONFIG+set} != xset ; then + GTK_CONFIG=$gtk_config_exec_prefix/bin/gtk-config + fi + fi + if test x$gtk_config_prefix != x ; then + gtk_config_args="$gtk_config_args --prefix=$gtk_config_prefix" + if test x${GTK_CONFIG+set} != xset ; then + GTK_CONFIG=$gtk_config_prefix/bin/gtk-config + fi + fi + + # Extract the first word of "gtk-config", so it can be a program name with args. +set dummy gtk-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_GTK_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $GTK_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_GTK_CONFIG="$GTK_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_GTK_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_GTK_CONFIG" && ac_cv_path_GTK_CONFIG="no" + ;; +esac +fi +GTK_CONFIG=$ac_cv_path_GTK_CONFIG +if test -n "$GTK_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTK_CONFIG" >&5 +$as_echo "$GTK_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + min_gtk_version=1.2.0 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK - version >= $min_gtk_version" >&5 +$as_echo_n "checking for GTK - version >= $min_gtk_version... " >&6; } + no_gtk="" + if test "$GTK_CONFIG" = "no" ; then + no_gtk=yes + else + GTK_CFLAGS=`$GTK_CONFIG $gtk_config_args --cflags` + GTK_LIBS=`$GTK_CONFIG $gtk_config_args --libs` + gtk_config_major_version=`$GTK_CONFIG $gtk_config_args --version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` + gtk_config_minor_version=`$GTK_CONFIG $gtk_config_args --version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` + gtk_config_micro_version=`$GTK_CONFIG $gtk_config_args --version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` + if test "x$enable_gtktest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $GTK_CFLAGS" + LIBS="$GTK_LIBS $LIBS" + rm -f conf.gtktest + if test "$cross_compiling" = yes; then : + echo $ac_n "cross compiling; assumed OK... $ac_c" +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include <gtk/gtk.h> +#include <stdio.h> +#include <stdlib.h> + +int +main () +{ + int major, minor, micro; + char *tmp_version; + + system ("touch conf.gtktest"); + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = g_strdup("$min_gtk_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_gtk_version"); + exit(1); + } + + if ((gtk_major_version != $gtk_config_major_version) || + (gtk_minor_version != $gtk_config_minor_version) || + (gtk_micro_version != $gtk_config_micro_version)) + { + printf("\n*** 'gtk-config --version' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n", + $gtk_config_major_version, $gtk_config_minor_version, $gtk_config_micro_version, + gtk_major_version, gtk_minor_version, gtk_micro_version); + printf ("*** was found! If gtk-config was correct, then it is best\n"); + printf ("*** to remove the old version of GTK+. You may also be able to fix the error\n"); + printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n"); + printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); + printf("*** required on your system.\n"); + printf("*** If gtk-config was wrong, set the environment variable GTK_CONFIG\n"); + printf("*** to point to the correct copy of gtk-config, and remove the file config.cache\n"); + printf("*** before re-running configure\n"); + } +#if defined (GTK_MAJOR_VERSION) && defined (GTK_MINOR_VERSION) && defined (GTK_MICRO_VERSION) + else if ((gtk_major_version != GTK_MAJOR_VERSION) || + (gtk_minor_version != GTK_MINOR_VERSION) || + (gtk_micro_version != GTK_MICRO_VERSION)) + { + printf("*** GTK+ header files (version %d.%d.%d) do not match\n", + GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION); + printf("*** library (version %d.%d.%d)\n", + gtk_major_version, gtk_minor_version, gtk_micro_version); + } +#endif /* defined (GTK_MAJOR_VERSION) ... */ + else + { + if ((gtk_major_version > major) || + ((gtk_major_version == major) && (gtk_minor_version > minor)) || + ((gtk_major_version == major) && (gtk_minor_version == minor) && (gtk_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** An old version of GTK+ (%d.%d.%d) was found.\n", + gtk_major_version, gtk_minor_version, gtk_micro_version); + printf("*** You need a version of GTK+ newer than %d.%d.%d. The latest version of\n", + major, minor, micro); + printf("*** GTK+ is always available from ftp://ftp.gtk.org.\n"); + printf("***\n"); + printf("*** If you have already installed a sufficiently new version, this error\n"); + printf("*** probably means that the wrong copy of the gtk-config shell script is\n"); + printf("*** being found. The easiest way to fix this is to remove the old version\n"); + printf("*** of GTK+, but you can also set the GTK_CONFIG environment to point to the\n"); + printf("*** correct copy of gtk-config. (In this case, you will have to\n"); + printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); + printf("*** so that the correct libraries are found at run-time))\n"); + } + } + return 1; +} + +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + no_gtk=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + if test "x$no_gtk" = x ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_GTK="yes" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + if test "$GTK_CONFIG" = "no" ; then + echo "*** The gtk-config script installed by GTK could not be found" + echo "*** If GTK was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the GTK_CONFIG environment variable to the" + echo "*** full path to gtk-config." + else + if test -f conf.gtktest ; then + : + else + echo "*** Could not run GTK test program, checking why..." + CFLAGS="$CFLAGS $GTK_CFLAGS" + LIBS="$LIBS $GTK_LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include <gtk/gtk.h> +#include <stdio.h> + +int +main () +{ + return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version)); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding GTK or finding the wrong" + echo "*** version of GTK. If it is not finding GTK, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" + echo "***" + echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that" + echo "*** came with the system with the command" + echo "***" + echo "*** rpm --erase --nodeps gtk gtk-devel" +else + echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means GTK was incorrectly installed" + echo "*** or that you have moved GTK since it was installed. In the latter case, you" + echo "*** may want to edit the gtk-config script: $GTK_CONFIG" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + GTK_CFLAGS="" + GTK_LIBS="" + HAVE_GTK="no" + fi + + + rm -f conf.gtktest + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking use of ElectricFence malloc debugging" >&5 +$as_echo_n "checking use of ElectricFence malloc debugging... " >&6; } +# Check whether --enable-efence was given. +if test "${enable_efence+set}" = set; then : + enableval=$enable_efence; CONFIG_EFENCE="${enableval}" +else + CONFIG_EFENCE="no" +fi + + +case "${CONFIG_EFENCE}" in +yes) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for EF_Print in -lefence" >&5 +$as_echo_n "checking for EF_Print in -lefence... " >&6; } +if ${ac_cv_lib_efence_EF_Print+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lefence $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char EF_Print (); +int +main () +{ +return EF_Print (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_efence_EF_Print=yes +else + ac_cv_lib_efence_EF_Print=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_efence_EF_Print" >&5 +$as_echo "$ac_cv_lib_efence_EF_Print" >&6; } +if test "x$ac_cv_lib_efence_EF_Print" = xyes; then : + HAVE_EFENCE="-lefence" +fi + + if test "x${HAVE_EFENCE}" != "x-lefence"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + LDADD="${LDADD} ${HAVE_EFENCE}" + +$as_echo "#define HAVE_EFENCE 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${CONFIG_EFENCE}" >&5 +$as_echo "${CONFIG_EFENCE}" >&6; } + fi + ;; +no) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${CONFIG_EFENCE}" >&5 +$as_echo "${CONFIG_EFENCE}" >&6; } + ;; +*) + as_fn_error $? "bad value �${CONFIG_EFENCE}� for efence option" "$LINENO" 5 + ;; +esac + + +WARNING= + +# Check whether --with-fileio was given. +if test "${with_fileio+set}" = set; then : + withval=$with_fileio; CONFIG_FILEIO="${withval}" +else + CONFIG_FILEIO="lame" +fi + + +if test "${CONFIG_FILEIO}" = "sndfile" ; then + + + + + + + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. +set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PKG_CONFIG=$ac_cv_path_PKG_CONFIG +if test -n "$PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 +$as_echo "$PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_PKG_CONFIG"; then + ac_pt_PKG_CONFIG=$PKG_CONFIG + # Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG +if test -n "$ac_pt_PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 +$as_echo "$ac_pt_PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_PKG_CONFIG" = x; then + PKG_CONFIG="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + PKG_CONFIG=$ac_pt_PKG_CONFIG + fi +else + PKG_CONFIG="$ac_cv_path_PKG_CONFIG" +fi + +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=0.9.0 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 +$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + PKG_CONFIG="" + fi +fi + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SNDFILE" >&5 +$as_echo_n "checking for SNDFILE... " >&6; } + +if test -n "$SNDFILE_CFLAGS"; then + pkg_cv_SNDFILE_CFLAGS="$SNDFILE_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sndfile >= 1.0.2\""; } >&5 + ($PKG_CONFIG --exists --print-errors "sndfile >= 1.0.2") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_SNDFILE_CFLAGS=`$PKG_CONFIG --cflags "sndfile >= 1.0.2" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$SNDFILE_LIBS"; then + pkg_cv_SNDFILE_LIBS="$SNDFILE_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sndfile >= 1.0.2\""; } >&5 + ($PKG_CONFIG --exists --print-errors "sndfile >= 1.0.2") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_SNDFILE_LIBS=`$PKG_CONFIG --libs "sndfile >= 1.0.2" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + SNDFILE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "sndfile >= 1.0.2" 2>&1` + else + SNDFILE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "sndfile >= 1.0.2" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$SNDFILE_PKG_ERRORS" >&5 + + HAVE_SNDFILE="no" +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_SNDFILE="no" +else + SNDFILE_CFLAGS=$pkg_cv_SNDFILE_CFLAGS + SNDFILE_LIBS=$pkg_cv_SNDFILE_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_SNDFILE="yes" +fi +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking use of file io" >&5 +$as_echo_n "checking use of file io... " >&6; } + +if test "${CONFIG_FILEIO}" = "sndfile" ; then + if test "${HAVE_SNDFILE}" = "yes" -o "x${SNDFILE_LIBS}" != "x" \ + -o "x${SNDFILE_CFLAGS}" != "x"; then + SNDFILE_LIBS=`echo ${SNDFILE_LIBS}` + SNDFILE_CFLAGS=`echo ${SNDFILE_CFLAGS}` + + if test -n "${SNDFILE_LIBS}" ; then + FRONTEND_LDFLAGS="${SNDFILE_LIBS} ${FRONTEND_LDFLAGS}" + fi + FRONTEND_LDADD="-lsndfile ${FRONTEND_LDADD}" + + if test -n "${SNDFILE_CFLAGS}" ; then + INCLUDES="${SNDFILE_CFLAGS} ${INCLUDES}" + fi + + +$as_echo "#define LIBSNDFILE 1" >>confdefs.h + + else + # default + CONFIG_FILEIO="lame" + WARNING="${WARNING} Could not find any sndfile lib on system." + fi +else + CONFIG_FILEIO="lame" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${CONFIG_FILEIO}" >&5 +$as_echo "${CONFIG_FILEIO}" >&6; } +if test "x${WARNING}" != "x" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $WARNING" >&5 +$as_echo "$as_me: WARNING: $WARNING" >&2;} +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking use of analyzer hooks" >&5 +$as_echo_n "checking use of analyzer hooks... " >&6; } +# Check whether --enable-analyzer-hooks was given. +if test "${enable_analyzer_hooks+set}" = set; then : + enableval=$enable_analyzer_hooks; CONFIG_ANALYZER="${enableval}" +else + CONFIG_ANALYZER="yes" +fi + + +case "${CONFIG_ANALYZER}" in +yes) + ;; +no) + +$as_echo "#define NOANALYSIS 1" >>confdefs.h + + ;; +*) + as_fn_error $? "bad value �${CONFIG_ANALYZER}� for analyzer-hooks option" "$LINENO" 5 + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CONFIG_ANALYZER" >&5 +$as_echo "$CONFIG_ANALYZER" >&6; } + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking use of mpg123 decoder" >&5 +$as_echo_n "checking use of mpg123 decoder... " >&6; } +# Check whether --enable-decoder was given. +if test "${enable_decoder+set}" = set; then : + enableval=$enable_decoder; CONFIG_DECODER="${enableval}" +else + CONFIG_DECODER="yes" +fi + + + if test "x${CONFIG_DECODER}" = "xyes"; then + LIB_WITH_DECODER_TRUE= + LIB_WITH_DECODER_FALSE='#' +else + LIB_WITH_DECODER_TRUE='#' + LIB_WITH_DECODER_FALSE= +fi + + +if test "${CONFIG_DECODER}" != "no" ; then + CONFIG_DECODER="yes (Layer 1, 2, 3)" + +$as_echo "#define HAVE_MPGLIB 1" >>confdefs.h + + +$as_echo "#define DECODE_ON_THE_FLY 1" >>confdefs.h + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CONFIG_DECODER" >&5 +$as_echo "$CONFIG_DECODER" >&6; } + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the lame frontend should be build" >&5 +$as_echo_n "checking if the lame frontend should be build... " >&6; } +# Check whether --enable-frontend was given. +if test "${enable_frontend+set}" = set; then : + enableval=$enable_frontend; WITH_FRONTEND="${enableval}" +else + WITH_FRONTEND=yes +fi + +if test "x${WITH_FRONTEND}" = "xyes"; then + WITH_FRONTEND=lame${ac_exeext} + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + WITH_FRONTEND= + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if mp3x is requested" >&5 +$as_echo_n "checking if mp3x is requested... " >&6; } +# Check whether --enable-mp3x was given. +if test "${enable_mp3x+set}" = set; then : + enableval=$enable_mp3x; WITH_MP3X="${enableval}" +else + WITH_MP3X=no +fi + +if test "x${WITH_MP3X}" = "xyes"; then + WITH_MP3X=mp3x${ac_exeext} + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + WITH_MP3X= + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + +if test "${HAVE_GTK}" = "no"; then + if test "x${WITH_MP3X}" = "xmp3x"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: can't build mp3x" >&5 +$as_echo "$as_me: WARNING: can't build mp3x" >&2;} + WITH_MP3X= + fi + if test "x${CONFIG_ANALYZER}" != "xyes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: can't build mp3x because of disabled analyzer hooks" >&5 +$as_echo "$as_me: WARNING: can't build mp3x because of disabled analyzer hooks" >&2;} + WITH_MP3X= + fi +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if mp3rtp is requested" >&5 +$as_echo_n "checking if mp3rtp is requested... " >&6; } +# Check whether --enable-mp3rtp was given. +if test "${enable_mp3rtp+set}" = set; then : + enableval=$enable_mp3rtp; WITH_MP3RTP="${enableval}" +else + WITH_MP3RTP=no +fi + +if test "x${WITH_MP3RTP}" = "xyes"; then + if test ${SOCKETFUNCTION} = NO; then + as_fn_error $? "function socket is mandatory for mp3rtp" "$LINENO" 5 + fi + WITH_MP3RTP=mp3rtp${ac_exeext} + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + WITH_MP3RTP= + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if dynamic linking of the frontends is requested" >&5 +$as_echo_n "checking if dynamic linking of the frontends is requested... " >&6; } +# Check whether --enable-dynamic-frontends was given. +if test "${enable_dynamic_frontends+set}" = set; then : + enableval=$enable_dynamic_frontends; FRONTEND_LDFLAGS="${FRONTEND_LDFLAGS}" +else + FRONTEND_LDFLAGS="${FRONTEND_LDFLAGS} -static" +fi + +case "x${FRONTEND_LDFLAGS}" in +*-static*) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; +*) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + ;; +esac + + +# +# this is from vorbis +# +case $host in +*86-*-linux*) + # glibc < 2.1.3 has a serious FP bug in the math inline header + # that will cripple Vorbis. Look to see if the magic FP stack + # clobber is missing in the mathinline header, thus indicating + # the buggy version + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #define __LIBC_INTERNAL_MATH_INLINES 1 + #define __OPTIMIZE__ + #include <math.h> + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "log10.*fldlg2.*fxch" >/dev/null 2>&1; then : + bad=maybe +else + bad=no +fi +rm -f conftest* + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking glibc mathinline bug" >&5 +$as_echo_n "checking glibc mathinline bug... " >&6; } + if test ${bad} = "maybe" ;then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #define __LIBC_INTERNAL_MATH_INLINES 1 + #define __OPTIMIZE__ + #include <math.h> + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "log10.*fldlg2.*fxch.*st\([0123456789]*\)" >/dev/null 2>&1; then : + bad=no +else + bad=yes +fi +rm -f conftest* + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${bad}" >&5 +$as_echo "${bad}" >&6; } + if test ${bad} = "yes" ;then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: " >&5 +$as_echo "$as_me: WARNING: " >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ********************************************************" >&5 +$as_echo "$as_me: WARNING: ********************************************************" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: * The glibc headers on this machine have a serious bug *" >&5 +$as_echo "$as_me: WARNING: * The glibc headers on this machine have a serious bug *" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: * in /usr/include/bits/mathinline.h This bug affects *" >&5 +$as_echo "$as_me: WARNING: * in /usr/include/bits/mathinline.h This bug affects *" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: * all floating point code, not only LAME, but all code *" >&5 +$as_echo "$as_me: WARNING: * all floating point code, not only LAME, but all code *" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: * built on this machine. Upgrading to glibc 2.1.3 is *" >&5 +$as_echo "$as_me: WARNING: * built on this machine. Upgrading to glibc 2.1.3 is *" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: * strongly urged to correct the problem. *" >&5 +$as_echo "$as_me: WARNING: * strongly urged to correct the problem. *" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *Note: that upgrading glibc will not fix any previously*" >&5 +$as_echo "$as_me: WARNING: *Note: that upgrading glibc will not fix any previously*" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: * built programs; this is a compile-time bug. *" >&5 +$as_echo "$as_me: WARNING: * built programs; this is a compile-time bug. *" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: * To work around the problem for this build of LAME, *" >&5 +$as_echo "$as_me: WARNING: * To work around the problem for this build of LAME, *" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: * autoconf is disabling all math inlining. This will *" >&5 +$as_echo "$as_me: WARNING: * autoconf is disabling all math inlining. This will *" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: * hurt LAME performace but is necessary for LAME to *" >&5 +$as_echo "$as_me: WARNING: * hurt LAME performace but is necessary for LAME to *" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: * work correctly. Once glibc is upgraded, rerun *" >&5 +$as_echo "$as_me: WARNING: * work correctly. Once glibc is upgraded, rerun *" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: * configure and make to build with inlining. *" >&5 +$as_echo "$as_me: WARNING: * configure and make to build with inlining. *" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ********************************************************" >&5 +$as_echo "$as_me: WARNING: ********************************************************" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: " >&5 +$as_echo "$as_me: WARNING: " >&2;} + + +$as_echo "#define __NO_MATH_INLINES 1" >>confdefs.h + + fi;; +esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for termcap" >&5 +$as_echo_n "checking for termcap... " >&6; } +if test "x${HAVE_TERMCAP}" != "x"; then + FRONTEND_LDADD="-l${HAVE_TERMCAP} ${FRONTEND_LDADD}" + +$as_echo "#define HAVE_TERMCAP 1" >>confdefs.h + + TERMCAP_DEFAULT="yes" +else + TERMCAP_DEFAULT="no" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${TERMCAP_DEFAULT}" >&5 +$as_echo "${TERMCAP_DEFAULT}" >&6; } + + +WITH_VECTOR=no +case $host_cpu in +x86_64|amd64) + CPUTYPE="no" + if test $ac_cv_header_xmmintrin_h = yes ; then + WITH_XMM=yes + WITH_VECTOR=yes + fi + + +$as_echo "#define TAKEHIRO_IEEE754_HACK 1" >>confdefs.h + + +$as_echo "#define USE_FAST_LOG 1" >>confdefs.h + + ;; +*86) + CPUTYPE="i386" + if test $ac_cv_header_xmmintrin_h = yes ; then + WITH_XMM=yes + WITH_VECTOR=yes + fi + + # use internal knowledge of the IEEE 754 layout + +$as_echo "#define TAKEHIRO_IEEE754_HACK 1" >>confdefs.h + + +$as_echo "#define USE_FAST_LOG 1" >>confdefs.h + + ;; +powerpc) + CPUTYPE="no" + + # use internal knowledge of the IEEE 754 layout + +$as_echo "#define TAKEHIRO_IEEE754_HACK 1" >>confdefs.h + + + # The following should not get enabled on a G5. HOWTO check for a G5? + +$as_echo "#define USE_FAST_LOG 1" >>confdefs.h + + ;; +*) + CPUTYPE="no" + ;; +esac + +# which vector code do we support to build on this machine? + if test "x${WITH_XMM}" = "xyes"; then + WITH_XMM_TRUE= + WITH_XMM_FALSE='#' +else + WITH_XMM_TRUE='#' + WITH_XMM_FALSE= +fi + + +# needs to be defined to link in the internal vector lib + if test "x${WITH_VECTOR}" = "xyes"; then + WITH_VECTOR_TRUE= + WITH_VECTOR_FALSE='#' +else + WITH_VECTOR_TRUE='#' + WITH_VECTOR_FALSE= +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if I have to build the internal vector lib" >&5 +$as_echo_n "checking if I have to build the internal vector lib... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${WITH_VECTOR}" >&5 +$as_echo "${WITH_VECTOR}" >&6; } + + +# Extract the first word of "nasm", so it can be a program name with args. +set dummy nasm; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_NASM+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $NASM in + [\\/]* | ?:[\\/]*) + ac_cv_path_NASM="$NASM" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_NASM="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_NASM" && ac_cv_path_NASM="no" + ;; +esac +fi +NASM=$ac_cv_path_NASM +if test -n "$NASM"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NASM" >&5 +$as_echo "$NASM" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +case "${NASM}" in +no) + ;; +*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for assembler routines for this processor type" >&5 +$as_echo_n "checking for assembler routines for this processor type... " >&6; } + for recurse_over in ${ASM_FOR_ARCH} + do + if test "${CPUTYPE}" = "${recurse_over}"; then + include_asm_routines="yes" + fi + + case $host_os in + *darwin*) + # currently we have problems because of a wrong + # libtool hack in the darwin case (for nasm code) + include_asm_routines="no" + ;; + esac + done + if test "x${include_asm_routines}" = "xyes"; then + +$as_echo "#define HAVE_NASM 1" >>confdefs.h + + +$as_echo "#define MMX_choose_table 1" >>confdefs.h + + else + include_asm_routines="no" + NASM="no" + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${include_asm_routines}" >&5 +$as_echo "${include_asm_routines}" >&6; } + ;; +esac + if test "${NASM}" != "no"; then + HAVE_NASM_TRUE= + HAVE_NASM_FALSE='#' +else + HAVE_NASM_TRUE='#' + HAVE_NASM_FALSE= +fi + + +case $host_os in + *cygwin*|*mingw32*) + CYGWIN=yes + NASM_FORMAT="-f win32 -DWIN32" + ;; + *darwin*) + NASM_FORMAT="-f macho" + ;; + *) + CYGWIN=no + NASM_FORMAT="-f elf" + ;; +esac + +# +# 'expopt' is used for "additional optimizations", not for optimizations which +# are marked as "experimental" in the guide for the compiler. +# They are "experimental" here in the LAME project (at least +# "--enable-expopt=full"). +# +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for additional optimizations" >&5 +$as_echo_n "checking for additional optimizations... " >&6; } +# Check whether --enable-expopt was given. +if test "${enable_expopt+set}" = set; then : + enableval=$enable_expopt; CONFIG_EXPOPT="${enableval}" +else + CONFIG_EXPOPT="no" +fi + + +if test "x$HAVE_GCC" = "xyes" -o "x$HAVE_CLANG" = "xyes"; then + # gcc defaults. OS specific options go in versious sections below + # from the gcc man pages: "there is no reason to use -pedantic" + if test "x${with_gnu_ld}" = "xyes"; then + CFLAGS="-Wall -pipe ${CFLAGS}" + else + # some vendor ld's don't like '-pipe' + CFLAGS="-Wall ${CFLAGS}" + fi + + # GCC version specific generic options + if test "x${HAVE_GCC}" = "xyes"; then + case "${GCC_version}" in + 2.96*) + # for buggy version of gcc shipped with RH7.1, back of on some + # optimizations + OPTIMIZATION="-O -fomit-frame-pointer -ffast-math \ + -funroll-loops" + OPTIMIZATION_FULL="-fmove-all-movables -freduce-all-givs \ + -fsched-interblock -fbranch-count-reg -fforce-addr \ + -fforce-mem" + ;; + 3.0*) + # -funroll-loops seems to produce buggy code with gcc 3.0.3 + OPTIMIZATION="-O -fomit-frame-pointer -ffast-math" + OPTIMIZATION_FULL="-fmove-all-movables -freduce-all-givs \ + -fbranch-count-reg -fforce-addr -fforce-mem" + ;; + 3.*|4.0.*|4.1.*) + # -fomit-frame-pointer seems to be buggy on cygwin + case ${host_os} in + *cygwin*) + OMIT_FRAME_POINTER= + ;; + *) + OMIT_FRAME_POINTER=-fomit-frame-pointer + ;; + esac + + OPTIMIZATION="-O3 ${OMIT_FRAME_POINTER} -ffast-math" + OPTIMIZATION_FULL="-fmove-all-movables -freduce-all-givs \ + -fbranch-count-reg -fforce-addr -fforce-mem" + ;; + 456789.*) + OPTIMIZATION="-O3 -fomit-frame-pointer -ffast-math" + OPTIMIZATION_FULL="-fbranch-count-reg -fforce-addr" + ;; + *) + # default + OPTIMIZATION="-O3 ${OMIT_FRAME_POINTER} -ffast-math \ + -funroll-loops" + OPTIMIZATION_FULL="-fbranch-count-reg -fforce-addr" + ;; + esac + + # GCC version independend generic options + OPTIMIZATION_NORM="-fschedule-insns2" + fi + + + # generic CPU specific options + case ${host_cpu} in + sparc) + case "${GCC_version}" in + 3.0*) + ;; + 3456789.*) + # doesn't work on 3.0.x, but on 3.[12] and + # hopefully on every other release after that too + if test -x /usr/bin/isalist; then + /usr/bin/isalist | grep sparcv8plus \ + >/dev/null 2>&1 && \ + OPTIMIZATION="${OPTIMIZATION} \ + -mcpu=ultrasparc \ + -mtune=ultrasparc" + fi + ;; + esac + ;; + *86) + case "${GCC_version}" in + 3456789.*) + OPTIMIZATION="${OPTIMIZATION} \ + -maccumulate-outgoing-args" + ;; + esac + ;; + esac + + expopt_msg_result_printed=no + case "${CONFIG_EXPOPT}" in + no) + # if someone supplies own CFLAGS, we don't add our own + if test "x${ac_save_CFLAGS}" != "x"; then + OPTIMIZATION="" + fi + ;; + norm|yes) + OPTIMIZATION="${OPTIMIZATION} ${OPTIMIZATION_NORM}" + ;; + full) + OPTIMIZATION="${OPTIMIZATION} ${OPTIMIZATION_NORM} \ + ${OPTIMIZATION_FULL}" + + if test "${HAVE_GCC}" = "yes"; then + # some hardware dependend options + case "${GCC_version}" in + 2.9*|3.*|4.0.*|4.1.*) + # "new" GCC, use some "new" CPU specific optimizations + # use -mtune instead of -m486 or -mcpu= etc, since they are + # deprecated by GCC <rbrito> + case ${host_cpu} in + *486) + OPTIMIZATION="${OPTIMIZATION} -mcpu=i486 \ + -mfancy-math-387" + ;; + *586) + OPTIMIZATION="${OPTIMIZATION} -mcpu=pentium \ + -march=pentium -mfancy-math-387" + ;; + *686) + OPTIMIZATION="${OPTIMIZATION} -mcpu=pentiumpro \ + -march=pentiumpro -mfancy-math-387 \ + -malign-double" + ;; + *86) + OPTIMIZATION="${OPTIMIZATION} -mfancy-math-387" + ;; + alpha*) + OPTIMIZATION="${OPTIMIZATION} -mfp-regs" + +$as_echo "#define FLOAT double" >>confdefs.h + + # add "-mcpu=21164a -Wa,-m21164a" to optimize + # for 21164a (ev56) CPU + ;; + *) + OPTIMIZATION="${OPTIMIZATION} -fdelayed-branch" + ;; + esac + ;; + 456789.*) + case ${host_cpu} in + *486) + OPTIMIZATION="${OPTIMIZATION} -march=i486" + ;; + *586) + OPTIMIZATION="${OPTIMIZATION} -march=i586 \ + -mtune=native" + ;; + *686) + OPTIMIZATION="${OPTIMIZATION} -march=i686 \ + -mtune=native" + ;; + *86) + OPTIMIZATION="${OPTIMIZATION} -march=native \ + -mtune=native" + ;; + arm*-gnueabi) + if -z "$(echo ${GCC_version} | awk '/4\.0/')" ; then + # Work round buggy softfloat optimization in ARM EABI compilers + # -gnueabi in only gcc-4.1 onwards + OPTIMIZATION="${OPTIMIZATION} -fno-finite-math-only" + fi + ;; + esac + ;; + *) + # no special optimization for other versions + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + expopt_msg_result_printed=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: LAME doesn't know about your version (${GCC_version}) of gcc" >&5 +$as_echo "$as_me: WARNING: LAME doesn't know about your version (${GCC_version}) of gcc" >&2;} + ;; + esac + fi + ;; + *) + as_fn_error $? "bad value �${CONFIG_EXPOPT}� for expopt option" "$LINENO" 5 + ;; + esac + + + if test "x${HAVE_CLANG}" = "xyes"; then + case "${CLANG_VERSION}" in + 3.89*|45.*) + OPTIMIZATION="-Ofast" + ;; + *) + OPTIMIZATION="-O3" + ;; + esac + + # generic CPU specific options + case ${host_cpu} in + *486) + OPTIMIZATION="${OPTIMIZATION} -march=i486" + ;; + *586) + OPTIMIZATION="${OPTIMIZATION} -march=i586 \ + -mtune=native" + ;; + *686) + OPTIMIZATION="${OPTIMIZATION} -march=i686 \ + -mtune=native" + ;; + *86) + OPTIMIZATION="${OPTIMIZATION} -march=native \ + -mtune=native" + ;; + esac + + fi + + + if test "${expopt_msg_result_printed}" = "no" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${CONFIG_EXPOPT}" >&5 +$as_echo "${CONFIG_EXPOPT}" >&6; } + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for debug options" >&5 +$as_echo_n "checking for debug options... " >&6; } +# Check whether --enable-debug was given. +if test "${enable_debug+set}" = set; then : + enableval=$enable_debug; CONFIG_DEBUG="${enableval}" +else + CONFIG_DEBUG="no" +fi + + +if test "x$GCC" = "xyes"; then + DEBUG_NORM_OPT="-O -g -Wall" + DEBUG_ANOYING="-Wbad-function-cast -Wcast-align \ + -Wcast-qual -Wchar-subscripts -Wconversion \ + -Wmissing-prototypes -Wnested-externs -Wpointer-arith \ + -Wredundant-decls -Wshadow -Wstrict-prototypes \ + -Wwrite-strings -Winline \ + -Wformat -Wswitch -Waggregate-return -Wmissing-noreturn \ + -Wimplicit-int -fno-builtin" + + case "${CONFIG_DEBUG}" in + no) + ;; + norm|yes) + +$as_echo "#define ABORTFP 1" >>confdefs.h + + OPTIMIZATION="${DEBUG_NORM_OPT}" + ;; + anoying) + +$as_echo "#define ABORTFP 1" >>confdefs.h + + OPTIMIZATION="${DEBUG_NORM_OPT} ${DEBUG_ANOYING}" + ;; + alot) + +$as_echo "#define ABORTFP 1" >>confdefs.h + + +$as_echo "#define DEBUG 1" >>confdefs.h + + OPTIMIZATION="${DEBUG_NORM_OPT}" + ;; + *) + as_fn_error $? "bad value �${CONFIG_DEBUG}� for debug option" "$LINENO" 5 + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${CONFIG_DEBUG}" >&5 +$as_echo "${CONFIG_DEBUG}" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + +########################################################################## +# LINUX on Digital/Compaq Alpha CPUs +########################################################################## +case $host in +alpha*-*-linux*) + +################################################################ +#### Check if 'ccc' is in our path +################################################################ +if test "`which ccc 2>/dev/null | grep -c ccc`" != "0" ; then + # Compaq's C Compiler + CC=ccc + +################################################################ +#### set 'OPTIMIZATION = -arch host -tune host' +#### to generate/tune instructions for this machine +#### 'OPTIMIZATION += -migrate -fast -inline speed -unroll 0' +#### tweak to run as fast as possible :) +#### 'OPTIMIZATION += -w0' +#### set warning and linking flags +################################################################ + OPTIMIZATION="-arch host -tune host" + OPTIMIZATION="-migrate -fast -inline speed -unroll 0 $OPTIMIZATION" + OPTIMIZATION="-w0 $OPTIMIZATION" + + +################################################################ +#### to debug, uncomment +################################################################ + # For Debugging + #OPTIMIZATION="-g3 $OPTIMIZATION" + +################################################################ +#### define __DECALPHA__ (i was getting re-declaration warnings +#### in machine.h +################################################################ + # Define DEC Alpha + +$as_echo "#define __DECALPHA__ 1" >>confdefs.h + +fi # gcc or ccc? +;; # alpha + + +########################################################################## +# SunOS +########################################################################## +sparc-*-sunos4*) + if test CC = "cc"; then + OPTIMIZATION="-O -xCC" + MAKEDEP="-xM" + # for gcc, use instead: + # CC="gcc" + # OPTIMIZATION="-O" + # MAKEDEP="-M" +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Please contact lame@lists.sourceforge.net with the output of the configure run and the file config.cache. Thank you for your cooperation." >&5 +$as_echo "$as_me: WARNING: Please contact lame@lists.sourceforge.net with the output of the configure run and the file config.cache. Thank you for your cooperation." >&2;} + fi +;; #SunOS + +########################################################################## +# SGI +########################################################################## +*-sgi-irix*) + if test CC = "cc"; then + OPTIMIZATION="-O3 -woff all" + fi +;; # SGI + +########################################################################## +# Compaq Alpha running Dec Unix (OSF) +########################################################################## +alpha*-dec-osf*) + if test CC = "cc"; then + OPTIMIZATION="-fast -O3 -std -g3 -non_shared" + fi +;; #OSF +esac + +# todo: include the following tests in the case-list +UNAME=`uname` +ARCH=`uname -m` + +########################################################################### +# MOSXS (Rhapsody PPC) +########################################################################### +if test "$UNAME" = "Rhapsody"; then +# CC="cc" # should be handled already by autoconf + MAKEDEP="-make" +fi + +########################################################################### +# MAC OSX Darwin PPC +########################################################################### +if test "$UNAME" = "Darwin"; then + MAKEDEP="-make" + CFLAGS="$CFLAGS -fno-common" +fi + + +########################################################################## +# OS/2 +########################################################################## +# Properly installed EMX runtime & development package is a prerequisite. +# tools I used: make 3.76.1, uname 1.12, sed 2.05, PD-ksh 5.2.13 +# +########################################################################## +if test "$UNAME" = "OS/2"; then + SHELL=sh + #CC=gcc # should already be handled by configure + + # file extension should already be handled by automake (I don't know, + # please give feedback! + #FILE_EXTENSION=".exe" + +# Uncomment & inspect the GTK lines to use MP3x GTK frame analyzer. +# Properly installed XFree86/devlibs & GTK+ is a prerequisite. +# The following works for me using Xfree86/OS2 3.3.5 and GTK+ 1.2.3: +# AC_DEFINE(HAVE_GTK, 1, have GTK) +# AC_DEFINE(__ST_MT_ERRNO__, 1) +# INCLUDES="-IC:/XFree86/include/gtk12 -IC:/XFree86/include/glib12 \ +# -IC:/XFree86/include $INCLUDES" +# FRONTEND_LDFLAGS="-LC:/XFree86/lib -lgtk12 -lgdk12 -lgmodule -lglib12 \ +# -lXext -lX11 -lshm -lbsd -lsocket -lm $FRONTEND_LDFLAGS" +# FRONTEND_CFLAGS="-Zmtd -Zsysv-signals -Zbin-files $FRONTEND_CFLAGS" +fi + +########################################################################### +# AmigaOS +########################################################################### +# Type 'Make ARCH=PPC' for PowerUP and 'Make ARCH=WOS' for WarpOS +# +########################################################################### +if test "$UNAME" = "AmigaOS" ; then + CC="gcc -noixemul" + OPTIMIZATION="$OPTIMIZATION -m68020-60 -m68881" + MAKEDEP="-MM" + if test "$ARCH" = "WOS"; then + CC="ppc-amigaos-gcc -warpup" + OPTIMIZATION="$OPTIMIZATION -mmultiple -mcpu=603e" + AR="ppc-amigaos-ar" + RANLIB="ppc-amigaos-ranlib" + fi + if test "$ARCH",PPC; then + CC="ppc-amigaos-gcc" + OPTIMIZATION="$OPTIMIZATION -mmultiple -mcpu=603e" + AR="ppc-amigaos-ar" + RANLIB="ppc-amigaos-ranlib" + fi +fi + + +CFLAGS="${OPTIMIZATION} ${CFLAGS}" +LDADD="${LDADD}" +FRONTEND_CFLAGS="${INCICONV} ${FRONTEND_CFLAGS}" +FRONTEND_LDADD="${FRONTEND_LDADD} ${LTLIBICONV} ${CONFIG_MATH_LIB}" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ac_config_files="$ac_config_files Makefile libmp3lame/Makefile libmp3lame/i386/Makefile libmp3lame/vector/Makefile frontend/Makefile mpglib/Makefile doc/Makefile doc/html/Makefile doc/man/Makefile include/Makefile Dll/Makefile misc/Makefile dshow/Makefile ACM/Makefile ACM/ADbg/Makefile ACM/ddk/Makefile ACM/tinyxml/Makefile lame.spec mac/Makefile macosx/Makefile macosx/English.lproj/Makefile macosx/LAME.xcodeproj/Makefile vc_solution/Makefile" + + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +$as_echo_n "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +$as_echo "done" >&6; } + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then + as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +if test -z "${LIB_WITH_DECODER_TRUE}" && test -z "${LIB_WITH_DECODER_FALSE}"; then + as_fn_error $? "conditional \"LIB_WITH_DECODER\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WITH_XMM_TRUE}" && test -z "${WITH_XMM_FALSE}"; then + as_fn_error $? "conditional \"WITH_XMM\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WITH_VECTOR_TRUE}" && test -z "${WITH_VECTOR_FALSE}"; then + as_fn_error $? "conditional \"WITH_VECTOR\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_NASM_TRUE}" && test -z "${HAVE_NASM_FALSE}"; then + as_fn_error $? "conditional \"HAVE_NASM\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by lame $as_me 3.100, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to <lame-dev@lists.sf.net>." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +lame config.status 3.100 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' +macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' +enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' +enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' +pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' +shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' +SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' +ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' +PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' +host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' +host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' +host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' +build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' +build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' +build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' +SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' +Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' +GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' +EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' +FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' +LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' +NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' +LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' +ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' +exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' +lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' +lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' +lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' +reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' +file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' +want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' +DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' +sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' +AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' +archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' +STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' +RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' +lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' +CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' +compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' +GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' +lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`' +nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' +lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' +lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`' +objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' +need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' +MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' +LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' +OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' +libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' +module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' +postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' +need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' +version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' +runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' +libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' +soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' +install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' +finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' +configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' +configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' +old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' +striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in SHELL \ +ECHO \ +PATH_SEPARATOR \ +SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +OBJDUMP \ +deplibs_check_method \ +file_magic_cmd \ +file_magic_glob \ +want_nocaseglob \ +DLLTOOL \ +sharedlib_from_linklib_cmd \ +AR \ +AR_FLAGS \ +archiver_list_spec \ +STRIP \ +RANLIB \ +CC \ +CFLAGS \ +compiler \ +lt_cv_sys_global_symbol_pipe \ +lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_import \ +lt_cv_sys_global_symbol_to_c_name_address \ +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +lt_cv_nm_interface \ +nm_file_list_spec \ +lt_cv_truncate_bin \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_pic \ +lt_prog_compiler_wl \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +MANIFEST_TOOL \ +DSYMUTIL \ +NMEDIT \ +LIPO \ +OTOOL \ +OTOOL64 \ +shrext_cmds \ +export_dynamic_flag_spec \ +whole_archive_flag_spec \ +compiler_needs_object \ +with_gnu_ld \ +allow_undefined_flag \ +no_undefined_flag \ +hardcode_libdir_flag_spec \ +hardcode_libdir_separator \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +install_override_mode \ +finish_eval \ +old_striplib \ +striplib; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds \ +old_postinstall_cmds \ +old_postuninstall_cmds \ +old_archive_cmds \ +extract_expsyms_cmds \ +old_archive_from_new_cmds \ +old_archive_from_expsyms_cmds \ +archive_cmds \ +archive_expsym_cmds \ +module_cmds \ +module_expsym_cmds \ +export_symbols_cmds \ +prelink_cmds \ +postlink_cmds \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +configure_time_dlsearch_path \ +configure_time_lt_sys_library_path; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +ac_aux_dir='$ac_aux_dir' + +# See if we are running on zsh, and set the options that allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='$PACKAGE' + VERSION='$VERSION' + RM='$RM' + ofile='$ofile' + + + + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "libmp3lame/Makefile") CONFIG_FILES="$CONFIG_FILES libmp3lame/Makefile" ;; + "libmp3lame/i386/Makefile") CONFIG_FILES="$CONFIG_FILES libmp3lame/i386/Makefile" ;; + "libmp3lame/vector/Makefile") CONFIG_FILES="$CONFIG_FILES libmp3lame/vector/Makefile" ;; + "frontend/Makefile") CONFIG_FILES="$CONFIG_FILES frontend/Makefile" ;; + "mpglib/Makefile") CONFIG_FILES="$CONFIG_FILES mpglib/Makefile" ;; + "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; + "doc/html/Makefile") CONFIG_FILES="$CONFIG_FILES doc/html/Makefile" ;; + "doc/man/Makefile") CONFIG_FILES="$CONFIG_FILES doc/man/Makefile" ;; + "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;; + "Dll/Makefile") CONFIG_FILES="$CONFIG_FILES Dll/Makefile" ;; + "misc/Makefile") CONFIG_FILES="$CONFIG_FILES misc/Makefile" ;; + "dshow/Makefile") CONFIG_FILES="$CONFIG_FILES dshow/Makefile" ;; + "ACM/Makefile") CONFIG_FILES="$CONFIG_FILES ACM/Makefile" ;; + "ACM/ADbg/Makefile") CONFIG_FILES="$CONFIG_FILES ACM/ADbg/Makefile" ;; + "ACM/ddk/Makefile") CONFIG_FILES="$CONFIG_FILES ACM/ddk/Makefile" ;; + "ACM/tinyxml/Makefile") CONFIG_FILES="$CONFIG_FILES ACM/tinyxml/Makefile" ;; + "lame.spec") CONFIG_FILES="$CONFIG_FILES lame.spec" ;; + "mac/Makefile") CONFIG_FILES="$CONFIG_FILES mac/Makefile" ;; + "macosx/Makefile") CONFIG_FILES="$CONFIG_FILES macosx/Makefile" ;; + "macosx/English.lproj/Makefile") CONFIG_FILES="$CONFIG_FILES macosx/English.lproj/Makefile" ;; + "macosx/LAME.xcodeproj/Makefile") CONFIG_FILES="$CONFIG_FILES macosx/LAME.xcodeproj/Makefile" ;; + "vc_solution/Makefile") CONFIG_FILES="$CONFIG_FILES vc_solution/Makefile" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' <conf$$subs.awk | sed ' +/^[^""]/{ + N + s/\n// +} +' >>$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' <confdefs.h | sed ' +s/'"$ac_delim"'/"\\\ +"/g' >>$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "$am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + "libtool":C) + + # See if we are running on zsh, and set the options that allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST + fi + + cfgfile=${ofile}T + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL +# Generated automatically by $as_me ($PACKAGE) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +# Copyright (C) 2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool 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 2 of of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. +# +# GNU Libtool 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 this program. If not, see <http://www.gnu.org/licenses/>. + + +# The names of the tagged configurations supported by this script. +available_tags='' + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + +# ### BEGIN LIBTOOL CONFIG + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# Shared archive member basename,for filename based shared library versioning on AIX. +shared_archive_member_spec=$shared_archive_member_spec + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + +# The PATH separator for the build system. +PATH_SEPARATOR=$lt_PATH_SEPARATOR + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="\$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# convert \$build file names to \$host format. +to_host_file_cmd=$lt_cv_to_host_file_cmd + +# convert \$build files to toolchain format. +to_tool_file_cmd=$lt_cv_to_tool_file_cmd + +# An object symbol dumper. +OBJDUMP=$lt_OBJDUMP + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd=$lt_file_magic_cmd + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob=$lt_file_magic_glob + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob=$lt_want_nocaseglob + +# DLL creation program. +DLLTOOL=$lt_DLLTOOL + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd + +# The archiver. +AR=$lt_AR + +# Flags to create an archive. +AR_FLAGS=$lt_AR_FLAGS + +# How to feed a file listing to the archiver. +archiver_list_spec=$lt_archiver_list_spec + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=$lock_old_archive_extraction + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm into a list of symbols to manually relocate. +global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# The name lister interface. +nm_interface=$lt_lt_cv_nm_interface + +# Specify filename containing input files for \$NM. +nm_file_list_spec=$lt_nm_file_list_spec + +# The root where to search for dependent libraries,and where our libraries should be installed. +lt_sysroot=$lt_sysroot + +# Command to truncate a binary pipe. +lt_truncate_bin=$lt_lt_cv_truncate_bin + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Manifest tool. +MANIFEST_TOOL=$lt_MANIFEST_TOOL + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# Do we need the "lib" prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Permission mode override for installation of shared libraries. +install_override_mode=$lt_install_override_mode + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Compile-time system search path for libraries. +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Detected run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path + +# Explicit LT_SYS_LIBRARY_PATH set during ./configure time. +configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + + +# The linker used to build libraries. +LD=$lt_LD + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \$shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# ### END LIBTOOL CONFIG + +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + +ltmain=$ac_aux_dir/ltmain.sh + + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/configure.in b/configure.in new file mode 100644 index 0000000..3f9fddb --- /dev/null +++ b/configure.in @@ -0,0 +1,1265 @@ +dnl $Id: configure.in,v 1.148 2017/08/15 15:16:31 aleidinger Exp $ +dnl +dnl +dnl don't forget to set ASM_FOR_ARCH to a space delimited list of +dnl processor architectures, for which assembler routines exist +dnl +dnl +dnl Exported and configured variables: +dnl CC +dnl CFLAGS +dnl LDFLAGS +dnl LDADD +dnl NASM + +dnl extra vars for frontend: +dnl FRONTEND_LDFLAGS +dnl FRONTEND_CFLAGS +dnl FRONTEND_LDADD + +AC_PREREQ(2.69) +AC_INIT([lame],[3.100],[lame-dev@lists.sf.net]) +AC_CONFIG_SRCDIR([libmp3lame/lame.c]) +AC_LANG([C]) + +dnl check system +AC_CANONICAL_HOST + +dnl automake +AM_INIT_AUTOMAKE +AC_CONFIG_HEADERS([config.h]) +AH_TOP([ +#ifndef LAME_CONFIG_H +#define LAME_CONFIG_H +]) +AH_BOTTOM([#endif /* LAME_CONFIG_H */]) +AM_MAINTAINER_MODE +AM_MAKE_INCLUDE + +dnl check environment +AC_AIX +AC_ISC_POSIX +AC_MINIX +case $host_os in + *cygwin* ) CYGWIN=yes;; + * ) CYGWIN=no;; +esac + +dnl libtool +# AC_DISABLE_SHARED +AC_PROG_LIBTOOL +AC_SUBST(LIBTOOL_DEPS) +CFLAGS="${ac_save_CFLAGS}" + +# increase this when the shared lib becomes totally incompatible +LIB_MAJOR_VERSION=0 + +# increase this when changes are made, but they are upward compatible +# to previous versions +LIB_MINOR_VERSION=0 + +dnl # work around for a bug, don't know where it is exactly +if test "${ac_cv_cygwin}" = "yes"; then + if test "${CC}" != "gcc"; then + AC_MSG_ERROR([Please use] + [ CC=gcc ./configure] + [Abort this configure run and add "CC=gcc" or you will] + [see errors and no lame.exe will be build.]) + fi +fi + +dnl check programs +AC_PROG_CC() + +if test "x${GCC}" = "xyes"; then + AC_MSG_CHECKING(compiler) + COMPILER_TYPE="`${CC} --version | head -1 | sed -e '1,$s/version.*//g'`" + case "${COMPILER_TYPE}" in + *gcc*) + AC_MSG_RESULT(gcc) + HAVE_GCC=yes + HAVE_CLANG=no + ;; + *clang*) + AC_MSG_RESULT(clang) + HAVE_CLANG=yes + HAVE_GCC=no + ;; + *) + AC_MSG_RESULT(unknown) + HAVE_GCC=no + HAVE_CLANG=no + ;; + esac + + if test "${HAVE_GCC}" = "yes"; then + AC_MSG_CHECKING(version of GCC) + GCC_version="`${CC} --version | sed -n '1s/^[[^ ]]* (.*) //;s/ .*$//;1p'`" + case "${GCC_version}" in + [0-9]*[0-9]*) + AC_MSG_RESULT(${GCC_version}) + ;; + *) + # probably not gcc... + AC_MSG_RESULT(unknown compiler version pattern, playing safe and disabling gcc optimisations... ${GCC_version}) + HAVE_GCC=no + ;; + esac + fi + + if test "${HAVE_CLANG}" = "yes"; then + AC_MSG_CHECKING(version of clang) + CLANG_version="`${CC} --version | sed -n 's/.*clang version //;s/ .*$//;1p'`" + AC_MSG_RESULT(${CLANG_version}) + fi +fi + + + +AC_CHECK_HEADER(dmalloc.h) +if test "${ac_cv_header_dmalloc_h}" = "yes"; then + AM_WITH_DMALLOC +fi + +dnl Checks for header files. +AC_HEADER_STDC +AC_CHECK_HEADERS( \ + errno.h \ + fcntl.h \ + limits.h \ + stdint.h \ + string.h \ + sys/soundcard.h \ + sys/time.h \ + unistd.h \ + linux/soundcard.h) + +dnl Checks for actually working SSE intrinsics +AC_MSG_CHECKING(working SSE intrinsics) +AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[#include <xmmintrin.h>]], + [[_mm_sfence();]])], + [AC_DEFINE([HAVE_XMMINTRIN_H], [1], [Define if SSE intrinsics work.]) + ac_cv_header_xmmintrin_h=yes], + [ac_cv_header_xmmintrin_h=no]) +AC_MSG_RESULT(${ac_cv_header_xmmintrin_h}) + +dnl Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST +AC_C_INLINE +if test ${cross_compiling} = "no"; then + AC_C_BIGENDIAN +fi + +AC_SYS_LARGEFILE + +AC_CHECK_SIZEOF(short) +AC_CHECK_SIZEOF(unsigned short) +AC_CHECK_SIZEOF(int) +AC_CHECK_SIZEOF(unsigned int) +AC_CHECK_SIZEOF(long) +AC_CHECK_SIZEOF(unsigned long) +AC_CHECK_SIZEOF(long long) +AC_CHECK_SIZEOF(unsigned long long) +AC_CHECK_SIZEOF(float) +AC_CHECK_SIZEOF(double) + +if test $ac_cv_sizeof_short -eq 0 \ + -o $ac_cv_sizeof_unsigned_short -eq 0 \ + -o $ac_cv_sizeof_int -eq 0 \ + -o $ac_cv_sizeof_unsigned_int -eq 0 \ + -o $ac_cv_sizeof_long -eq 0 \ + -o $ac_cv_sizeof_unsigned_long -eq 0 \ + -o $ac_cv_sizeof_long_long -eq 0 \ + -o $ac_cv_sizeof_unsigned_long_long -eq 0 \ + -o $ac_cv_sizeof_float -eq 0 \ + -o $ac_cv_sizeof_double -eq 0; then + echo '*** I have a problem determining the size of some variable types. Either' + echo '*** you compiler is broken, or your system+compiler combination is not' + echo '*** supportet by the "autoconf" framework we use to generate this' + echo '*** configure script.' + exit 1 +fi + +AC_C_LONG_DOUBLE +if test "${ac_cv_c_have_long_double}" = "yes" ; then + AC_CHECK_SIZEOF(long double) +fi + +AC_CHECK_TYPES([uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t]) + +AH_VERBATIM([HAVE_UINT8_T], +[/* add uint8_t type */ +#undef HAVE_UINT8_T +#ifndef HAVE_UINT8_T + typedef unsigned char uint8_t; +#endif]) + +AH_VERBATIM([HAVE_INT8_T], +[/* add int8_t type */ +#undef HAVE_INT8_T +#ifndef HAVE_INT8_T + typedef char int8_t; +#endif]) + +AH_VERBATIM([HAVE_UINT16_T], +[/* add uint16_t type */ +#undef HAVE_UINT16_T +#ifndef HAVE_UINT16_T + typedef unsigned short uint16_t; +#endif]) + +AH_VERBATIM([HAVE_INT16_T], +[/* add int16_t type */ +#undef HAVE_INT16_T +#ifndef HAVE_INT16_T + typedef short int16_t; +#endif]) + +if test "${HAVE_INT32_T}" = yes; then + AC_DEFINE(A_UINT32_T,unsigned int32_t) +else + if test "${ac_cv_sizeof_unsigned_short}" = "4"; then + AC_DEFINE(A_UINT32_T,unsigned short) + else + if test "${ac_cv_sizeof_unsigned_int}" = "4"; then + AC_DEFINE(A_UINT32_T,unsigned int) + else + if test "${ac_cv_sizeof_unsigned_long}" = "4"; then + AC_DEFINE(A_UINT32_T,unsigned long) + else + AC_MSG_ERROR([CHECK_TYPE_uint32_t - please report to lame-dev@lists.sourceforge.net]) + fi + fi + fi +fi + +AH_VERBATIM([HAVE_UINT32_T], +[/* add uint32_t type */ +#undef HAVE_UINT32_T +#ifndef HAVE_UINT32_T +#undef A_UINT32_T + typedef A_UINT32_T uint32_t; +#endif]) + +if test "${ac_cv_sizeof_short}" = "4"; then + AC_DEFINE(A_INT32_T,short) +else + if test "${ac_cv_sizeof_int}" = "4"; then + AC_DEFINE(A_INT32_T,int) + else + if test "${ac_cv_sizeof_long}" = "4"; then + AC_DEFINE(A_INT32_T,long) + else + AC_MSG_ERROR([CHECK_TYPE_int32_t - please report to lame-dev@lists.sourceforge.net]) + fi + fi +fi + +AH_VERBATIM([HAVE_INT32_T], +[/* add int32_t type */ +#undef HAVE_INT32_T +#ifndef HAVE_INT32_T +#undef A_INT32_T + typedef A_INT32_T int32_t; +#endif]) + +if test "${HAVE_INT64_T}" = yes; then + AC_DEFINE(A_UINT64_T,unsigned int64_t) +else + if test "${ac_cv_sizeof_unsigned_int}" = "8"; then + AC_DEFINE(A_UINT64_T,unsigned int) + else + if test "${ac_cv_sizeof_unsigned_long}" = "8"; then + AC_DEFINE(A_UINT64_T,unsigned long) + else + if test "${ac_cv_sizeof_unsigned_long_long}" = "8"; then + AC_DEFINE(A_UINT64_T,unsigned long long) + else + AC_MSG_ERROR([CHECK_TYPE_uint64_t - please report to lame-dev@lists.sourceforge.net]) + fi + fi + fi +fi + +AH_VERBATIM([HAVE_UINT64_T], +[/* add uint64_t type */ +#undef HAVE_UINT64_T +#ifndef HAVE_UINT64_T +#undef A_UINT64_T + typedef A_UINT64_T uint64_t; +#endif]) + +if test "${ac_cv_sizeof_int}" = "8"; then + AC_DEFINE(A_INT64_T,int) +else + if test "${ac_cv_sizeof_long}" = "8"; then + AC_DEFINE(A_INT64_T,long) + else + if test "${ac_cv_sizeof_long_long}" = "8"; then + AC_DEFINE(A_INT64_T,long long) + else + AC_MSG_ERROR([CHECK_TYPE_int64_t - please report to lame-dev@lists.sourceforge.net]) + fi + fi +fi + +AH_VERBATIM([HAVE_INT64_T], +[/* add int64_t type */ +#undef HAVE_INT64_T +#ifndef HAVE_INT64_T +#undef A_INT64_T + typedef A_INT64_T int64_t; +#endif]) + +alex_IEEE854_FLOAT80 +if test "${alex_cv_ieee854_float80}" = "yes" ; then + if test "${ac_cv_c_long_double}" = "yes" ; then + AC_CHECK_TYPES(ieee854_float80_t, long double) + AH_VERBATIM([HAVE_IEEE854_FLOAT80_T], +[/* add ieee854_float80_t type */ +#undef HAVE_IEEE854_FLOAT80_T +#ifndef HAVE_IEEE854_FLOAT80_T + typedef long double ieee854_float80_t; +#endif]) + + AC_DEFINE(HAVE_IEEE854_FLOAT80, 1, [system has 80 bit floats]) + fi +fi +AC_CHECK_TYPES([ieee754_float64_t, ieee754_float32_t]) + +AH_VERBATIM([HAVE_IEEE754_FLOAT64_T], +[/* add ieee754_float64_t type */ +#undef HAVE_IEEE754_FLOAT64_T +#ifndef HAVE_IEEE754_FLOAT64_T + typedef double ieee754_float64_t; +#endif]) + +AH_VERBATIM([HAVE_IEEE754_FLOAT32_T], +[/* add ieee754_float32_t type */ +#undef HAVE_IEEE754_FLOAT32_T +#ifndef HAVE_IEEE754_FLOAT32_T + typedef float ieee754_float32_t; +#endif]) + +AC_DEFINE(LAME_LIBRARY_BUILD, 1, [requested by Frank, seems to be temporary needed for a smooth transition]) + + +if test ${cross_compiling} = "yes"; then + AC_MSG_WARN([] + [**************************************************************************] + [* *] + [* You are cross compiling: *] + [* - I did not have a change to determine *] + [* + the size of: *] + [* - short *] + [* - unsigned short *] + [* - int *] + [* - unsigned int *] + [* - long *] + [* - unsigned long *] + [* - float *] + [* - double *] + [* - long double *] + [* + the endianess of the system *] + [* - You have to provide appropriate defines for them in config.h, e.g. *] + [* + define SIZEOF_SHORT to 2 if the size of a short is 2 *] + [* + define WORDS_BIGENDIAN if your system is a big endian system *] + [* *] + [**************************************************************************]) +fi + +AC_TYPE_SIZE_T +AC_HEADER_TIME + +dnl Checks for library functions. +AC_FUNC_ALLOCA +AC_CHECK_FUNCS(gettimeofday strtol) + +if test "X${ac_cv_func_strtol}" != "Xyes"; then + AC_MSG_ERROR([function strtol is mandatory]) +fi + +dnl Check if we are on a mingw system, which needs libwsock32 +SOCKETFUNCTION=unknown +AC_CHECK_FUNCS(socket) +if test $ac_cv_func_socket = no; then + # maybe it is in libsocket + AC_CHECK_LIB(socket, socket, [AC_DEFINE(HAVE_SOCKET) + LIBS="$LIBS -lsocket"]) + if test "X${ac_cv_lib_socket_socket}" != "Xyes"; then + SOCKETFUNCTION=NO + else + case ${host_os} in + *solaris*) + LIBS="$LIBS -lnsl" + ;; + esac + fi +fi + +dnl Initialize configuration variables for the Makefile +CFLAGS=${CFLAGS} +CONFIG_DEFS=${CONFIG_DEFS} +NASM= +INCLUDES="-I\$(top_srcdir)/include -I\$(srcdir)" +FRONTEND_LDFLAGS= +FRONTEND_CFLAGS= +LIB_SOURCES= +MAKEDEP="-M" +RM_F="rm -f" + +AC_ARG_ENABLE(nasm, + [ --enable-nasm Allow the use of nasm if available], + ASM_FOR_ARCH="i386", ASM_FOR_ARCH="") + +dnl Checks for libraries. + +AC_CHECK_HEADERS(termcap.h) +AC_CHECK_HEADERS(ncurses/termcap.h) +AC_CHECK_LIB(termcap, initscr, HAVE_TERMCAP="termcap") +AC_CHECK_LIB(curses, initscr, HAVE_TERMCAP="curses") +AC_CHECK_LIB(ncurses, initscr, HAVE_TERMCAP="ncurses") + +AM_ICONV + +dnl math lib +AC_CHECK_LIB(m, cos, USE_LIBM="-lm") +dnl free fast math library +AC_CHECK_LIB(ffm, cos, USE_LIBM="-lffm -lm") +dnl Compaq fast math library. +AC_ARG_ENABLE(cpml, + [ --disable-cpml Do not use Compaq's fast Math Library], + CONFIG_CPML="no", CONFIG_CPML="yes") +if test "${CONFIG_CPML}" = yes; then + AC_CHECK_LIB(cpml, cos, USE_LIBM="-lcpml") +fi +CONFIG_MATH_LIB="${USE_LIBM}" + +dnl configure use of features + +AM_PATH_GTK(1.2.0, HAVE_GTK="yes", HAVE_GTK="no") + +dnl ElectricFence malloc debugging +AC_MSG_CHECKING(use of ElectricFence malloc debugging) +AC_ARG_ENABLE(efence, + [ --enable-efence Use ElectricFence for malloc debugging], + CONFIG_EFENCE="${enableval}", CONFIG_EFENCE="no") + +case "${CONFIG_EFENCE}" in +yes) + AC_CHECK_LIB(efence, EF_Print, HAVE_EFENCE="-lefence") + if test "x${HAVE_EFENCE}" != "x-lefence"; then + AC_MSG_RESULT(yes, but libefence not found) + else + LDADD="${LDADD} ${HAVE_EFENCE}" + AC_DEFINE(HAVE_EFENCE, 1, we link against libefence) + AC_MSG_RESULT(${CONFIG_EFENCE}) + fi + ;; +no) + AC_MSG_RESULT(${CONFIG_EFENCE}) + ;; +*) + AC_MSG_ERROR(bad value �${CONFIG_EFENCE}� for efence option) + ;; +esac + + +dnl libsndfile +WARNING= +AC_ARG_WITH(fileio, + [ --with-fileio=lame Use lame's internal file io routines [default]] + [ =sndfile Use Erik de Castro Lopo's libsndfile] + [ (no stdin possible currently)], + CONFIG_FILEIO="${withval}", CONFIG_FILEIO="lame") + +if test "${CONFIG_FILEIO}" = "sndfile" ; then + PKG_CHECK_MODULES(SNDFILE, sndfile >= 1.0.2, HAVE_SNDFILE="yes", HAVE_SNDFILE="no") +fi + +AC_MSG_CHECKING(use of file io) + +if test "${CONFIG_FILEIO}" = "sndfile" ; then + if test "${HAVE_SNDFILE}" = "yes" -o "x${SNDFILE_LIBS}" != "x" \ + -o "x${SNDFILE_CFLAGS}" != "x"; then + SNDFILE_LIBS=`echo ${SNDFILE_LIBS}` + SNDFILE_CFLAGS=`echo ${SNDFILE_CFLAGS}` + + if test -n "${SNDFILE_LIBS}" ; then + FRONTEND_LDFLAGS="${SNDFILE_LIBS} ${FRONTEND_LDFLAGS}" + fi + FRONTEND_LDADD="-lsndfile ${FRONTEND_LDADD}" + + if test -n "${SNDFILE_CFLAGS}" ; then + INCLUDES="${SNDFILE_CFLAGS} ${INCLUDES}" + fi + + AC_DEFINE(LIBSNDFILE, 1, set to 1 if you have libsndfile) + else + # default + CONFIG_FILEIO="lame" + WARNING="${WARNING} Could not find any sndfile lib on system." + fi +else + CONFIG_FILEIO="lame" +fi +AC_MSG_RESULT(${CONFIG_FILEIO}) +if test "x${WARNING}" != "x" ; then + AC_MSG_WARN($WARNING) +fi + + +dnl check if we should remove hooks for analyzer code in library +dnl default library must include these hooks +AC_MSG_CHECKING(use of analyzer hooks) +AC_ARG_ENABLE(analyzer-hooks, + [ --disable-analyzer-hooks Exclude analyzer hooks], + CONFIG_ANALYZER="${enableval}", CONFIG_ANALYZER="yes") + +case "${CONFIG_ANALYZER}" in +yes) + ;; +no) + AC_DEFINE(NOANALYSIS, 1, build without hooks for analyzer) + ;; +*) + AC_MSG_ERROR(bad value �${CONFIG_ANALYZER}� for analyzer-hooks option) + ;; +esac +AC_MSG_RESULT($CONFIG_ANALYZER) + + +dnl mpg123 decoder +AC_MSG_CHECKING(use of mpg123 decoder) +AC_ARG_ENABLE(decoder, + [ --disable-decoder Exclude mpg123 decoder], + CONFIG_DECODER="${enableval}", CONFIG_DECODER="yes") + +AM_CONDITIONAL(LIB_WITH_DECODER, test "x${CONFIG_DECODER}" = "xyes") + +if test "${CONFIG_DECODER}" != "no" ; then + CONFIG_DECODER="yes (Layer 1, 2, 3)" + AC_DEFINE(HAVE_MPGLIB, 1, build with mpglib support) + AC_DEFINE(DECODE_ON_THE_FLY, 1, allow to compute a more accurate replaygain value) +fi +AC_MSG_RESULT($CONFIG_DECODER) + + +AC_MSG_CHECKING(if the lame frontend should be build) +AC_ARG_ENABLE(frontend, + [ --disable-frontend Do not build the lame executable [default=build]], + WITH_FRONTEND="${enableval}", WITH_FRONTEND=yes) +if test "x${WITH_FRONTEND}" = "xyes"; then + WITH_FRONTEND=lame${ac_exeext} + AC_MSG_RESULT(yes) +else + WITH_FRONTEND= + AC_MSG_RESULT(no) +fi + + + +AC_MSG_CHECKING(if mp3x is requested) +AC_ARG_ENABLE(mp3x, + [ --enable-mp3x Build GTK frame analyzer [default=no]], + WITH_MP3X="${enableval}", WITH_MP3X=no) +if test "x${WITH_MP3X}" = "xyes"; then + WITH_MP3X=mp3x${ac_exeext} + AC_MSG_RESULT(yes) +else + WITH_MP3X= + AC_MSG_RESULT(no) +fi + +if test "${HAVE_GTK}" = "no"; then + if test "x${WITH_MP3X}" = "xmp3x"; then + AC_MSG_WARN(can't build mp3x, no GTK installed) + WITH_MP3X= + fi + if test "x${CONFIG_ANALYZER}" != "xyes"; then + AC_MSG_WARN(can't build mp3x because of disabled analyzer hooks) + WITH_MP3X= + fi +fi + +AC_MSG_CHECKING(if mp3rtp is requested) +AC_ARG_ENABLE(mp3rtp, + [ --enable-mp3rtp Build mp3rtp [default=no]], + WITH_MP3RTP="${enableval}", WITH_MP3RTP=no) +if test "x${WITH_MP3RTP}" = "xyes"; then + if test ${SOCKETFUNCTION} = NO; then + AC_MSG_ERROR([function socket is mandatory for mp3rtp]) + fi + WITH_MP3RTP=mp3rtp${ac_exeext} + AC_MSG_RESULT(yes) +else + WITH_MP3RTP= + AC_MSG_RESULT(no) +fi + +AC_MSG_CHECKING(if dynamic linking of the frontends is requested) +AC_ARG_ENABLE(dynamic-frontends, + [ --enable-dynamic-frontends Link frontends against shared libraries [default=no]], + FRONTEND_LDFLAGS="${FRONTEND_LDFLAGS}", FRONTEND_LDFLAGS="${FRONTEND_LDFLAGS} -static") +case "x${FRONTEND_LDFLAGS}" in +*-static*) + AC_MSG_RESULT(no) + ;; +*) + AC_MSG_RESULT(yes) + ;; +esac + + +# +# this is from vorbis +# +dnl check GLIBC +case $host in +*86-*-linux*) + # glibc < 2.1.3 has a serious FP bug in the math inline header + # that will cripple Vorbis. Look to see if the magic FP stack + # clobber is missing in the mathinline header, thus indicating + # the buggy version + + AC_EGREP_CPP(log10.*fldlg2.*fxch,[ + #define __LIBC_INTERNAL_MATH_INLINES 1 + #define __OPTIMIZE__ + #include <math.h> + ],bad=maybe,bad=no) + + AC_MSG_CHECKING(glibc mathinline bug) + if test ${bad} = "maybe" ;then + AC_EGREP_CPP(log10.*fldlg2.*fxch.*st\([[0123456789]]*\), + [ + #define __LIBC_INTERNAL_MATH_INLINES 1 + #define __OPTIMIZE__ + #include <math.h> + ],bad=no,bad=yes) + fi + AC_MSG_RESULT(${bad}) + if test ${bad} = "yes" ;then + AC_MSG_WARN([ ]) + AC_MSG_WARN([********************************************************]) + AC_MSG_WARN([* The glibc headers on this machine have a serious bug *]) + AC_MSG_WARN([* in /usr/include/bits/mathinline.h This bug affects *]) + AC_MSG_WARN([* all floating point code, not only LAME, but all code *]) + AC_MSG_WARN([* built on this machine. Upgrading to glibc 2.1.3 is *]) + AC_MSG_WARN([* strongly urged to correct the problem. *]) + AC_MSG_WARN([*Note: that upgrading glibc will not fix any previously*]) + AC_MSG_WARN([* built programs; this is a compile-time bug. *]) + AC_MSG_WARN([* To work around the problem for this build of LAME, *]) + AC_MSG_WARN([* autoconf is disabling all math inlining. This will *]) + AC_MSG_WARN([* hurt LAME performace but is necessary for LAME to *]) + AC_MSG_WARN([* work correctly. Once glibc is upgraded, rerun *]) + AC_MSG_WARN([* configure and make to build with inlining. *]) + AC_MSG_WARN([********************************************************]) + AC_MSG_WARN([ ]) + + AC_DEFINE(__NO_MATH_INLINES, 1, work around a glibc bug) + fi;; +esac + + +dnl configure use of VBR bitrate histogram +dnl todo: always use yes as default, use simulation instead ? +AC_MSG_CHECKING(for termcap) +if test "x${HAVE_TERMCAP}" != "x"; then + FRONTEND_LDADD="-l${HAVE_TERMCAP} ${FRONTEND_LDADD}" + AC_DEFINE(HAVE_TERMCAP, 1, have termcap) + TERMCAP_DEFAULT="yes" +else + TERMCAP_DEFAULT="no" +fi +AC_MSG_RESULT(${TERMCAP_DEFAULT}) + + +dnl ### processor specific options ### +WITH_VECTOR=no +case $host_cpu in +x86_64|amd64) + CPUTYPE="no" + if test $ac_cv_header_xmmintrin_h = yes ; then + WITH_XMM=yes + WITH_VECTOR=yes + fi + + AC_DEFINE(TAKEHIRO_IEEE754_HACK, 1, IEEE754 compatible machine) + AC_DEFINE(USE_FAST_LOG, 1, faster log implementation with less but enoug +h precission) + ;; +*86) + CPUTYPE="i386" + if test $ac_cv_header_xmmintrin_h = yes ; then + WITH_XMM=yes + WITH_VECTOR=yes + fi + + # use internal knowledge of the IEEE 754 layout + AC_DEFINE(TAKEHIRO_IEEE754_HACK, 1, IEEE754 compatible machine) + AC_DEFINE(USE_FAST_LOG, 1, faster log implementation with less but enough precission) + ;; +powerpc) + CPUTYPE="no" + + # use internal knowledge of the IEEE 754 layout + AC_DEFINE(TAKEHIRO_IEEE754_HACK, 1, IEEE754 compatible machine) + + # The following should not get enabled on a G5. HOWTO check for a G5? + AC_DEFINE(USE_FAST_LOG, 1, faster log implementation with less but enough precission) + ;; +*) + CPUTYPE="no" + ;; +esac + +# which vector code do we support to build on this machine? +AM_CONDITIONAL(WITH_XMM, test "x${WITH_XMM}" = "xyes") + +# needs to be defined to link in the internal vector lib +AM_CONDITIONAL(WITH_VECTOR, test "x${WITH_VECTOR}" = "xyes") +AC_MSG_CHECKING(if I have to build the internal vector lib) +AC_MSG_RESULT(${WITH_VECTOR}) + + +AC_PATH_PROG(NASM, nasm, no) +case "${NASM}" in +no) + ;; +*) + AC_MSG_CHECKING(for assembler routines for this processor type) + for recurse_over in ${ASM_FOR_ARCH} + do + if test "${CPUTYPE}" = "${recurse_over}"; then + include_asm_routines="yes" + fi + + case $host_os in + *darwin*) + # currently we have problems because of a wrong + # libtool hack in the darwin case (for nasm code) + include_asm_routines="no" + ;; + esac + done + if test "x${include_asm_routines}" = "xyes"; then + AC_DEFINE(HAVE_NASM, 1, have nasm) + AC_DEFINE(MMX_choose_table, 1, use MMX version of choose_table) + else + include_asm_routines="no" + NASM="no" + fi + AC_MSG_RESULT(${include_asm_routines}) + ;; +esac +AM_CONDITIONAL(HAVE_NASM, test "${NASM}" != "no") + +case $host_os in + *cygwin*|*mingw32*) + CYGWIN=yes + NASM_FORMAT="-f win32 -DWIN32" + ;; + *darwin*) + NASM_FORMAT="-f macho" + ;; + *) + CYGWIN=no + NASM_FORMAT="-f elf" + ;; +esac + +# +# 'expopt' is used for "additional optimizations", not for optimizations which +# are marked as "experimental" in the guide for the compiler. +# They are "experimental" here in the LAME project (at least +# "--enable-expopt=full"). +# +AC_MSG_CHECKING(for additional optimizations) +AC_ARG_ENABLE(expopt, + [ --enable-expopt=full,norm Whether to enable experimental optimizations] + [ [default=no]], + CONFIG_EXPOPT="${enableval}", CONFIG_EXPOPT="no") + +if test "x$HAVE_GCC" = "xyes" -o "x$HAVE_CLANG" = "xyes"; then + # gcc defaults. OS specific options go in versious sections below + # from the gcc man pages: "there is no reason to use -pedantic" + if test "x${with_gnu_ld}" = "xyes"; then + CFLAGS="-Wall -pipe ${CFLAGS}" + else + # some vendor ld's don't like '-pipe' + CFLAGS="-Wall ${CFLAGS}" + fi + + # GCC version specific generic options + if test "x${HAVE_GCC}" = "xyes"; then + case "${GCC_version}" in + 2.96*) + # for buggy version of gcc shipped with RH7.1, back of on some + # optimizations + OPTIMIZATION="-O -fomit-frame-pointer -ffast-math \ + -funroll-loops" + OPTIMIZATION_FULL="-fmove-all-movables -freduce-all-givs \ + -fsched-interblock -fbranch-count-reg -fforce-addr \ + -fforce-mem" + ;; + 3.0*) + # -funroll-loops seems to produce buggy code with gcc 3.0.3 + OPTIMIZATION="-O -fomit-frame-pointer -ffast-math" + OPTIMIZATION_FULL="-fmove-all-movables -freduce-all-givs \ + -fbranch-count-reg -fforce-addr -fforce-mem" + ;; + 3.*|4.0.*|4.1.*) + # -fomit-frame-pointer seems to be buggy on cygwin + case ${host_os} in + *cygwin*) + OMIT_FRAME_POINTER= + ;; + *) + OMIT_FRAME_POINTER=-fomit-frame-pointer + ;; + esac + + OPTIMIZATION="-O3 ${OMIT_FRAME_POINTER} -ffast-math" + OPTIMIZATION_FULL="-fmove-all-movables -freduce-all-givs \ + -fbranch-count-reg -fforce-addr -fforce-mem" + ;; + [456789].*) + OPTIMIZATION="-O3 -fomit-frame-pointer -ffast-math" + OPTIMIZATION_FULL="-fbranch-count-reg -fforce-addr" + ;; + *) + # default + OPTIMIZATION="-O3 ${OMIT_FRAME_POINTER} -ffast-math \ + -funroll-loops" + OPTIMIZATION_FULL="-fbranch-count-reg -fforce-addr" + ;; + esac + + # GCC version independend generic options + OPTIMIZATION_NORM="-fschedule-insns2" + fi + + + # generic CPU specific options + case ${host_cpu} in + sparc) + case "${GCC_version}" in + 3.0*) + ;; + [3456789].*) + # doesn't work on 3.0.x, but on 3.[12] and + # hopefully on every other release after that too + if test -x /usr/bin/isalist; then + /usr/bin/isalist | grep sparcv8plus \ + >/dev/null 2>&1 && \ + OPTIMIZATION="${OPTIMIZATION} \ + -mcpu=ultrasparc \ + -mtune=ultrasparc" + fi + ;; + esac + ;; + *86) + case "${GCC_version}" in + [3456789].*) + OPTIMIZATION="${OPTIMIZATION} \ + -maccumulate-outgoing-args" + ;; + esac + ;; + esac + + expopt_msg_result_printed=no + case "${CONFIG_EXPOPT}" in + no) + # if someone supplies own CFLAGS, we don't add our own + if test "x${ac_save_CFLAGS}" != "x"; then + OPTIMIZATION="" + fi + ;; + norm|yes) + OPTIMIZATION="${OPTIMIZATION} ${OPTIMIZATION_NORM}" + ;; + full) + OPTIMIZATION="${OPTIMIZATION} ${OPTIMIZATION_NORM} \ + ${OPTIMIZATION_FULL}" + + if test "${HAVE_GCC}" = "yes"; then + # some hardware dependend options + case "${GCC_version}" in + 2.9*|3.*|4.0.*|4.1.*) + # "new" GCC, use some "new" CPU specific optimizations + # use -mtune instead of -m486 or -mcpu= etc, since they are + # deprecated by GCC <rbrito> + case ${host_cpu} in + *486) + OPTIMIZATION="${OPTIMIZATION} -mcpu=i486 \ + -mfancy-math-387" + ;; + *586) + OPTIMIZATION="${OPTIMIZATION} -mcpu=pentium \ + -march=pentium -mfancy-math-387" + ;; + *686) + OPTIMIZATION="${OPTIMIZATION} -mcpu=pentiumpro \ + -march=pentiumpro -mfancy-math-387 \ + -malign-double" + ;; + *86) + OPTIMIZATION="${OPTIMIZATION} -mfancy-math-387" + ;; + alpha*) + OPTIMIZATION="${OPTIMIZATION} -mfp-regs" + AC_DEFINE(FLOAT, double, double is faster than float on Alpha) + # add "-mcpu=21164a -Wa,-m21164a" to optimize + # for 21164a (ev56) CPU + ;; + *) + OPTIMIZATION="${OPTIMIZATION} -fdelayed-branch" + ;; + esac + ;; + [456789].*) + case ${host_cpu} in + *486) + OPTIMIZATION="${OPTIMIZATION} -march=i486" + ;; + *586) + OPTIMIZATION="${OPTIMIZATION} -march=i586 \ + -mtune=native" + ;; + *686) + OPTIMIZATION="${OPTIMIZATION} -march=i686 \ + -mtune=native" + ;; + *86) + OPTIMIZATION="${OPTIMIZATION} -march=native \ + -mtune=native" + ;; + arm*-gnueabi) + if [ -z "$(echo ${GCC_version} | awk '/4\.0/')" ]; then + # Work round buggy softfloat optimization in ARM EABI compilers + # -gnueabi in only gcc-4.1 onwards + OPTIMIZATION="${OPTIMIZATION} -fno-finite-math-only" + fi + ;; + esac + ;; + *) + # no special optimization for other versions + AC_MSG_RESULT(no) + expopt_msg_result_printed=yes + AC_MSG_WARN(LAME doesn't know about your version (${GCC_version}) of gcc, please report it to lame-dev@lists.sourceforge.net. Please make sure you try the latest LAME version first!) + ;; + esac + fi + ;; + *) + AC_MSG_ERROR(bad value �${CONFIG_EXPOPT}� for expopt option) + ;; + esac + + + if test "x${HAVE_CLANG}" = "xyes"; then + case "${CLANG_VERSION}" in + 3.[89]*|[45].*) + OPTIMIZATION="-Ofast" + ;; + *) + OPTIMIZATION="-O3" + ;; + esac + + # generic CPU specific options + case ${host_cpu} in + *486) + OPTIMIZATION="${OPTIMIZATION} -march=i486" + ;; + *586) + OPTIMIZATION="${OPTIMIZATION} -march=i586 \ + -mtune=native" + ;; + *686) + OPTIMIZATION="${OPTIMIZATION} -march=i686 \ + -mtune=native" + ;; + *86) + OPTIMIZATION="${OPTIMIZATION} -march=native \ + -mtune=native" + ;; + esac + + fi + + + if test "${expopt_msg_result_printed}" = "no" ; then + AC_MSG_RESULT(${CONFIG_EXPOPT}) + fi +else + AC_MSG_RESULT(no) +fi + + + + + +AC_MSG_CHECKING(for debug options) +AC_ARG_ENABLE(debug, + [ --enable-debug=alot,norm Enable debugging (disables optimizations)] + [ [default=no]], + CONFIG_DEBUG="${enableval}", CONFIG_DEBUG="no") + +if test "x$GCC" = "xyes"; then + DEBUG_NORM_OPT="-O -g -Wall" + DEBUG_ANOYING="-Wbad-function-cast -Wcast-align \ + -Wcast-qual -Wchar-subscripts -Wconversion \ + -Wmissing-prototypes -Wnested-externs -Wpointer-arith \ + -Wredundant-decls -Wshadow -Wstrict-prototypes \ + -Wwrite-strings -Winline \ + -Wformat -Wswitch -Waggregate-return -Wmissing-noreturn \ + -Wimplicit-int -fno-builtin" + + case "${CONFIG_DEBUG}" in + no) +dnl Comment out the NDEBUG on release build, they check for issues +dnl which should also be rejected in a release build. +dnl The real solution would be to do user friendly error messages +dnl instead of a core dump. This is a quick and user-unfriendly fix. +dnl AC_DEFINE(NDEBUG, 1, no debug build) + ;; + norm|yes) + AC_DEFINE(ABORTFP, 1, debug define) + OPTIMIZATION="${DEBUG_NORM_OPT}" + ;; + anoying) + AC_DEFINE(ABORTFP, 1, debug define) + OPTIMIZATION="${DEBUG_NORM_OPT} ${DEBUG_ANOYING}" + ;; + alot) + AC_DEFINE(ABORTFP, 1, debug define) + AC_DEFINE(DEBUG, 1, alot of debug output) + OPTIMIZATION="${DEBUG_NORM_OPT}" + ;; + *) + AC_MSG_ERROR(bad value �${CONFIG_DEBUG}� for debug option) + esac + + AC_MSG_RESULT(${CONFIG_DEBUG}) +else + AC_MSG_RESULT(no) +fi + + + +dnl ### system specific options ### + +########################################################################## +# LINUX on Digital/Compaq Alpha CPUs +########################################################################## +case $host in +alpha*-*-linux*) + +################################################################ +#### Check if 'ccc' is in our path +################################################################ +if test "`which ccc 2>/dev/null | grep -c ccc`" != "0" ; then + # Compaq's C Compiler + CC=ccc + +################################################################ +#### set 'OPTIMIZATION = -arch host -tune host' +#### to generate/tune instructions for this machine +#### 'OPTIMIZATION += -migrate -fast -inline speed -unroll 0' +#### tweak to run as fast as possible :) +#### 'OPTIMIZATION += -w0' +#### set warning and linking flags +################################################################ + OPTIMIZATION="-arch host -tune host" + OPTIMIZATION="-migrate -fast -inline speed -unroll 0 $OPTIMIZATION" + OPTIMIZATION="-w0 $OPTIMIZATION" + + +################################################################ +#### to debug, uncomment +################################################################ + # For Debugging + #OPTIMIZATION="-g3 $OPTIMIZATION" + +################################################################ +#### define __DECALPHA__ (i was getting re-declaration warnings +#### in machine.h +################################################################ + # Define DEC Alpha + AC_DEFINE(__DECALPHA__, 1, we're on DEC Alpha) +fi # gcc or ccc? +;; # alpha + + +########################################################################## +# SunOS +########################################################################## +sparc-*-sunos4*) + if test CC = "cc"; then + OPTIMIZATION="-O -xCC" + MAKEDEP="-xM" + # for gcc, use instead: + # CC="gcc" + # OPTIMIZATION="-O" + # MAKEDEP="-M" +AC_MSG_WARN([Please contact lame@lists.sourceforge.net with the output of the configure run and the file config.cache. Thank you for your cooperation.]) + fi +;; #SunOS + +########################################################################## +# SGI +########################################################################## +*-sgi-irix*) + if test CC = "cc"; then + OPTIMIZATION="-O3 -woff all" + fi +;; # SGI + +########################################################################## +# Compaq Alpha running Dec Unix (OSF) +########################################################################## +alpha*-dec-osf*) + if test CC = "cc"; then + OPTIMIZATION="-fast -O3 -std -g3 -non_shared" + fi +;; #OSF +esac + +# todo: include the following tests in the case-list +UNAME=`uname` +ARCH=`uname -m` + +########################################################################### +# MOSXS (Rhapsody PPC) +########################################################################### +if test "$UNAME" = "Rhapsody"; then +# CC="cc" # should be handled already by autoconf + MAKEDEP="-make" +fi + +########################################################################### +# MAC OSX Darwin PPC +########################################################################### +if test "$UNAME" = "Darwin"; then + MAKEDEP="-make" + CFLAGS="$CFLAGS -fno-common" +fi + + +########################################################################## +# OS/2 +########################################################################## +# Properly installed EMX runtime & development package is a prerequisite. +# tools I used: make 3.76.1, uname 1.12, sed 2.05, PD-ksh 5.2.13 +# +########################################################################## +if test "$UNAME" = "OS/2"; then + SHELL=sh + #CC=gcc # should already be handled by configure + + # file extension should already be handled by automake (I don't know, + # please give feedback! + #FILE_EXTENSION=".exe" + +# Uncomment & inspect the GTK lines to use MP3x GTK frame analyzer. +# Properly installed XFree86/devlibs & GTK+ is a prerequisite. +# The following works for me using Xfree86/OS2 3.3.5 and GTK+ 1.2.3: +# AC_DEFINE(HAVE_GTK, 1, have GTK) +# AC_DEFINE(__ST_MT_ERRNO__, 1) +# INCLUDES="-IC:/XFree86/include/gtk12 -IC:/XFree86/include/glib12 \ +# -IC:/XFree86/include $INCLUDES" +# FRONTEND_LDFLAGS="-LC:/XFree86/lib -lgtk12 -lgdk12 -lgmodule -lglib12 \ +# -lXext -lX11 -lshm -lbsd -lsocket -lm $FRONTEND_LDFLAGS" +# FRONTEND_CFLAGS="-Zmtd -Zsysv-signals -Zbin-files $FRONTEND_CFLAGS" +fi + +########################################################################### +# AmigaOS +########################################################################### +# Type 'Make ARCH=PPC' for PowerUP and 'Make ARCH=WOS' for WarpOS +# +########################################################################### +if test "$UNAME" = "AmigaOS" ; then + CC="gcc -noixemul" + OPTIMIZATION="$OPTIMIZATION -m68020-60 -m68881" + MAKEDEP="-MM" + if test "$ARCH" = "WOS"; then + CC="ppc-amigaos-gcc -warpup" + OPTIMIZATION="$OPTIMIZATION -mmultiple -mcpu=603e" + AR="ppc-amigaos-ar" + RANLIB="ppc-amigaos-ranlib" + fi + if test "$ARCH",PPC; then + CC="ppc-amigaos-gcc" + OPTIMIZATION="$OPTIMIZATION -mmultiple -mcpu=603e" + AR="ppc-amigaos-ar" + RANLIB="ppc-amigaos-ranlib" + fi +fi + + +CFLAGS="${OPTIMIZATION} ${CFLAGS}" +LDADD="${LDADD}" +FRONTEND_CFLAGS="${INCICONV} ${FRONTEND_CFLAGS}" +FRONTEND_LDADD="${FRONTEND_LDADD} ${LTLIBICONV} ${CONFIG_MATH_LIB}" + + +AC_SUBST(INCLUDES) + +AC_SUBST(FRONTEND_LDFLAGS) +AC_SUBST(FRONTEND_CFLAGS) +AC_SUBST(FRONTEND_LDADD) +AC_SUBST(CONFIG_MATH_LIB) +AC_SUBST(LDADD) + +AC_SUBST(LIB_MAJOR_VERSION) +AC_SUBST(LIB_MINOR_VERSION) + +AC_SUBST(NASM) +AC_SUBST(NASM_FORMAT) + +AC_SUBST(MAKEDEP) +AC_SUBST(RM_F) + +AC_SUBST(LIBTOOL_DEPS) + +AC_SUBST(WITH_FRONTEND) +AC_SUBST(WITH_MP3X) +AC_SUBST(WITH_MP3RTP) + +AC_SUBST(CPUTYPE) +AC_SUBST(CPUCCODE) + +AC_SUBST(CONFIG_DEFS) + +AC_CONFIG_FILES([Makefile \ + libmp3lame/Makefile \ + libmp3lame/i386/Makefile \ + libmp3lame/vector/Makefile \ + frontend/Makefile \ + mpglib/Makefile \ + doc/Makefile \ + doc/html/Makefile \ + doc/man/Makefile \ + include/Makefile \ + Dll/Makefile \ + misc/Makefile \ + dshow/Makefile \ + ACM/Makefile \ + ACM/ADbg/Makefile \ + ACM/ddk/Makefile \ + ACM/tinyxml/Makefile \ + lame.spec \ + mac/Makefile \ + macosx/Makefile \ + macosx/English.lproj/Makefile \ + macosx/LAME.xcodeproj/Makefile \ + vc_solution/Makefile]) + +AC_OUTPUT diff --git a/debian/.cvsignore b/debian/.cvsignore new file mode 100644 index 0000000..f3c7a7c --- /dev/null +++ b/debian/.cvsignore @@ -0,0 +1 @@ +Makefile diff --git a/debian/CVS/Entries b/debian/CVS/Entries new file mode 100644 index 0000000..7a99c6b --- /dev/null +++ b/debian/CVS/Entries @@ -0,0 +1,16 @@ +/.cvsignore/1.1/Wed Jan 9 12:09:58 2002// +/Makefile.am/1.8/Sat Oct 15 14:31:09 2011// +/Makefile.in/1.27/Sat Oct 15 14:31:09 2011// +/changelog/1.31/Wed Mar 2 16:56:30 2011// +/compat/1.2/Sat May 2 13:44:24 2009// +/control/1.28/Wed Mar 2 16:54:47 2011// +/copyright/1.9/Sat May 7 16:05:17 2011// +/lame.doc-base/1.3/Sun Nov 22 22:09:35 2009// +/lame.docs/1.6/Wed May 14 07:42:04 2008// +/lame.install/1.1/Sat May 2 13:44:24 2009// +/lame.manpages/1.1/Wed Jul 27 08:43:02 2005// +/libmp3lame-dev.install/1.1/Sat May 2 13:44:24 2009// +/libmp3lame0.install/1.1/Sat May 2 13:44:24 2009// +/rules/1.24/Wed Mar 2 16:48:11 2011// +/watch/1.2/Mon Apr 20 05:39:44 2009// +D/source//// diff --git a/debian/CVS/Repository b/debian/CVS/Repository new file mode 100644 index 0000000..9b41cfa --- /dev/null +++ b/debian/CVS/Repository @@ -0,0 +1 @@ +lame/debian diff --git a/debian/CVS/Root b/debian/CVS/Root new file mode 100644 index 0000000..5023546 --- /dev/null +++ b/debian/CVS/Root @@ -0,0 +1 @@ +:ext:aleidinger@lame.cvs.sourceforge.net:/cvsroot/lame diff --git a/debian/Makefile.am b/debian/Makefile.am new file mode 100644 index 0000000..4a23ef5 --- /dev/null +++ b/debian/Makefile.am @@ -0,0 +1,20 @@ +## $Id: Makefile.am,v 1.8 2011/10/15 14:31:09 robert Exp $ + +include $(top_srcdir)/Makefile.am.global + +EXTRA_DIST = \ + changelog \ + compat \ + control \ + copyright \ + libmp3lame-dev.install \ + libmp3lame0.install \ + lame.docs \ + lame.install \ + lame.manpages \ + rules \ + watch + +dist-hook: + chmod +x $(distdir)/rules + diff --git a/debian/Makefile.in b/debian/Makefile.in new file mode 100644 index 0000000..24619a7 --- /dev/null +++ b/debian/Makefile.in @@ -0,0 +1,405 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# global section for every Makefile.am +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.global +subdir = debian +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_DEFS = @CONFIG_DEFS@ +CONFIG_MATH_LIB = @CONFIG_MATH_LIB@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CPUCCODE = @CPUCCODE@ +CPUTYPE = @CPUTYPE@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FRONTEND_CFLAGS = @FRONTEND_CFLAGS@ +FRONTEND_LDADD = @FRONTEND_LDADD@ +FRONTEND_LDFLAGS = @FRONTEND_LDFLAGS@ +GREP = @GREP@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_CONFIG = @GTK_CONFIG@ +GTK_LIBS = @GTK_LIBS@ +INCLUDES = @INCLUDES@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDADD = @LDADD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_MAJOR_VERSION = @LIB_MAJOR_VERSION@ +LIB_MINOR_VERSION = @LIB_MINOR_VERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEDEP = @MAKEDEP@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NASM = @NASM@ +NASM_FORMAT = @NASM_FORMAT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM_F = @RM_F@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +STRIP = @STRIP@ +U = @U@ +VERSION = @VERSION@ +WITH_FRONTEND = @WITH_FRONTEND@ +WITH_MP3RTP = @WITH_MP3RTP@ +WITH_MP3X = @WITH_MP3X@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = 1.11 foreign $(top_srcdir)/ansi2knr +EXTRA_DIST = \ + changelog \ + compat \ + control \ + copyright \ + libmp3lame-dev.install \ + libmp3lame0.install \ + lame.docs \ + lame.install \ + lame.manpages \ + rules \ + watch + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.global $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign debian/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign debian/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + dist-hook distclean distclean-generic distclean-libtool \ + distdir dvi dvi-am html html-am info info-am install \ + install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + uninstall uninstall-am + + +# end global section + +dist-hook: + chmod +x $(distdir)/rules + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000..eed38ca --- /dev/null +++ b/debian/changelog @@ -0,0 +1,277 @@ +lame (3.99~cvs20110302) UNRELEASED; urgency=low + + * New update of the debian infra-structure. + * debian/rules: + + Transition to the short debhelper 7 format. + + Use the --parallel flag so that building in parallel is supported. + * debian/control: + + Rewrap the Build-Depends field for legibility. + + Change B-D on nasm to allow any i386 platform (no amd64, though). + + Update the B-D on debhelper to >= 7.0.50~, as we use overrides in + debian/rules. + + Fix lintian's debhelper-but-no-misc-depends from the binary packages. + + Remove unused Conflicts: and Replaces: fields. + + Verified that the packaging conforms to the Policy version 3.9.1. + * debian/changelog: + + Put my SF email or we get warnings from lintian. + + -- Rogério Brito <rbrito@users.sf.net> Wed, 02 Mar 2011 13:31:29 -0300 + +lame (3.99~cvs20091122) unstable; urgency=low + + * Update based on many suggestions by Fabian Greffrath. + * debian/compat: update to 7. + * debian/control: + + remame libmp3lame0-dev to libmp3lame-dev. + + remove dependency on libc6-dev from libmp3lame-dev. + + bump dependency on debhelper to 7. + + bump Standards-Version to 3.8.0. + * debian/libmp3lame0-dev.files: rename to libmp3lame-dev.files. + * debian/*.files: rename to *.install. + * debian/rules: + + replace obsolete dh_clean -k with dh_prep. + + substitute the use of dh_movefiles with dh_install. + + changed the *FLAGS variables to use appends, not attributions. + + include options -O1, -z,defs for the linker. + + no need to pass options to dh_installman. + + no need to pass options to dh_installchangelogs. + * Initial transition to source format "3.0 (quilt)". + + -- Rogério Brito <rbrito@users.sf.net> Sun, 22 Nov 2009 19:19:39 -0200 + +lame (3.99~cvs20090419) unstable; urgency=low + + * Updating the packaging of lame. + * debian/control: include autotools-dev as a build dependency. + * debian/rules: + + made use of autotools-dev. + + remove switch --without-vorbis. + + substituted `pwd` by $(CURDIR). + * debian/watch: also consider versions with a letter in them. + + -- Rogério Brito <rbrito@users.sf.net> Sun, 19 Apr 2009 20:20:27 -0300 + +lame (3.99~cvs20081106) unstable; urgency=low + + * changes are now (mostly) committed to changelog. + * debian/rules: include -Wl,--as-needed for the loader at compile time. + * debian/rules: remove (not needed) hack for rpath (Tks Fabian Greffrath). + * debian/control: depend libsndfile1-dev (Tks Fabian Greffrath). + * debian/control: get rid of transitional liblame0. + + -- Rogério Brito <rbrito@users.sf.net> Sat, 12 Jul 2008 09:14:54 -0300 + +lame (3.98) unstable; urgency=low + + * Preparation for the final release. + + -- Rogério Brito <rbrito@users.sf.net> Sun, 29 Jun 2008 18:29:09 -0300 + +lame (3.98~beta8+cvs20080624) unstable; urgency=low + + * Preparation for the new upstream release (lame 3.98 final). + * debian/control: eliminate build dependency on gtk1.2-dev. + * debian/rules: include -Wextra in the CFLAGS variable. + * debian/rules: explicitly disable some features from the build. + + -- Rogério Brito <rbrito@users.sf.net> Tue, 24 Jun 2008 15:16:22 -0300 + +lame (3.98~beta8+cvs20080514) unstable; urgency=low + + * Fixing debian packaging details. + * debian/rules: put detection of architectures for cross-compilation. + * debian/rules: included support for noopt option. + * debian/rules: take more care of building everything under debian/tmp. + * debian/control: updated to Standards-Version 3.7.3 (no changes). + * debian/control: put correctly Conflicts: and Replaces in libmp3lame0{,-dev}. + * debian/lame.docs: remove TODO and sort by name. + * debian/libmp3lame0-dev.docs: include TODO. + * debian/libmp3lame0-dev: include liblame0.so in the package. + * debian/watch: include watchfile. + + -- Rogério Brito <rbrito@users.sf.net> Wed, 14 May 2008 01:44:46 -0300 + +lame (3.98~alpha1) unstable; urgency=low + + * New upstream release with various improvements; + * Use libsndfile for input files; + * Remove the parts that depend on gtk-1.2; + * debian/rules: remove the DH_COMPAT variable; + * debian/control: use ${binary:Version} to be up-to-date; + * debian/control: use debhelper version >= 5; + + -- Rogério Brito <rbrito@users.sf.net> Wed, 09 Jan 2008 17:12:19 -0200 + +lame (3.98~alpha0) unstable; urgency=low + + * debian/copyright: updated FSF real address; + * debian/rules: small fixes; + * doc/man/lame.1: used accented characters in troff format. + + -- Rogério Brito <rbrito@users.sf.net> Mon, 10 Oct 2005 03:33:31 -0300 + +lame (3.97-8) unstable; urgency=low + + * debian/rules: enable full optimization, now that it works with GCC 4. + + -- Rogério Brito <rbrito@users.sf.net> Mon, 5 Sep 2005 01:24:44 -0300 + +lame (3.97-7) unstable; urgency=low + + * debian/control: make libmp3lame0 provide and replace liblame0. + + -- Rogério Brito <rbrito@users.sf.net> Tue, 16 Aug 2005 04:36:46 -0300 + +lame (3.97-6) unstable; urgency=low + + * debian/control: make libmp3lame0 provide liblame0 for legacy apps; + * debian/control: fix typo in description of libmp3lame0-dev; + * debian/libmp3lame0-dev.files: don't ship shared libraries. + + -- Rogério Brito <rbrito@users.sf.net> Tue, 16 Aug 2005 04:03:42 -0300 + +lame (3.97-5) unstable; urgency=low + + * debian/control: fix use of SONAME in the package; + * debian/liblame0.*: renamed to libmp3lame0.* as per above; + * debian/liblame-dev: idem; + * debian/rules: incorporate some changes by Christian Marillat. + + -- Rogério Brito <rbrito@users.sf.net> Mon, 15 Aug 2005 00:47:25 -0300 + +lame (3.97-4) unstable; urgency=low + + * debian/control: exclude libsndfile0-dev as a build dependency. + * debian/control: include libgtk1.2-dev as a build dependency. + * debian/rules: s/--with-fileio=sndfile/--with-fileio=lame/, since + grabbing input from stdin is a very important feature. + + -- Rogério Brito <rbrito@users.sf.net> Fri, 5 Aug 2005 02:01:40 -0300 + +lame (3.97-3) unstable; urgency=low + + * doc/man/lame.1: document the --{un,}signed options. + * doc/man/lame.1: document the --{big,little}-endian options. + * debian/control: include libsndfile0-dev as a build dependency. + * debian/rules: s/--with-fileio=lame/--with-fileio=sndfile/ . + + -- Rogério Brito <rbrito@users.sf.net> Wed, 3 Aug 2005 21:35:17 -0300 + +lame (3.97-2) unstable; urgency=low + + * debian/rules: use dh_installman instead of dh_installmanpages. + * doc/man/lame.1: escape minus signals with backslash. + + -- Rogério Brito <rbrito@users.sf.net> Wed, 27 Jul 2005 04:58:39 -0300 + +lame (3.97-1) unstable; urgency=low + + * Preparation for the beta release of lame 3.97. + * Still more improvements to come. + + -- Rogério Brito <rbrito@users.sf.net> Tue, 26 Jul 2005 18:16:34 -0300 + +lame (3.97-0.2) unstable; urgency=low + + * Fixed debian/control according to the Debian Library Packaging Guide + + -- Jack Bates <ms419@freezone.co.uk> Thu, 12 May 2005 13:41:28 -0700 + +lame (3.97-0.1) unstable; urgency=low + + * Preparation for new upstream release. + * debian/control: modified short descriptions to be lower case. + + -- Rogério Brito <rbrito@users.sf.net> Fri, 18 Mar 2005 01:18:42 -0300 + +lame (3.96-0.1) unstable; urgency=low + + * Update debian packaging for lame 3.96 + + -- Geoffrey T. Dairiki <dairiki@dairiki.org> Fri, 9 Apr 2004 10:28:12 -0700 + +lame (3.94-0.1) unstable; urgency=low + + * Update packaging for lame 3.94 alpha 14; + * Made progress to make the package as lintian-clean as possible: + * debian/copyright: removed the traces of the skeleton file; + * debian/rules: avoid using --host, as per warning of ./configure; + * debian/rules: use trick to avoind generating a library with rpath; + * debian/lame.docs: avoid generating duplicate html documentation; + * debian/control: added dependency on debhelper >= 3; + * still more work left, but progressing anyway (i.e., changes listed in + /usr/share/doc/debian-policy/upgrading-checklist.txt.gz should be + applied). + + -- Rogério Brito <rbrito@users.sf.net> Tue, 15 Jul 2003 19:30:42 -0300 + +lame (3.93-0.1) unstable; urgency=low + + * Prevent lame 3.93 shipping and still building a 3.92 debian package; + * Use --enable-nasm, as is shouldn't break compilation on non-x86; + * Use --enable-expopt, to get a bit more of speed. + + -- Rogério Brito <rbrito@users.sf.net> Sun, 25 Aug 2002 18:58:16 -0300 + +lame (3.92-1) unstable; urgency=low + + * New upstream release. + * Closes: #578135. + + -- Rogério Brito <linuxsup@ig.com.br> Sun, 28 Jul 2002 03:08:04 -0300 + +lame (3.91-1) unstable; urgency=low + + * New upstream release. + + -- Rogerio Brito <linuxsup@ig.com.br> Sun, 20 Jan 2002 20:50:19 -0200 + +lame (3.90.1-0) unstable; urgency=low + + * New upstream release. + * debian/control: nasm is only a build-dependency on x86; + * debian/control: added debhelper to build-dependency list; + * debian/control: changed description of the binary packages; + * debian/rules: enabled experimental/agressive optimizations; + * debian/rules: effectively spread the installed files in binary packages; + * debian/rules: now dh_makeshlibs creates good postinst and prerm scripts; + * Changed the lame-dev package to liblame0-dev; + * Removed references to lame-extras, since it doesn't exist anymore; + * Added LICENCE to copyright and excluded it from the binary package; + * Removed INSTALL from the binary package; + * lame is now almost lintian clean (the only problem remaining is + an rpath in liblame build process). + + -- Rogerio Brito <linuxsup@ig.com.br> Fri, 28 Dec 2001 04:08:57 -0200 + +lame (3.90-1) unstable; urgency=low + + * New upstream release. + + -- Viral <viral@debian.org> Tue, 21 Aug 2001 13:50:14 +0530 + +lame (3.89-1) unstable; urgency=low + + * New upstream version. + * Added --host=$$(dpkg-architecture -qDEB_HOST_GNU_TYPE) to configure. + * Added liblame0 package. + * Added doc-base entry. + * Actual ChangeLog is installed now instead of history.html + + -- Viral <viral@debian.org> Sun, 22 Jul 2001 03:07:30 +0530 + +lame (3.88-0) unstable; urgency=low + + * Updated debian/ directory to use configure. + + -- Ingo Saitz <Ingo.Saitz@stud.uni-hannover.de> Mon, 11 Dec 2000 08:43:26 +0100 + +lame (3.86-1) unstable; urgency=low + + * Initial Release. + + -- Stefan Karrmann <S.Karrmann@gmx.net> Thu, 31 Aug 2000 22:15:07 +0200 + +Local variables: +mode: debian-changelog +End: diff --git a/debian/compat b/debian/compat new file mode 100644 index 0000000..7f8f011 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +7 diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..9ef23d6 --- /dev/null +++ b/debian/control @@ -0,0 +1,51 @@ +Source: lame +Section: sound +Priority: optional +Maintainer: Rogério Brito <rbrito@users.sf.net> +Bugs: mailto:lame-dev@lists.sourceforge.net +Homepage: http://lame.sourceforge.net/ +Build-Depends: debhelper (>= 7.0.50~), + libncurses5-dev, + nasm [any-i386], + libsndfile1-dev, + autotools-dev +Standards-Version: 3.9.1 + +Package: lame +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: open source MP3 encoder + Lame is a program which can be used to create compressed + audio files. (Lame aint MP3 encoder). These audio files + can be played back by popular mp3 players such as mpg123. + To read from stdin, use "-" for <infile>. To write to + stdout, use a "-" for <outfile>. + . + This package contains the frontend encoder binary. + +Package: libmp3lame0 +Architecture: any +Section: libs +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: shared libraries for MP3 encoding + Lame is a program which can be used to create compressed + audio files. (Lame aint MP3 encoder). These audio files + can be played back by popular mp3 players such as mpg123. + To read from stdin, use "-" for <infile>. To write to + stdout, use a "-" for <outfile>. + . + This package contains the dynamic library. + +Package: libmp3lame-dev +Architecture: any +Section: libdevel +Depends: libmp3lame0 (= ${binary:Version}), ${misc:Depends} +Description: development files for lame + Lame is a program which can be used to create compressed + audio files. (Lame aint MP3 encoder). These audio files + can be played back by popular mp3 players such as mpg123. + To read from stdin, use "-" for <infile>. To write to + stdout, use a "-" for <outfile>. + . + This package contains the static library and header files + for development with lame. diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 0000000..ca4c175 --- /dev/null +++ b/debian/copyright @@ -0,0 +1,55 @@ +This package was originally made by Stefan Karrmann <S.Karrmann@gmx.net> +on Thu, 31 Aug 2000 22:15:07 +0200. + +The current maintainer is Rogério Brito <rbrito@users.sf.net>. + +It was downloaded from the CVS repository at <http://sf.net/projects/lame>. + +Upstream Authors: The LAME team <lame-dev@lists.sf.net>. + +Copyright © 1999-2009 The LAME team <lame-dev@lists.sf.net> and contributors. + + LAME is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + LAME 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the + Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + MA 02110-1301, USA. + +Additionally, the original software's LICENCE file contains the following: + +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Can I use LAME in my commercial program? + +Yes, you can, under the restrictions of the LGPL. The easiest +way to do this is to: + +1. Link to LAME as separate library (libmp3lame.a on unix or + lame_enc.dll on windows) + +2. Fully acknowledge that you are using LAME, and give a link + to our web site, www.mp3dev.org + +3. If you make modifications to LAME, you *must* release these + these modifications back to the LAME project, under the LGPL. + +*** IMPORTANT NOTE *** + +The decoding functions provided in LAME use the mpglib decoding engine which +is under the GPL. They may not be used by any program not released under the +GPL unless you obtain such permission from the MPG123 project (www.mpg123.de). +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +On Debian systems, the complete text of the GNU Library General Public +License can be found in `/usr/share/common-licenses/LGPL-2'. + +The Debian packaging is © 2005-2009, Rogério Brito <rbrito@users.sf.net> +and is licensed under the GPL, see above. diff --git a/debian/lame.doc-base b/debian/lame.doc-base new file mode 100644 index 0000000..27e8bdf --- /dev/null +++ b/debian/lame.doc-base @@ -0,0 +1,9 @@ +Document: lame +Abstract: This manual describes the LAME MP3 encoder and concepts behind audio compression. +Author: The LAME Development Team +Section: Sound +Title: LAME MP3 encoder manual + +Format: HTML +Index: /usr/share/doc/lame/html/index.html +Files: /usr/share/doc/lame/html/* diff --git a/debian/lame.docs b/debian/lame.docs new file mode 100644 index 0000000..45d9e7d --- /dev/null +++ b/debian/lame.docs @@ -0,0 +1 @@ +USAGE diff --git a/debian/lame.install b/debian/lame.install new file mode 100644 index 0000000..5d06f7f --- /dev/null +++ b/debian/lame.install @@ -0,0 +1,2 @@ +usr/bin/lame +usr/share/doc/lame/html/*.html diff --git a/debian/lame.manpages b/debian/lame.manpages new file mode 100644 index 0000000..ba8addd --- /dev/null +++ b/debian/lame.manpages @@ -0,0 +1 @@ +doc/man/lame.1 diff --git a/debian/libmp3lame-dev.install b/debian/libmp3lame-dev.install new file mode 100644 index 0000000..7a32f3c --- /dev/null +++ b/debian/libmp3lame-dev.install @@ -0,0 +1,3 @@ +usr/include/lame/lame.h +usr/lib/*.{a,la} +usr/lib/libmp3lame*.so diff --git a/debian/libmp3lame0.install b/debian/libmp3lame0.install new file mode 100644 index 0000000..f5235c2 --- /dev/null +++ b/debian/libmp3lame0.install @@ -0,0 +1 @@ +usr/lib/libmp3lame.so.* diff --git a/debian/rules b/debian/rules new file mode 100644 index 0000000..ac7bbd8 --- /dev/null +++ b/debian/rules @@ -0,0 +1,18 @@ +#!/usr/bin/make -f + +%: + dh $@ --parallel + +CFLAGS += -g -Wall -Wextra +LDFLAGS += -Wl,-O1 -Wl,-z,defs -Wl,--as-needed + +override_dh_auto_configure: + dh_auto_configure -- \ + --with-fileio=sndfile \ + --enable-nasm \ + --with-pic \ + --disable-mp3x \ + --disable-mp3rtp \ + --disable-gtktest \ + --enable-dynamic-frontends \ + --enable-expopt=full diff --git a/debian/source/CVS/Entries b/debian/source/CVS/Entries new file mode 100644 index 0000000..82f07e4 --- /dev/null +++ b/debian/source/CVS/Entries @@ -0,0 +1,2 @@ +/format/1.1/Sun Nov 22 21:18:23 2009// +D diff --git a/debian/source/CVS/Repository b/debian/source/CVS/Repository new file mode 100644 index 0000000..f731ac0 --- /dev/null +++ b/debian/source/CVS/Repository @@ -0,0 +1 @@ +lame/debian/source diff --git a/debian/source/CVS/Root b/debian/source/CVS/Root new file mode 100644 index 0000000..5023546 --- /dev/null +++ b/debian/source/CVS/Root @@ -0,0 +1 @@ +:ext:aleidinger@lame.cvs.sourceforge.net:/cvsroot/lame diff --git a/debian/source/format b/debian/source/format new file mode 100644 index 0000000..163aaf8 --- /dev/null +++ b/debian/source/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/debian/watch b/debian/watch new file mode 100644 index 0000000..f7d69a1 --- /dev/null +++ b/debian/watch @@ -0,0 +1,2 @@ +version=3 +http://sf.net/lame/lame-(.*).tar.gz diff --git a/depcomp b/depcomp new file mode 100755 index 0000000..b39f98f --- /dev/null +++ b/depcomp @@ -0,0 +1,791 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2016-01-11.22; # UTC + +# Copyright (C) 1999-2017 Free Software Foundation, Inc. + +# This program 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 2, or (at your option) +# any later version. + +# This program 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 this program. If not, see <http://www.gnu.org/licenses/>. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by 'PROGRAMS ARGS'. + object Object file output by 'PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputting dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to <bug-automake@gnu.org>. +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +# Get the directory component of the given path, and save it in the +# global variables '$dir'. Note that this directory component will +# be either empty or ending with a '/' character. This is deliberate. +set_dir_from () +{ + case $1 in + */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; + *) dir=;; + esac +} + +# Get the suffix-stripped basename of the given path, and save it the +# global variable '$base'. +set_base_from () +{ + base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` +} + +# If no dependency file was actually created by the compiler invocation, +# we still have to create a dummy depfile, to avoid errors with the +# Makefile "include basename.Plo" scheme. +make_dummy_depfile () +{ + echo "#dummy" > "$depfile" +} + +# Factor out some common post-processing of the generated depfile. +# Requires the auxiliary global variable '$tmpdepfile' to be set. +aix_post_process_depfile () +{ + # If the compiler actually managed to produce a dependency file, + # post-process it. + if test -f "$tmpdepfile"; then + # Each line is of the form 'foo.o: dependency.h'. + # Do two passes, one to just change these to + # $object: dependency.h + # and one to simply output + # dependency.h: + # which is needed to avoid the deleted-header problem. + { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" + sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" + } > "$depfile" + rm -f "$tmpdepfile" + else + make_dummy_depfile + fi +} + +# A tabulation character. +tab=' ' +# A newline character. +nl=' +' +# Character ranges might be problematic outside the C locale. +# These definitions help. +upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ +lower=abcdefghijklmnopqrstuvwxyz +digits=0123456789 +alpha=${upper}${lower} + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Avoid interferences from the environment. +gccflag= dashmflag= + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvisualcpp +fi + +if test "$depmode" = msvc7msys; then + # This is just like msvc7 but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvc7 +fi + +if test "$depmode" = xlc; then + # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. + gccflag=-qmakedep=gcc,-MF + depmode=gcc +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. +## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. +## (see the conditional assignment to $gccflag above). +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). Also, it might not be +## supported by the other compilers which use the 'gcc' depmode. +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The second -e expression handles DOS-style file names with drive + # letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the "deleted header file" problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. +## Some versions of gcc put a space before the ':'. On the theory +## that the space means something, we add a space to the output as +## well. hp depmode also adds that space, but also prefixes the VPATH +## to the object. Take care to not repeat it in the output. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like '#:fec' to the end of the + # dependency line. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ + | tr "$nl" ' ' >> "$depfile" + echo >> "$depfile" + # The second pass generates a dummy entry for each header file. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" + ;; + +xlc) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts '$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + aix_post_process_depfile + ;; + +tcc) + # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 + # FIXME: That version still under development at the moment of writing. + # Make that this statement remains true also for stable, released + # versions. + # It will wrap lines (doesn't matter whether long or short) with a + # trailing '\', as in: + # + # foo.o : \ + # foo.c \ + # foo.h \ + # + # It will put a trailing '\' even on the last line, and will use leading + # spaces rather than leading tabs (at least since its commit 0394caf7 + # "Emit spaces for -MD"). + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. + # We have to change lines of the first kind to '$object: \'. + sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" + # And for each line of the second kind, we have to emit a 'dep.h:' + # dummy dependency, to avoid the deleted-header problem. + sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" + rm -f "$tmpdepfile" + ;; + +## The order of this option in the case statement is important, since the +## shell code in configure will try each of these formats in the order +## listed in this file. A plain '-MD' option would be understood by many +## compilers, so we must ensure this comes after the gcc and icc options. +pgcc) + # Portland's C compiler understands '-MD'. + # Will always output deps to 'file.d' where file is the root name of the + # source file under compilation, even if file resides in a subdirectory. + # The object file name does not affect the name of the '.d' file. + # pgcc 10.2 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using '\' : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + set_dir_from "$object" + # Use the source, not the object, to determine the base name, since + # that's sadly what pgcc will do too. + set_base_from "$source" + tmpdepfile=$base.d + + # For projects that build the same source file twice into different object + # files, the pgcc approach of using the *source* file root name can cause + # problems in parallel builds. Use a locking strategy to avoid stomping on + # the same $tmpdepfile. + lockdir=$base.d-lock + trap " + echo '$0: caught signal, cleaning up...' >&2 + rmdir '$lockdir' + exit 1 + " 1 2 13 15 + numtries=100 + i=$numtries + while test $i -gt 0; do + # mkdir is a portable test-and-set. + if mkdir "$lockdir" 2>/dev/null; then + # This process acquired the lock. + "$@" -MD + stat=$? + # Release the lock. + rmdir "$lockdir" + break + else + # If the lock is being held by a different process, wait + # until the winning process is done or we timeout. + while test -d "$lockdir" && test $i -gt 0; do + sleep 1 + i=`expr $i - 1` + done + fi + i=`expr $i - 1` + done + trap - 1 2 13 15 + if test $i -le 0; then + echo "$0: failed to acquire lock after $numtries attempts" >&2 + echo "$0: check lockdir '$lockdir'" >&2 + exit 1 + fi + + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" + # Add 'dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in 'foo.d' instead, so we check for that too. + # Subdirectories are respected. + set_dir_from "$object" + set_base_from "$object" + + if test "$libtool" = yes; then + # Libtool generates 2 separate objects for the 2 libraries. These + # two compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir$base.o.d # libtool 1.5 + tmpdepfile2=$dir.libs/$base.o.d # Likewise. + tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + # Same post-processing that is required for AIX mode. + aix_post_process_depfile + ;; + +msvc7) + if test "$libtool" = yes; then + showIncludes=-Wc,-showIncludes + else + showIncludes=-showIncludes + fi + "$@" $showIncludes > "$tmpdepfile" + stat=$? + grep -v '^Note: including file: ' "$tmpdepfile" + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The first sed program below extracts the file names and escapes + # backslashes for cygpath. The second sed program outputs the file + # name when reading, but also accumulates all include files in the + # hold buffer in order to output them again at the end. This only + # works with sed implementations that can handle large buffers. + sed < "$tmpdepfile" -n ' +/^Note: including file: *\(.*\)/ { + s//\1/ + s/\\/\\\\/g + p +}' | $cygpath_u | sort -u | sed -n ' +s/ /\\ /g +s/\(.*\)/'"$tab"'\1 \\/p +s/.\(.*\) \\/\1:/ +H +$ { + s/.*/'"$tab"'/ + G + p +}' >> "$depfile" + echo >> "$depfile" # make sure the fragment doesn't end with a backslash + rm -f "$tmpdepfile" + ;; + +msvc7msys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for ':' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. + "$@" $dashmflag | + sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this sed invocation + # correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + # makedepend may prepend the VPATH from the source file name to the object. + # No need to regex-escape $object, excess matching of '.' is harmless. + sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process the last invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed '1,2d' "$tmpdepfile" \ + | tr ' ' "$nl" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E \ + | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + | sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" + echo "$tab" >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/doc/Makefile.am b/doc/Makefile.am new file mode 100644 index 0000000..c452a6a --- /dev/null +++ b/doc/Makefile.am @@ -0,0 +1,5 @@ +## $Id: Makefile.am,v 1.2 2001/01/15 15:16:08 aleidinger Exp $ + +include $(top_srcdir)/Makefile.am.global + +SUBDIRS = html man diff --git a/doc/Makefile.in b/doc/Makefile.in new file mode 100644 index 0000000..55cd6bc --- /dev/null +++ b/doc/Makefile.in @@ -0,0 +1,651 @@ +# Makefile.in generated by automake 1.15.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2017 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# global section for every Makefile.am +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = doc +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + distdir +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.global +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_DEFS = @CONFIG_DEFS@ +CONFIG_MATH_LIB = @CONFIG_MATH_LIB@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CPUCCODE = @CPUCCODE@ +CPUTYPE = @CPUTYPE@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FRONTEND_CFLAGS = @FRONTEND_CFLAGS@ +FRONTEND_LDADD = @FRONTEND_LDADD@ +FRONTEND_LDFLAGS = @FRONTEND_LDFLAGS@ +GREP = @GREP@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_CONFIG = @GTK_CONFIG@ +GTK_LIBS = @GTK_LIBS@ +INCLUDES = @INCLUDES@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDADD = @LDADD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_MAJOR_VERSION = @LIB_MAJOR_VERSION@ +LIB_MINOR_VERSION = @LIB_MINOR_VERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEDEP = @MAKEDEP@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NASM = @NASM@ +NASM_FORMAT = @NASM_FORMAT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM_F = @RM_F@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_FRONTEND = @WITH_FRONTEND@ +WITH_MP3RTP = @WITH_MP3RTP@ +WITH_MP3X = @WITH_MP3X@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = 1.15 foreign +SUBDIRS = html man +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.global $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign doc/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/Makefile.am.global $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(am__recursive_targets) install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ + check-am clean clean-generic clean-libtool cscopelist-am ctags \ + ctags-am distclean distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# end global section + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/doc/html/Makefile.am b/doc/html/Makefile.am new file mode 100644 index 0000000..f5d4152 --- /dev/null +++ b/doc/html/Makefile.am @@ -0,0 +1,26 @@ +## $Id: Makefile.am,v 1.9 2013/06/12 09:16:29 rbrito Exp $ + +AUTOMAKE_OPTIONS = foreign + +docdir = $(datadir)/doc +pkgdocdir = $(docdir)/$(PACKAGE) +htmldir = $(docdir)/html +pkghtmldir = $(pkgdocdir)/html + +pkghtml_DATA = \ + about.html \ + abr.html \ + cbr.html \ + contact.html \ + contributors.html \ + detailed.html \ + history.html \ + index.html \ + introduction.html \ + links.html \ + list.html \ + ms_stereo.html \ + usage.html \ + vbr.html + +EXTRA_DIST = $(pkghtml_DATA) diff --git a/doc/html/Makefile.in b/doc/html/Makefile.in new file mode 100644 index 0000000..ed3a03d --- /dev/null +++ b/doc/html/Makefile.in @@ -0,0 +1,537 @@ +# Makefile.in generated by automake 1.15.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2017 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = doc/html +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(pkghtmldir)" +DATA = $(pkghtml_DATA) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_DEFS = @CONFIG_DEFS@ +CONFIG_MATH_LIB = @CONFIG_MATH_LIB@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CPUCCODE = @CPUCCODE@ +CPUTYPE = @CPUTYPE@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FRONTEND_CFLAGS = @FRONTEND_CFLAGS@ +FRONTEND_LDADD = @FRONTEND_LDADD@ +FRONTEND_LDFLAGS = @FRONTEND_LDFLAGS@ +GREP = @GREP@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_CONFIG = @GTK_CONFIG@ +GTK_LIBS = @GTK_LIBS@ +INCLUDES = @INCLUDES@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDADD = @LDADD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_MAJOR_VERSION = @LIB_MAJOR_VERSION@ +LIB_MINOR_VERSION = @LIB_MINOR_VERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEDEP = @MAKEDEP@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NASM = @NASM@ +NASM_FORMAT = @NASM_FORMAT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM_F = @RM_F@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_FRONTEND = @WITH_FRONTEND@ +WITH_MP3RTP = @WITH_MP3RTP@ +WITH_MP3X = @WITH_MP3X@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = $(datadir)/doc +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = $(docdir)/html +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = foreign +pkgdocdir = $(docdir)/$(PACKAGE) +pkghtmldir = $(pkgdocdir)/html +pkghtml_DATA = \ + about.html \ + abr.html \ + cbr.html \ + contact.html \ + contributors.html \ + detailed.html \ + history.html \ + index.html \ + introduction.html \ + links.html \ + list.html \ + ms_stereo.html \ + usage.html \ + vbr.html + +EXTRA_DIST = $(pkghtml_DATA) +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/html/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign doc/html/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-pkghtmlDATA: $(pkghtml_DATA) + @$(NORMAL_INSTALL) + @list='$(pkghtml_DATA)'; test -n "$(pkghtmldir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pkghtmldir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pkghtmldir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkghtmldir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pkghtmldir)" || exit $$?; \ + done + +uninstall-pkghtmlDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkghtml_DATA)'; test -n "$(pkghtmldir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(pkghtmldir)'; $(am__uninstall_files_from_dir) +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(DATA) +installdirs: + for dir in "$(DESTDIR)$(pkghtmldir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pkghtmlDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pkghtmlDATA + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pkghtmlDATA install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am tags-am uninstall uninstall-am uninstall-pkghtmlDATA + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/doc/html/about.html b/doc/html/about.html new file mode 100644 index 0000000..a1ac817 --- /dev/null +++ b/doc/html/about.html @@ -0,0 +1,138 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> + <head> + <meta name="generator" content="PSPad editor, www.pspad.com" /> + <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> + <link rel="stylesheet" type="text/css" href="styles/lame.css" /> + <title>About the LAME encoder + + + +
+
+ +
+ LAME Official Logo +

About LAME

+
+ +

+ LAME development started around mid-1998. Mike Cheng started it as a patch + against the 8hz-MP3 encoder sources. After some quality concerns raised by + others, he decided to start from scratch based on the dist10 sources. His + goal was only to speed up the dist10 sources, and leave its quality untouched. + That branch (a patch against the reference sources) became Lame 2.0, and not + until Lame 3.81 (May 2000) the latest remainings of dist10 code were removed, + making LAME no more only a patch. +

+ +

+ The project quickly became a team project. Mike Cheng eventually left + leadership and started working on tooLame, an MP2 encoder. Mark Taylor became + leader and started pursuing increased quality in addition to better speed. He + can be considered the initiator of the LAME project in its current form. He + released version 3.0 featuring gpsycho, a new psychoacoustic model he + developed. +

+ +

+ In early 2003 Mark left project leadership, and since then the project has + been lead through the cooperation of the active developers (currently 4 + individuals). +

+ +

+ Today, LAME is considered the best MP3 encoder at mid-high bitrates and at + VBR1, mostly thanks to the dedicated work of its developers and the open + source licensing model that allowed the project to tap into engineering + resources from all around the world. Both quality and speed improvements are + still happening, probably making LAME the only MP3 encoder still being + actively developed. +

+ + +

LAME features:

+
    +
  • + Supports MPEG1, MPEG2 and MPEG2.52 layer III encoding. +
  • +
  • + Encodes in CBR (constant bitrate) and in two types of variable bitrate, VBR and ABR3, as well as freeformat. +
  • +
  • + Supports mono and stereo signals. Stereo signals are encoded by default with + an advanced algorithm4 to maximize the quality. +
  • +
  • + Tuned default parameters for optimum encoding. +
  • +
  • + Fast. Encodes to -V 2 at 17 times realtime on a P4 2.8Ghz. +
  • +
  • + Uses an advanced psycho acoustic and noise shaping model improved during years. +
  • +
  • + Developed under the LGPL + GNU license +
  • +
+
+
    +
  1. See the results of +several blind tests conducted by hydrogenaudio members. +
  2. +
  3. MPEG1 sample rates are 32Khz, 44.1Khz and 48Khz. +
    +MPEG2 sample rates are 16Khz, 22.05Khz and 24Khz. +
    + MPEG 2.5 does not exist as a standard. It is an extension from + fraunhofer that added the possibility + to encode in 8Khz, 11,025Khz and 12Khz. +
  4. +
  5. See Variable Bit Rate and +Average Bit Rate (ABR). +
  6. +
  7. The stereo encoding of LAME automatically switches between + Mid-Side and simple-stereo to maximize the available bits while preserving the + quality. More info in Mid/Side Stereo +
  8. +
+
+ +
+ +
+ + + diff --git a/doc/html/abr.html b/doc/html/abr.html new file mode 100644 index 0000000..44c0684 --- /dev/null +++ b/doc/html/abr.html @@ -0,0 +1,112 @@ + + + + + + + LAME MP3 Encoder ::Average Bit Rate (ABR) + + + +
+
+ +
+ LAME Official Logo +

LAME - Average Bit Rate (ABR)

+
+ +

Suggested usage:

+
lame --abr 128 input.wav output.mp3
+ +

+ ABR is a mix between CBR and VBR. +

+

+ Like CBR, the files will have the (approximate) bitrate specified in the + commandline, and uses the CBR algorithm to compute the number of bits needed + to encode each frame.
+

+ +

+ Like VBR, the files will use different frame bitrates so instead of relying on + bit reservoir like CBR, each frame just uses the smallest possible bitrate + that can encode it. +

+ +

+ The difference between ABR and true VBR is in how the desired number of bits + is chosen. The true VBR mode determines the number of bits based on the + quantization noise. VBR figures out how many bits are needed so that the + quantization noise is less than the allowed masking. +

+ +

+ ABR mode uses the CBR formula to determine the desired number of bits. This + formula is based on the perceptual entropy, which is a rough measure of how + difficult the frame is to encode. +

+

+The majority of frames in a VBR MP3 produced with an ABR method is normally at +or near the target bitrate chosen by the user, but each frame can still +potentially vary within the normal range of 8 to 320 kbps. The ABR encoder will +typically limit the range of bitrates it can choose from, or will greatly favor +certain bitrates, in an effort to ensure that the average comes out near the +target. +

+ +

Who should use ABR

+ +

+ABR encoding is desirable for users who want the general benefits of VBR (an +optimum bitrate from frame to frame) but with a relatively predictable file size +like they would get with constant bitrate (CBR), and a greater preference for +bitrates that are near a desired target. Inevitably, some frames will be encoded +with more bits than necessary, but the result will always be equal to or better +than that of CBR for the target bitrate. +

+ +
+ +
+ + + \ No newline at end of file diff --git a/doc/html/cbr.html b/doc/html/cbr.html new file mode 100644 index 0000000..35f43f6 --- /dev/null +++ b/doc/html/cbr.html @@ -0,0 +1,104 @@ + + + + + + + LAME MP3 Encoder :: Constant Bit Rate + + + +
+
+ +
+ LAME Official Logo +

LAME - Constant Bit Rate

+
+ +

Suggested usage:

+
lame -b 128 input.wav output.mp3
+ +

+CBR encoding is the basic encoding mode of MP3: The bitrate is kept constant +across the entire file, which means the same number of bits is allocated to +encode each second of audio, and internally, frames of audio data occur at +regular, predictable intervals, given a predictable file size for a given +duration. CBR is therefore the "opposite" of VBR. +

+

+That said, in some formats there may be some variability in the number of bits +that contain actual audio information from frame to frame. This concept manifests +in the bit reservoir of MP3s. In a CBR MP3, even though the frames are of +a fixed size, the audio data is not necessarily distributed consistently between +them; audio for one frame might use fewer bits than the frame has, so that frame +adds the spare bits to a reservoir that can supplement the bits allocated +to the next frame. Thus, the effective bitrate is allowed to vary somewhat in a +CBR MP3, even though there is a fixed number of frames for the duration of audio. +For example, for a 256kbps file, the bitrate of a single frame can be up to 320 +kbps, but the frame immediately before and/or after that one would have to use +fewer bits, whereas in VBR, there would be no such restriction. Consequently, the +amount of variability across the entire MP3 is not as great as that afforded by +VBR, but it is not insignificant; a CBR encoder that does not efficiently use +the reservoir will likely produce a lower quality file than one that does. +

+

+ABR is a more flexible way to encode where filesize is +important, but still giving some flexibility to choose frame sizes. +

+

Who should use CBR

+

+CBR is useful for people who are concerned about maintaining maximum +compatibility, especially with certain streaming applications and some +hardware-based decoders that don't reliably support VBR. +

+

+CBR is also useful for people who desire the ability to obtain accurate +estimates of the bitrate or approximate duration of a file's decoded audio +without scanning and partially decoding the entire file. +

+ +
+ +
+ + + \ No newline at end of file diff --git a/doc/html/contact.html b/doc/html/contact.html new file mode 100644 index 0000000..11947b5 --- /dev/null +++ b/doc/html/contact.html @@ -0,0 +1,126 @@ + + + + + + + LAME MP3 Encoder :: Contact Information + + + +
+
+ +
+ LAME Official Logo +

Contact Information

+
+ +

MP3 encoder mailing list

+ +

+ For general discussions and comments about LAME and MP3 encoding, you can + check the MP3 encoder mailing list. Keep in mind this + is not the preferred list if you want to get in touch with the + developers. +

+ +

+ Archives + are also available (older archives: before October + 2000) +

+ +

LAME development mailing list

+ +

+ The lame-dev + list is right place for everything related to LAME development: bug + reports, questions and suggestions concerning the encoder, the documentation + and the web pages. It's also the best way to get in touch with the active + developers. + Archives are provided by SourceForge. +

+ +

CVS mailing list

+ +

+ If you want to be automatically notified of commits to CVS, you can subscribe + to the lame-cvs + list. +

+ +

IRC

+ +

+ Some developers and other interested parties can eventually be found on the + #mp3encoder channel on the FreeNode + Network. +

+ +

Bug reports/tracker

+ +

+ To submit bug reports, you can use the bug + tracker besides the lame-dev mailing + list. Please be descriptive in your bug report. You should clearly mention + your problem, LAME version used and how to reproduce the bug. +

+ +

Contact developers

+ +

+ Here is the list of developers. If you encounter + a problem, please use any of the ways mentioned above instead of directly + contact a developer. +

+ +

Contact the Webmaster

+ +

+ The current Webmaster for the LAME project is Roberto Amorim. You can contact him through + e-mail. +

+ +
+ +
+ + + \ No newline at end of file diff --git a/doc/html/contributors.html b/doc/html/contributors.html new file mode 100644 index 0000000..eab23bb --- /dev/null +++ b/doc/html/contributors.html @@ -0,0 +1,191 @@ + + + + + + + LAME MP3 Encoder :: Developers + + + +
+
+ +
+ LAME Official Logo +

LAME Developers

+
+ +

+ Note: if possible, please do not contact developers directly, but proceed as + mentioned in the contact page. +

+ +

+ LAME was originally developed by Mike Cheng, from 1998 to 1999. After he + retired, the project started being maintained by Mark Taylor till early 2003. + After 2003, the project became managed by core developpers' teamwork, with no + official hierarchy or leadership. +

+ +

+ The following list only represents some of the individuals (in alphabetical + order of family name) that contributed resources to LAME development. LAME + owes its quality and speed to contributions from many other people, including + the many people who post to the mp3encoder mailing list. See + History for more complete details. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Primary developers:
Robert HegemannTuning, optimizations, psychoacoustics...
Alexander LeidingerMultiplatform configuration, libraries handling, release management...
Rogério BritoDebian packaging, debugging.
Primary developers - Retired:
Gabriel BouvigneTuning, optimizations, psychoacoustics...
Mike ChengMaintainer of LAME v2.x.
Frank KlemmPsychoacoustics, optimizations.
Naoki ShibataPsychoacoustics (NSPsytune model, NSSafeJoint).
Mark TaylorMaintainer of LAME v3.x, initial implementer of GPsycho psychoacoustic + model.
Takehiro TominagaPsychoacoustics, bitstream, optimizations, assembly code...
Additional developers:
Roberto AmorimWeb pages and documentation.
John DahlstromAdaptive ATH.
John DeeLAME extended VBR header.
Dominique DuvivierSpeed optimizations.
Albert FaberAuthor of CDex and lame_enc.dll.
Peter GubanovLAME DirectShow Filter.
Guillaume Lessard 
Steve LhommeLAME ACM codec.
Don Meltonid3v1 and v2 code.
Darin MorrisonPresets tuning.
Kyle VanderBeekPython bindings, website clean-up.
+ + + +
+ +
+ + + \ No newline at end of file diff --git a/doc/html/detailed.html b/doc/html/detailed.html new file mode 100644 index 0000000..085091a --- /dev/null +++ b/doc/html/detailed.html @@ -0,0 +1,1308 @@ + + + + + + + Detailed command-line switches + + + +
+
+ +
+ LAME Official Logo +

Detailed command line switches

+
+ +

Options ordered by feature

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SettingBrief description
Input options
By default, LAME accepts a PCM audio sample inside a .WAV +container as the input file, in 8, 16, 24 and 32 bits integer and in IEEE FLOAT. +If it is compiled with libsndfile, +then it also supports the extra formats that the library supports.
+There is also support for RAW PCM data and and piped input
-For piped/streamed Input, use "-" as the input and/or output + file name.
--out-dir pathIf no explicit output file is specified, a file will be written at given path. Ignored when using piped/streamed input
--mp1input1Input file is an MPEG + layer I file. Implicit if extension is .mp1
--mp2input1Input file is an MPEG + layer II file. Implicit if extension is .mp2
--mp3input1Input file is an MPEG + layer III file. Implicit if extension is .mp3
--scale numberScale input (multiply PCM data) by number.
--scale-l numberScale channel 0 (left) input (multiply PCM data +) by number
--scale-r numberScale channel 1 (right) input (multiply PCM data) + by number
--gain numberapply Gain adjustment in decibels, range -20.0 to +12.0.
--swap-channelSwap Left and Right channels
--nogap file1 file2 ...Gapless encoding for a set of contiguous + files
--nogapout dirOutput dir for gapless encoding (must precede + --nogap)
--nogaptagsAllow the use of VBR tags in gapless encoding
Input options for RAW PCM
-rAssume input file is raw PCM.
-s numberInput sampling frequency in kHz (Default is 44.1Khz)
--signed / --unsigned Input is signed (default) or unsigned
--bitwidth w Input bit width is w (default 16)
-x Force byte-swapping of input stream
--little-endian / --big-endian Input is little-endian (default) + or big-endian
-aDownmix from stereo to mono file for mono encoding. Needed with RAW input for the -mm mode to do the downmix.
Constant Bit Rate (CBR)
-b numberSet the bitrate in kbps, default 128 kbps
--cbrEnforce use of constant bitrate
--comp ratioChoose bitrate to obtain the specified compression + ratio
--freeformatProduce a free format bitstream instead of the +standard one. Supported bitrates between 8 and 640 kbps. Scarce support by +decoders.
Variable Bit Rate (ABR)
--abr numberSpecify average bitrate desired (instead of quality) +
Variable Bit Rate (VBR)
-V numberQuality setting for VBR. default number=4.
+ Decimal values can be specified, like: 4.51
+ 0=highest quality, bigger files. 9.999=lowest quality, + smaller files
--vbr-oldUse old variable bitrate (VBR) routine
-b numberSpecify a minimum allowed bitrate. default 32 kbps (See -F setting below)
-B numberSpecify a maximum allowed bitrate. default 320 kbps
-FEnforce -b option for digital silence frames too, rather than encoding them at 8 or 32 kbps.
-tDisable VBR informational tag
-TEnable and force writing LAME Tag
-YAllows -V2, -V1 and -V0 to not to encode the highest frequencies accurately, if doing so causes disproportional increases in bitrate. This is the same that CBR and ABR modes do.
Operational options
--preset typeEnables some preconfigured settings. Check below +for each of the valid values
--priority numberSets the process priority:
+ 0,1 = Low priority
+ 2 = normal priority (default)
+ 3,4 = High priority
--flushFlush output stream as soon as possible
--decodeInput=mp3 file, output=wav
--decode-mp3delay samplesSet the encoder delay to use to decode +the input .mp3 file
-tDisable writing wav header when using --decode
--noasm typeDisable assembly optimizations for mmx/3dnow/sse
Noise shaping & psycho acoustic algorithms
-q numbernumber = 0...9. Default -q 3
+ -q 0: Highest quality, very slow
+ -q 9: Poor quality, but fast
+ Please, see notes in the detailed description
-m modejoint, simple, force, dual-mono, + mono, left, right. default is j.
+ joint = joins the best possible of MS and LR stereo
+ simple = force LR stereo on all frames
+ force = force MS stereo on all frames.
Filter and resampling options:
--resample sfreqSampling frequency of output file(kHz)- +default=automatic
--lowpass numberFrequency(kHz), lowpass filter cutoff above freq. + Range [0.001..50]kHz or [50..50000]Hz
--lowpass-width numberFrequency(kHz), lowpass window width. Range [0.001..16]kHz or + [16..50000]Hz - (See further restriction in the detailed explanation)
--highpass numberFrequency(kHz), highpass filter cutoff below freq. Range [0.001..16]kHz or + [16..50000]Hz (See further restriction in the detailed explanation)
--highpass-width numberFrequency(kHz), highpass window width - (See further restriction in the detailed explanation)
ID3 tag Information
--tt titleAudio/song title (max 30 chars for version 1 tag)
--ta artistAudio/song artist (max 30 chars for version 1 tag)
--tl albumAudio/song album (max 30 chars for version 1 tag)
--ty yearAudio/song year of issue (1 to 9999)
--tc commentUser-defined text (max 30 chars for v1 tag, 28 for v1.1)
--tn track[/total]Audio/song track number and (optionally) the total + number of tracks on the original recording.
(track + and total each 1 to 255. just the track number + creates v1.1 tag, providing a total forces v2.0).
--tg genreAudio/song genre (name or number in list)
--ti fileAudio/song albumArt (jpeg/png/gif file, 128KB max, v2.3)
--tv id=valueText or URL frame specified by id and value (v2.3 tag). User defined frame. Syntax: --tv "TXXX=description=content"
--add-id3v2Force addition of version 2 tag
--id3v1-onlyAdd only a version 1 tag
--id3v2-onlyAdd only a version 2 tag
--id3v2-latin1Add following options in ISO-8859-1 text encoding
--id3v2-utf16Add following options in unicode text encoding
--space-id3v1Pad version 1 tag with spaces instead of nulls
--pad-id3v2-size nAdds ID3v2 tag with n padding bytes
--genre-listPrint alphabetically sorted ID3 genre list and exit
--ignore-tag-errorsIgnore errors in values passed for tags
+ Note: A version 2 tag will NOT be added unless one of the input fields + won't fit in a version 1 tag (e.g. the title string is longer than 30 + characters), or the '--add-id3v2' or '--id3v2-only' options are used, + or output is redirected to stdout.
MP3 header/stream options:
-e modeDe-emphasis n/5/c (obsolete)
-cMark as copyright
-oMark as non-original
-pError detection. adds 16 bit checksum to every frame + (the checksum is computed correctly)
--strictly-enforce-ISOComply as much as possible to ISO MPEG spec
--replaygain-fastCompute RG fast but slightly inaccurately (default)
--replaygain-accurate1Compute RG + more accurately and find the peak sample
--noreplaygainDisable ReplayGain analysis
--clipdetect1Enable + --replaygain-accurate and print a message whether + clipping occurs and how far the waveform is from full scale
Verbosity:
--disptime secsPrint progress report every secs seconds
--nohistDisable VBR histogram display
--silent / --quietDon't print anything on screen
--verbosePrint a lot of useful information
--version / --licensePrint License information
--help / --usageShows the common list of switches. Add id3 or dev to get help for a specified topic
--longhelpShows the complete list of switches
Experimental switches for developers. Only enabled in alpha/debug +versions. Can change from version to version
--noresDisables the bit reservour. Each frame will become independent from previous ones, but the quality will be lower.
--buffer-constraint xavailable values for x: default, strict, maximum
--noathturns ATH down to a flat noise floor
--athshortignore GPSYCHO for short blocks, use ATH only
--athonlyignore GPSYCHO completely, use ATH only
--athtype xselects between different ATH types [0-4]
--athlower xLower the ATH by x.x dB's
--athaa-type nATH auto adjust: 0 'no' else 'loudness based'
--athaa-sensitivity xactivation offset in -/+ dB for ATH auto-adjustment
--shortAllow the use of short blocs (default)
--noshortDisable use of short blocks
--allshortUse only short blocks
--shortthreshold x[,y]short block switching threshold, x for L/R/M channel, y for S channel
--temporal-masking xx=0 disables, x=1 enables temporal masking effect
--notempAlias of --temporal-masking 0
--nssafejointM/S switching criterion
--nsmsfix xM/S switching tuning [effective 0-3.5]
--ns-bass xAdjust masking for sfbs 0 - 6 (long) 0 - 5 (short)
--ns-alto xAdjust masking for sfbs 7 - 13 (long) 6 - 10 (short)
--ns-treble xAdjust masking for sfbs 14 - 21 (long) 11 - 12 (short)
--ns-sfb21 xChange ns-treble by x dB for sfb21
-Z [n]always do calculate short block maskings
--substepuse pseudo substep noise shaping method types 0-2
-X n[,m]selects between different noise measurements n for long block, m for short. if m is omitted, m = n
--vbr-newIn LAME 3.98, the new VBR was made default, and this switch may be used for experimental tweaks.
Aliases and removed settings
-fAlias of -q 7.
-hAlias of -q 2.
-vAlias of -V 4
-SAlias of --silent
--alt-presetAlias of --preset
--r3mixAlias of -V 3
--vbr-mtrhAlias of LAME 3.98 default vbr mode
--pad-id3v2Alias of --pad-id3v2-size 128
-dNo longer supported
-kNo longer supported
--cwlimitNo longer supported
--ogginputNo longer supported. Compile with +libsndfile instead
--briefCurrently unused
--interch xCurrently unused
--nspsytuneCurrently unused
+ +

Detailed description in alphabetical order

+ +

+-a Downmix +

+

+mix the stereo input file to mono and encode as mono.
+

+

+This option is only needed in the case of raw PCM stereo input +(because LAME cannot determine the number of channels in the input file). +To encode a stereo PCM input file as mono, use "lame -m m -a"
+

+

+For WAV and AIFF input files, using "-m m" will always produce a +mono .mp3 file from both mono and stereo input. +

+ +

+--abr n Average bitrate encoding (aka Safe VBR) +

+

+turns on encoding with a targeted average bitrate of n kbps, allowing +to use frames of different sizes. The allowed range of n is 8...320 +kbps, you can use any integer value within that range. +

+ +

+--add-id3v2 Force addition of version 2 tag +

+

+Tells LAME to add the tag information as id3v2. This implies adding both, a version 1 +and a version 2 tag, if the values fit on a version 1 tag. See --id3v1-only and +--id3v2-only if you want a more fine-grained control. +

+ +

+-b n Bitrate +

+ + + + + + + + + + + +
Codecsample frequencies (kHz)bitrates (kbps)
MPEG-1 layer III 32, 48, 44.132 40 48 56 64 80 96 112 128 160 192 224 256 320
MPEG-2 layer III 16, 24, 22.05 8 16 24 32 40 48 56 64 80 96 112 128 144 160
MPEG-2.5 layer III 8, 12, 11.0258 16 24 32 40 48 56 64
+

+The bitrate to be used. Default is 128kbps in MPEG1 (64 for mono), +64kbps in MPEG2 (32 for mono) and 32kbps in MPEG2.5 (16 for mono). +

+

+When used with variable bitrate encodings (VBR), -b specifies the +minimum bitrate to use. This is useful only if you need to circumvent +a buggy hardware device with strange bitrate constrains. (You will need the -F setting too for digital silence).
+Default for ABR/VBR is the minimum allowed bitrate for the MPEG version. (i.e. no limit) +

+ +

+-B n Max bitrate +

+

+see also option "-b" for allowed bitrates. +

+

+Maximum allowed bitrate when using VBR/ABR. +

+

+Using -B is NOT RECOMMENDED. A 128 kbps CBR bitstream, because of the +bit reservoir, can actually have frames which use as many bits as a +320 kbps frame. ABR/VBR modes minimize the use of the bit reservoir, and +thus need to allow 320 kbps frames to get the same flexibility as CBR +streams. This is useful only if you need to circumvent a buggy hardware +device with strange bitrate constrains.
+Default value is the maximum allowed bitrate for the MPEG versio (i.e. no limit) +

+ +

+--big-endian Set the byte order to big-endian. +

+

+This switch tells LAME that the RAW pcm input is encoded in big-endian instead +of little-endian. +

+ +

+--bitwidth Sets the bitwidth value +

+

+With RAW pcm input, this switch lets specify the bitwidth of the same (8 bits, + 16 bits...) +

+ +

+-c copyright flag +

+

+mark the encoded file as copyrighted +

+ +

+--cbr Enforce constant bitrate encoding +

+

This switch disables the VBR encoding. Examples:

+
lame -V 0 --cbr input.wav
+Will encode at -b 128 (ignore completely -V and encode at default bitrate) +
lame --preset 160 --cbr
+Will encode at -b 160 (ignore ABR and use the specified bitrate) +
lame --abr 200 --cbr
+Will encode at -b 192 (ignore ABR and use the nearest bitrate to the one specified) + +

+--clipdetect Clipping detection +

+

+Enable --replaygain-accurate and print a message whether clipping +occurs and how far in dB the waveform is from full scale. +

+

+This option is not usable if the MP3 decoder was explicitly disabled +in the build of LAME. +

+

+See also: --replaygain-accurate +

+ +

+--comp x Indicate a compression ratio instead of a bitrate +

+

+Use this in place of the -b setting if you prefer to indicate a compression ratio (integer value). +The ratio is the value of original-filesize/desired-filesize +

+ +

+--decode MP3 decode capability +

+

+This uses LAME's HIP2 decoder to decode an MP3 (layers 1, 2 and 3) file to a wav file. +

+

+If -t is used (disable wav header), LAME will output +raw pcm in native endian format (use -x to swap bytes). +

+

+This option is not usable if the MP3 decoder was explicitly disabled +in the build of LAME. +

+ +

+--decode-mp3delay x Indicate a different encoder delay +for decoding +

+

+When decoding an mp3 file, LAME automatically corrects for the start delay that +the encoder had to put into it.
+This setting lets you specify a different delay than LAME's own one, so that it +is possible to compensate for the delay of mp3's generated with other encoders. +

+ +

+--disptime secs Update the display each secs +

+

+Use this setting to change the frequency that LAME updates the display when +encoding a file. Allows decimal values (like 0.5) +

+ +

+-e n/5/c Write the de-emphasis flag +

+

+ n = (none, default)
+ 5 = 50/15 microseconds
+ c = ccitt j.17
+

+

+All this does is set a flag in the bitstream. If you have a PCM +input file where one of the above types of (obsolete) emphasis has +been applied, you can set this flag in LAME. Then the mp3 decoder +should de-emphasize the output during playback, although most +decoders ignore this flag. +

+

+A better solution would be to apply the de-emphasis with a standalone +utility before encoding, and then encode without -e. +

+ +

+-F Enforce the minimum bitrate +

+

+Enforces the minimum bitrate. Without this option, passages of analog +silence will be encoded at the minimum bitrate possible (32 or 8, depending on +MPEG version). +

+ +

+--flush Flush the output stream as soon as possible +

+

+This setting forces a flush of the data written as soon as the operation has +finished. This is mostly useful in case of streams. With files, it may degrade +performance, since the OS has to write to disk in smaller chunks. +

+ +

+--freeformat Encode to freeformat stream +

+

+LAME will produce a fixed bitrate, free format bitstream. +User must specify the desired bitrate in kbps, which can +be any integer between 8 and 640. +

+

+Not supported by most decoders. Compliant decoders (of which there +are few) are only required to support up to 320 kbps. +

+

+Decoders knwon to handle free format: +

+ + + + + +
Supports up to
MAD640 kbps
"lame --decode"640 kbps
l3dec310 kbps
+ +

+--gain Apply gain in decibels. +

+

+Apply Gain adjustment in decibels, range -20.0 to +12.0. 0dBFS means no amplification. +

+ +

+--genre-list Print alphabetical ordered list of +known genres +

+

+Tell LAME to print the list of genres with their index to be used with the --tg + setting. +

+ + +
123 Acappella
+ 34 Acid
+ 74 Acid Jazz
+ 73 Acid Punk
+ 99 Acoustic
+ 20 Alternative
+ 40 Alternative Rock
+ 26 Ambient
+145 Anime
+ 90 Avantgarde
+116 Ballad
+ 41 Bass
+135 Beat
+ 85 Bebob
+ 96 Big Band
+138 Black Metal
+ 89 Bluegrass
+ 0 Blues
+107 Booty Bass
+132 BritPop
+ 65 Cabaret
+ 88 Celtic
+104 Chamber Music
+102 Chanson
+ 97 Chorus
+136 Christian Gangsta
+ 61 Christian Rap
+141 Christian Rock
+ 32 Classical
+ 1 Classic Rock
+112 Club
+128 Club-House
+ 57 Comedy
+140 Contemporary Christian
+ 2 Country
+139 Crossover
+ 58 Cult
+ 3 Dance
+125 Dance Hall
+ 50 Darkwave
+ 22 Death Metal
+ 4 Disco
+ 55 Dream
+127 Drum & Bass
+122 Drum Solo
+120 Duet
+ 98 Easy Listening
+ 52 Electronic
+ 48 Ethnic
+ 54 Eurodance
+124 Euro-House
+ 25 Euro-Techno
+ 84 Fast Fusion
+ 80 Folk
+115 Folklore
+ 81 Folk-Rock
+119 Freestyle
+ 5 Funk
+ 30 Fusion
+ 36 Game
+ 59 Gangsta
+126 Goa
+ 38 Gospel
+ 49 Gothic
+ 91 Gothic Rock
+ 6 Grunge
+129 Hardcore
+ 79 Hard Rock
+137 Heavy Metal
+ 7 Hip-Hop
+ 35 House
+100 Humour
+131 Indie
+ 19 Industrial
+ 33 Instrumental
+ 46 Instrumental Pop
+ 47 Instrumental Rock
+ 8 Jazz
+ 29 Jazz+Funk
+146 JPop
+ 63 Jungle
+ 86 Latin
+ 71 Lo-Fi
+ 45 Meditative
+142 Merengue
+ 9 Metal
+ 77 Musical
+ 82 National Folk
+ 64 Native US
+133 Negerpunk
+ 10 New Age
+ 66 New Wave
+ 39 Noise
+ 11 Oldies
+103 Opera
+ 12 Other
+ 75 Polka
+134 Polsk Punk
+ 13 Pop
+ 53 Pop-Folk
+ 62 Pop/Funk
+109 Porn Groove
+117 Power Ballad
+ 23 Pranks
+108 Primus
+ 92 Progressive Rock
+ 67 Psychedelic
+ 93 Psychedelic Rock
+ 43 Punk
+121 Punk Rock
+ 15 Rap
+ 68 Rave
+ 14 R&B
+ 16 Reggae
+ 76 Retro
+ 87 Revival
+118 Rhythmic Soul
+ 17 Rock
+ 78 Rock & Roll
+143 Salsa
+114 Samba
+110 Satire
+ 69 Showtunes
+ 21 Ska
+111 Slow Jam
+ 95 Slow Rock
+105 Sonata
+ 42 Soul
+ 37 Sound Clip
+ 24 Soundtrack
+ 56 Southern Rock
+ 44 Space
+101 Speech
+ 83 Swing
+ 94 Symphonic Rock
+106 Symphony
+147 SynthPop
+113 Tango
+ 18 Techno
+ 51 Techno-Industrial
+130 Terror
+144 Thrash Metal
+ 60 Top 40
+ 70 Trailer
+ 31 Trance
+ 72 Tribal
+ 27 Trip-Hop
+ 28 Vocal
+ +

+--help Print the command line help. +

+

+Print the short command line help and exit. +

+ +

+--highpass number Use a highpass filter when encoding +

+

+Enables a highpass filter of the specified frequency when encoding the source. +Range [0.001..50]kHz or [50..50000]Hz.
+This is usually not required, and the gains are usually minimal. May be useful to +remove an interference signal on 50Hz or 60Hz, or a DC offset. (default: disabled)
+Note: The current implementation has a minimum highpass frequency of (67.5/62)% of the sample rate +(I.e. 481Hz at 44Khz). +

+ +

+--highpass-width width Set the width of the decaying curve. +

+

+Specify the width in Hz of the decaying curve of the highpass. Range [16..50000]Hz
+The minimum (and default) width is 75% of a band's width (which is 1/64th of the sample rate).
+Note: See the remark in the --highpass command above. +

+ +

+--id3v1-only Disable the use of id3v2. +

+

+Put it before any tag setting.
+This setting tells LAME to use ID3 v1 tag only, and not create an ID3v2 even if +it thinks it should. +

+ +

+--id3v2-only Disable the user ov id3v1. +

+

+Put it before any tag setting.
+This setting tells LAME to use ID3 v2 tag only. An ID3 v1 tag would not be written. +

+ +

+--ignore-tag-errors Ignore tag information errors +

+

+Put it before any tag setting.
+This tells lame to ignore the tag information that sees as erroneous and continue +encoding without those. Without this setting, errors are reported and encoding +does not start. +

+ +

+--license Print the license page +

+

+Prints version and license information about LAME encoder. +

+ +

+--little-endian Set the byte order to little-endian. +

+

+This switch tells LAME that the RAW pcm input is encoded in little-endian. It is +the default setting. +

+ +

+--longhelp Shows the detailed help +

+

+Prints a help page with all of the command-line switches and a brief explanation +of them. +

+ +

+--lowpass number Use a lowpass filter when encoding +

+

+Enables a lowpass filter of the specified frequency when encoding the source. +Range [0.001..50]kHz or [50..50000]Hz
+

+

+Using a lowpass filter helps reducing the amount of data to encode. This is +important in MP3 due to a limitation in very high frequencies (>16Khz). The +default value depends on the target bitrate/quality. It is not recommended to +change it as a general basis. +

+ +

+--lowpass-width width Set the width of the decaying curve. +

+

+Specify the width in Hz of the decaying curve of the lowpass. Range [0.001..16]kHz or [16..50000]Hz
+The lowpass is in the center of this curve. +The minimum (and default) width is 75% of a band's width (which is 1/64th of the sample rate). + +

+ +

+-m x Channel modes +

+ + + + + + + + +
-m mmono
-m lget only the left channel of a stereo signal for a mono output
-m rget only the right channel of a stereo signal for a mono output
-m sforced L/R stereo
-m j /
-m a
automatic switch between L/R and M/S stereo
-m fforced mid/side stereo
-m ddual (independent) channels.
+

+MONO is the default mode for mono input files. If "-m m" is specified +for a stereo input file, the two channels will be averaged into a mono +signal. (Note: See comments about the -a switch for RAW PCM streams) +

+

+FORCED L/R STEREO encodes the left and the right signals independently, and +gives more or less bits to each, depending on the currently available. +

+

+JOINT STEREO is the default mode of encoding. jstereo means the encoder can use +(on a frame by frame basis) either L/R stereo or mid/side stereo. +In mid/side stereo, the mid (L+R) and side (L-R) +channels are encoded, and more bits are allocated to the mid channel +than the side channel. When there isn't too much stereo separation, this effectively +increases the bandwidth, so having higher quality with the same amount of bits.
+Using mid/side stereo inappropriately can result in audible +compression artifacts. Too much switching between mid/side and regular +stereo can also sound bad. To determine when to switch to mid/side +stereo, LAME uses a much more sophisticated algorithm than the one +described in the ISO documentation. +

+

+FORCED MID/SIDE STEREO forces all frames to be encoded with mid/side stereo. It +should only be used if you are sure every frame of the input file +has very little stereo seperation. +

+

+DUAL CHANNEL mode is similar to encode the left and right as two mono signals. +Its purpose was meant for Dual language streams where only one of them should be decoded. +Most decoders just decode them as a stereo stream +

+ +

+--mp1input + --mp2input + --mp3input MPEG layer I, II or III input file +

+

+Assume the input file is an MP1/2/3 file. LAME will decode the input file +before re-encoding it. Since MP3 is a lossy format, this is +not recommended in general. But it is useful for creating low bitrate +mp3s from high bitrate mp3s. If the filename ends in ".mp3" LAME will assume +it is an MP3. For stdin or MP3 files which don't end in .mp3 you need +to use this switch. +

+ +

+--noasm value Disables the specified assembler +instructions +

+

+When the encoder is compiled with assembler optimizations, this setting allows +to disable them at runtime (They are only enabled if the CPU supports them). +The purpose of this setting is to detect problems in those optimizations, and/or +check the speed difference. +

+ +

+--nogap file1 file2 [...] Encodes multiple continuous +files. +

+

+Encodes multiple files (ordered by position) which are meant to be played +gaplessly. +

+

+By default, LAME will encode the files with accurate length, but the first and +last frame may contain a few erroneous samples for signals that don't fade-in/out +(as is the case of continuous playback). +

+

+This setting solves that by using the samples from the next/previous file to +compute the encoding. +

+ +

+--nogapout dir Specify a directory for the output +of the files encoded with --nogap +

+

+This setting should precede --nogap, and is used to specify the alternate +directory where to store the encoded files. The default one is the input file +directory. +

+ +

+--nogaptags Enables the use of VBR tags with files +encoded with --nogap +

+

+Tells LAME to put VBR tags to encoded files if they are encoded in VBR or ABR +modes. Else, using the --nogap option doesn't generate it. +

+ +

+--nohist Disable bitrate Histogram +

+

+By default, LAME will display a bitrate histogram while producing +VBR mp3 files. This will disable that feature. +

+ +

+--noreplaygain Disable ReplayGain analysis +

+

+By default ReplayGain analysis is enabled. This switch disables it. +

+

+See also: --replaygain-accurate, --replaygain-fast +

+ +

+-o non-original +

+

+Mark the encoded file as a copy +

+ +

+-p CRC error detection +

+

+Turn on CRC error protection. +It will add a cyclic redundancy check (CRC) code in each frame, allowing to +detect transmission errors that could occur on the MP3 stream. However, it +takes 16 bits per frame that would otherwise be used for encoding, and then +will slightly reduce the sound quality. +

+ +

+--pad-id3v2 Pad ID3v2 tag. +

+

+Pads the ID3v2 tag with extra 128bytes to allow it to expand. +

+ +

+--preset x Enable one of the presets +

+ + + + + + + + + + + + + + + + + + + +
SettingMeaning
--preset medium-V 5 --vbr-old
--preset standard-V 2 --vbr-old
--preset extreme-V 0 --vbr-old
--preset insane-b 320 --vbr-old
--preset fast xxxIn versions older than LAME 3.98, "fast" was needed to enable the vbr-new routine. It is no longer needed.
 
--preset number--abr number
--preset cbr number-b number
Old compatibility settings. Meaningless
--preset phone-b 16 -m m
--preset phon+ / lw / mw-eu-b 24 -m m
--preset mw-us-b 40 -m m
--preset voice-b 56 -m m
--preset fm / radio-b 112
--preset hifi-b 160
--preset cd-b 192
--preset studio-b 256
+ +

+--priority value Set process priority +

+

+(Windows and OS/2 only) +

+

+Sets the process priority for LAME while running under Windows and/or IBM OS/2. +This can be very useful to avoid the system becoming slow and/or +unresponsive. By setting LAME to run in a lower priority, you leave +more time for the system to update basic processing (drawing windows, +polling keyboard/mouse, etc). The impact in LAME's performance is +minimal if you use priority 0 to 2. +

+

+The valid parameters are: +

+ + + + + + + + + + + +
PriorityWindowsOS/2
0Low priority IDLE_PRIORITY_CLASSIDLE, delta = 0
1Medium priority IDLE_PRIORITY_CLASSIDLE, delta = +31
2Regular priority NORMAL_PRIORITY_CLASSREGULAR, delta = -31
3High priority HIGH_PRIORITY_CLASSREGULAR, delta = 0
4Maximum priority HIGH_PRIORITY_CLASSREGULAR, delta = +31
+

+Note that if you call '--priority' without a parameter, then +priority 0 will be assumed. +

+ +

+-q n Algorithm quality selection +

+

+Bitrate is of course the main influence on quality. The higher the bitrate, +the higher the quality. But for a given bitrate, we have a choice of algorithms +to determine the best scalefactors and Huffman coding (noise shaping). +

+

+For CBR, ABR and --vbr-old modes, the following table applies +

+ + + + + +
-q 0Use the best algorithms (Best Huffman coding search, full outer loop, and the highest precision of several parameters).
-q 1 to -q 4Similar to -q 0 without the full outer loop and with decreasing precision of parameters the further from -q 0. -q 3 is the default
-q 5 and -q 6Same as -q 7, but enables noise shaping and increases subblock gain
-q 7 to -q 9Same as -f. Very fast, OK quality. Psychoacoustics are used for pre-echo and mid/side stereo, but no noise-shaping is done.
+

+For the default VBR mode since LAME 3.98, the following table applies +

+ + + + +
-q 0 to -q 4include all features of the other modes and additionally use the best search when applying Huffman coding.
-q 5 and -q 6 include all features of -q7, calculate and consider actual quantisation noise, and additionally enable subblock gain.
-q 7 to -q 9This level uses a psymodel but does not calculate quantisation noise when encoding: it takes a quick guess.
+

+--quiet Don't print any output in the screen +

+

+Disables the screen output. Useful for job processing or other times where +screen output is undesirable. +

+ +

+-r Input file is raw pcm +

+

+Assume the input file is raw pcm. Sampling rate and mono/stereo +must be specified on the command line. Without -r, LAME will perform +several fseek()'s on the input file looking for WAV and AIFF headers. +

+

+Not supported if LAME is compiled to use LIBSNDFILE. +

+ +

+--replaygain-accurate Slightly more accurate + ReplayGain analysis and finding the peak sample +

+

+Compute "Radio" ReplayGain on the decoded data stream. Find the peak sample +by decoding on the fly the encoded data stream and store it in the file. +

+

+ReplayGain analysis does _not_ affect the content of a compressed data +stream itself, it is a value stored in the header of a sound file. +Information on the purpose of ReplayGain and the algorithms used is +available from http://www.replaygain.org/ +

+

+By default, LAME performs ReplayGain analysis on the input data (after +the user-specified volume scaling). This behaviour might give slightly +inaccurate results because the data on the output of a lossy +compression/decompression sequence differs from the initial input data. +When --replaygain-accurate is specified the mp3 stream gets decoded on +the fly and the analysis is performed on the decoded data stream. +Although theoretically this method gives more accurate results, it has +several disadvantages: +

+
    +
  • tests have shown that the difference between the ReplayGain values + computed on the input data and decoded data is usually no greater + than 0.5dB, although the minimum volume difference the human ear + can perceive is about 1.0dB +
  • +
  • decoding on the fly significantly slows down the encoding process
  • +
+The apparent advantage is that: +
    +
  • with --replaygain-accurate the peak sample is determined and + stored in the file. The knowledge of the peak sample can be useful + to decoders (players) to prevent a negative effect called 'clipping' + that introduces distortion into sound. +
  • +
+

+Only the "Radio" ReplayGain value is computed. It is stored in the LAME tag. +The analysis is performed with the reference volume equal to 89dB. +Note: the reference volume has been changed from 83dB on transition +from version 3.95 to 3.95.1. +

+

+This option is not usable if the MP3 decoder was _explicitly_ disabled +in the build of LAME. (Note: if LAME is compiled without the MP3 decoder, +ReplayGain analysis is performed on the input data after user-specified +volume scaling). +

+

+See also: --replaygain-fast, --noreplaygain, --clipdetect +

+ +

+--replaygain-fast Fast ReplayGain analysis +

+

+Compute "Radio" ReplayGain of the input data stream after user-specified +volume scaling and/or resampling. +

+

+ReplayGain analysis does _not_ affect the content of a compressed data +stream itself, it is a value stored in the header of a sound file. +Information on the purpose of ReplayGain and the algorithms used is +available from http://www.replaygain.org/ +

+

+Only the "Radio" ReplayGain value is computed. It is stored in the LAME tag. +The analysis is performed with the reference volume equal to 89dB. +Note: the reference volume has been changed from 83dB on transition +from version 3.95 to 3.95.1. +

+

+This switch is enabled by default. +

+

+See also: --replaygain-accurate, --noreplaygain +

+ +

+--resample n Output sampling frequency in kHz +

+

+where n = 8, 11.025, 12, 16, 22.05, 24, 32, 44.1, 48 +

+

+Output sampling frequency. Resample the input if necessary. +

+

+If not specified, LAME may sometimes resample automatically +when faced with extreme compression conditions (like encoding +a 44.1 kHz input file at 32 kbps). To disable this automatic +resampling, you have to use --resample to set the output sample rate +equal to the input sample rate. In that case, LAME will not +perform any extra computations. +

+ +

+-s n Sampling frequency in kHz +

+

+where n = sampling rate in kHz. +

+

+Required for raw PCM input files. Otherwise it will be determined +from the header information in the input file. +

+

+LAME will automatically resample the input file to one of the +supported MP3 sample rates if necessary. +

+ +

+--scale arg +--scale-l arg +--scale-r arg Scale the amplitude of the input file +

+

+Scales input by arg. This just multiplies the PCM data +(after it has been converted to floating point) by arg. +

+

+arg > 1: increase volume
+arg = 1: no effect
+arg < 1: reduce volume
+

+

+Use with care, since most MP3 decoders will truncate data +which decodes to values greater than 32768. +

+

+The l and r variants apply the scaling only to left (channel 0) or right +(channel 1) respectively. +

+ +

+--signed Input RAW uses signed values +

+

+Use with RAW pcm to indicate if the data is signed (values centered at zero) or +unsigned (all positive values). This is the default value. +

+ +

+--silent Don't print any output in the screen +

+

+Disables the screen output. Useful for job processing or other times where +screen output is undesirable. +

+ +

+--space-id3v1 Use spaces for padding. +

+

+Use spaces instead of null values for padding data in an ID3v1 tag. +

+ +

+--strictly-enforce-ISO Strict ISO compliance +

+

+With this option, LAME will enforce the 7680 bit limitation on +total frame size. This results in many wasted bits for +high bitrate encodings. Some decoders need it. +

+ +

+-t Disable VBR tag or disable WAV header +

+

This setting has two different uses:

+

+When encoding to VBR, this setting disables writing the VBR Tag (also known as XING tag). +This tag is embedded by default in the frame 0 of the MP3 file. It lets VBR aware players +to correctly seek and compute playing times in such files.
+

+

+When decoding MP3 to WAV using --decode, this flag will +disable writing the WAV header. The output will be raw pcm, +native endian format. Use -x to swap bytes. +

+ +

+-T Force the usage of the LAME tag +

+

+By default, LAME already adds a LAME tag when encoding. +This setting overrides the -t setting, and implies --nogaptags. +

+ +

+--unsigned Input RAW uses unsigned values +

+

+Use with RAW pcm to indicate if the data is signed (values centered at zero) or +unsigned (all positive values). +

+ +

+--usage Print the command line help. +

+

+Print the short command line help and exit. +

+ +

+-V n Enable VBR encoding +

+

+Encodes using the VBR algorithm, at the indicated quality.
+0=highest quality, bigger files. 9.999=lowest quality, smaller files. Decimal values can be specified, like: 4.51
+On average, the resulting bitrates are as follows: + + + + + + + + + + + +
SettingAverage bitrate (kbps)
0245
2190
3175
4165
5130
+ +

+

+Using -V 7 or higher (lower quality) is not recommended. +ABR usually produces better results. +

+ +

+--vbr-old Uses the old VBR method of encoding +

+

+Tells LAME to encode to VBR using the old (slower) method of encoding. +

+ +

+--verboseProgram verbosity +

+

+Print a lot of information on screen. +

+ +

+--version Prints the license page +

+

+Prints version and license information about LAME encoder. +

+ +

+-x Swap input bytes +

+

+swap bytes in the input file (and output file when using --decode). +For sorting out little endian/big endian type problems. If your +encodings sound like static, try this first. +

+ +

+-Y Ignore noise in sbf21, like CBR mode does +

+

+Allows -V2, -V1 and -V0 to not encode the highest frequencies accurately, +if doing so causes disproportional increases in bitrate. This is the same that +CBR and ABR modes do.
+Due to the design of the MP3 format, to keep precision in the last scalefactor +band, an encoder needs to increase the precision in all the bands (not only in +this one).
+The consequence is an increase of bitrate (+60kbps in some cases) compared to +not keeping that precision. Generally, this band should allow for distortions, +so using this switch shouldn't cause harm. +

+ +

  +

+ +
+
    +
  1. If compiled with decoding capabilities
  2. +
  3. HIP stands for Hip Isn't a Player and is based off of + Michael Hipp's mpglib 0.2a
  4. + +
+
+ +
+ +
+ + + diff --git a/doc/html/history.html b/doc/html/history.html new file mode 100644 index 0000000..63b60f5 --- /dev/null +++ b/doc/html/history.html @@ -0,0 +1,3532 @@ + + + + + + + + + + LAME Changelog + + + + + + + +
+

History

+ +
+ +Starting with LAME 3.0:
+ +red = features and bug fixes which +affect quality
+ +blue = features and bug fixes which +affect speed
+ +black = usability, portability, other + +
+

LAME 3.100   2017 (in preparation)

+
    +
  • Rogério Brito +
      +
    • + Don't include the debian directory as one that is needed during + builds. Patch taken from Debian's packaging of lame. +
    • +
    • + Resurrect Owen Taylor's code dated from 97-11-3 to properly deal + with GTK1. This was transplanted back from aclocal.m4 with a patch + provided by Andres Mejia. This change makes it easy to regenerate + autotools' files with a simple invocation of autoconf -vfi. +
    • +
    • + Fix possible race condition causing build failures in libmp3lame. + Discovered in automated builds by the Debian project with patch + provided by Andres Mejia. +
    • +
    +
  • +
  • Robert Hegemann +
      +
    • Improved detection of MPEG audio data in RIFF WAVE files. Tracker item [ 3545112 ] Invalid sampling detection +
    • +
    • New switch --gain <decibel>, range -20.0 to +12.0, a more convenient way to apply Gain adjustment in decibels, + than the use of --scale <factor>. +
    • +
    • Fix for tracker item [ 3558466 ] Bug in path handling +
    • +
    • Fix for tracker item [ 3567844 ] problem with Tag genre +
    • +
    • Fix for tracker item [ 3565659 ] no progress indication with pipe input +
    • +
    • Fix for tracker item [ 3544957 ] scale (empty) silent encode without warning +
    • +
    • Fix for tracker item [ 3580176 ] environment variable LAMEOPT doesn't work anymore +
    • +
    • Fix for tracker item [ 3608583 ] input file name displayed with wrong character encoding (on windows console with CP_UTF8) +
    • +
    • Fix for bug ticket [ #447 ] Fix dereference NULL and Buffer not NULL terminated issues. Thanks to Surabhi Mishra +
    • +
    • Fix for bug ticket [ #445 ] dereference of a null pointer possible in loop. Thanks to Renu Tyagi +
    • +
    • Fix for bug ticket [ #449 ] Make sure functions with SSE instructions maintain their own properly aligned stack. Thanks to Fabian Greffrath +
    • +
    • Fix for bug ticket [ #458 ] Multiple Stack and Heap Corruptions from Malicious File. Thanks to Gareth Evans and Elio Blanca +
    • +
    • Fix for bug ticket [ #460 ] A division by zero vulnerability. Thanks to Wang Shiyang, Liu Bingchang +
    • +
    • Fix for bug ticket [ #461 ] CVE-2017-9410 fill_buffer_resample function in libmp3lame/util.c heap-based buffer over-read and ap +
    • +
    • Fix for bug ticket [ #462 ] CVE-2017-9411 fill_buffer_resample function in libmp3lame/util.c invalid memory read and application crash +
    • +
    • Fix for bug ticket [ #463 ] CVE-2017-9412 unpack_read_samples function in frontend/get_audio.c invalid memory read and application crash +
    • +
    • Fix for bug ticket [ #434 ] clip detect scale suggestion unaware of scale input value +
    • +
    • HIP decoder bug fixed: decoding mixed blocks of lower sample frequency Layer3 data resulted in internal buffer overflow (write). Thanks to Henri Salo +
    • +
    +
  • +
  • Alexander Leidinger +
      +
    • Feature request, patch ticket [ #27 ] Add lame_encode_buffer_interleaved_int() by Michael Fink +
    • +
    +
  • +
+ +
+
+

LAME 3.99.5   February 28 2012

+
    +
  • Rogério Brito +
      +
    • autotools: Fix compilation on alpha using proper ifdef guards. Thanks to Andres Mejia. +
    • +
    • Small correction of the documentation. +
    • +
    +
  • +
  • Robert Hegemann +
      +
    • Workaround for cygwin build problem. Tracker item [ 3480692 ] mingw-w64 compilation error +
    • +
    • Fix for a problem when LAME is compiled with fast floating point math. It could result in bitrate bloat with silent input data. +
    • +
    • Bug fix for tracker item [ 3486753 ] Artifacts at the beginning of decoded file +
    • +
    +
  • +
+ +
+

LAME 3.99.4   January 25 2012

+
    +
  • Robert Hegemann +
      +
    • Fix for tracker item [ 3475581 ] lame crashes at .w64 input file +
    • +
    • Addressing things brought to attention by tracker item [ 3463197 ] 3.99.x problem WFED and PCST frames +
      • WFED and PCST frames can now be added, to tag podcasts iTunes recognizes
      • +
      • USER frames are now supported
      • +
      • COMM frames can now have a description, when passed via --tv "COMM=description=full text"
      • +
      • possible divide-by-zero exception should be fixed
      • +
      • adding malformed user-defined-frames could result in abnormal program termination, fixed
      • +
      +
    • +
    +
  • +
+ +
+

LAME 3.99.3   November 26 2011

+
    +
  • Robert Hegemann +
      +
    • Fix for tracker item [ 3441349 ] --tg does not handle genre number when adding unicode tag +
    • +
    +
  • +
+ +
+

LAME 3.99.2   November 18 2011

+
    +
  • Robert Hegemann +
      +
    • Due to some bugs in 3rd party HW/SW decoders, those were not + be able to make use of LAME's extended info tag anymore, + resulting in problems with things like gapless playback. +
    • +
    +
  • +
+ +
+

LAME 3.99.1   November 5 2011

+
    +
  • Robert Hegemann +
      +
    • Fixes for several issues with ID3v2 unicode tags, using Big-Endian text encodings. + Because of several other software (like Windows Media Player), + LAME writes Little-Endian unicode tags only.
      + Thanks to Taihei Monma, for reporting these issues. + Tracker items: [ 3431203, 3431222, 3431241 ] +
    • +
    +
  • +
+ +
+

LAME 3.99   October 15 2011

+
    +
  • 3.99 beta 1 becomes 3.99
  • +
+ +
+

LAME 3.99 beta 1   not yet released

+
    +
  • Robert Hegemann +
      +
    • Fix for Bugtracker item [ 3395813 ] id3tag_set_fieldvalue for URL link frames Broken +
    • +
    • Fix for Bugtracker item [ 3368977 ] Wave Parser doesn't pad chunks +
    • +
    • Fix for Bugtracker item [ 3034259 ] confusing fatal error: can't update LAME-tag frame! +
    • +
    +
  • +
+

LAME 3.99 beta 0   not officially released

+
    +
  • Josep Maria Antolín Segura +
      +
    • Documentation work +
    • +
    +
  • +
  • Rogério Brito +
      +
    • Improve Debian packaging. +
        +
      • Include suggestions made by Fabian Greffrath
      • +
      • Update version of the Debian package to reflect that it is taken from CVS.
      • +
      • Get rid of a transitional package
      • +
      • Much more to come...
      • +
      +
    • Minor fix to validate the history file correctly
    • +
    +
  • + +
  • Robert Hegemann +
      +
    • Porting of LAME mp3rtp program to Windows platform +
    • +
    • Fix: for free format mp3 above 320 kbps, the maximum allowed bits was limited too far. +
    • +
    • Changed behaviour: LAME replaces common suffixes by MP3/WAV when no output filename was given. For example, a simple lame x.wav will create output file x.mp3 +
    • +
    • UNICODE support on Windows OS, file names and ID3v2 tags; + related: Bugtracker item [ 3052230 ] Lame.exe can't find files with non-ASCII names +
    • +
    • Added support for WAVE FORMAT IEEE FLOAT input files +
    • +
    • New switch --swap-channel added, see tracker item [ 1118412 ] RFE: option to swap L and R channels +
    • +
    • New switches -m l and -m r to select either left or right channel for mono encoding. +
    • +
    • Feature request item [ 3134258 ] Allow larger images with LAME (>128KB) +
    • +
    • Fix for Bugtracker item [ 2962223 ] Encoder delay and padding values ignored when re-encoding +
    • +
    • Fix for Bugtracker item [ 2986823 ] Error when building Lame with NASM support -still exists +
    • +
    • Fix for Bugtracker item [ 3125235 ] make -f Makefile.mingw32 fails +
    • +
    • Fix for Bugtracker item [ 3021935 ] ID3 tag TXXX cannot be used more than once +
    • +
    • Fix for Bugtracker item [ 3025801 ] gain_analysis.h needs int constants +
    • +
    • Fix for Bugtracker item [ 3277412 ] Segmentation fault at layer2.c:105 with --decode +
    • +
    • Changes in new VBR code: +
        +
      • tuning on PSY model
      • +
      • tuning on VBR scale and resulting bitrates
      • +
      • Minor bug fix for sfb21 encoding
      • +
      +
    • +
    • All encoding modes use the PSY model from new VBR code, addresses Bugtracker item [ 3187397 ] Strange compression behavior +
    • +
    • Fix for a possible out of bounds array access in HIP decoder, addresses Bugtracker item [ 3091776 ] crash at III_dequantize_sample +
    • +
    +
  • +
+ +
+

LAME 3.98.4    March 22 2010

+
    +
  • Joseph Flynn +
      +
    • Improvements for LAME DirectShow filter: +
        +
      • Added support for the DirectShow IAMStreamConfig Interface to the LAME encoder filter output pin. +
      • +
      • Modified the DirectShow filter registration section so that the LAME Encoder filter is correctly registered in the Audio Compressors filter category. This will allow third-party encoding applications using the DirectShow System Device Enumerator Interface to correctly detect the LAME encoder when querying the Audio Compressors filter group. +
      • +
      • Modified the filter registration information so that the MP3 audio subtype is correctly reported as being supported on the encoder output pin. This will allow third-party encoding applications using the DirectShow IFilterMapper2 Interface to recognize that the LAME encoder supports MP3 output. +
      • +
      • Altered the Filter Merit Value that was being used when the filter was registered so that it is now using the standard DirectShow compressor filter merit value of MERIT_DO_NOT_USE (0x200000). Previously, the filter was being registered using a value of MERIT_SW_COMPRESSOR (0x100000), which was at a lower priority (i.e. worse priority) than MERIT_DO_NOT_USE. This prevented the LAME Encoder filter from being selected for use by some third-party encoding applications. +
      • +
      • Added code to calculate the frame length of the audio frames used for the nBlockSize element of the WAVEFORMATEX output structure. Previously this value was simply hard-coded to 1. +
      • +
      +
    • +
    +
  • + +
  • Robert Hegemann +
      +
    • Fix for Bugtracker item [ 2973877 ] A problem regarding the new drain code +
    • +
    +
  • +
+ +

LAME 3.98.3    February 27 2010

+
    +
  • Rogério Brito: +
      +
    • Update the debian packaging for the new release. +
    • +
    +
  • +
  • Robert Hegemann +
      +
    • The ignore-tag-errors switch had no effect when embedding album art, fixed.
    • +
    • Library API change: lame_decode functions are now obsolete but still present, please use hip_decode instead. + The reason for this change is: lame_decode functions use a single global variable within the library + to store decoder setup, hip_decode functions don't. + The encoder now uses hip_decode internally and it is now possible to use clipdetect + feature while reencoding mp3 to mp3. +
    • +
    • Workaround for FFMPEG bug, which uses to call lame_encode_flush more than once in a loop. +
    • +
    • Windows: program icon and version info added (when building with VC9) +
    • +
    • Fix for Bugtracker item [ 2688413 ] lib name problem in Microsoft Visual Studio 6 +
    • +
    • Fix for Bugtracker items [ 2051870, 2423650, 2928684 ] several small documentation issues +
    • +
    • Fix for Bugtracker item [ 2723518 ] resampling in 3.98 and 3.99alpha +
    • +
    • Fix for Bugtracker item [ 2891879 ] Because of Windows API change, there was a problem with the prority switch. +
    • +
    • Fix for Bugtracker item [ 2893101 ] Access Violation in BladeMP3EncDLL if UNICODE was defined. +
    • +
    • Fix for Bugtracker item [ 2887359 ] Wrong length in ID3v2 tag when num_samples isn't set +
    • +
    • Fix for Bugtracker item [ 2872590 ] LameTAG: "Music length" missmatch in LAME 3.98 +
    • +
    • Fix for Bugtracker item [ 2824296 ] wrong enc_padding value in LAME 3.99a and 3.98.3 (from CVS) +
    • +
    • Revisiting the FhG decoder problem (FhG V1.5 build 50, ships with MS Windows): + enabling the new-drain-code seems to solve that issue better, than restricting the buffer size (see below: 3.98 beta 1, May 16 2007). +
    • +
    • Patch submitted by Bernhard Doebler, tracker item [ 2807676 ] Error when building Lame with NASM support +
    • +
    • Patch submitted by Mancuso Raffaele, tracker item [ 2406420 ] compile lame_enc.dll under cygwin +
    • +
    +
  • +
+ +

LAME 3.98.2    September 22 2008

+
    +
  • Robert Hegemann +
      +
    • Fix for Bugtracker item [ 2123206 ] lame 3.98.1 segfaults with -h +
    • +
    +
  • +
+ +

LAME 3.98.1    September 21 2008

+
    +
  • Rogério Brito: +
      +
    • More fixes for the abx tool for Unix systems: +
        +
      • Plugged a memory leak.
      • +
      • Fixed an endianness problem: users of big-endian machines + can now do abx tests.
      • +
      +
    • +
    • Fixed history's HTML doctype
    • +
    • + Fixed history so that it finally validates + at W3's validator +
    • +
    • + Fixed compilation of frontend mp3rtp.c. Thanks to Kris Karas. + Bugtracker item [ 2015432 ] mp3rtp missing uint16_t in lame 3.98 +
    • +
    +
  • +
  • Robert Hegemann: +
      +
    • Fix for Bugtracker item [ 2031704 ] --id3v1-only didnt work in 3.98-final
    • +
    • Fix for Bugtracker item [ 2022035 ] encoder_padding value and resampling
    • +
    • Fix for Bugtracker item [ 2029282 ] Frequency filtering API broken in 3.98
    • +
    • Fix for Bugtracker item [ 2039648 ] potential memory leak in parse_args() function in parse.c
    • +
    • Fix for some tagging issues: +
        +
      • Made search for ID3v1 genres more sloppy, abbrevations may match more often as some simple typos. + Examples:
        • --tg "Alt. Rock" matches genre "Alternate Rock"
        • +
        • --tg "acapela" matches genre "A Cappella"
        • +
      • +
      • New switch --pad-id3v2-size "n": adds ID3v2 tag with n padding bytes.
      • +
    • +
    +
  • +
+ +
+

LAME 3.98    July 4 2008

+
    +
  • Anton Sergunov: +
      +
    • Frontend DirectShow: enabling LAME dshow filter to connect to "File Writer Filter". +
    • +
    +
  • +
  • Rogério Brito: +
      +
    • Updates to the Debian Packaging
    • +
    • Fixes to the abx tool for Unix systems (so that more people + can evaluate LAME's compression against the original files)
    • +
    +
  • +
  • Alexander Leidinger: +
      +
    • explicitely link the math lib to the lame lib
    • +
    • add switch to disable the use of the compaq optimized math lib
    • +
    +
  • +
+ +

LAME 3.98 beta 8   April 13 2008

+
    +
  • Robert Hegemann: +
      +
    • LAME now accepts a floating point value in the range [0,...,10[ as VBR quality setting, like -V5.678 +
    • +
    • Found and fixed some suspicious code in additive masking calculation for VBR-NEW +
    • +
    • bug-fix:experimental code was defaulted by accident for VBR-NEW +
    • +
    • fix for some endianess problem on big-endian machines +
    • +
    +
  • +
+ +

LAME 3.98 beta 7   April 6 2008

+ +
    +
  • Robert Hegemann: +
      +
    • libmp3lame API: allow frontends to separately retrieve LAME/Xing and ID3 data, because the old library automatism + makes it impossible to make fully buffered encodes. +
    • +
    • libmp3lame API: added some experimental unicode ID3 tagging code. +
    • +
    • frontends: write itself final ID3 tags and LAME/Xing header frame +
    • +
    • lame_enc.dll: writes itself final LAME/Xing header frame +
    • +
    • Latest changes to the new VBR psymodel: +
        +
      • uses a different spreading function +
      • +
      • bug-fix for out-of-bounds array access (program stack corruption possible) +
      • +
      +
    • +
    +
  • +
+ +

LAME 3.98 beta 6   December 16 2007

+ +
    +
  • Robert Hegemann: +
      + +
    • Feature request [ 1811483 ] WAVE_FORMAT_EXTENSIBLE support (PCM) +
    • + +
    • Fix for some rare scalefactor selection issue the newer vbr code had at low compression levels +
    • + +
    • Fix for Bugtracker item[ 1813496 ] AIFF parsing bug +
    • + +
    • Latest changes to the new VBR code: +
        + +
      • it now has its own psy model, a derivation from NSPSY. +
      • + +
      • some more tuning has been done for this new psy model. + Many thanks to Horst Albrecht and Myles Thaiss. +
      • + +
      • the "out-of-bits" strategy is reworked +
      • + +
      + +
    • It was possible, that the "interchannel masking effects feature" + was used by the dual-channel-mode for bi-lingual encodings too. It was meant to work + on stereo L/R channels only. +
    • + +
    +
  • +
+ +

LAME 3.98 beta 5   August 12 2007

+ +
    + +
  • Jonathan Stott: + +
      + +
    • Bug tracker items: [ 1590693 ] ID3v2 tag not writing, [ 1636267 ] ID3v2 tags overwritten
      + If the output file is opened 'write-only', then LAME can't update the LAME tag. + In this case LAME silently overwrote the first bytes of the file and an + optional ID3v2 tag disappeared. Now an error message will be printed and + no data is written in this case. +
    • + +
    + +
  • + +
  • Robert Hegemann: +
      + +
    • Fix for Bugtracker item [ 1719593 ] Track numbers > 255 not allowed even with --id3v2-only + +
    • Fix for Bugtracker item [ 1742623 ] fail(lame --mp3input -m m -b 128 --resample 8 *.mp3 **.mp3)
      + The problem here was, the input files are MPEG-1 Layer2 files named as MP3s. Even if you leave out + the --mp3input switch LAME tried to decode the input files as Layer3 files because of the file name + extension and because it found some valid looking Layer3 synchronization header. + The fixed LAME version does not assume the file name extension is always correct and treats the files + depending on the first found MPEG sync word. The files in question are now correctly detected as + Layer2 files and transcoding does succeed. +
    • + +
    • Fix for Bugtracker item [ 1445175 ] Input being stdin fails in Windows on WAV files
      + The problem here was, seeking on pipes shows some different behaviour depending on C-Library + implementations. The workaround tries to detect it's working on a pipe and doing some + reading instead of seeking in that case. +
    • + +
    • Fixing some memory leak in the 'lame_enc.dll'. +
    • + +
    • Fix for Bugtracker items [ 1160757, 1160741 ] --little-endian / --big-endian not working
      + These switches where originally intended to be used together with Libsndfile only. +
    • + +
    • Fix for Bugtracker item [ 1746336 ] Incorrect Bitrate with ABR und --resample, LAME 3.98b4
      + Some earlier bug-fix had some typo. As a result, when adding a '--resample 123' switch, + the average bitrate rised upto maximum bitrate. +
    • + +
    +
  • + +
+ +

LAME 3.98 beta 4   June 23 2007

+ +
    + +
  • Dennis Lambe Jr: Added support for total track count (id3v2) in the frontend +
  • + +
  • Nyaochi: +
      + +
    • Ability to set user-defined ID3v2.3 frame
    • + +
    • Ability to include albumArt in ID3v2.3 tag
    • + +
    + +
  • + +
  • Robert Hegemann: +
      + +
    • Bugfix: the "play length in ms", which is stored in the ID3v2 tag TLEN, was not correctly computed. + Some hardware and software players were confused by this garbage data.
    • + +
    • Out of bits strategy for the newer VBR code overhauled
    • + +
    • LAME API: the ID3 tag functions do not store the pointers passed anymore, + they do make deep copies of strings passed as parameters. +
    • + +
    • Changes in LAME frontend switches regarding ID3 tags: +
      --tg "MyGenre" will route unknown ID3v1 genres to "Other" for ID3v1 tags + and will be stored as plain text "MyGenre" for ID3v2 tags. Genres given by known + ID3v1 numbers will be stored as its corresponding text in ID3v2 tags. +
      --tn "02/02" will store the track number specified as plain text as-is + for ID3v2 tags. +
    • +
    + +
  • + +
+ +
+ +

LAME 3.98 beta 3   May 22 2007

+ +
    + +
  • Robert Hegemann: +
      + +
    • Fixes regarding max number of bits limitation
    • + +
    + +
  • + +
+ +
+ +

LAME 3.98 beta 2   May 20 2007

+ +
    + +
  • Robert Hegemann: +
      + +
    • Bug tracker item: [ 1693461 ]; + Fixed memory leaks in ACM codec
    • + +
    • Fixed encoding of non-standard sampling rates in CBR
    • + +
    • Improved VBR strategy when running out of bits
    • + +
    + +
  • + +
+ +
+ +

LAME 3.98 beta 1   May 16 2007

+ +
    + +
  • Alexander Leidinger: +
      + +
    • Add TLEN (ID3v2) support (Submitted by: Linus Walleij).
    • + +
    • Add number of total tracks per album (ID3v2) support +(Submitted by: Kyle VanderBeek).
    • + +
    • Some seatbelts for overflowing arrays in the ID3v2 +support.
    • + +
    • Update the RPM spec (Submitted by: Kyle VanderBeek).
    • + +
    • Fix some mem-leaks in the error case.
    • + +
    • Update to newer autotools versions.
    • + +
    • Update to use a recent libsndfile (submitted by +libsndfile author).
    • + +
    • Intrinsics support +enabled for gcc
    • + +
    + +
  • + +
  • Robert Hegemann: +
      + +
    • The newer VBR code is now LAME's default + VBR routine
    • + +
    • Fixed: in case of +not enough bits the new vbr code incorrectly used old vbr routine
    • + +
    • Improved ATH +adjustment in low volume cases
    • + +
    • Fixed (PSY model): mapping from convolution bands + to partition bands was broken since we replaced tables by own calculation + several years ago
    • + +
    • Fixed (PSY model): loss of fraction in equal loudness weighting
    • + +
    • Fixed (PSY model): in NSPSY highpass filter, out of bounds access in fircoef
    • + +
    • Known problem samples for the new VBR code: + many of them are at an acceptable quality level now; + with a big 'Thank You' to Francis Niechcial
    • + +
    • Modified VBR strategy to handle out of bits cases
    • + +
    • Restricted bitreservoir size for 320 kbps frames to + the size used for sideinfo, because of decoding problems + with FhG decoders installed on almost every Windows system
    • + +
    • LAME aborts on unsupported input files + or unrecognized parameter options passed more often now
    • + +
    • Bug tracker item: [ 1596306 ] "fatal error during initialization"; + an invalid MPEG samplerate was returned by optimum_samplefreq function
    • + +
    • Bug tracker item: [ 1585942 ] lame not --silent when TERM not set; + in case LAME was build with TERMCAP defined and no TERM + environment is defined, now we do not issue an error message and + silently fallback to the default behaviour as if LAME was + compiled without TERMCAP defined.
    • + +
    • Bug tracker item: [ 1711980 ] LAME writes invalid Xing header when ID3 tags exist; + LAME was sometimes writing an invalid Xing/Info header
    • + +
    • Feature request: [ 1588283 ] Flushing output stream in lame.exe; + 'flush' option added
    • + +
    • Added FFTSSE and FFT3DNOW assembler code from + Lame4 branch
    • + +
    • Changes in lame frontend switches: + -k removed, add lowpass and highpass switches if you need to change + them; --short/noshort/allshort - degraded into DEVELOPER ONLY switches + normal users shouldn't use them; -X -Z degraded to + DEVELOPER ONLY switches, -X is too tough to communicate to + end users and -Z isn't used actualy
    • + +
    • Fixed some console printing problems
    • + +
    • Windows: ACM code now uses LAME library API only, all + references to private include files are removed
    • + +
    • Windows: DirectShow code now uses LAME library API only, all + references to private include files are removed
    • + +
    • Windows: disabled code that resets processor affinity, + because this doesn't belong to LAME, but seems to work around + some problems the parent process has (in most cases EAC)
    • + +
    + +
  • + +
  • John33: +
      + +
    • Fixed mp2 and mp3 decoding: For mp3 and mp2 decoding, +this now yields the same output as foobar2000 but the error checking +remains unchanged
    • + +
    + +
  • + +
  • Gabriel Bouvigne: +
      + +
    • VC8 project files
    • + +
    • Added support for x64 under VC8
    • + +
    • Restricted MPEG 2.5 to 64kbps frames
    • + +
    + +
  • + +
  • Takehiro Tominaga: +
      + +
    • SSE version of FFT
    • + +
    + +
  • + +
+ +
+ +

LAME 3.97   September 24 2006

+ +
    + +
  • 3.97 beta 3 becomes 3.97
  • + +
+ +
+ +

LAME 3.97 beta 3   August 19 2006

+ +
    + +
  • Gabriel Bouvigne: +
      + +
    • Workaround against a +short blocks detection issue
    • + +
    + +
  • + +
+ +
+ +

LAME 3.97 beta 2   November 26 2005

+ +
    + +
  • Gabriel Bouvigne: +
      + +
    • Fixed an initialization error when input is not using a +standard sampling frequency
    • + +
    • Fixed a possible assertion failure in very low bitrate +encoding
    • + +
    • Slight change +regarding ATH adjustment with V5
    • + +
    • Reinstated bit +reservoir for 320kbps CBR
    • + +
    • ReplayGain analysis +should now be faster when encountering silent parts
    • + +
    + +
  • + +
  • Takehiro Tominaga: +
      + +
    • Fixed a possible link problem of assembly code
    • + +
    + +
  • + +
+ +
+ +

LAME 3.97 beta 1   September 12 2005

+ +
    + +
  • Takehiro Tominaga: +
      + +
    • Fixed an out of array access in mp3rtp
    • + +
    • Fixed a quality +setting in DLL
    • + +
    • Fixed display when using --silent
    • + +
    + +
  • + +
  • Vitaly Ivanov: +
      + +
    • Updated DirectShow interface
    • + +
    + +
  • + +
  • Robert Hegemann: +
      + +
    • Fixed an out of +array access
    • + +
    • Fixed some small +rounding problem in vbr-new quantization routines
    • + +
    • Fixed a bug in +vbr-new regarding high frequencies (sfb21) when using -Y
    • + +
    • Fixed a few bugs in +vbr-new when using -Y
    • + +
    • Updated scalefactors +allocation scheme in vbr-new
    • + +
    • Fixed mingw32 configure problems
    • + +
    • Resolved some compiler warnings
    • + +
    • Updated command-line visualisation
    • + +
    + +
  • + +
  • Gabriel Bouvigne: +
      + +
    • Changed some FLOAT8 to FLOAT
    • + +
    • Added project files for VC7
    • + +
    • Reworked -q1 and -q0
    • + +
    • Updated presets
    • + +
    • Fixed an error in +ISO quantization on systems not using the IEEE754 hack
    • + +
    • Faster quantization
    • + +
    • SSE version of +init_xrpow
    • + +
    + +
  • + +
  • Rogério Brito: +
      + +
    • Updated Debian packaging
    • + +
    • Documentation work
    • + +
    + +
  • + +
  • Chris Miller: +
      + +
    • Support for x64 platform SDK in makefile.msvc
    • + +
    + +
  • + +
+ +
+ +

LAME 3.96.1    July 25 2004

+ +
    + +
  • Robert Hegemann: +
      + +
    • Fixed a rare bug in +vbr-new (could lead to crashes or data corruption)
    • + +
    + +
  • + +
  • Gabriel Bouvigne: +
      + +
    • some fixes in ACM codec
    • + +
    • fixed padding when encoding to 320kbps
    • + +
    • fixed block size +selection for mid and side channels
    • + +
    + +
  • + +
+ +
+ +

LAME 3.96    April 11 2004

+ +
    + +
  • Gabriel Bouvigne: +
      + +
    • new quantization +selection mode (used in ABR/CBR)
    • + +
    • set sfscale for +ABR/CBR up to 160kbps
    • + +
    + +
  • + +
+ +
+ +

LAME 3.96 beta 2    March 28 2004

+ +
    + +
  • Takehiro Tominaga: +
      + +
    • removed unnecessary +integer convertion in resampling
    • + +
    + +
  • + +
  • Robert Hegemann: +
      + +
    • reworked scalefactor +allocation in vbr-new
    • + +
    • fixed a freeformat decoding problem
    • + +
    + +
  • + +
  • Gabriel Bouvigne: +
      + +
    • updated minimal +bitrate for V1 and V2
    • + +
    + +
  • + +
  • Aleksander Korzynski: +
      + +
    • added ability to disable ReplayGain analysis
    • + +
    + +
  • + +
+ +
+ +

LAME 3.96 beta    March 7 2004

+ +
    + +
  • Takehiro Tominaga: +
      + +
    • fixed decoding issue
    • + +
    + +
  • + +
  • Aleksander Korzynski: +
      + +
    • changed internal ReplayGain handling
    • + +
    • fixed some issues when ReplayGain is used with +resampling
    • + +
    + +
  • + +
  • Robert Hegemann: +
      + +
    • added standard ISO quantization for vbr-new, used at +lower quality settings
    • + +
    • faster count_bits +for vbr-new
    • + +
    • faster +find_scalefac_ave function for vbr-new
    • + +
    • fixed an out of +array access in psychoacoustic models; this bug could make some psy +calculations worthless and sometimes let lame crash
    • + +
    • fixed an error on +silent scalefactor bands; this bug resulted in huffman data overrun +problems while decoding, resulting in audible glitches
    • + +
    • fixed a freeformat decoding bug
    • + +
    + +
  • + +
  • Gabriel Bouvigne: +
      + +
    • adjusted short block +thresholds
    • + +
    • fixed some array addressing bugs
    • + +
    • made ReplayGain analysis reentrant
    • + +
    + +
  • + +
  • David Chandler: fixed a crash in quantize_xrpow
  • + +
  • Michal Bacik: fixed a crash when using 8kHz
  • + +
  • Goran Markovic: fixed some decoding bugs
  • + +
  • John Edwards: fixed a too small buffer in ReplayGain code
  • + +
+ +
+ +

LAME 3.95.1    January 12 2004

+ +
    + +
  • Gabriel Bouvigne: +
      + +
    • fixed a crash when using vbr-new
    • + +
    • changed ReplayGain reference level to 89dB
    • + +
    + +
  • + +
+ +
+ +

LAME 3.95    January 11 2004

+ +
    + +
  • Gabriel Bouvigne: +
      + +
    • fixed lowpass values +when using vbr with mono files
    • + +
    • faster quantization +loops
    • + +
    • faster count_bits
    • + +
    • fixed a buffer requirement error in ACM codec
    • + +
    + +
  • + +
  • Takehiro TOMINAGA: +
      + +
    • fixed mpglib and other decoding support code to prevent +the crash when invalid mp3 input
    • + +
    + +
  • + +
  • removed Layer I decoding support
  • + +
  • use FastLog and IEEE 754 +hack on PowerPC too (approx. 10 percent faster)
  • + +
+ +
+ +

LAME 3.94 beta December 15 2003

+ +
    + +
  • Takehiro Tominaga: +
      + +
    • fixed block +switching of nspsytune
    • + +
    • best huffman divide +in the inner loop. This should improve the quality, but +PAINFULLY slow. So it is not enabled by default. Use -q0 to use it.
    • + +
    • Changed -q option mapping. "-q2" until version 3.93 is +now "-q3".
    • + +
    • saving bits by +better scalefactor storing
    • + +
    • removed Vorbis support
    • + +
    • substep quantization.This +should help breaking the SFB21 bloating problem
    • + +
    • made psychoacoustic +model aware of ATH adjustements
    • + +
    • use ATH value as +short block masking lower limit
    • + +
    • several fixes in +psychoacoustic model
    • + +
    • more robust decoding
    • + +
    + +
  • + +
  • Mark Taylor / Gabriel Bouvigne: fixed issues in VBR header
  • + +
  • Mark Taylor: workaround against some hardware decoder +defficiencies
  • + +
  • Aleksander Korzynski: ability to compute the "Radio" +ReplayGain and detect clipping on the fly. The ReplayGain value is +stored in the Lame tag.
  • + +
  • Gabriel Bouvigne: +
      + +
    • work on presets
    • + +
    • use presets by +default for cbr/abr
    • + +
    • use presets by +default for vbr
    • + +
    • analog silence +detection in partitionned sfb21
    • + +
    • do not compute noise +in upper 0 part of the spectrum
    • + +
    • only compute noise +in modified scalefactor bands
    • + +
    + +
  • + +
  • Guillaume Lessard: +
      + +
    • nogap related changes
    • + +
    + +
  • + +
  • Alexander Leidinger: +
      + +
    • prevent closing the input fd prematurely if the input +is a named pipe
    • + +
    + +
  • + +
+ +
+ +

LAME 3.93.1    December 1 2002

+ +
    + +
  • Gabriel Bouvigne: +
      + +
    • preset medium added to the dll interface
    • + +
    • fix for abr/cbr +presets
    • + +
    • fix -q0 switch
    • + +
    + +
  • + +
  • Alexander Leidinger: fix link problem on systems where +socket() resides in libsocket
  • + +
+ +
+ +

LAME 3.93    November 16 2002

+ +
    + +
  • Takehiro Tominaga: +
      + +
    • bit allocation for +pre-echo control improved for single channel encodings
    • + +
    • substep noise shaping
    • + +
    • optimizations by +changing data structure
    • + +
    • noise shaping model +2 fix
    • + +
    • nspsytune FIR filter +clean up
    • + +
    • fix small psymodel +bugs(DC current estimation, preecho detection of non-VBR mode, and +nspsymode initialization)
    • + +
    • portability fixes for Tru64 UNIX
    • + +
    + +
  • + +
  • Albert Faber: some fixes in the DLL
  • + +
  • Simon Blandford: fixes for channel scaling in mono mode
  • + +
  • Dominique Duvivier: some +optimizations and a faster log10 function
  • + +
  • Mark Taylor: +
      + +
    • some tag related fixes in the direct show filter and in +the ACM codec
    • + +
    • fixed a mono +encoding bug found by Justin Schoeman
    • + +
    • calc_noise bug fix
    • + +
    • other fixes
    • + +
    + +
  • + +
  • Alexander Leidinger: +
      + +
    • update to autoconf 2.53, rewrite some configure tests
    • + +
    • Akos Maroy: determine gcc version even with gcc 3.1
    • + +
    • Andrew Bachmann: compile shared libs on BeOS (and +perhaps other arches)
    • + +
    • ultrasparc switches for gcc 3.1
    • + +
    • fixes for SunOS 4.x
    • + +
    • fixes for 64bit arches
    • + +
    • CFLAGS fix for IRIX
    • + +
    • don't override CFLAGS if exptopt isn't requested
    • + +
    + +
  • + +
  • Robert Hegeman: +
      + +
    • some fixes
    • + +
    • some fixes for VBR
    • + +
    + +
  • + +
  • Gabriel Bouvigne: +
      + +
    • --noasm switch. Might help Cyrix/Via users
    • + +
    • presets and +alt-presets merged
    • + +
    + +
  • + +
+ +
+ +

LAME 3.92    April 14 2002

+ +
    + +
  • Alexander +Leidinger:  add non linear psymodel (compile time option, +disabled by default), workaround a bug in gcc 3.0.3 +(compiler options, based upon suggestions from various people, see +archives and changelog for more)
  • + +
  • Steve Lhomme:  ACM wrapper (MS-Windows codec)
  • + +
  • Steve Lhomme:  +less memory copying on stereo (interleaved) input
  • + +
  • Takehiro Tominaga: +Inter-channel masking, enables with --interch x option
  • + +
  • For buggy versions of gcc compiler (2.96*), back off on +some of the advanced compiler options
    + +
  • + +
+ +
+ +

LAME 3.91    December 29 2001

+ +
    + +
  • Darin +Morrison:  Bugfix for --alt-preset (for content with low +volume, clean vocals), only important for the "fast standard" preset +
  • + +
  • Alexander Leidinger: +
      + +
    • add some missing files to the distribution
    • + +
    • add --alt-preset to the man page
    • + +
    + +
  • + +
+ +
+ +

LAME 3.90    December 21 2001

+ +
    + +
  • Many small improvements +and bug fixes not added to history
  • + +
  • John +Dahlstrom:  more fine tuning on the auto adjustment of the ATH
  • + +
  • Robert +Hegemann:  small speed and quality improvements for the old +VBR code (--vbr-old).
  • + +
  • Robert +Hegemann:  some short block bug fixes
  • + +
  • Robert +Hegemann:  Big improvements to --vbr-mtrh, now encodes much +more frequencies over 16khz
  • + +
  • Robert +Hegemann:  --vbr-new code disabled (outdated and lower +quality) and replaced with --vbr-mtrh (Both --vbr-new and --vbr-mtrh +now default to mtrh)
  • + +
  • Robert Hegemann:  reordering of --longhelp to give +more information, --extrahelp dropped
  • + +
  • Darin Morrison:  Totally revamped and extremely +high quality unified preset system and other general quality +improvements now available with --alt-presets: +
      + +
    • some improvements +to psychoacoustics (vast improvements over default L.A.M.E. modes) when +--alt-preset is used including: + +
        + +
      • Improved tuning +of short block usage.
      • + +
      • Improved +quantization selection usage (the -X modes), now adapts between +appropriate modes on the fly. Also helps on "dropout" problems and with +pre-echo cases.
      • + +
      • Improved joint +stereo usage. Thresholds are better tuned now and fix some "dropout" +problems L.A.M.E. suffers from on clips like serioustrouble.
      • + +
      • Improved noise +shaping usage. Now switches between noise shaping modes on the fly +(toggles -Z on and off when appropriate) which allows lower bitrates +but without the quality compromise.
      • + +
      • Clips vastly +improved over default L.A.M.E. modes (vbr/cbr/abr, including --r3mix): +castanets, florida_seq, death2, fatboy, spahm, gbtinc, ravebase, short, +florida_seq, hihat, bassdrum, 2nd_vent_clip, serioustrouble, bloodline, +and others. No degraded clips known.
      • + +
      • VBR bitrates are now more "stable" with less +fluctuation -- not dipping too low on some music and not increasing too +high unnecessarily on other music. "--alt-preset standard" provides +bitrates roughly within the range of 180-220kbps, often averaging close +to 192kbps.
      • + +
    • + +
    • --alt-presets replace the --dm-presets and "metal" +preset is removed and replaced with generic abr and cbr presets.
    • + +
    • --alt-preset extreme (note the 'e') replaces xtreme to +help eliminate some confusion
    • + +
    • --alt-preset vbr modes now have a fast option which +offers almost no compromise in speed.
    • + +
    • --alt-preset standard (and "fast standard") are now +much lower in bitrate, matching --r3mix with an overall average, though +offering higher quality especially on difficult test samples.
    • + +
    • --alt-presets are no longer just "presets" as in a +collection of switches, instead they are now quality "modes" because of +special code level tunings (those mentioned above).
    • + +
    • Use --alt-preset help for more information.
    • + +
    + +
  • + +
  • Roel VdB: more tuning on the --r3mix preset
  • + +
  • Jon Dee, Roel VdB:  INFO tag
  • + +
  • Alexander Leidinger, mp3gain@hotmail.com:  added +--scale-l and --scale-r to scale stereo channels independantly
  • + +
  • Takehiro Tominaga:  new +noise shaping mode, offering more "cutting edge" shaping according to +masking, enabled via -q0
  • + +
  • Mark Taylor:  More work on --nogap
  • + +
  • Gabriel Bouvigne:  Small changes to abr code for +more accurate final bitrate
  • + +
  • Gabriel Bouvigne, mp3gain@hotmail.com:  +Preliminary +ReplayGain analysis code added (not functional yet)
  • + +
  • Gabriel Bouvigne, Alexander Leidinger:  +Documentation updates
  • + +
  • John Dahlstrom, DSPguru@math.com:  floating point +interface function in the Windows DLL
  • + +
+ +
+ +

LAME 3.89beta   July 5 2001

+ +
    + +
  • John Stewart:  long filename support for Win9x/NT.
  • + +
  • Takehiro Tominaga:  LAME can calculate the CRC of +VBR header, so now "lame -pv" works fine.
  • + +
  • Robert +Hegemann:  Improvements of the new VBR code (--vbr-mtrh).
  • + +
  • Robert Hegemann: New VBR +code (--vbr-mtrh) is now defaulted to get more feedback. The VBR speed +is now on par with CBR. We will use the old VBR code in the release.
  • + +
  • Gabriel Bouvigne: Change +of the maximum frame size limit. LAME should now be more friendly with +hardware players.
  • + +
  • Gabriel Bouvigne: Size of VBR is now more balanced +according to the -V value.
  • + +
  • Alexander Leidinger: Finished the implementation of the +set/get functions.
  • + +
  • John Dahlstrom: LAME now handles 24bits input
  • + +
  • Mark Taylor: bugs in lame --decode causing truncation of +mp3 file fixed
  • + +
  • Mark Taylor: preliminary --nogap support
  • + +
  • "Final" API completed: shared library safe!  This +API is frozen and should be backwords compatiable with future versions +of libmp3lame.so, but we will continue to add new functionality. + 
    + +
  • + +
+ +

LAME 3.88beta   March 25 2001

+ +
    + +
  • A lot of work that was +never added to the History!
  • + +
  • Frank Klemm and +Gabriel Bouvigne:  New ATH formula.  Big improvement +for high bitrate encodings.
  • + +
  • Takehiro Tominaga: +Temporal masking
  • + +
  • Gabriel Bouvigne/Mark +Taylor: auto adjustment of ATH
  • + +
  • Robert +Hegemann:  Better outer_loop stopping criterion.  +Enabled with -q2 or better.
  • + +
  • Robert Hegemann/Naoki +Shibata:  slow/carefull noise shaping.  +-q3..9:  amplify all distorted bands.  -q2: amplify +distorted bands within 50%.  -q1-0:  amplify only +most distorted band at each iteration.
  • + +
  • Takehiro Tominaga: +Interframe, shortblock temporal masking.
  • + +
  • Takehiro Tominaga:  LAME restructured into a +shared library and front end application.  Slight changes to +the API. More changes are coming to turn LAME into a true shared +library (right now you have to recompile if you upgrade the library :-(
  • + +
  • Naoki Shibata: + +
      + +
    • improvements to + psychoacoustics + (--nspsytune) + +
    • BUG in long block + pre echo control fixed + (some out of range array access in M/S psychoacoustics)
    • + +
    +
  • + +
  • Ralf +Kempkens:    Visual Basic Script for lame, +suggested to put it on your Windows Desktop and you can drag'n'drop +Waves to encode on it.
  • + +
  • Alexander +Stumpf:    improved lame.bat for 4Dos users
  • + +
  • Mark Taylor: Several +bugs fixed in the resampling code.
  • + +
  • Frank Klemm, Robert +Hegemann:    added assembler code for CPU +feature detection on runtime (MMX, 3DNow, SIMD)
  • + +
  • Takehiro Tominaga: +3DNow FFT code.
  • + +
  • Florian Bome, +Alexander Leidinger:    more work on +configure stuff
  • + +
  • Alexander +Leidinger:   automake/libtool generated Makefiles and +TONS of other work.
  • + +
  • Alexander +Leidinger:   Much work towards shared library style +API.
  • + +
  • Anonymous: New more +efficient RTP code.
  • + +
  • Mark Taylor: +psycho-acoustic data now computed for all scalefactor bands (up to 24 +kHz)
  • + +
  • Mark Taylor, Takehiro +Tominaga: All ISO table data replaced by formulas - should improve +MPEG2.5 results for which we never had correct table data.
  • + +
+ +

LAME 3.87alpha  September 25 2000

+ +
    + +
  • Mark Taylor:  Bug fixed in LAME/mpglib error +recovery when encountering a corrupt  MP3 frame during +*decoding*.
  • + +
  • Albert Faber:  added LayerI+II decoding support
  • + +
  • Frank Klemm:  +added improved CRC calculation
  • + +
  • Frank Klemm: +substantial code cleanup/improvements
  • + +
  • Robert Hegemann:  Bug fixes + +
      + +
    • in huffman_init, +could lead to segmentation faults (only in rare cases, most likely at +lower sample rates)
    • + +
    • M/S switching at +lower sample rates (the fact there is no 2nd granule was +ignored)
    • + +
    +
  • +
  • Robert +Hegemann:  speed up in  VBR
  • + +
  • Jarmo Laakkonen:  Amiga/GCC settings for +Makefile.unix.
  • + +
  • Magnus Holmgren:  README and Makefile for (free) +Borland C++  compiler. Will also compile lame_enc.dll, but +this is untested.
  • + +
  • Florian Bome:   LAME finally has +a  ./configure script!!
  • + +
+ +

LAME 3.86beta  August 6 2000

+ +
    + +
  • Christopher Wise:  A makefile for DJGPP, the DOS +version of gcc.  Now most windows users should be able to +compile LAME with minimal effort.
  • + +
  • Robert +Hegemann:  old VBR:   fixed some bugs and +Takehiro's scalefac_scale feature (not yet on by  +default.)  older LAME versions did not allow to spent more +than 2500 bits of 4095 possible bits to a granule per channel, now +fixed.
  • + +
  • Robert Hegemann:  new VBR:   +analog silence treatment like in old VBR
  • + +
  • William Welch:  Improved options for Linux/Alpha +gcc and ccc compilers in Makefile.
  • + +
  • Mathew Hendry:  setting appropriate CRC bit for +additional Xing-VBR tagging frame
  • + +
  • Don Melton:  added ID3 version 2 TAG support
  • + +
  • John Dahlstrom: fixed +bug allowing timing information (for status in command line encoder) to +overflow.
  • + +
  • Tamito KAJIYAMA, Fixed +several bugs in the LAME/Vorbis interface.
  • + +
  • Mark Taylor:  +lame --decode will recognize Album +ID tags
  • + +
  • Naoki +Shibata:  Additive masking and other improvements to psycho +acoustics.  (not yet on by default)
  • + +
+ +

LAME 3.85beta   July 3 2000

+ +
    + +
  • Takehiro +Tominaga:  mid/side stereo demasking thresholds updated.
  • + +
  • Takehiro Tominaga: New short block MDCT coefficient data +structure.  Should allow for future speed improvements.
  • + +
  • Robert Hegemann:  fixed bug in old VBR routine, +the --noath mode messed up the VBR routine resulting in very large files
  • + +
  • Robert Hegemann: found bugs in some sections when using 32 +bit floating point.  Default is now back to 64bit floating +point.
  • + +
  • Takehiro +Tominaga:  Modified PE formula to use ATH.
  • + +
  • S.T.L.:  +README.DJGPP - instructions for compiling LAME with DJGPP, the dos +version of gcc.
  • + +
+ +

LAME 3.84beta  June 30  2000

+ +
    + +
  • Mark Weinstein:  .wav file output (with --decode +option) was writing the wrong filesize in the .wav file.  Now +fixed.
  • + +
  • Mark Taylor:  (optional) Vorbis support, both +encoding and decoding.  LAME can now produce .ogg files, or +even re-encode your entire .ogg collection into +mp3.   (Just kidding: it is always a bad idea to +convert from one lossy format to another)
  • + +
  • ?: Bug fixed causing VBR to crash under +windows.   (pretab[] array overflow)
  • + +
  • Sergey Sapelin: Another bug found in the mpg123 MPEG2 +tables.  Now fixed for the mpg123 based decoder in LAME.
  • + +
  • Marco Remondini:  VBR histogram works in +win32.  compile with -DBRHIST -DNOTERMCAP
  • + +
  • Takehiro +Tominaga:  LAME CBR will now use scalefac_scale to expand the +dynamic range of the scalefactors.
  • + +
  • Iwasa Kazmi:  +Library improvements:  exit()'s, printf, fprintf's are being +replaced by interceptable macros.
  • + +
+ +

LAME 3.83beta  May 19  2000

+ +
    + +
  • Mark Taylor:  +Bug in buffering routines:  in some cases, could cause +MDCT  to read past end of buffer.  Rare in MPEG2, +even more rare for MPEG1, but potentially serious!
  • + +
  • Mark Taylor:  MDCT/polyphase filterbank was not +being "primed" properly.  Does not effect output unless you +set the encoder delay lower than the default of 576 samples.
  • + +
  • Mark Taylor:  +"vdbj" and "Caster"  found several VBR bugs (now +fixed):   1.  Analog silence detection only +checked frequencies up to 16 kHz.  2.  VBR mode could +still somehow avoid -F mode.  3.  VBR mode would +ignore noise above 16 kHz (scalefactor band 22), Now calc_noise1 will +compute the noise in this band when in VBR mode.  Not +calculated in CBR  mode since CBR algorithm has no way of +using this information.
  • + +
  • Mark Taylor:  scalefactor band 22 info +(masking(=ATH),  noise and energy) now displayed in frame +analyzer.
  • + +
  • VBR code ATH tuning +was disabled by accident in 3.81, now fixed.
  • + +
  • Mark Taylor:  +lame --decode will produce .wav files.  (oops - size is off by +a factor of 4)
  • + +
+ +

LAME 3.82beta   May 11 2000

+ +
    + +
  • Robert Hegemann:  Fixed bug in high bitrate joint +stereo encodings.
  • + +
  • Naoki +Shibata:  new long block MDCT routine
  • + +
+ +

LAME 3.81beta  May 8 2000

+ +
    + +
  • all ISO code removed!
  • + +
  • Takehiro Tominaga and +Naoki Shibata:  new window subband routines.
  • + +
  • Naoki +Shibata:  Bug fix in mpglib (decoding) lib:  in some +cases, MDCT coefficients from previous granule was incorrectly used for +the next granule.
  • + +
  • ISO 7680 bit buffer +limitation removed.  It can be reactivated with +"--strictly-enforce-ISO"  Please report any trouble with high +bitrates.
  • + +
+ +

LAME 3.80beta  May 6 2000

+ +
    + +
  • Takehiro +Tominaga:  more efficient and faster huffman encoding!
  • + +
  • Takehiro Tominaga and +Mark Taylor:  much improved short block compression!
  • + +
  • Tomasz Motylewski and +Mark Taylor:  MPEG2.5 now supported!
  • + +
  • Mark Taylor: +incorporated Takehiro's bitstream.c!  bitstream.c used by +default, but old ISO bitstream code can also be used.
  • + +
  • Scott  Manley +and Mark Taylor:  good resampling routine finaly in +LAME.  uses a 19 point FIR filter with Blackman +window.  Very slow for non integer resampling ratios.
  • + +
  • Iwasa Kazmi:  +fixed SIGBUS error:  VBR and id3 tags were using data after it +was free()'d.
  • + +
  • Robert +Hegemann:  Improved VBR tuning.  #define +RH_QUALITY_CONTROL and #RH_SIDE_VBR now the defaults.
  • + +
  • Robert +Hegemann:   LAME version string now added to +ancillary data.
  • + +
  • Kimmo Mustonen:  VBR histogram support for Amiga.
  • + +
  • Casper Gripenberg:  VBR stats (but not histogram) +for DOS verson.
  • + +
  • Robert Hegemann:  rare VBR overflow bug fixed.
  • + +
  • Zack:  -F option strictly enforces the VBR min +bitrate.  Without -F, LAME will ignore the minimum bitrate +when encoding analog silence.
  • + +
  • Shawn Riley:  User can now specify a compression +ratio (--comp <arg>) instead of a bit rate.  +Default settings based on a compression ratio of 11.0
  • + +
  • Mark Taylor:  free format bitstreams can be +created with --freeformat, and specify any integer bitrate from 8 to +320kbs with -b.
  • + +
  • Mark Taylor: lame be used as a decoder (output raw pcm +only):  lame --decode input.mp3 output.pcm
  • + +
+ +

LAME 3.70   April 6 2000

+ +
    + +
  • "LAME 3.69beta" becomes LAME 3.70 "stable"
  • + +
+ +

LAME 3.69beta   April 6 2000

+ +
    + +
  • "spahm":  default mode selection bug +fixed.  In some cases, lame was defaulting to regular stereo +instead of jstereo when the user did not specify a mode.
  • + +
+ +

LAME 3.68beta  April 4 2000

+ +
    + +
  • Mark Taylor: mono encoding bug in DLL fixed.
  • + +
  • Ingo Saitz: bug in --cwlimit argument parsing fixed.
  • + +
  • Scott Manly: bug in +4-point resample code fixed.
  • + +
+ +

LAME 3.67beta  March 27 2000

+ +
    + +
  • Robert +Hegemann:  jstereo now enabled for MPEG2 encodings
  • + +
  • Mark Taylor: old M/S stereo mode which used L/R maskings +has been removed.
  • + +
  • Mark Taylor: Xing MPEG2 VBR headers now working.
  • + +
  • Mark Taylor:  +When quantized coefficients are all 0 in a band, set scalefactors to 0 +also to save a few bits.
  • + +
  • Ingo Saitz:  +Problems with framesize calculation when using -f fast-math option +fixed.
  • + +
+ +

LAME 3.66beta March 21 2000

+ +
    + +
  • Bug fixes in BladeEnc DLL, possible click in last mp3 +frame, VBR historgram display, byteswapping option, ASM quantize +routines work for both float and double.
  • + +
+ +

LAME 3.65beta   March 17 2000

+ +
    + +
  • Enabled ASM version of quantize_xrpow() - accidently +disabled in lame3.64.
  • + +
+ +

LAME 3.64beta  March 16 2000

+ +
    + +
  • Don Melton:  id3v1.1 tags & id3 bugfixes
  • + +
  • Gabriel +Bouvigne:  L/R matching block type fix
  • + +
  • Bug fixed which was +allowing quantized values to exceed the maximum when not using -h
  • + +
  • Mark Taylor: Fitlers +based on polyphase filterbank.  should be slightly better +since the responce is independent of the blocktype, and they are +slightly faster.
  • + +
  • Mark Taylor: API:  the API changed slightly - and +this should be the final version. There is a new routine: +lame_encode_buffer() which takes an arbritray sized input buffer, +resamples & filters if necessary, encodes, and returns the +mp3buffer.  There are also several new #defines, so it is +possible to compile a simple encoding library with no decoding or file +I/O or command line parsing.  see the file API for details.
  • + +
  • Mark Taylor: MSVC stuff:  lame.exe (with and + without the frame analyzer) and the CDex lame_enc.dll + should compile under MSVC.  The MSVC5 project files may need + some tweaking.  In particular, + you need to make sure LAMEPARSE, LAMESNDFILE and HAVEMPGLIB + are defined.  (and HAVEGTK for the GTK stuff).
  • +
+ +

LAME 3.63beta  February 20  2000

+ +
    + +
  • Robert Hegemann:  FPE with -h fixed?
  • + +
  • Mathey Hendry:  FPE error catching for Cygwin, +FPE fix for vbr mode and output to /dev/null
  • + +
  • Jeremy Hall:  Fixed problems with input files +where the number of samples is not known.
  • + +
  • Mathew +Hendry:  ASM quantize_xrpow() for GNU i386
  • + +
  • Wilfried +Behne  quantize_xrpow ()for PowerPC and non-ASM
  • + +
  • Takehiro +Tominaga:  GOGO FFTs  (not yet used?)
  • + +
+ +

LAME 3.62beta   February 9 2000

+ +
    + +
  • Iwasa Kazmi:  +frame analyzer short block display of single subblocks (press +1,2  or 3)
  • + +
  • Ingo Saitz:  +--help option added, with output to stdout
  • + +
  • Alfred Weyers: short +block AAC spreading function bug fixed
  • + +
  • Takehiro +Tominaga:  new scalefac data structure - improves performance!
  • + +
  • Lionel +Bonnet:  Bug fixed in MPEG2 scalefactor routine: scalefactors +were being severly limited.
  • + +
  • Takehiro +Tominaga:  faster FFT routines from.  These routines +are also compatible with the GOGO routines, in case someone is +interested in porting them back to LAME.
  • + +
  • Sigbjørn +Skjæret, Takehiro Tominaga:  faster pow() code.
  • + +
  • Joachim +Kuebart:  Found some unitialized variables that were effecting +quality for encodings which did not use the -h option (now fixed).
  • + +
  • Mark Taylor: More modularization work.   +It is now possible to use LAME as a library where you can set the +encoding parameters directly and do your own file +i/o.   The calling program is now it's own mp3 +output.  For an example of the LAME API, see main.c, or +mp3rtp.c or mp3x.c.  These can all be compiled as stand alone +programs which link with libmp3lame.a.
  • + +
  • Felix vos Leitner:  mp3rtp fixes.  +mp3rtp is a standalone program which will encode and stream with RTP.
  • + +
  • Robert Hegemann:  Information written to stderr +displaying exactly which type of lowpass filter (if any) is being used.
  • + +
  • Iwasa Kazmi:  mpglib (the mpg123 decoder) scsfi +decoding fixes.
  • + +
  • Takehiro Tominaga:  More mpglib scsfi decoding +fixes.
  • + +
+ +

LAME 3.61beta  January 14 2000

+ +
    + +
  • Mark Taylor: Fixed bug +with lowpass filters when using VBR with a 64kbs or lower min bitrate +setting.
  • + +
  • Takehiro +Tominaga:  more efficient huffman encoding splitting.
  • + +
+ +

LAME 3.60beta   January 9 2000

+ +
    + +
  • Mark Taylor: Distribution now comes with self +test.  Needs work to be automated, see 'make test' in Makefile.
  • + +
  • Mark Taylor: AAC +spreading function now the default
  • + +
  • Gabriel Bouvigne: updated HTML docs
  • + +
  • Felix von Leitner: compute correct file length from Xing +header (if present) when input file is a mp3 file
  • + +
  • Felix von Leitner: mp3rtp (standalone) program now +included.  Not yet tested.  mp3rtp +ip:port:ttl  <infile>   +/dev/null will stream directly to ip:port using  RTP.
  • + +
+ +

LAME 3.59beta  January 4 2000

+ +
    + +
  • Takehiro Tominaga:  --noath option.  +Disables ATH maskings.
  • + +
  • Gabriel Bouvigne:  updated HTML docs.
  • + +
  • Iwasa Kazmi:  makefile fixes
  • + +
  • Mark Taylor:  Fixed bug where first frame of data +was always overwritten with 0's.  Thanks to 'gol'
  • + +
  • Mark Taylor:  +bug fixes in mid/side masking ratios (thanks to Menno Bakker)
  • + +
  • Mark Taylor:  replaced norm_l, norm_s table data +with formulas.
  • + +
+ +

LAME 3.58beta  December 13 1999

+ +
    + +
  • Segher +Boessenkool:  More accurate quantization procedure!  +Enabled with -h.
  • + +
  • Mathew Hendry, Acy +Stapp and Takehiro Tominaga: ASM optimizations for quantize_xrpow and +quantize_xrpow_ISO.
  • + +
  • Chuck Zenkus:  "encoder inside" logo on web page
  • + +
  • Mark Taylor:   a couple people have +asked for this.   Allow LAME to overide +VBR_min_bitrate if analog_silence detected.   +Analog_silence defined a la Robert:   +energy  < ATH.
  • + +
  • An Van Lam: Valid bitrates were being printed for layer 2, +not layer 3!
  • + +
  • Ethan Yeo:  Makefile.MSVC updated
  • + +
  • Mark Stephens:  updated all MSVC project files
  • + +
  • Robert Hegemann:  lowpass and highpass filters +can be enabled with --lowpass, --highpass
  • + +
  • Mark Taylor:  +MS switching is now smoother: ms_ratio average over 4 granules
  • + +
  • Takehiro +Tominaga:  Scalefactor pre-emphasis fixed (and now turned back +on)
  • + +
  • Takehiro +Tominaga:  Bug in M/S maskings:  switch to turn on +stereo demasking code was buggy.
  • + +
+ +

LAME 3.57beta  November 22 1999

+ +
    + +
  • Sigbjørn Skjæret, patch to allow +encoding from 8bit input files when using LIBSNDFILE
  • + +
  • Mark Taylor: Automatic downsampling to nearest valid +samplerate.
  • + +
  • Mark Taylor: Scalefactor bands demarked on MDCT plot in +frameanalyzer
  • + +
  • Mark Taylor: Scalefactor preemphasis disabled for +now.   The algorithm was often doing more harm than +good.
  • + +
+ +

LAME 3.56beta  November 19 1999

+ +
    + +
  • Kimmo Mustonen: portabilty code cleanup.
  • + +
  • Vladimir Marek: id3 genre patch.
  • + +
  • Conrad Sanderson: new applypatch script.
  • + +
  • Mark Taylor: Initial window type now "STOP_TYPE" to reduce +initial attenuation.  This is needed because the new encoder +delay is so short.  With a NORM_TYPE, the first 240 samples +would be attenuated.
  • + +
  • Mark Taylor: Padding at end of file now adjusted +(hopefully!) to produce as little padding as possible while still +guarantee all input samples are encoded.
  • + +
  • Takehiro +Tominaga:  Reduced shortblock extra bit allocation formulas by +10% since new huffman coding is at least 10% more efficient.
  • + +
+ +

LAME 3.55beta  November 11 1999

+ +
    + +
  • Albert Faber:  updated BladeEnc.dll
  • + +
  • Mark Taylor: Simple lowpass filter added to linear +downsampling routine.
  • + +
  • Nils Faerber: updated man page.
  • + +
  • Mark Taylor: All floating point variables are delcared +FLOAT or  FLOAT8.  Change the definition of FLOAT8 in +machine.h to run at 32bit preceision.
  • + +
  • Mark Taylor: Bug (introduced in 3.54beta) in +stereo->mono downsampling fixed.
  • + +
+ +

LAME 3.54beta  November 8 1999

+ +
    + +
  • Mark Taylor: Encoder delay is now 48 samples.  +Can be adjusted to 1160 to sync with FhG (see ENCDELAY in +encoder.h)  This is kind of amazing, since if Takehiro put his +MDCT/filterbank routine in a decoder, we could have a total  +delay of only 96 samples.
  • + +
  • Mark Taylor: More +inconstancies found and fixed in MPEG2 tables.
  • + +
  • Mark Taylor: Resampling from an MP3 input file now +works.  But we still dont have a lowpass filter so dont expect +good results.
  • + +
+ +

LAME 3.53beta  November 8 1999

+ +
    + +
  • Takehiro +Tominaga:  Fixed MPEG2 problem in new MDCT routines.  +Takehiro's combined filterbank/MDCT routine is now the +default.  Removes all buffering from psymodel.c and the +filterbanks/MDCT routines.
  • + +
+ +

LAME 3.52beta  November 8 1999

+ +
    + +
  • By permission of copyright holders of all GPL code in +LAME,  all GPL code is now released under a modified version +of the LGPL (see the README file)
  • + +
  • By popular demand, all C++ comments changed to C style +comments
  • + +
  • Mark Taylor: Linear resampling now works.  Use +--resample to set an output samplerate different from the input +samplerate.  (doesn't seem to work with mp3 input files, and +there is no lowpass filter, so dont expect good results just yet)
  • + +
  • Takehiro +Tominaga:  Faster Huffman encoding routines
  • + +
+ +The following changes are disabled +because of MPEG2 problems.  But to try them, set MDCTDELAY=48 +in encoder.h, instead of MDCTDELAY=528.: +
    + +
  • Takehiro +Tominaga:  New MDCT routines with shorter delay (48 samples +instead of 528) and even faster than the old routines.
  • + +
  • Takehiro +Tominaga:  Removed extra buffering in psymodel.c
  • + +
+ +

LAME 3.51  November 7 1999

+ +
    + +
  • Takehiro Tominaga: Bug in quantize.c absolute threshold of +hearing calculation for non-44.1 kHz input files.
  • + +
+ +

LAME 3.50  November 1 1999

+ +
    + +
  • LAME 3.37beta becomes official LAME 3.50 release
  • + +
+ +

LAME 3.37beta  November 1 1999

+ +
    + +
  • Lionel +Bonnet:  Found severe bug in MPEG2 Short block SNR.
  • + +
  • Sergey Sapelin:  VBR Toc improvement.
  • + +
  • Sergey Dubov: fskip() routine
  • + +
  • Conrad Sanderson: replacement for +filterbank.c.   Not much faster but amazingly simpler.
  • + +
+ +

LAME 3.36beta  October 25 1999

+ +
    + +
  • Albert Faber:  more MSVC and BladeDLL updates
  • + +
  • Kimmo Mustonen:  Much code cleanup and Amiga +updates
  • + +
  • Anton Oleynikov: Borland C updates
  • + +
  • Mark Taylor: More stdin fixes:  For some reason, +forward fseek()'s would fail when used on pipes even though it is okay +with redirection from "<". So I changed all the forward +fseek()'s to use fread().  This should improve stdin support +for wav/aiff files.  If you know the input file is raw pcm, +you can still use the '-r' option to avoid *all* seeking of any kind.
  • + +
+ +

LAME 3.35beta  October 21 1999

+ +
    + +
  • Leonid +Kulakov:  Serious bug in MPEG2 scalefactor band tables fixed.
  • + +
  • Portability patches from:  Anton Oleynikov, +Sigbjørn Skjæret, Mathew Hendry, Richard Gorton
  • + +
  • Alfred Weyers: compiler options, updated timestatus.
  • + +
  • Albert Faber:  BladeDll and other updates (new +machine.h).
  • + +
  • Monty:  updated Makefile to fix gcc inline math +bug.
  • + +
+ +

LAME 3.34beta  October 12 1999

+ +
    + +
  • Mark Taylor: Bug +fixed:  minimum bitrate in VBR mode could be ignored for a few +frames.
  • + +
  • Mark Taylor: New +(minor) VBR tunings.
  • + +
  • Tim Ruddick: New wav/aiff header parsing +routines.  Better parsing and fewer fseek()'s.
  • + +
  • Anton Oleynikov:  patches to work with Borland C
  • + +
  • Gabriel +Bouvigne:  Experimental voice option enabled with --voice
  • + +
+ +

LAME 3.33beta  October 11 1999

+ +
    + +
  • Robert Hegemann: RH +VBR mode now the default and only VBR mode.  The new code will +always quantize to 0 distortion and the quality is increased by +reducing the masking from the psy-model.  -X0 is still the +default for now.
  • + +
  • Robert Hegemann: new +-X5 mode
  • + +
  • Mathew Hendry: New timing code, removes the need for +HAVETIMES
  • + +
  • Mathew +Hendry:  assembler quantize_xrpow for Windows
  • + +
  • Iwasa Kazmi:  stdin/stdout patch for Windows
  • + +
  • Mark Taylor: New option: "--athonly" will ignore the +psy-model output and use only the absolute threshold of hearing for the +masking.
  • + +
+ +

LAME 3.32beta  October 8 1999

+ +
    + +
  • Takehiro +Tominaga:  faster long block spreading function convolution +for non 44.1 kHz sampling frequencies, and faster short block spreading +function convolution for all sampling frequencies.
  • + +
  • Takehiro +Tominaga:  Completly rewritten huffman table selection and +count_bits().  More efficient table selection results in many +more bits per frame.
  • + +
  • Takehiro +Tominaga:  More efficient scalefac compress setting.
  • + +
  • Mike Cheng: new +calc_noise2()
  • + +
  • Alfred Weyers: patch for timestatus() seconds rollover
  • + +
+ +

LAME 3.31beta  September 28 1999

+ +
    + +
  • Albert Faber:  updated his BladeDLL +code.  This allows LAME to be compiled into a BladeEnc +compatiable .dll.
  • + +
  • Mike Cheng: faster +l3psycho_ener() routine.
  • + +
  • Sigbjørn Skjæret: more code cleanup.
  • + +
+ +

LAME  3.30beta  September 27 1999

+ +
    + +
  • Conrad Sanderson:  ID3 tag code added (type +'lame' for instructions)
  • + +
  • new mdct.c from Mike Cheng (no faster, but much cleaner +code)
  • + +
  • Mathew Hendry: Microsoft nmake makefile and a couple other +changes for MSVC
  • + +
  • More modulization work:  One input sound file +interface handles mp3's, uncompressed audio, with or without +LIBSNDFILE.  Fixes (hopefully) a bunch of file I/O bugs +introduced in 3.29 (Mark Taylor)
  • + +
  • LAME will now print valid samplerate/bitrate combinations +(Mark Taylor)
  • + +
  • stdin/stdout fix for OS/2 (Paul Hartman)
  • + +
  • For mp3 input files, totalframes estimated based on +filesize and first frame bitrate. (Mark Taylor)
  • + +
  • Updated all functions with new style prototypes.  +(Sigbjørn Skjæret)
  • + +
+ +

LAME 3.29beta  September 21 1999

+ +
    + +
  • Bug in bigv_bitcount +fixed.  Loop.c was overestimating the number of bits needed, +resulting in wasted bits every frame.  (Leonid A. Kulakov)
  • + +
  • Bug in +*_choose_table() fixed   These routines would not +sellect the optimal Huffman table in some cases.   +(Leonid A. Kulakov)
  • + +
  • Tuning of ATH +normalization (macik)
  • + +
  • Removed unused variables and fixed function prototypes +(Sigbjørn Skjæret)
  • + +
  • Sami Farin sent a  .wav  file +that  LAME built in support choked on.   I +added a slightly more sophisticated wav header parsing to handle this, +but if you have trouble, use libsndfile.
  • + +
  • Resampling hooks and options added.  Buffering +and resampling routines need to be written.
  • + +
  • LAME will now take an mp3 file as input.  When +resampling code is working, LAME will be able to (for example) convert +a high bitrate stereo mp3 to a low bitrate mono mp3 for streaming.
  • + +
+ +

LAME 3.28beta  September 15 1999

+ +
    + +
  • Serious bug fixed in +high frequency MDCT coefficients.  Huffman coding was +reversing the order of the count1 block quadruples.   +(Leonid A. Kulakov)
  • + +
  • nint() problems under Tru64 unix fixed and preprocessor +variable HAVE_NINT removed.  (Bob Bell)
  • + +
  • Compiler warning fixes and code +cleanup   (Sigbjørn Skjæret, +Lionel Bonnet)
  • + +
  • USAGE file now includes suggestions for +downsampling.  For low bitrate encodings, proper downsampling +can give dramatically better results.  (John Hayward-Warburton)
  • + +
+ +

LAME 3.27beta  September 12 1999

+ +
    + +
  • Several bugs in encode.c and l3bitstream.c fixed by Lionel +Bonnet.
  • + +
  • Bugs in new VBR (#define RH) formula for mono input file +and mid/side encoding fixed.
  • + +
+ +

LAME 3.26beta  September 10 1999

+ +
    + +
  • The "-m m" option (mono .mp3 file) will automatically mix +left and right channels if the input file is stereo.  (Alfred +Weyers)
  • + +
  • New quant_compare +algorithm (method for deciding which of two quantizations is better) +enabled with -X4 (Greg Maxwell)
  • + +
  • New mid/side VBR bit +allocation formula.  Mid channel bits are set by the quality +requirements, and then the side channel uses a reduced number of bits +(in a proportion coming from the fixed bitrate code).  This +might not be optimal, but it should be pretty good and no one knows +what the optimal solution should be.  (Greg Maxwell)
  • + +
  • New VBR (#define RH) +tunings based on detailed listening tests by Macik and Greg Maxwell.
  • + +
  • Sigbjørn Skjæret fixed several +compiler warnings (which turned out to be potential bugs)
  • + +
  • Takehiro Tominaga fixed a low bitrate bug in reduce_side()
  • + +
  • Alfred Weyers fixed some buffer overflows.
  • + +
  • New ATH (absolute +threshold of hearing) formula replaces buggy ISO code, and +adds  analog silence treatment  (removal of +coefficients below below ATH).   These are turned on +by default but have not been fully tested.  (Robert Hegemann)
  • + +
  • Bug in short block +spreading function fixed.  (Robert Hegemann)
  • + +
+ +

LAME 3.25beta  August 22 1999

+ +
    + +
  • Sigbjørn Skjæret fixed a zero byte +malloc call.  This bug  was introduced in 3.24 and +causes problems on non Linux systems.
  • + +
  • Bit allocation routines would sometimes allocate more than +4095 bits to one channel of one granule.  A couple of people +reported problems that might be caused by this, especially at higher +bitrates.
  • + +
  • Nils Faerber updated the man page and fixed many of the +compiler warnings.
  • + +
+ +

LAME 3.24beta   August 15 1999

+ +
    + +
  • This release contains the following new code (for +developers) which is disabled by default:
  • + +
  • Robert Hegemann:  Completely overhauled VBR +code.  Now computes exact number of bits required for the +given qualty and then quantized with the appropriate bitrate.
  • + +
  • Several new quantization quality measures.
  • + +
+ +

LAME 3.23beta  August 8 1999

+ +
    + +
  • Very nice continuously updated VBR histogram display from +Iwasa Kazmi.  (disabled with --nohist).
  • + +
  • More modulerization work.  The encoding engine +can now be compiled into libmp3lame, but the interface is awkward.
  • + +
  • Bug fixed in FFT Hann +window formula (Leonid A. Kulakov).
  • + +
  • New LAME logo on the download page.  Created by +Chris Michalisles.
  • + +
  • Several VBR algorithm +improvements from Robert Hegemann.  New quantization noise +metrics and VBR quality measure takes into account mid/side +encoding.  Should produce smaller files with the same quality, +especially when using jstereo.
  • + +
+ +

LAME 3.22beta  July 27 1999

+ +
    + +
  • Downsampling (stereo to mono) bug with MPEG2 +fixed.  (Mike Oliphant)
  • + +
  • Downsampling now merges L & R channels - before it +only took the L channel.
  • + +
  • More modularization and code cleanup from Albert Faber and +myself.
  • + +
  • Input filesize limit removed for raw pcm input +files.  For other file types, LAME will still only read the +first 2^32 samples, (27 hours of playing time at 44.1 kHz).
  • + +
+ +

LAME 3.21beta  July 26 1999

+ +
    + +
  • Correct Mid/Side +masking thresholds for JSTEREO mode!  This is enabled with +-h.  It  makes LAME about 20% slower since it +computes psycho-acoustics for L,R Mid and Side channels.
  • + +
  • "Analog silence" +threshold added.  Keeps VBR from upping the bitrate during +very quite passages.  (Robert.Hegemann)
  • + +
  • New VBR quality +setting from Robert Hegemann.  It is based on the idea that +distortion at lower bit rates sounds worse than at higher bitrates, and +so the allowed distortion (VBR quality setting) is proportional to the +bitrate.  Because of this, default minimum bitrate is now +32kbs.
  • + +
  • Expermental subblock +gain code enabled with -Z.
  • + +
  • New "-r" option for raw pcm input files.  With +-r, LAME will not do any fseek()'s or look for wav and aiff headers on +the input file.
  • + +
  • Bug fixes in mp3x (frame analyzer) for viewing frames near +end of the file.
  • + +
  • Bug fixed to allow setting the sampling rate of raw pcm +input files.
  • + +
+ +

LAME 3.20beta  July 19 1999

+ +
    + +
  • Bug in get_audio.c fixed.  Libsndfile wrappers +would not compile (Miguel Revilla  Rodriguez)
  • + +
  • Nils Faerber found some unitialized variables and some +wierd extranous computations in filter_subband, now fixed.  +This was causing seg faults on some machines.
  • + +
+ +

LAME 3.19beta  July 18 1999

+ +
    + +
  • Oops!  Robert +Hegemann immediatly found a bug in the new  (old -Z option) +quantization code.  calc_noise1 was not returning tot_noise, +so non ms-stereo frames were buggy.
  • + +
+ +

LAME 3.18beta  July 17 1999

+ +
    + +
  • Many psycho-acoustic +bug fixes.  Dan Nelson discovered a bug in MPEG2: For short +blocks, the code assumes 42 partition bands.  MPEG1 sometimes +has less, MPEG2 can have more.  In MPEG1, this bug would not +have effected the output if your compiler initializes static variables +to 0 on creation.  In MPEG2 it leads to array out-of-bounds +access errors. Finally, there was a related bug in MPEG1/MPEG2, short +& long blocks where the energy above 16 kHz was all added to +partition band 0. (the lowest frequeny partition band!)
  • + +
  • The -Z option (Gabriel +Bouvigne's idea of using total quantization noise to choose between two +quantizations with the same value of "over") is now the +default.  I believe this helps remove the trilling sound in +Jan's testsignal4.wav.  The quality of testsignal2.wav and +testsignal4.wav are now better than Xing and getting closer to FhG.
  • + +
  • Bug fixes in frame & sample count for downsampling +mode. (ben "jacobs")
  • + +
  • Patches to improve modulization.  (ben "jacobs")
  • + +
+ +

LAME 3.17beta  July 11 1999

+ +
    + +
  • substantial code cleanup towards goal of making LAME more +modular.
  • + +
+ +

LAME 3.16beta  July 11 1999

+ +
    + +
  • New tunings of window +switching, and better bit allocation based on pe.  (Jan +Rafaj.  improves both testsignal2.wav and testsignal4.wav).
  • + +
  • Bug in mid/side +quantization when side channel was zero fixed.  (Albert Faber)
  • + +
  • Removed some extranous computations in l3psy.c (Robert +Hegemann)
  • + +
  • More detailed timing status info, including hours display. +(Sakari Ailus) and percentage indicator (Conrad Sanderson).
  • + +
  • Window_subband and +calc_noise1,calc_noise2 speedups.  Quantize_xrpow speedup +should be significant on non GNU/intel systems. (Mike Cheng)
  • + +
  • Better initial guess +for VBR bitrate.  Should speed up VBR encoding.  +(Gabriel Bouvigne)
  • + +
  • More advanced .wav header parsing.  fixes bugs +involving click in first frame. (Robert.Hegemann)
  • + +
  • Correct filesize and total frame computation when using +LIBSNDFILE (ben "jacobs")
  • + +
  • Click in last frame (buffering problem) when using +libsndfile fixed.
  • + +
  • Audio I/O code overhauled.  There is now a +uniform audio i/o interface to libsndfile or the LAME built in wav/aiff +routines.  All audio i/o code localized to get_audio.c.
  • + +
+ +

LAME 3.15beta

+ +
    + +
  • times()/clock() problem fixed for non-unix OS.  +(Ben "Jacobs")
  • + +
  • Fixed uninitialized pe[] when using fast mode.  +(Ben "Jacobs")
  • + +
+ +

LAME 3.13  June 24 1999

+ +
    + +
  • Patches for BeOS from Gertjan van Ratingen.
  • + +
  • Makefile info for OS/2 Warp 4.0  (from dink.org).
  • + +
  • Status display now based on wall clock time, not cpu time.
  • + +
  • mem_alloc no longer allocates twice as much memory as +needed (Jan Peman).
  • + +
+ +

3.12pre9

+ +
    + +
  • Updated BLADEDLL code to handle recent changes (Albert +Faber).
  • + +
  • Bug fixed in parsing options when not using GTK (Albert +Faber).
  • + +
  • MPEG2 Layer III psycho +acoustics now working.
  • + +
  • Improved huffman +encoding Chris Matrakidis. (10% faster).  I dont know how he +finds these improvements!  LAME with full quality now encodes +faster than real time on my PII 266.
  • + +
  • Fixed time display when encoding takes more than 60 +minutes.
  • + +
+ +

3.12pre8

+ +
    + +
  • New mid/side stereo +criterion.  LAME will use mid/side stereo only when the +difference between L & R masking thresholds (averaged over all +scalefactors) is less then 5db.  In several test samples it +does a very good job mimicking the FhG encoder.
  • + +
  • Bug in mid/side stereo +fixed:  independent variation of mid & side channel +scalefactors disabled.  Because of the way outer_loop is +currently coded, when encoding mid/side coefficietns using left/right +thresholds, you have to vary the scalefactors simultaneously.
  • + +
  • Bug in side/mid energy +ratio calculation fixed. (Thanks to Robert Hegemann)
  • + +
  • Default mode is stereo (not jstereo) if bitrate is chosen +as 192kbs or higher.  Tero Auvinen first pointed out that FhG +seems to think at 160kbs, their encoder is so good it doesn't need +jstereo tricks. Since LAME is not as good as FhG, I am going to claim +that 192kbs LAME is so good it doens't need jstereo tricks, and thus it +is disabled by default.
  • + +
  • WAV header parsing for big-endian machines, and automatic +detection of big-endian machines.  (Thanks to  +Sigbjørn Skjæret).
  • + +
  • added 56 sample delay to sync LAME with FhG.
  • + +
  • MP3x (frame analyzer) can now handle MPEG2 streams.
  • + +
+ +

3.12pre7

+ +
    + +
  • MPEG2 layer III now working!  lower bit rates +(down to 8kbs) and 3 more sampling frequencies:  16000, 22050, +24000Hz. Quality is poor - the psy-model does not yet work with these +sampling frequencies.
  • + +
  • Fixed "ERROR: outer_loop(): huff_bits < 0." bug +when using VBR.
  • + +
  • bash and sh scripts to run LAME on multiple files now +included.  (from Robert Hegemann and Gerhard Wesp respectively)
  • + +
  • bug fix in encoding times for longer files from  +(Alvaro Martinez Echevarria)
  • + +
  • yet another segfault in the frame analyzer fixed.
  • + +
  • ISO psy-model/bit allocation routines removed.  +This allowed makeframe() to be made much simpler, and most of the +complicated buffering is now gone. Eventually I would like the encoding +engine to be a stand alone library.
  • + +
+ +

3.12pre6

+ +
    + +
  • Better VBR +tuning.  Find minimum bitrate with distortion less than the +allows maximum.  A minimum bit rate is imposed on frames with +short blocks (where the measured distortion can not be +trusted).   A minimum frame bitrate can be specified +with -b, default=64kbs.
  • + +
  • LIBSNDFILE +support.  With libsndfile, LAME can encode almost all sound +formats.  Albert Faber did the work for this, including +getting libsndfile running under win32.
  • + +
  • CRC checksum now working!   (Thanks to +Johannes Overmann )
  • + +
  • frame analyzer will now work with mono .mp3 files
  • + +
  • more code tweeks from +Jan Peman.
  • + +
  • Compaq-Alpha(Linux) +fixes and speedups from Nils Faerber.
  • + +
  • Faster +bin_search_StepSize from Juha Laukala.
  • + +
  • Faster quantize() from +Mike Cheng
  • + +
  • Faster +quantize_xrpow() from Chris Matrakidis.  xrpow_flag removed +since this option is now on by default.
  • + +
  • Fixed .wav header parsing from Nils Faerber.
  • + +
  • Xing VBR frame info header code from Albert +Faber.   "Xing" and "LAME 3.12" embedded in first +frame.
  • + +
  • Bug in VBR bit +allocation based on "over" value fixed.
  • + +
+ +

LAME 3.11  June 3 1999

+ +
    + +
  • Almost all warnings (-Wall) now fixed!  (Thanks +to Jan Peman)
  • + +
  • More coding improvements from Gabriel Bouvigne and Warren +Toomey.
  • + +
  • VBR  +(variable bit rate).   Increases bit rate for short +blocks and for frames where the number of bands containing audible +distortion is greater than a given value.  Much tuning needs +to be done.
  • + +
  • Patch to remove all atan() calls from James Droppo.
  • + +
+ +

LAME 3.10 May 30 1999

+ +
    + +
  • Fast mode +(-f)  disables psycho-acoustic model for real time encoding on +older machines.  Thanks to Lauri Ahonen who first sent a patch +for this.
  • + +
  • New bit reservoir +usage scheme to accommodate the new pre-echo detection formulas.
  • + +
  • Tuning of AWS and +ENER_AWS pre-echo formulas by Gabriel Bouvigne and myself.  +They work great!  now on by default.
  • + +
  • In jstereo, force blocktypes for left & right +channels to be identical.  FhG seems to do this.  It +can be disabled with "-d".
  • + +
  • Patches to compile MP3x under win32 (Thanks to Albert +Faber).
  • + +
  • bin_serach_stepsize +limited to a quantizationStepSize of  -210 through 45.
  • + +
  • outer_loop()  +will now vary Mid & Side scalefactors independently.  +Can lead to better quantizations, but it is slower (twice as many +quantizations to look at).  Running with "-m f" does not need +this and will run at the old speed
  • + +
  • Bug in inner_loop +would allow quantizations larger than allowed.  (introduced in +lame3.04, now fixed.)
  • + +
  • Updated HTML documentation from Gabriel Bouvigne.
  • + +
  • Unix  man page from William Schelter.
  • + +
  • numlines[] bug +fixed.  (Thanks to Rafael Luebbert, MPecker author).
  • + +
  • Quantization speed +improvements from Chirs Matrakidis.
  • + +
  • When comparing +quantizations with the same number of bands with audible distortion, +use the one with the largest scalefactors, not the first one outer_loop +happened to find.
  • + +
  • Improved defination of best quantization when using -f +(fast mode).
  • + +
  • subblock code now working.  But no algorithm to +choose subblock gains yet.
  • + +
  • Linux now segfaults on floating point +exceptions.  Should prevent me from releasing binaries that +crash on other operating systems.
  • + +
+ +

LAME 3.04 May 22 1999

+ +
    + +
  • Preliminary documentation from Gabriel Bouvigne.
  • + +
  • I wouldn't have +thought it was possible, but now there are even more speed improvements +from Chris Matrakidis!  Removed one FFT when using joint +stereo, and many improvements in loop.c.
  • + +
  • "Fake" ms_stereo mode renamed "Force" ms_stereo since it +forces mid/side stereo on all frames.  For some music this is +said to be a problem, but for most music mode is probably better than +the default jstereo because it uses specialized mid/side channel +masking thresholds.
  • + +
  • Small bugs in Force ms_stereo mode fixed.
  • + +
  • Compaq Alpha fixes from Nathan Slingerland.
  • + +
  • Some new experimental +pre-echo detection formulas in l3psy.c (#ifdef AWS and #ifdef ENER_AWS, +both off by default.  Thanks to Gabriel Bouvigne and Andre +Osterhues)
  • + +
  • Several bugs in the syncing of data displayed by mp3x (the +frame analyzer) were fixed.
  • + +
  • highq (-h) option added.  This turns on things +(just one so far) that should sound better but slow down LAME.
  • + +
+ +

LAME 3.03 May 18 1999

+ +
    + +
  • Faster (20%) & +cleaner FFT (Thanks to Chris Matrakidis  +http://www.geocities.com/ResearchTriangle/8869/fft_summary.html)
  • + +
  • mods so it works with VC++ (Thanks to Gabriel Bouvigne, +www.mp3tech.org)
  • + +
  • MP3s marked "original" by default  (Thanks to +Gabriel Bouvigne, www.mp3tech.org)
  • + +
  • Can now be compiled into a BladeEnc compatible +.DLL   (Thanks to  Albert Faber, CDex author)
  • + +
  • Patches for "silent mode" and stdin/stdout  +(Thanks to Lars Magne Ingebrigtsen)
  • + +
  • Fixed rare bug: if a +long_block is sandwiched between two short_blocks, it must be changed +to a short_block, but the short_block ratios have not been computed in +l3psy.c.  Now always compute short_block ratios just in case.
  • + +
  • Fixed bug with initial +quantize step size when many coefficients are zero.  (Thanks +to Martin Weghofer).
  • + +
  • Bug fixed in MP3x display of audible distortion.
  • + +
  • improved status display (Thanks to Lauri Ahonen).
  • + +
+ +

LAME 3.02 May 12 1999

+ +
    + +
  • encoder could use +ms_stereo even if channel 0 and 1 block types were different.  +(Thanks to Jan Rafaj)
  • + +
  • added -k option to +disable the 16 kHz cutoff at 128kbs.  This cutoff is never +used at higher bitrates. (Thanks to Jan Rafaj)
  • + +
  • modified pe bit +allocation formula to make sense at bit rates other than 128kbs.
  • + +
  • fixed l3_xmin initialization problem which showed up under +FreeBSD.  (Thanks to Warren Toomey)
  • + +
+ +

LAME 3.01 May 11 1999

+ +
    + +
  • max_name_size increased to 300  (Thanks to Mike +Oliphant)
  • + +
  • patch to allow seeks on input file (Thanks to Scott Manley)
  • + +
  • fixes for mono modes (Thanks to everyone who pointed this +out)
  • + +
  • overflow in calc_noise2 fixed
  • + +
  • bit reservoir overflow when encoding lots of frames with +all zeros  (Thanks to Jani Frilander)
  • + +
+ +
+ +

LAME 3.0 May 10 1999

+ +
    + +
  • added GPSYCHO (developed +by Mark Taylor)
  • + +
  • added MP3x (developed +by Mark Taylor)
  • + +
  • LAME now maintained by Mark Taylor
  • + +
+ +

November 8 1998

+
    + +
  • Version 2.1f released
  • + +
  • 50% faster filter_subband() routine in encode.c +contributed by James Droppo
  • + +
+ +

November 2 1998

+
    + +
  • Version 2.1e released.
  • + +
  • New command line switch -a +auto-resamples a stereo input file to mono.
  • + +
  • New command line switch -r resamples +from 44.1 kHz to 32 kHz [this switch doesn't work really well. Very +tinny sounding output files. Has to do with the way I do the resampling +probably]
  • + +
  • Both of these were put into the ISO code in the encode.c +file, and are simply different ways of filling the input buffers from a +file.
  • + +
+ +

October 31 1998

+
    + +
  • Version 2.1d released
  • + +
  • Fixed memory alloc in musicin.c (for l3_sb_sample)
  • + +
  • Added new command line switch (-x) to force swapping of +byte order
  • + +
  • Cleaned up memory routines in l3psy.c. All the mem_alloc() +and free() routines where changed so that it was only done once +and not every single time the routine was called.
  • + +
  • Added a compile time switch -DTIMER that includes all +timing info. It's a switch for the time being until some other people +have tested on their system. Timing code has a tendency to do different +things on different platforms.
  • + +
+ +

October 18 1998

+
    + +
  • Version 2.1b released.
  • + +
  • Fixed up bug: all PCM files were being read as WAV.
  • + +
  • Played with the mem_alloc routine to fix crash under +amigaos (just allocating twice as much memory as needed). Might see if +we can totally do without this routine. Individual malloc()s where they +are needed instead
  • + +
  • Put Jan Peman's quality switch back in. This reduces +quality via the '-q <int>' switch. Fun speedup which is +mostly harmless if you're not concerned with quality.
  • + +
  • Compiling with amiga-gcc works fine
  • + +
+ +

October 16 1998

+
    + +
  • Version 2.1a released. User input/output has been cleaned +up a bit. WAV file reading is there in a very rudimentary sense ie the +program will recognize the header and skip it, but not read it. The WAV +file is assumed to be 16bit stereo 44.1 kHz.
  • + +
+ +

October 6 1998

+
    + +
  • Version 2.1 released with all tables now incorporated into +the exe. Thanks to Lars Magne Ingebrigtseni
  • + +
+ +

October 4 1998

+ +
    +
  • + In response to some concerns about the quality of the encoder, I + have rebuilt the encoder from scratch and carefully compared output + at all stages with the output of the unmodified ISO encoder. +
  • +
  • + + Version 2.0 of LAME is built from the ISO source code (dist10), + and incorporates modifications from myself and the 8hz effort. The + output file from LAME v2.0 is identical to the output of + the ISO encoder for my test file. Since I do not have heaps of time, + I left the ISO AIFF file reader in the code, and did not incorporate + a WAV file reader. +
  • +
  • + Added section + on + quality. +
  • +
+ +

October 1 1998

+
    +
  • Updated web page and released LAME v1.0
  • +
+ +
+ +

Up to September 1998

+

Working on the 8hz source code...

+
    +
  • + Patched the 8hz source + code +
  • +
  • + 45% faster than original source (on my freebsd p166). +
      +
    • + m1 - sped up the mdct.c and quantize() functions [MDCTD, + MDCTD2, LOOPD] +
    • +
    • m2 - sped up the filter_subband routine using Stephane + Tavenard's work from musicin [FILTST] +
    • +
    • m2 - minor cleanup of window_subband [WINDST2]
    • +
    • m2 - Cleaned up a few bits in l3psy.c. Replaced a sparse + matrix multiply with a hand configured unrolling [PSYD]
    • +
    • m3 - (amiga only) Added in the asm FFT for m68k (based on + sources from Henryk Richter and Stephane Tavenard)
    • +
    • m4 - raw pcm support back in
    • +
    • m5 - put in a byte-ordering switch for raw PCM reading (just + in case)
    • +
    • m6 - reworked the whole fft.c file. fft now 10-15% + faster.
    • +
    • m7 - totally new fft routine. exploits fact that this is a + real->complex fft. About twice as fast as previous fastest fft (in + m6). (C fft routine is faster than the asm one on an m68k!)
    • +
    • m8 +
        +
      • + Now encodes from stdin. Use '-' as the input filename. Thanks + to Brad Threatt +
      • +
      • + Worked out that the 1024point FFT only ever uses the first 6 + phi values, and the first 465 energy values. Saves a bunch of + calculations. +
      • +
      • + Added a speed-up/quality switch. Speed is increased but + quality is decreased slightly. My ears are bad enough + not to be able to notice the difference in quality at low + settings :). Setting '-q 1' improves speed by about 10%. '-q + 100' improves speed by about 26%. Enoding of my test track + goes from 111s (at default '-q 0') to 82s (at -q 100). Thanks + to Jan Peman for this tip. +
      • +
      +
    • +
    • + m9 - fixed an error in l3psy.c. numlines[] is overwritten with + incorrect data. Added a new variable numlines_s[] to fix + this. Thanks again to Jan Peman. +
    • +
    • + m10 - Down to 106 seconds by selecting a few more compiler + options. Also added a pow20() function in l3loop.c to speed up + (ever so slightly) calls to pow(2.0, x) +
    • + +
    • m11 +
        +
      • + No speedups. Just cleaned up some bits of the code. +
      • +
      • + Changed K&R prototyping to 'normal' format. Thanks + to Steffan Haeuser for his help here. +
      • +
      • + Changed some C++ style comments to normal C comments in + huffman.c +
      • +
      • + Removed the #warning from psy_data.h (it was getting + annoying!) +
      • +
      • + Removed reference in bitstream.c to malloc.h. Is there a + system left where malloc.h hasn't been superceded by + stdlib.h? +
      • +
      +
    • +
    + +
  • In Progess: +
      +
    • + my PSYD hack for the spreading functions is only valid for + 44.1 kHz - Should really put in a "if freq = 44.1 kHz" + switch for it. Someone might want to extend the speedup for + 48 and 32 kHz. +
    • +
    • + Putting in Jan Peman's quantanf_init speedup. +
    • +
    +
  • +
+ +
+
+

+ + Valid HTML 4.01 Transitional + +

+
+ + + diff --git a/doc/html/index.html b/doc/html/index.html new file mode 100644 index 0000000..a973ca1 --- /dev/null +++ b/doc/html/index.html @@ -0,0 +1,73 @@ + + + + + + + LAME High-End MPEG Layer III (MP3) Encoder + + + +
+
+ +
+ LAME Official Logo +

The LAME Project

+
+ +

+ LAME is a high quality MPEG Audio Layer III (MP3) encoder licensed under the + LGPL. +

+

+ It is developed as an educational tool to be used in learning about MP3 + encoding. The goal of the LAME project is to use the open source model to + improve the psycho acoustics, noise shaping and speed of MP3. +

+

+ LAME is not for everyone - it is distributed as source code only and requires + the ability to use a C compiler. However, many popular ripping and encoding + programs include the LAME encoding engine, see: Software + which uses LAME. +

+

Using the LAME encoding engine (or other mp3 encoding technology) in your + software may require a patent license in some + countries. +

+ +
+ +
+ + + diff --git a/doc/html/introduction.html b/doc/html/introduction.html new file mode 100644 index 0000000..9b8b079 --- /dev/null +++ b/doc/html/introduction.html @@ -0,0 +1,185 @@ + + + + + + + Introduction to encoding + + + +
+
+ +
+ LAME Official Logo +

Introduction to encoding

+
+

Introduction

+

+There is a lot of confusion surrounding the terms audio compression +1, audio encoding, and audio decoding. This section will give you +an overview what audio coding (another one of these terms...) is all about. +

+

The purpose of audio compression

+

Up to the advent of audio compression, high-quality digital audio data took +a lot of hard disk space to store. Let us go through a short example. +

+

+You want to sample 1 minute of your favourite song and store it on your harddisk. +Because you want CD quality, you sample at 44.1 kHz, stereo, with 16 bits per sample. +

+

+44100 Hz means that you have 44100 values per second coming in from your sound card +(or input file). Multiply that by two because you have two channels. Multiply by +another factor of two because you have two bytes per value (that's what 16 bit +means). The song will take up 44100 samples/s · 2 channels +· 2 bytes/sample · +60 s/min ~ 10 MBytes of storage space on your harddisk. +

+

+In order to stream this over internet, a speed of at least 1.41Mbits/ +s is needed, +which wasn't a common speed at all at the time MP3 was invented. +If you wanted to download that, given an average 56k modem connected at 44k, it +would take 1.41Mbits · 1000 kbits/Mbit / 44 kbits ~ 32 + times as much. +
This means 32 minutes just to download one minute of music! +

+

+Digital audio coding, which - in this context - is synonymously called digital +audio compression as well, is the art of minimizing storage space (or channel +bandwidth) requirements for audio data. Modern perceptual audio coding techniques +(like MPEG Layer III) exploit the properties of the human ear (the perception of +sound) to achieve a size reduction by a factor of 11 with little or no perceptible +loss of quality. +

+

+Therefore, such schemes are the key technology for high quality low bit-rate +applications, like soundtracks for CD-ROM games, solid-state sound memories, +Internet audio, digital audio broadcasting systems, and the like. +

+

The two parts of audio compression

+

+Audio compression really consists of two parts. The first part, called encoding, +transforms the digital audio data that resides, say, in a WAVE file, into a highly +compressed form called bitstream. To play the bitstream on your soundcard, you +need the second part, called decoding. Decoding takes the bitstream and re-expands +it to a WAVE file. +

+

+The program that effects the first part is called an audio encoder. LAME is such +an encoder . The program that does the second part is called an audio decoder. +Nowadays there are lots of players that decode MP3 +

+

Compression ratios, bitrate and quality

+

+It has not been explicitly mentioned up to now: What you end up with after +encoding and decoding is not the same sound file anymore: All superfluous +information has been squeezed out, so to say. It is not the same file, but it + will sound the same - more or less, depending on how much compression has been + performed on it. +

+

+Generally speaking, the lower the compression ratio achieved, the better the +sound quality will be in the end - and vice versa.
+Table 1.1 gives you a rough estimate about the quality you can expect. +

+

+Because compression ratio is a somewhat unwieldy measure, experts use the term +bitrate when speaking of the strength of compression. Bitrate denotes the average +number of bits that one second of audio data will take up in your compressed +bitstream. Usually the units used will be kbps, which is kbits/s, or 1000 bits/s +(not 1024).
+To calculate the number of bytes per second of audio data, simply divide the +number of bits per second by eight. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
table 1.1: bitrate versus sound quality
BitrateBandwidthQuality comparable to
16 kbps mono5.5 khzabove shortwave radio / telephone
32 kbps mono8.5 khznear AM (medium wave) radio
64kbps mono, 128 kbps stereo16 khzFM radio
-V 3~-V 0 (160~200 kbps)
+ (variable bitrate)
18~20 khzperceptual transparency versus CD2 +
+
+
    +
  1. Audio compression (also called coding) + means reduce the size (bytes) that the original source requires to be stored. + This is not the same than compressors in DSP (or audio effects). The latter + reduces the dynamic range of the audio so that there is less difference in + perceived loudness between its strong and subtle parts. +
  2. +
  3. Lossy encoding (as opposed to lossless) cannot guarantee +transparency all of the time. This is the value accepted as the sweet spot. +
  4. + +
+
+
+ +
+ + + diff --git a/doc/html/links.html b/doc/html/links.html new file mode 100644 index 0000000..9b1174e --- /dev/null +++ b/doc/html/links.html @@ -0,0 +1,973 @@ + + + + + + + Links related to LAME + + + +
+
+ +
+ LAME Official Logo +

LAME and MP3-related Links

+
+ +

Quick Links:

+ + + +

Free (open source) software which supports or uses +LAME:

+ +

  Multiplatform:

+ +
    + +
  • + FFmpeg An awesome collection of + codecs (libavcodec) for pretty much all popular audio and video formats. +
  • + +
  • + Traverso, + a cross-platform Digital Audio Workstation (DAW). +
  • + +
  • + andromeda (PHP and ASP) + Dynamically presents collections of mp3s as streaming web sites. +
  • + +
  • + getID3() (PHP) PHP4 script that + extracts useful information from MP3s & other multimedia file formats. + Reads Lame tags. +
  • + +
  • + rip (Perl) Script for ripping + and encoding. +
  • + +
  • + VideoLAN A powerful multimedia + player and streaming solution for Win32, Linux, MacOS, BeOS... +
  • + +
  • + Audacity Open source + multiplatform audio editor. +
  • + +
  • + jRipper (Java) CD + ripper frontend. +
  • + +
  • + Tradebit + is a file hosting service that offers server-side MP3 encoding with LAME. +
  • + +
  • + fre:ac (Formerly BonkEnc) + A CD ripper, encoder & converter that uses LAME for MP3 encoding. +
  • + +
+ +

  Posix (Linux, MacOS X, BSD, Solaris, etc.): +

+ +
    + +
  • + k3b An exceptional CD burning and + ripping frontend for KDE. +
  • + +
  • + avifile AVI/DIVX encoder and decoder. +
  • + +
  • + Grip A gtk-based cd-player, + ripper and encoder. Supports cddb, cdparanoia and LAME. +
  • + +
  • + Transcode Several command line + utilities to transcode several audio and video formats. +
  • + +
  • + Mp3Maker + A WindowMaker enhanced front end to cdda2wav/cdparanoia and LAME/bladeenc. +
  • + +
  • + ripperX GTK frontend for + rippers and several encoders featuring CDDB support. +
  • + +
  • + T.E.A.R. frontend to LAME, + cdparanoia and CDDB. +
  • + +
  • + Xmcd. CD Player with CDDB and + ripping to MP3 and OGG. +
  • + +
  • + xtunes GTK frontend for LAME, + MAD, cdparanoia, cdrecord and more. +
  • + +
  • + DLame Perl script to + distribute the LAME encoding task among several machines in a network. +
  • + +
  • + Strec Stream recorder - A perl + wrapper for dsproxy, realplayer and LAME. +
  • + +
  • + TCDR a menu-driven console + frontend for CD recording and ripping that uses LAME to rip CDs into MP3 + files. +
  • + +
  • + DarkIce Live streamer for + IceCast. +
  • + +
  • + LiveIce + Real time streaming of mp3s. Works with IceCast. +
  • + +
  • + MuSE A mixing, encoding and streaming + engine. +
  • + +
  • + Flash For Linux a Flash-like + development library. +
  • + +
  • + ABCDE "A Better CD Encoder" + - Shell script to automatize ripping, encoding and tagging process. +
  • + +
  • + Arson - a KDE fronted to CD + burning and ripping tools. +
  • + +
  • + Cripple - A + command-line/batch CD ripper/encoder frontend. +
  • + +
+ +

  MacOS Classic:

+ +
    + +
  • + DropMP3 includes LAME + binaries. +
  • + +
+ +

  Windows:

+ +
    + +
  • + CDex Ripper & encoder, + includes LAME binaries (the Blade compatible dll). +
  • + +
  • + LameDropXPd + OggDrop style drag'n'drop frontend. +
  • + +
  • + DVDx DVD to + VCD/SVCD/AVI(XviD...) one-step converter. +
  • + +
  • + OmniEncoder a fully + featured frontend for LAME and several other encoders. +
  • + +
  • + LAMEX An activex control for + LAME, and a GUI. Source code only, includes LAME. +
  • + +
  • + m3w A + live mp3 streamer for the WWW. Works with LAME, icecast, soundcard input. +
  • + +
  • + out_lame Winamp output + plug-in. Create MP3 files directly from Winamp! +
  • + +
  • + RazorLame The + RazorBlade front end now supports LAME. +
  • + +
  • + winLAME The only *nice* + windows UI for LAME, according to the author :-) +
  • + +
  • + bbc2mp3 a tool for + saving BBC "Listen Again" programmes as MP3 files. +
  • + +
  • + Aaron's Sonar Mp3 Patch + a Cakewalk Sonar plugin written in AutoHotkey. +
  • +
+ +

Free (closed source) software which supports or uses +LAME:

+ +
    + +
  • + Foobar2000 (Windows) an audio + player with spartan interface but lots of components and an almost + fanatical focus on audio quality. +
  • + +
  • + Audiograbber (Windows) + CD ripper/encoder. +
  • + +
  • + EnLAMEr + (Windows) frontend for lame.exe +
  • + +
  • + EAC (Windows) Exact Audio + Copy: High quality CD ripper. +
  • + +
  • + jtvmaker (Java) A web + slideshow generating and photo sharing tool using LAME. +
  • + +
  • + Wavosaur Free audio editor and + batch processor. +
  • + +
  • + LameBatch (Windows) frontend + for lame.exe +
  • + +
  • + Hard Disk Ogg a + line-in recorder that can encode directly to MP3, among other formats. +
  • + +
  • + LAMEr (Windows) Can also + encode from line-in. +
  • + +
  • + RipTrax (Windows) Advanced CD Ripper + with support for LAME and Vorbis. +
  • + +
  • + Music Conduit (Windows) + A working substitute for the Transfer to Device feature in Windows Media + Player. +
  • + +
  • + WORM MP3 Encoder + (Windows) MP3 encoder based on LAME with reported improvements. +
  • + +
  • + ZLURP (Windows, Mac, Linux) Ripper and + encoder. Includes LAME binaries. +
  • + +
  • + iTunes-LAME (MacOS) + Integrates LAME into Apple iTunes, as an alternative to the default + (rather poor) encoder. +
  • + +
  • + LameBrain (MacOS) + LAME frontend for MacOS X. +
  • + +
  • + SecondSpin + (Amiga) ripper & encoder. +
  • + +
+ +

Commercial software which supports or uses +LAME:

+ +
    + +
  • + WinAmp Can rip CDs using Lame, but + only in the Pro (paid) version. +
  • + +
  • + WaveLab Digital Audio + editing software. +
  • + +
  • + Mackie Tracktion + a sequencer that uses LAME to export to MP3. +
  • + +
  • + Goldwave Audio editor for Windows. +
  • + +
  • + dBpowerAMP (Windows) Rip and + encode to/from mp3, wma, vorbis and other audio formats. +
  • + +
  • + UltraISO ISO CD image + builder, editor and extractor. +
  • + +
  • + J. River Media Center + a media center software that supports LAME for ripping, transcoding, and gapless playback. +
  • + +
  • + Acoustica + digital audio editor . +
  • + +
  • + AudioEdit Deluxe Windows + sound editor. +
  • + +
  • + Blaze Media Pro audio/video + converter, editor, CD/DVD burner, and more for Windows. +
  • + +
  • + SWiSH Max Adobe Flash + authoring tool for Windows. +
  • + +
  • + übercaster Podcast + production suite for Macintosh. +
  • + +
  • + Audio Ease BarbaBatch Batch audio + file converter for Macintosh. +
  • + +
  • + Amadeus II (Mac) + Manipulate, create and analyze sounds. +
  • + +
  • + Peak 3 Macintosh audio + editing/processing/mastering software. +
  • + +
  • + Audion Mac Jukebox software. +
  • + +
  • + CD Stack CD ripping software for + Mac. +
  • + +
  • + Text Aloud MP3 Converts text + into speech. +
  • + +
  • + TotalRecorder Universal sound + recoder. +
  • + +
  • + CDcopy Windows ripper/encoder. +
  • + +
  • + eJay DJ Mix Station / Dance eJay + Various Windows DJ software, using Gogo. +
  • + +
  • + Easy CD-DA Extractor Windows + ripper/encoder, includes LAME binaries. +
  • + +
  • + MP3 Observer MP3 file-manager, + ID3 tag editor, playlist creator and CD-archiving tool. +
  • + +
  • + MPAction MP3 Tools Windows + jukebox software. +
  • + +
  • + 1CoolButtonTool Flash and Java + button editor. +
  • + +
  • + N2MP3 Pro Macintosh jukebox + software. +
  • + +
  • + UltraTagger. ID3 tag + management, encoding and decoding. +
  • + +
  • + UMG protected audio CDs + UMG is using Lame for the PC part of protected audio CDs. ("Fast + and Furious"). +
  • + +
  • + Visual MP3 Windows jukebox + software with Karaoke support. +
  • + +
  • + Flash Digger Plus - a ShockWave + Flash decompiler. +
  • + +
+ +
+ + + +

LAME Binaries:

+ +

Linux:

+ + + +

Windows:

+ +
    + +
  • + RareWares offers several + compiled LAME versions, including modified versions featuring special + functionality. +
  • + +
  • + From the Encoder/Windows section of Arturo "Buanzo" Busleiman + offers up-to-date Windows and Mac OS LAME compiles on his Argentina-hosted site. . +
  • + +
  • + In the encoders section of MAZ + Sound. +
  • + +
+ +

MacOS X:

+ +
    + +
  • + Thalictrum offers optimized + binaries for both Intel and PowerPC Macs. +
  • + +
  • + KJams has a + QuickTime component, which allows you to export audio from QuickTime + and related apps to MP3 using LAME. +
  • + +
  • + The FINK project provides LAME + binaries compiled for MacOS X. +
  • + + + +
+ +

Solaris:

+ +
    + +
  • + Sunfreeware provides + up-to-date binaries for several versions of Sun Solaris, both SPARC and + x86 architectures. +
  • + +
+ +

Etc.:

+ + + +

Amiga:

+ + + +
+ +

Other MP3 Encoders:

+ +
    + +
  • + Takehiro Tominaga has done some + amazing work on LAME recently (see + history). His versions are available here (source code only). + Fortunately for us, Takehiro takes the time to fold many of his + improvements back into LAME. +
  • + +
  • + George Kotorlis created a multithreaded version of LAME called + fpMP3Enc based on his multicore framework Fiber Pool. +
  • + +
  • + GOGO-no-coda + MP3 encoder (Alternate + link) A forked version of LAME with many key routines rewritten in + assembly (I.E, it's much faster). Uses the NASM assembler. +
  • + +
  • + FhG MP3enc 3.1. The + gold standard of encoders. All other encoders strive to sound this good. + Demo version only encodes up to 30 seconds.
    + Update: according to recent listening tests, Lame already surpassed + FhG encoders in quality at most bitrates. :-) +
  • + +
  • + FhG l3enc. The older + brother of MP3enc. Very slow, but with quite reasonable quality. +
  • + +
  • + FhG Fastencc this + "free" encoder was created with libraries stolen from Fraunhofer. It's + the faster brother of MP3enc, and also the only FhG encoder to offer VBR + encoding. Quality is not on par with MP3enc or LAME. +
  • + +
  • + BladeEnc One of + the first free encoders for Linux. Development has stopped at version + 0.94.2. Quality is not satisfactory. +
  • + +
  • + Xing MP3 + encoder Reasonable quality and extremely fast encoder. Is now the MP3 + encoder used in Real Jukebox and Real Player, and has been recently + released under an Open Source license (it's still limited to Windows + though) +
  • + +
  • + QDesign MP3 encoder Horrible + quality. Only listed here for completeness purposes. +
  • + +
  • + ReallyRareWares is an online + museum preserving obsolete and defunct encoders for several audio + formats, including old LAME versions and obscure MP3 encoders (most of + these encoders are simply compiles of the MPEG reference sources - + dist10 - though) +
  • +
+ +
+ +

MP3 Encoder Comparisons based on listening +tests:

+ + + +

MP3 Encoding Web Sites:

+ +
    + +
  • + Hydrogenaudio + - Public discussion forum focused on psychoacoustic audio compression, + featuring an MP3 section. +
  • + +
  • + MAZ Sound Encoders and other + audio software. +
  • + +
+ +

General MP3 Web Sites:

+ + + +

MP3 Related Software and Hardware:

+ +
    + +
  • + A favorite Linux ripper: cdparanoia (also, GNU's + libcdio, a + multiplatform port of CDparanoia) +
  • + +
  • + How to figure out which codec was used to make that mp3? Use EncSpot +
  • + +
  • + Open source embedded mp3? Cantante +
  • + +
  • + The MAD decoder Bug + free, 24bit and GPL! +
  • + +
  • + PCAVtech sound + card benchmarks +
  • + +
  • + Maate looks like a + very sophisticated MP3 analysis package. They also have a good + description of MP3 frames. +
  • + +
  • + A nice .wav file viewer and editor: sweep +
  • + +
  • + mptrim: Trim silence and adjust + volume of mp3 files. +
  • + +
  • + mp3check: A + program to check integrity of mp3 files. +
  • + +
  • + Mpcut: X11 mp3 + frame editor. +
  • + +
  • + mp3asm: A program + to cut and paste mp3 frames. +
  • + +
  • + MP3Splitter: Win32 + MP3 splitter and frame statistics. +
  • + +
  • + jchopwave: Source code to a + utility to split up .wav files. +
  • + +
+ +

MP3 Encoding direct from line-in:

+ +
    + +
  • + mpegrec: Linux/Win32 + line-in/mic MP3 recorder (requires LAME). +
  • + +
  • + MixMP3 by Dmitry Lesnikov +
  • + +
  • + Messer by Dariusz + Sieradzki +
  • + +
  • + LAMEr, also a nice + Windows + frontend +
  • + +
+ +

Patent Information:

+ + + +
+ +
+ + + \ No newline at end of file diff --git a/doc/html/list.html b/doc/html/list.html new file mode 100644 index 0000000..6a49be9 --- /dev/null +++ b/doc/html/list.html @@ -0,0 +1,69 @@ + + + + + + + LAME MP3 Encoder :: The LAME Mailing List + + + +
+
+ +
+ LAME Official Logo +

The LAME Mailing List

+
+ +

+ Thanks to Jan Peman for running the mp3encoder mailing list for several + years! +

+ +

+ In September of 2000, the list was moved and is now run by Warren Toomey. To + join, visit the + mp3encoder mailing list webpage. +

+ +

+ The development + list is run by SourceForge +

+ +
+ +
+ + + \ No newline at end of file diff --git a/doc/html/ms_stereo.html b/doc/html/ms_stereo.html new file mode 100644 index 0000000..095853f --- /dev/null +++ b/doc/html/ms_stereo.html @@ -0,0 +1,126 @@ + + + + + + + LAME MP3 Encoder :: Mid/Side Stereo + + + +
+
+ +
+ LAME Official Logo +

LAME - Mid/Side Stereo

+
+ +

+During years, what is called Joint-stereo has been misunderstood.
+Joint stereo in MP3 is a mechanism to selectively choose between three modes +of storing stereo information. These three modes are Simple Stereo +, Mid-Side Stereo, and Intensity-Stereo. +

+

+In Simple Stereo, the encoder analyzes the left and the right channels +independently and stores the information as-is, without further checking the +similarities in the signal1 +

+

+In Mid-Side Stereo, the encoder analyzes the left, right2 +, mid (l+r) and side (l-r) channels. It then gives more bits to the +mid than the side channel (as usually the side channel is less complex) and then +stores just the mid and side channels into the resulting MP3.
+This way, the mid channel can be encoded as if the frame was bigger, and as such +have more quality with the same bitrate.
+Note: Mid/side in MP3 is switched frame-by-frame. In AAC, it can be switched +band by band. +

+

+Intensity-Stereo (not supported in LAME) uses a technique known as joint +frequency encoding, which is based on the principle of sound localization.
+Human hearing is predominantly less acute at perceiving the direction of certain +audio frequencies. By exploiting this 'limitation', intensity stereo coding can +reduce the data rate of an audio stream with little or no perceived change in +apparent quality.
+It works by merging the upper spectrum into just one channel (thus reducing +overall differences between channels) and transmiting a little side information +about how to pan certain frequency regions.
+This type of coding does not perfectly reconstruct the original audio because +of the loss of information and can cause unwanted artifacts. However, for very +low bitrates this tool usually provides a gain of perceived quality. +3 +

+ +

+ The LAME mid/side switching criterion, and mid/side masking thresholds are + taken from Johnston and Ferreira, Sum-Difference Stereo Transform + Coding, Proc. IEEE ICASSP (1992) p 569-571. +

+ +

+ The MPEG AAC standard claims to use mid/side encoding based on this paper. +

+ +
+
    +
  1. This is not the same than dual-mono. Dual-mono should be +used where the left and right channels of the input file contain two different +streams, where you should choose one (as in two different languages)
  2. +
  3. If one channel has much less noise masking in a certain +band than the other, it could happen than the noise spread (by mid/side stereo) +may no longer be masked for that channel. If both channels have the same +masking, then the noise spread between both channels will be equally well masked. +
    +To prevent this from happening, there is an analysis done on the left and right +channel to determine the noise masking thresholds and properly mask the noise.
  4. +
  5. Quote from wikipedia Joint_stereo.
  6. +
+
+ +
+ +
+ + + \ No newline at end of file diff --git a/doc/html/usage.html b/doc/html/usage.html new file mode 100644 index 0000000..4238849 --- /dev/null +++ b/doc/html/usage.html @@ -0,0 +1,140 @@ + + + + + + + Usage of the commandline encoder + + + +
+
+ +
+ LAME Official Logo +

Common and recommended switches

+
+

Common settings

+
+% lame [options] inputfile [outputfile]
+
+
    +
  • Constant Bitrate: -b number or + --preset cbr number Valid values +for the -b settings depend on the sampling rate1. +
    lame -b 128 sample.wav sample.mp3
    +
  • +
  • Variable Bitrate (ABR mode): + --abr number or --preset number + Valid values for the --abr setting range from 8 to 320. +
    lame --abr 128 sample.wav sample.mp3
    +
  • +
  • Variable Bitrate (VBR mode): + -V number Valid values +are from 0 to 9, with decimal values possible, where 0 is the highest quality +while 9.999 is the lowest one. +
    lame -V2 sample.wav sample.mp3
    +
  • +
+

Hydrogenaudio recommended settings

+
    +Very high quality, HiFi, home, or quiet listening, with best file size : +-V0 (avg. 245 kbps) or -V1 + (avg. 225 kbps) or -V2 (avg. 190 kbps) or -V3 (avg. 175 kbps). +

    VBR settings will normally produce transparent results. + Audible differences between these presets may exist, but are rare. +

    + +
  • +Very high quality, HiFi, home, or quiet listening, with maximum file size2 : +-b 320 +

    This CBR mode will maximize the MP3's bitrate and overall file +size. The extra space may allow for some parts of the audio to be +compressed with fewer sacrifices, but to date, no one has produced +ABX test results demonstrating that perceived quality is ever better +than the highest VBR profiles described above. +

    +
  • +
  • Portable, listening in noisy conditions, lower bitrate, smaller file size: +-V4 (avg. 160 kbps) or -V5 +(avg. 130 kbps) or -V6 (avg. 115 kbps) +

    +-V6 produces an "acceptable" quality, while -V4 should be close to perceptual transparency. +

    +
  • +
  • Very low bitrate, small sizes, eg. for voice, radio, mono encoding : +--abr 80 (stereo) or --abr 56 -m m (mono) +

    +For very low bitrates, up to 100kbps, ABR is most often the best solution. +--preset voice is only available in the command line front-end, and +is there for compatibility. It is currently mapped to --abr 56 -mm, + so that means that the recommendation would be to encode in mono, + and use ABR. +

    +
  • +
+
+
    +
  1. + + + + + + + + + + +
    Codecsample frequencies (kHz)bitrates (kbps)
    MPEG-1 layer III 32, 44.1, 4832 40 48 56 64 80 96 112 128 160 192 224 256 320
    MPEG-2 layer III 16, 22.05, 24 8 16 24 32 40 48 56 64 80 96 112 128 144 160
    MPEG-2.5 layer III 8, 11.025, 128 16 24 32 40 48 56 64
    +
  2. +
  3. Lossy codecs, like MP3, should not be used for archiving, +since the nature of lossy encoding always changes the original sound, even if it +sounds transparent. Use lossless codecs for this purpose. +
  4. +
+
+ +
+ +
+ + + diff --git a/doc/html/vbr.html b/doc/html/vbr.html new file mode 100644 index 0000000..77c4791 --- /dev/null +++ b/doc/html/vbr.html @@ -0,0 +1,83 @@ + + + + + + + LAME MP3 Encoder :: Variable Bit Rate + + + +
+
+ +
+ LAME Official Logo +

LAME - Variable Bit Rate

+
+ +

Suggested usage:

+
lame -V2 input.wav output.mp3
+ +

+In Variable Bitrate (VBR) coding, the user chooses a desired quality level +instead of a bitrate. A correct implementation should be able to maintain the +same quality perception, changing the bitrate to a higher or lower one whenever +the audio file is more or less complex. With MP3, this is not always possible. +

+

+VBR encoding is the logical way of encoding data. General data compressors (like +.zip and .rar) are VBR, as lossless codecs are as well. Being able to indicate +a quality value, the encoder decides for each frame, which is the most appropiate +bitrate to keep it. +

+

+The main advantage of using VBR is that the encoder will use the smallest amount +of bytes needed to keep the asked quality. The inconvenience is that the +file size is quite unpredictable, and can change from file to file in more than +50kbps. (or nearly double the size, with different genres and quasi-mono content) +

+
+ +
+ + + \ No newline at end of file diff --git a/doc/man/Makefile.am b/doc/man/Makefile.am new file mode 100644 index 0000000..8697038 --- /dev/null +++ b/doc/man/Makefile.am @@ -0,0 +1,6 @@ +## $Id: Makefile.am,v 1.2 2013/06/12 09:16:29 rbrito Exp $ + +AUTOMAKE_OPTIONS = foreign + +man_MANS = lame.1 +EXTRA_DIST = ${man_MANS} diff --git a/doc/man/Makefile.in b/doc/man/Makefile.in new file mode 100644 index 0000000..1cabff5 --- /dev/null +++ b/doc/man/Makefile.in @@ -0,0 +1,546 @@ +# Makefile.in generated by automake 1.15.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2017 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = doc/man +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +man1dir = $(mandir)/man1 +am__installdirs = "$(DESTDIR)$(man1dir)" +NROFF = nroff +MANS = $(man_MANS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_DEFS = @CONFIG_DEFS@ +CONFIG_MATH_LIB = @CONFIG_MATH_LIB@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CPUCCODE = @CPUCCODE@ +CPUTYPE = @CPUTYPE@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FRONTEND_CFLAGS = @FRONTEND_CFLAGS@ +FRONTEND_LDADD = @FRONTEND_LDADD@ +FRONTEND_LDFLAGS = @FRONTEND_LDFLAGS@ +GREP = @GREP@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_CONFIG = @GTK_CONFIG@ +GTK_LIBS = @GTK_LIBS@ +INCLUDES = @INCLUDES@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDADD = @LDADD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_MAJOR_VERSION = @LIB_MAJOR_VERSION@ +LIB_MINOR_VERSION = @LIB_MINOR_VERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEDEP = @MAKEDEP@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NASM = @NASM@ +NASM_FORMAT = @NASM_FORMAT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM_F = @RM_F@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_FRONTEND = @WITH_FRONTEND@ +WITH_MP3RTP = @WITH_MP3RTP@ +WITH_MP3X = @WITH_MP3X@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = foreign +man_MANS = lame.1 +EXTRA_DIST = ${man_MANS} +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/man/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign doc/man/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-man1: $(man_MANS) + @$(NORMAL_INSTALL) + @list1=''; \ + list2='$(man_MANS)'; \ + test -n "$(man1dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ + { for i in $$list1; do echo "$$i"; done; \ + if test -n "$$list2"; then \ + for i in $$list2; do echo "$$i"; done \ + | sed -n '/\.1[a-z]*$$/p'; \ + fi; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(MANS) +installdirs: + for dir in "$(DESTDIR)$(man1dir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-man + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: install-man1 + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-man + +uninstall-man: uninstall-man1 + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-man1 install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am tags-am uninstall uninstall-am uninstall-man \ + uninstall-man1 + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/doc/man/lame.1 b/doc/man/lame.1 new file mode 100644 index 0000000..7bdb383 --- /dev/null +++ b/doc/man/lame.1 @@ -0,0 +1,1101 @@ +.TH lame 1 "December 08, 2013" "LAME 3.99" "LAME audio compressor" +.SH NAME +lame \- create mp3 audio files +.SH SYNOPSIS +lame [options] +.SH DESCRIPTION +.PP +LAME is a program which can be used to create compressed audio files. +(Lame ain't an MP3 encoder). +These audio files can be played back by popular MP3 players such as +mpg123 or madplay. +To read from stdin, use "\-" for . +To write to stdout, use "\-" for . +.SH OPTIONS +Input options: +.TP +.B \-r +Assume the input file is raw pcm. +Sampling rate and mono/stereo/jstereo must be specified on the command line. +For each stereo sample, LAME expects the input data to be ordered left channel +first, then right channel. By default, LAME expects them to be signed integers +with a bitwidth of 16 and stored in little-endian. +Without +.B \-r, +LAME will perform several +.I fseek()'s +on the input file looking for WAV and AIFF headers. +.br +Might not be available on your release. +.TP +.B \-x +Swap bytes in the input file (or output file when using +.B \-\-decode). +.br +For sorting out little endian/big endian type problems. +If your encodings sounds like static, +try this first. +.br +Without using +.B \-x, +LAME will treat input file as native endian. +.TP +.BI \-s " sfreq" +.I sfreq += 8/11.025/12/16/22.05/24/32/44.1/48 + +Required only for raw PCM input files. +Otherwise it will be determined from the header of the input file. + +LAME will automatically resample the input file to one of the supported +MP3 samplerates if necessary. +.TP +.BI \-\-bitwidth " n" +Input bit width per sample. +.br +.I n += 8, 16, 24, 32 (default 16) + +Required only for raw PCM input files. +Otherwise it will be determined from the header of the input file. +.TP +.BI \-\-signed +Instructs LAME that the samples from the input are signed (the default +for 16, 24 and 32 bits raw pcm data). + +Required only for raw PCM input files. +.TP +.BI \-\-unsigned +Instructs LAME that the samples from the input are unsigned (the default +for 8 bits raw pcm data, where 0x80 is zero). + +Required only for raw PCM input files +and only available at bitwidth 8. +.TP +.BI \-\-little-endian +Instructs LAME that the samples from the input are in little-endian form. + +Required only for raw PCM input files. +.TP +.BI \-\-big-endian +Instructs LAME that the samples from the input are in big-endian form. + +Required only for raw PCM input files. +.TP +.B \-\-mp1input +Assume the input file is a MPEG Layer I (ie MP1) file. +.br +If the filename ends in ".mp1" LAME will assume it is a MPEG Layer I file. +For stdin or Layer I files which do not end in .mp1 you need to use +this switch. +.TP +.B \-\-mp2input +Assume the input file is a MPEG Layer II (ie MP2) file. +.br +If the filename ends in ".mp2" LAME will assume it is a MPEG Layer II file. +For stdin or Layer II files which do not end in .mp2 you need to use +this switch. +.TP +.B \-\-mp3input +Assume the input file is a MP3 file. +.br +Useful for downsampling from one mp3 to another. +As an example, +it can be useful for streaming through an IceCast server. +.br +If the filename ends in ".mp3" LAME will assume it is an MP3. +For stdin or MP3 files which do not end in .mp3 you need to use this switch. +.TP +.BI \-\-nogap " file1 file2 ..." +gapless encoding for a set of contiguous files +.TP +.BI \-\-nogapout " dir" +output dir for gapless encoding (must precede \-\-nogap) +.TP +.BI \-\-out-dir " dir" +If no explicit output file is specified, a file will be written at given path. +Ignored when using piped/streamed input + +.PP +Operational options: +.TP +.BI \-m " mode" +.I mode += s, j, f, d, m, l, r + +Joint-stereo is the default mode for stereo files. + +.B (s)imple stereo (Forced LR) +.br +In this mode, +the encoder makes no use of potentially existing correlations between +the two input channels. +It can, +however, +negotiate the bit demand between both channel, +i.e. give one channel more bits if the other contains silence or needs +less bits because of a lower complexity. + +.B (j)oint stereo +.br +In this mode, +the encoder can use (on a frame by frame basis) either L/R stereo or mid/side stereo. +In mid/side stereo, +the mid (L+R) and side (L-R) channels are encoded, +and more bits are allocated to the mid channel than the side channel. +When there isn't too much stereo separation, this effectively increases the bandwidth, +so having higher quality with the same amount of bits. + +Using mid/side stereo inappropriately can result in audible compression artifacts. +Too much switching between mid/side and regular stereo can also sound bad. +To determine when to switch to mid/side stereo, +LAME uses a much more sophisticated algorithm than the one described in the ISO documentation. + +.B (f)orced MS stereo +.br +Forces all frames to be encoded with mid/side stereo. It should be used only if you are sure that every frame of the input file has very little stereo separation. + +.B (d)ual channel +.br +In this mode, +the 2 channels will be totally independently encoded. +Each channel will have exactly half of the bitrate. +This mode is designed for applications like dual languages +encoding (for example: English in one channel and French in the other). +Using this encoding mode for regular stereo files will result in a +lower quality encoding. + +.B (m)ono +.br +The input will be encoded as a mono signal. +If it was a stereo signal, +it will be downsampled to mono. +The downmix is calculated as the sum of the left and right channel, +attenuated by 6 dB. +Also note that, if using a stereo RAW PCM stream, you need to use the -a parameter. + +.B (l)eft channel only +.br +The input will be encoded as a mono signal. +If it was a stereo signal, +the left channel will be encoded only. + +.B (r)ight channel only +.br +The input will be encoded as a mono signal. +If it was a stereo signal, +the right channel will be encoded only. + +.TP +.B \-a +Mix the stereo input file to mono and encode as mono. +.br +The downmix is calculated as the sum of the left and right channel, +attenuated by 6 dB. + +This option is only needed in the case of raw PCM stereo input +(because LAME cannot determine the number of channels in the input file). +To encode a stereo RAW PCM input file as mono, +use +.B lame \-a \-m m + +For WAV and AIFF input files, +using +.B \-m m +will always produce a mono .mp3 file from both mono and stereo input. +.TP +.B \-\-freeformat +Produces a free format bitstream. +With this option, +you can use +.B \-b +with any bitrate higher than 8 kbps. + +However, +even if an mp3 decoder is required to support free bitrates at +least up to 320 kbps, +many players are unable to deal with it. + +Tests have shown that the following decoders support free format: +.br +.B in_mpg123 +up to 560 kbps +.br +.B l3dec +up to 310 kbps +.br +.B LAME +up to 640 kbps +.br +.B MAD +up to 640 kbps +.TP +.B \-\-decode +Uses LAME for decoding to a wav file. +The input file can be any input type supported by encoding, +including layer II files. +LAME uses a fork of mpglib known as HIP for decoding. + +If +.B \-t +is used (disable wav header), +LAME will output raw pcm in native endian format. +You can use +.B \-x +to swap bytes order. + +This option is not usable if the MP3 decoder was +.B explicitly +disabled in the build of LAME. +.TP +.BI \-t +Disable writing of the INFO Tag on encoding. +.br +This tag is embedded in frame 0 of the MP3 file. +It includes some information about the encoding options of the file, +and in VBR it lets VBR aware players correctly seek and compute +playing times of VBR files. + +When +.B \-\-decode +is specified (decode to WAV), +this flag will disable writing of the WAV header. +The output will be raw pcm, +native endian format. +Use +.B \-x +to swap bytes. +.TP +.BI \-\-comp " arg" +Instead of choosing bitrate, +using this option, +user can choose compression ratio to achieve. +.TP +.BI \-\-scale " n" +.PD 0 +.TP +.BI \-\-scale\-l " n" +.TP +.BI \-\-scale\-r " n" +Scales input (every channel, only left channel or only right channel) by +.I n. +This just multiplies the PCM data (after it has been converted to floating +point) by +.I n. + +.I n +> 1: increase volume +.br +.I n += 1: no effect +.br +.I n +< 1: reduce volume + +Use with care, +since most MP3 decoders will truncate data which decodes to values +greater than 32768. +.PD +.TP +.B \-\-replaygain\-fast +Compute ReplayGain fast but slightly inaccurately. + +This computes "Radio" ReplayGain on the input data stream after +user\(hyspecified volume\(hyscaling and/or resampling. + +The ReplayGain analysis does +.I not +affect the content of a compressed data stream itself, +it is a value stored in the header of a sound file. +Information on the purpose of ReplayGain and the algorithms used is +available from +.B http://www.replaygain.org/. + +Only the "RadioGain" Replaygain value is computed, +it is stored in the LAME tag. +The analysis is performed with the reference +volume equal to 89dB. +Note: the reference volume has been changed from 83dB on transition from +version 3.95 to 3.95.1. + +This switch is enabled by default. + +See also: +.B \-\-replaygain\-accurate, \-\-noreplaygain +.TP +.B \-\-replaygain\-accurate +Compute ReplayGain more accurately and find the peak sample. + +This computes "Radio" ReplayGain on the decoded data stream, +finds the peak sample by decoding on the fly the encoded data stream and stores it in the file. + +The ReplayGain analysis does +.I not +affect the content of a compressed data stream itself, +it is a value stored in the header of a sound file. +Information on the purpose of ReplayGain and the algorithms used is +available from +.B http://www.replaygain.org/. + + +By default, LAME performs ReplayGain analysis on the input data +(after the user\(hyspecified volume scaling). +This behavior might give slightly inaccurate results +because the data on the output of a lossy compression/decompression sequence +differs from the initial input data. +When +.B \-\-replaygain-accurate +is specified the mp3 stream gets decoded on the fly and the analysis is +performed on the decoded data stream. +Although theoretically this method gives more accurate results, +it has several disadvantages: +.RS 8 +.IP "*" 4 +tests have shown that the difference between the ReplayGain values computed +on the input data and decoded data is usually not greater than 0.5dB, +although the minimum volume difference the human ear can perceive is +about 1.0dB +.IP "*" 4 +decoding on the fly significantly slows down the encoding process +.RE +.RS 7 + +The apparent advantage is that: +.RE +.RS 8 +.IP "*" 4 +with +.B \-\-replaygain-accurate +the real peak sample is determined and stored in the file. +The knowledge of the peak sample can be useful to decoders (players) +to prevent a negative effect called 'clipping' that introduces distortion +into the sound. +.RE +.RS 7 + +Only the "RadioGain" ReplayGain value is computed, +it is stored in the LAME tag. +The analysis is performed with the reference +volume equal to 89dB. +Note: the reference volume has been changed from 83dB on transition from +version 3.95 to 3.95.1. + +This option is not usable if the MP3 decoder was +.B explicitly +disabled in the build of LAME. +(Note: if LAME is compiled without the MP3 decoder, +ReplayGain analysis is performed on the input data after user-specified +volume scaling). + +See also: +.B \-\-replaygain-fast, \-\-noreplaygain \-\-clipdetect +.RE +.TP +.B \-\-noreplaygain +Disable ReplayGain analysis. + +By default ReplayGain analysis is enabled. This switch disables it. + +See also: +.B \-\-replaygain-fast, \-\-replaygain-accurate +.TP +.B \-\-clipdetect +Clipping detection. + +Enable +.B \-\-replaygain-accurate +and print a message whether clipping occurs and how far in dB the waveform +is from full scale. + +This option is not usable if the MP3 decoder was +.B explicitly +disabled in the build of LAME. + +See also: +.B \-\-replaygain-accurate +.TP +.B \-\-preset " type | [cbr] kbps" +Use one of the built-in presets. + +Have a look at the PRESETS section below. + +.B \-\-preset help +gives more infos about the the used options in these presets. +.TP +.B \-\-noasm " type" +Disable specific assembly optimizations ( +.B mmx +/ +.B 3dnow +/ +.B sse +). +Quality will not increase, only speed will be reduced. +If you have problems running Lame on a Cyrix/Via processor, +disabling mmx optimizations might solve your problem. + +.PP +Verbosity: +.TP +.BI \-\-disptime " n" +Set the delay in seconds between two display updates. +.TP +.B \-\-nohist +By default, +LAME will display a bitrate histogram while producing VBR mp3 files. +This will disable that feature. +.br +Histogram display might not be available on your release. +.TP +.B -S +.PD 0 +.TP +.B \-\-silent +.TP +.B \-\-quiet +Do not print anything on the screen. +.PD +.TP +.B \-\-verbose +Print a lot of information on the screen. +.TP +.B \-\-help +Display a list of available options. + +.PP +Noise shaping & psycho acoustic algorithms: +.TP +.BI -q " qual" +0 <= +.I qual +<= 9 + +Bitrate is of course the main influence on quality. +The higher the bitrate, +the higher the quality. +But for a given bitrate, +we have a choice of algorithms to determine the best scalefactors +and Huffman encoding (noise shaping). + +For CBR and ABR, the following table applies: + +.B -q 0: +.br +Use the best algorithms (Best Huffman coding search, full outer loop, and the highest precision of several parameters). + +.B -q 1 to q 4: +.br +Similar to -q 0 without the full outer loop and decreasing precision of parameters the further from q0. -q 3 is the default. + +.B -q 5 and -q 6: +.br +Same as -q 7, but enables noise shaping and increases subblock gain + +.B -q 7 to -q 9: +.br +Same as -f. Very fast, OK quality. Psychoacoustics are used for pre-echo and mid/side stereo, but no noise-shaping is done. + +For the default VBR mode since LAME 3.98, the following table applies : + +.B -q 0 to -q 4: +.br +include all features of the other modes and additionally use the best search when applying Huffman coding. + +.B -q 5 and -q 6: +.br +include all features of -q7, calculate and consider actual quantisation noise, and additionally enable subblock gain. + +.B -q 7 to -q 9 +.br +This level uses a psymodel but does not calculate quantisation noise when encoding: it takes a quick guess. + + +.TP +.B -h +Alias of +.B -q 2 +.TP +.B -f +Alias of +.B -q 7 + + +.PP +CBR (constant bitrate, the default) options: +.TP +.BI -b " n" +For MPEG-1 (sampling frequencies of 32, 44.1 and 48 kHz) +.br +.I n += 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320 + +For MPEG-2 (sampling frequencies of 16, 22.05 and 24 kHz) +.br +.I n += 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160 + +For MPEG-2.5 (sampling frequencies of 8, 11.025 and 12 kHz) +.br +.I n += 8, 16, 24, 32, 40, 48, 56, 64 + +Default is 128 for MPEG1 and 64 for MPEG2 and 32 for MPEG2.5 + (64, 32 and 16 respectively in case of mono). +.TP +.BI \-\-cbr +enforce use of constant bitrate. Used to disable VBR or ABR encoding even if their settings +are enabled. + +.PP +ABR (average bitrate) options: +.TP +.BI \-\-abr " n" +Turns on encoding with a targeted average bitrate of n kbits, +allowing to use frames of different sizes. +The allowed range of +.I n +is 8 - 310, +you can use any integer value within that range. + +It can be combined with the +.B -b +and +.B -B +switches like: +.B lame \-\-abr +.I 123 +.B -b +.I 64 +.B -B +.I 192 a.wav a.mp3 +which would limit the allowed frame sizes between 64 and 192 kbits. + +The use of +.B -B +is NOT RECOMMENDED. +A 128 kbps CBR bitstream, +because of the bit reservoir, +can actually have frames which use as many bits as a 320 kbps frame. +VBR modes minimize the use of the bit reservoir, +and thus need to allow 320 kbps frames to get the same flexibility +as CBR streams. + +.PP +VBR (variable bitrate) options: +.TP +.B -v +use variable bitrate +.B (\-\-vbr-new) +.TP +.B \-\-vbr-old +Invokes the oldest, +most tested VBR algorithm. +It produces very good quality files, +though is not very fast. +This has, +up through v3.89, +been considered the "workhorse" VBR algorithm. +.TP +.B \-\-vbr-new +Invokes the newest VBR algorithm. +During the development of version 3.90, +considerable tuning was done on this algorithm, +and it is now considered to be on par with the original +.B \-\-vbr-old. +It has the added advantage of being very fast (over twice as fast as +.B \-\-vbr-old +). This is the default since 3.98. +.TP +.BI -V " n" +0 <= +.I n +<= 9.999 +.br +Enable VBR (Variable BitRate) and specifies the value of VBR quality +(default = 4). Decimal values can be specified, like 4.51. +.br +0 = highest quality. + +.PP +ABR and VBR options: +.TP +.BI -b " bitrate" +For MPEG-1 (sampling frequencies of 32, 44.1 and 48 kHz) +.br +.I n += 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320 + +For MPEG-2 (sampling frequencies of 16, 22.05 and 24 kHz) +.br +.I n += 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160 + +For MPEG-2.5 (sampling frequencies of 8, 11.025 and 12 kHz) +.br +.I n += 8, 16, 24, 32, 40, 48, 56, 64 + +Specifies the minimum bitrate to be used. +However, +in order to avoid wasted space, +the smallest frame size available will be used during silences. +.TP +.BI -B " bitrate" +For MPEG-1 (sampling frequencies of 32, 44.1 and 48 kHz) +.br +.I n += 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320 + +For MPEG-2 (sampling frequencies of 16, 22.05 and 24 kHz) +.br +.I n += 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160 + +For MPEG-2.5 (sampling frequencies of 8, 11.025 and 12 kHz) +.br +.I n += 8, 16, 24, 32, 40, 48, 56, 64 + +Specifies the maximum allowed bitrate. + +Note: If you own an mp3 hardware player build upon a MAS 3503 chip, +you must set maximum bitrate to no more than 224 kpbs. +.TP +.B -F +Strictly enforce the +.B -b +option. +.br +This is mainly for use with hardware players that do not support low +bitrate mp3. + +Without this option, +the minimum bitrate will be ignored for passages of analog silence, +i.e. when the music level is below the absolute threshold of +human hearing (ATH). + +.PP +Experimental options: +.TP +.BI -X " n" +0 <= +.I n +<= 7 + +When LAME searches for a "good" quantization, +it has to compare the actual one with the best one found so far. +The comparison says which one is better, +the best so far or the actual. +The +.B -X +parameter selects between different approaches to make this decision, +.B -X0 +being the default mode: + +.B -X0 +.br +The criteria are (in order of importance): +.br +* less distorted scalefactor bands +.br +* the sum of noise over the thresholds is lower +.br +* the total noise is lower + +.B -X1 +.br +The actual is better if the maximum noise over all scalefactor bands is +less than the best so far. + +.B -X2 +.br +The actual is better if the total sum of noise is lower than the best so +far. + +.B -X3 +.br +The actual is better if the total sum of noise is lower than the best so +far and the maximum noise over all scalefactor bands is less than the +best so far plus 2dB. + +.B -X4 +.br +Not yet documented. + +.B -X5 +.br +The criteria are (in order of importance): +.br +* the sum of noise over the thresholds is lower +.br +* the total sum of noise is lower + +.B -X6 +.br +The criteria are (in order of importance): +.br +* the sum of noise over the thresholds is lower +.br +* the maximum noise over all scalefactor bands is lower +.br +* the total sum of noise is lower + +.B -X7 +.br +The criteria are: +.br +* less distorted scalefactor bands +.br +or +.br +* the sum of noise over the thresholds is lower +.TP +.B -Y +lets LAME ignore noise in sfb21, like in CBR + +.PP +MP3 header/stream options: +.TP +.BI -e " emp" +.I emp += n, 5, c + +n = (none, default) +.br +5 = 0/15 microseconds +.br +c = citt j.17 + +All this does is set a flag in the bitstream. +If you have a PCM input file where one of the above types of +(obsolete) emphasis has been applied, +you can set this flag in LAME. +Then the mp3 decoder should de-emphasize the output during playback, +although most decoders ignore this flag. + +A better solution would be to apply the de-emphasis with a standalone +utility before encoding, +and then encode without +.B -e. +.TP +.B -c +Mark the encoded file as being copyrighted. +.TP +.B -o +Mark the encoded file as being a copy. +.TP +.B -p +Turn on CRC error protection. +.br +It will add a cyclic redundancy check (CRC) code in each frame, +allowing to detect transmission errors that could occur on the +MP3 stream. +However, +it takes 16 bits per frame that would otherwise be used for encoding, +and then will slightly reduce the sound quality. +.TP +.B \-\-nores +Disable the bit reservoir. +Each frame will then become independent from previous ones, +but the quality will be lower. +.TP +.B \-\-strictly-enforce-ISO +With this option, +LAME will enforce the 7680 bit limitation on total frame size. +.br +This results in many wasted bits for high bitrate encodings but will +ensure strict ISO compatibility. +This compatibility might be important for hardware players. + +.PP +Filter options: +.TP +.BI \-\-lowpass " freq" +Set a lowpass filtering frequency in kHz. +Frequencies above the specified one will be cutoff. +.TP +.BI \-\-lowpass-width " freq" +Set the width of the lowpass filter. +The default value is 15% of the lowpass frequency. +.TP +.BI \-\-highpass " freq" +Set an highpass filtering frequency in kHz. +Frequencies below the specified one will be cutoff. +.TP +.BI \-\-highpass-width " freq" +Set the width of the highpass filter in kHz. +The default value is 15% of the highpass frequency. +.TP +.BI \-\-resample " sfreq" +.I sfreq += 8, 11.025, 12, 16, 22.05, 24, 32, 44.1, 48 +.br +Select output sampling frequency (only supported for encoding). +.br +If not specified, +LAME will automatically resample the input when using high compression ratios. + +.PP +ID3 tag options: +.TP +.BI \-\-tt " title" +audio/song title (max 30 chars for version 1 tag) +.TP +.BI \-\-ta " artist" +audio/song artist (max 30 chars for version 1 tag) +.TP +.BI \-\-tl " album" +audio/song album (max 30 chars for version 1 tag) +.TP +.BI \-\-ty " year" +audio/song year of issue (1 to 9999) +.TP +.BI \-\-tc " comment" +user-defined text (max 30 chars for v1 tag, 28 for v1.1) +.TP +.BI \-\-tn " track[/total]" +audio/song track number and (optionally) the total number of tracks on +the original recording. (track and total each 1 to 255. Providing +just the track number creates v1.1 tag, providing a total forces v2.0). +.TP +.BI \-\-tg " genre" +audio/song genre (name or number in list) +.TP +.BI \-\-tv " id=value" +Text or URL frame specified by id and value (v2.3 tag). User defined frame. Syntax: \-\-tv "TXXX=description=content" +.TP +.B \-\-add-id3v2 +force addition of version 2 tag +.TP +.B \-\-id3v1-only +add only a version 1 tag +.TP +.B \-\-id3v2-only +add only a version 2 tag +.TP +.B \-\-id3v2-latin1 +add following options in ISO-8859-1 text encoding. +.TP +.B \-\-id3v2-utf16 +add following options in unicode text encoding. +.TP +.B \-\-space-id3v1 +pad version 1 tag with spaces instead of nulls +.TP +.B \-\-pad-id3v2 +same as \-\-pad-id3v2-size 128 +.TP +.B \-\-pad-id3v2-size "num" +adds version 2 tag, pad with extra "num" bytes +.TP +.B \-\-genre-list +print alphabetically sorted ID3 genre list and exit +.TP +.B \-\-ignore-tag-errors +ignore errors in values passed for tags, use defaults in case an error occurs + +.PP +Analysis options: +.TP +.B \-g +run graphical analysis on . + can also be a .mp3 file. +(This feature is a compile time option. +Your binary may for speed reasons be compiled without this.) + +.SH ID3 TAGS +LAME is able to embed ID3 v1, +v1.1 or v2 tags inside the encoded MP3 file. +This allows to have some useful information about the music track +included inside the file. +Those data can be read by most MP3 players. + +Lame will smartly choose which tags to use. +It will add ID3 v2 tags only if the input comments won't fit in v1 +or v1.1 tags, +i.e. if they are more than 30 characters. +In this case, +both v1 and v2 tags will be added, +to ensure reading of tags by MP3 players which are unable to read ID3 v2 tags. + +.SH ENCODING MODES +LAME is able to encode your music using one of its 3 encoding modes: +constant bitrate (CBR), average bitrate (ABR) and variable bitrate (VBR). +.TP +.B Constant Bitrate (CBR) +This is the default encoding mode, +and also the most basic. +In this mode, +the bitrate will be the same for the whole file. +It means that each part of your mp3 file will be using the same +number of bits. +The musical passage being a difficult one to encode or an easy one, +the encoder will use the same bitrate, +so the quality of your mp3 is variable. +Complex parts will be of a lower quality than the easiest ones. +The main advantage is that the final files size won't change and +can be accurately predicted. +.TP +.B Average Bitrate (ABR) +In this mode, +you choose the encoder will maintain an average bitrate while using +higher bitrates for the parts of your music that need more bits. +The result will be of higher quality than CBR encoding but the +average file size will remain predictable, +so this mode is highly recommended over CBR. +This encoding mode is similar to what is referred as vbr in AAC or +Liquid Audio (2 other compression technologies). +.TP +.B Variable bitrate (VBR) +In this mode, +you choose the desired quality on a scale from 9 (lowest +quality/biggest distortion) to 0 (highest quality/lowest distortion). +Then encoder tries to maintain the given quality in the whole file by +choosing the optimal number of bits to spend for each part of your music. +The main advantage is that you are able to specify the quality level that +you want to reach, +but the inconvenient is that the final file size is totally unpredictable. + +.SH PRESETS +The +.B \-\-preset +switches are aliases over LAME settings. + +To activate these presets: +.PP +For VBR modes (generally highest quality): +.TP +.B \-\-preset medium +This preset should provide near transparency to most people on most music. +.TP +.B \-\-preset standard +This preset should generally be transparent to most people on most music and +is already quite high in quality. +.TP +.B \-\-preset extreme +If you have extremely good hearing and similar equipment, +this preset will generally provide slightly higher quality than the +.B standard +mode. +.PP +For CBR 320kbps (highest quality possible from the +.B \-\-preset +switches): +.TP +.B \-\-preset insane +This preset will usually be overkill for most people and most situations, +but if you must have the absolute highest quality with no regard to filesize, +this is the way to go. +.PP +For ABR modes (high quality per given bitrate but not as high as VBR): +.TP +.B \-\-preset " kbps" +Using this preset will usually give you good quality at a specified bitrate. +Depending on the bitrate entered, +this preset will determine the optimal settings for that particular situation. +While this approach works, +it is not nearly as flexible as VBR, +and usually will not attain the same level of quality as VBR at higher bitrates. +.TP +.B cbr +If you use the ABR mode (read above) with a significant bitrate such as 80, +96, +112, +128, +160, +192, +224, +256, +320, +you can use the +.B \-\-preset cbr " kbps" +option to force CBR mode encoding instead of the standard ABR mode. +ABR does provide higher quality but CBR may be useful in situations such as when +streaming an MP3 over the Internet may be important. + + +.SH EXAMPLES +.LP +Fixed bit rate jstereo 128kbs encoding: +.IP +.B lame \-b +.I 128 sample.wav sample.mp3 + +.LP +Fixed bit rate jstereo 128 kbps encoding, highest quality: +.IP +.B lame \-q 0 \-b +.I 128 sample.wav sample.mp3 + +.LP +To disable joint stereo encoding (slightly faster, +but less quality at bitrates <= 128 kbps): +.IP +.B lame \-m +.I s sample.wav sample.mp3 + +.LP +Variable bitrate (use \-V n to adjust quality/filesize): +.IP +.B lame \-V +.I 2 sample.wav sample.mp3 + +.LP +Streaming mono 22.05 kHz raw pcm, 24 kbps output: +.IP +.B cat +.I inputfile +.B | lame \-r \-m +.I m +.B \-b +.I 24 +.B \-s +.I 22.05 \- \- +.B > +.I output + +.LP +Streaming mono 44.1 kHz raw pcm, +with downsampling to 22.05 kHz: +.IP +.B cat +.I inputfile +.B | lame \-r \-m +.I m +.B \-b +.I 24 +.B \-\-resample +.I 22.05 \- \- +.B > +.I output + +.LP +Encode with the +.B standard +preset: +.IP +.B lame \-\-preset standard +.I sample.wav sample.mp3 + +.SH BUGS +.PP +Probably there are some. +.SH SEE ALSO +.BR mpg123 (1) , +.BR madplay (1) , +.BR sox (1) +.SH AUTHORS +.nf +LAME originally developed by Mike Cheng and now maintained by +Mark Taylor, and the LAME team. + +GPSYCHO psycho-acoustic model by Mark Taylor. +(See http://www.mp3dev.org/). + +mpglib by Michael Hipp + +Manual page by William Schelter, Nils Faerber, Alexander Leidinger, +and Rog\['e]rio Brito. +.\" Local Variables: +.\" mode: nroff +.\" End: diff --git a/dshow/Encoder.cpp b/dshow/Encoder.cpp new file mode 100644 index 0000000..291639d --- /dev/null +++ b/dshow/Encoder.cpp @@ -0,0 +1,577 @@ +/* + * LAME MP3 encoder for DirectShow + * LAME encoder wrapper + * + * Copyright (c) 2000-2005 Marie Orlova, Peter Gubanov, Vitaly Ivanov, Elecard Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include +#include "Encoder.h" + + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// +CEncoder::CEncoder() : + m_bInpuTypeSet(FALSE), + m_bOutpuTypeSet(FALSE), + m_bFinished(FALSE), + m_outOffset(0), + m_outReadOffset(0), + m_frameCount(0), + pgf(NULL) +{ + m_outFrameBuf = new unsigned char[OUT_BUFFER_SIZE]; +} + +CEncoder::~CEncoder() +{ + Close(NULL); + + if (m_outFrameBuf) + delete [] m_outFrameBuf; +} + +////////////////////////////////////////////////////////////////////// +// SetInputType - check if given input type is supported +////////////////////////////////////////////////////////////////////// +HRESULT CEncoder::SetInputType(LPWAVEFORMATEX lpwfex, bool bJustCheck) +{ + CAutoLock l(&m_lock); + + if (lpwfex->wFormatTag == WAVE_FORMAT_PCM) + { + if (lpwfex->nChannels == 1 || lpwfex->nChannels == 2) + { + if (lpwfex->nSamplesPerSec == 48000 || + lpwfex->nSamplesPerSec == 44100 || + lpwfex->nSamplesPerSec == 32000 || + lpwfex->nSamplesPerSec == 24000 || + lpwfex->nSamplesPerSec == 22050 || + lpwfex->nSamplesPerSec == 16000 || + lpwfex->nSamplesPerSec == 12000 || + lpwfex->nSamplesPerSec == 11025 || + lpwfex->nSamplesPerSec == 8000) + { + if (lpwfex->wBitsPerSample == 16) + { + if (!bJustCheck) + { + memcpy(&m_wfex, lpwfex, sizeof(WAVEFORMATEX)); + m_bInpuTypeSet = true; + } + + return S_OK; + } + } + } + } + + if (!bJustCheck) + m_bInpuTypeSet = false; + + return E_INVALIDARG; +} + +////////////////////////////////////////////////////////////////////// +// SetOutputType - try to initialize encoder with given output type +////////////////////////////////////////////////////////////////////// +HRESULT CEncoder::SetOutputType(MPEG_ENCODER_CONFIG &mabsi) +{ + CAutoLock l(&m_lock); + + m_mabsi = mabsi; + m_bOutpuTypeSet = true; + + return S_OK; +} + +////////////////////////////////////////////////////////////////////// +// SetDefaultOutputType - sets default MPEG audio properties according +// to input type +////////////////////////////////////////////////////////////////////// +HRESULT CEncoder::SetDefaultOutputType(LPWAVEFORMATEX lpwfex) +{ + CAutoLock l(&m_lock); + + if(lpwfex->nChannels == 1 || m_mabsi.bForceMono) + m_mabsi.ChMode = MONO; + + if((lpwfex->nSamplesPerSec < m_mabsi.dwSampleRate) || (lpwfex->nSamplesPerSec % m_mabsi.dwSampleRate != 0)) + m_mabsi.dwSampleRate = lpwfex->nSamplesPerSec; + + return S_OK; +} + +////////////////////////////////////////////////////////////////////// +// Init - initialized or reiniyialized encoder SDK with given input +// and output settings +////////////////////////////////////////////////////////////////////// +HRESULT CEncoder::Init() +{ + CAutoLock l(&m_lock); + + m_outOffset = 0; + m_outReadOffset = 0; + + m_bFinished = FALSE; + + m_frameCount = 0; + + if (!pgf) + { + if (!m_bInpuTypeSet || !m_bOutpuTypeSet) + return E_UNEXPECTED; + + // Init Lame library + // note: newer, safer interface which doesn't + // allow or require direct access to 'gf' struct is being written + // see the file 'API' included with LAME. + if (pgf = lame_init()) + { + lame_set_num_channels(pgf, m_wfex.nChannels); + lame_set_in_samplerate(pgf, m_wfex.nSamplesPerSec); + lame_set_out_samplerate(pgf, m_mabsi.dwSampleRate); + if ((lame_get_out_samplerate(pgf) >= 32000) && (m_mabsi.dwBitrate < 32)) + lame_set_brate(pgf, 32); + else + lame_set_brate(pgf, m_mabsi.dwBitrate); + lame_set_VBR(pgf, m_mabsi.vmVariable); + lame_set_VBR_min_bitrate_kbps(pgf, m_mabsi.dwVariableMin); + lame_set_VBR_max_bitrate_kbps(pgf, m_mabsi.dwVariableMax); + + lame_set_copyright(pgf, m_mabsi.bCopyright); + lame_set_original(pgf, m_mabsi.bOriginal); + lame_set_error_protection(pgf, m_mabsi.bCRCProtect); + + lame_set_bWriteVbrTag(pgf, m_mabsi.dwXingTag); + lame_set_strict_ISO(pgf, m_mabsi.dwStrictISO); + lame_set_VBR_hard_min(pgf, m_mabsi.dwEnforceVBRmin); + + if (lame_get_num_channels(pgf) == 2 && !m_mabsi.bForceMono) + { + //int act_br = pgf->VBR ? pgf->VBR_min_bitrate_kbps + pgf->VBR_max_bitrate_kbps / 2 : pgf->brate; + + // Disabled. It's for user's consideration now + //int rel = pgf->out_samplerate / (act_br + 1); + //pgf->mode = rel < 200 ? m_mabsi.ChMode : JOINT_STEREO; + + lame_set_mode(pgf, m_mabsi.ChMode); + } + else + lame_set_mode(pgf, MONO); + + if (lame_get_mode(pgf) == JOINT_STEREO) + lame_set_force_ms(pgf, m_mabsi.dwForceMS); + else + lame_set_force_ms(pgf, 0); + +// pgf->mode_fixed = m_mabsi.dwModeFixed; + + if (m_mabsi.dwVoiceMode != 0) + { + lame_set_lowpassfreq(pgf,12000); + ///pgf->VBR_max_bitrate_kbps = 160; + } + + if (m_mabsi.dwKeepAllFreq != 0) + { + ///pgf->lowpassfreq = -1; + ///pgf->highpassfreq = -1; + /// not available anymore + } + + lame_set_quality(pgf, m_mabsi.dwQuality); + lame_set_VBR_q(pgf, m_mabsi.dwVBRq); + + lame_init_params(pgf); + + // encoder delay compensation + { + int const nch = lame_get_num_channels(pgf); + short * start_padd = (short *)calloc(48, nch * sizeof(short)); + + int out_bytes = 0; + + if (nch == 2) + out_bytes = lame_encode_buffer_interleaved(pgf, start_padd, 48, m_outFrameBuf, OUT_BUFFER_SIZE); + else + out_bytes = lame_encode_buffer(pgf, start_padd, start_padd, 48, m_outFrameBuf, OUT_BUFFER_SIZE); + + if (out_bytes > 0) + m_outOffset += out_bytes; + + free(start_padd); + } + + return S_OK; + } + + return E_FAIL; + } + + return S_OK; +} + +////////////////////////////////////////////////////////////////////// +// Close - closes encoder +////////////////////////////////////////////////////////////////////// +HRESULT CEncoder::Close(IStream* pStream) +{ + CAutoLock l(&m_lock); + if (pgf) + { + if(lame_get_bWriteVbrTag(pgf) && pStream) + { + updateLameTagFrame(pStream); + } + + lame_close(pgf); + pgf = NULL; + } + + return S_OK; +} + +////////////////////////////////////////////////////////////////////// +// Encode - encodes data placed on pdata and returns +// the number of processed bytes +////////////////////////////////////////////////////////////////////// +int CEncoder::Encode(const short * pdata, int data_size) +{ + CAutoLock l(&m_lock); + + if (!pgf || !m_outFrameBuf || !pdata || data_size < 0 || (data_size & (sizeof(short) - 1))) + return -1; + + // some data left in the buffer, shift to start + if (m_outReadOffset > 0) + { + if (m_outOffset > m_outReadOffset) + memmove(m_outFrameBuf, m_outFrameBuf + m_outReadOffset, m_outOffset - m_outReadOffset); + + m_outOffset -= m_outReadOffset; + } + + m_outReadOffset = 0; + + + + m_bFinished = FALSE; + + int bytes_processed = 0; + int const nch = lame_get_num_channels(pgf); + + while (1) + { + int nsamples = (data_size - bytes_processed) / (sizeof(short) * nch); + + if (nsamples <= 0) + break; + + if (nsamples > 1152) + nsamples = 1152; + + if (m_outOffset >= OUT_BUFFER_MAX) + break; + + int out_bytes = 0; + + if (nch == 2) + out_bytes = lame_encode_buffer_interleaved( + pgf, + (short *)(pdata + (bytes_processed / sizeof(short))), + nsamples, + m_outFrameBuf + m_outOffset, + OUT_BUFFER_SIZE - m_outOffset); + else + out_bytes = lame_encode_buffer( + pgf, + pdata + (bytes_processed / sizeof(short)), + pdata + (bytes_processed / sizeof(short)), + nsamples, + m_outFrameBuf + m_outOffset, + OUT_BUFFER_SIZE - m_outOffset); + + if (out_bytes < 0) + return -1; + + m_outOffset += out_bytes; + bytes_processed += nsamples * nch * sizeof(short); + } + + return bytes_processed; +} + +// +// Finsh - flush the buffered samples +// +HRESULT CEncoder::Finish() +{ + CAutoLock l(&m_lock); + + if (!pgf || !m_outFrameBuf || (m_outOffset >= OUT_BUFFER_MAX)) + return E_FAIL; + + m_outOffset += lame_encode_flush(pgf, m_outFrameBuf + m_outOffset, OUT_BUFFER_SIZE - m_outOffset); + + m_bFinished = TRUE; + + return S_OK; +} + + +int getFrameLength(const unsigned char * pdata) +{ + if (!pdata || pdata[0] != 0xff || (pdata[1] & 0xe0) != 0xe0) + return -1; + + const int sample_rate_tab[4][4] = + { + {11025,12000,8000,1}, + {1,1,1,1}, + {22050,24000,16000,1}, + {44100,48000,32000,1} + }; + +#define MPEG_VERSION_RESERVED 1 +#define MPEG_VERSION_1 3 + +#define LAYER_III 1 + +#define BITRATE_FREE 0 +#define BITRATE_RESERVED 15 + +#define SRATE_RESERVED 3 + +#define EMPHASIS_RESERVED 2 + + int version_id = (pdata[1] & 0x18) >> 3; + int layer = (pdata[1] & 0x06) >> 1; + int bitrate_id = (pdata[2] & 0xF0) >> 4; + int sample_rate_id = (pdata[2] & 0x0C) >> 2; + int padding = (pdata[2] & 0x02) >> 1; + int emphasis = pdata[3] & 0x03; + + if (version_id != MPEG_VERSION_RESERVED && + layer == LAYER_III && + bitrate_id != BITRATE_FREE && + bitrate_id != BITRATE_RESERVED && + sample_rate_id != SRATE_RESERVED && + emphasis != EMPHASIS_RESERVED) + { + int spf = (version_id == MPEG_VERSION_1) ? 1152 : 576; + int sample_rate = sample_rate_tab[version_id][sample_rate_id]; + int bitrate = dwBitRateValue[version_id != MPEG_VERSION_1][bitrate_id - 1] * 1000; + + return (bitrate * spf) / (8 * sample_rate) + padding; + } + + return -1; +} + + +int CEncoder::GetFrame(const unsigned char ** pframe) +{ + if (!pgf || !m_outFrameBuf || !pframe) + return -1; + + while ((m_outOffset - m_outReadOffset) > 4) + { + int frame_length = getFrameLength(m_outFrameBuf + m_outReadOffset); + + if (frame_length < 0) + { + m_outReadOffset++; + } + else if (frame_length <= (m_outOffset - m_outReadOffset)) + { + *pframe = m_outFrameBuf + m_outReadOffset; + m_outReadOffset += frame_length; + + m_frameCount++; + + // don't deliver the first and the last frames + if (m_frameCount != 1 && !(m_bFinished && (m_outOffset - m_outReadOffset) < 5)) + return frame_length; + } + else + break; + } + + return 0; +} + +//////////////////////////////////////////////////////////////////////////////// +// Returns block of a mp3 file, witch size integer multiples of cbAlign +// or not aligned if finished +//////////////////////////////////////////////////////////////////////////////// +int CEncoder::GetBlockAligned(const unsigned char ** pblock, int* piBufferSize, const long& cbAlign) +{ + ASSERT(piBufferSize); + if (!pgf || !m_outFrameBuf || !pblock) + return -1; + + int iBlockLen = m_outOffset - m_outReadOffset; + ASSERT(iBlockLen >= 0); + + if(!m_bFinished) + { + if(cbAlign > 0) + iBlockLen-=iBlockLen%cbAlign; + *piBufferSize = iBlockLen; + } + else + { + if(cbAlign && iBlockLen%cbAlign) + { + *piBufferSize = iBlockLen + cbAlign - iBlockLen%cbAlign; + } + else + { + *piBufferSize = iBlockLen; + } + } + + if(iBlockLen) { + *pblock = m_outFrameBuf + m_outReadOffset; + m_outReadOffset+=iBlockLen; + } + + return iBlockLen; +} + +HRESULT CEncoder::maybeSyncWord(IStream *pStream) +{ + HRESULT hr = S_OK; + unsigned char mp3_frame_header[4]; + ULONG nbytes; + if(FAILED(hr = pStream->Read(mp3_frame_header, sizeof(mp3_frame_header), &nbytes))) + return hr; + + if ( nbytes != sizeof(mp3_frame_header) ) { + return E_FAIL; + } + if ( mp3_frame_header[0] != 0xffu ) { + return S_FALSE; /* doesn't look like a sync word */ + } + if ( (mp3_frame_header[1] & 0xE0u) != 0xE0u ) { + return S_FALSE; /* doesn't look like a sync word */ + } + return S_OK; +} + +HRESULT CEncoder::skipId3v2(IStream *pStream, size_t lametag_frame_size) +{ + HRESULT hr = S_OK; + ULONG nbytes; + size_t id3v2TagSize = 0; + unsigned char id3v2Header[10]; + LARGE_INTEGER seekTo; + + /* seek to the beginning of the stream */ + seekTo.QuadPart = 0; + if (FAILED(hr = pStream->Seek(seekTo, STREAM_SEEK_SET, NULL))) { + return hr; /* not seekable, abort */ + } + /* read 10 bytes in case there's an ID3 version 2 header here */ + hr = pStream->Read(id3v2Header, sizeof(id3v2Header), &nbytes); + if (FAILED(hr)) + return hr; + if(nbytes != sizeof(id3v2Header)) { + return E_FAIL; /* not readable, maybe opened Write-Only */ + } + /* does the stream begin with the ID3 version 2 file identifier? */ + if (!strncmp((char *) id3v2Header, "ID3", 3)) { + /* the tag size (minus the 10-byte header) is encoded into four + * bytes where the most significant bit is clear in each byte + */ + id3v2TagSize = (((id3v2Header[6] & 0x7f) << 21) + | ((id3v2Header[7] & 0x7f) << 14) + | ((id3v2Header[8] & 0x7f) << 7) + | (id3v2Header[9] & 0x7f)) + + sizeof id3v2Header; + } + /* Seek to the beginning of the audio stream */ + seekTo.QuadPart = id3v2TagSize; + if (FAILED(hr = pStream->Seek(seekTo, STREAM_SEEK_SET, NULL))) { + return hr; + } + if (S_OK != (hr = maybeSyncWord(pStream))) { + return SUCCEEDED(hr)?E_FAIL:hr; + } + seekTo.QuadPart = id3v2TagSize+lametag_frame_size; + if (FAILED(hr = pStream->Seek(seekTo, STREAM_SEEK_SET, NULL))) { + return hr; + } + if (S_OK != (hr = maybeSyncWord(pStream))) { + return SUCCEEDED(hr)?E_FAIL:hr; + } + /* OK, it seems we found our LAME-Tag/Xing frame again */ + /* Seek to the beginning of the audio stream */ + seekTo.QuadPart = id3v2TagSize; + if (FAILED(hr = pStream->Seek(seekTo, STREAM_SEEK_SET, NULL))) { + return hr; + } + return S_OK; +} + +// Updates VBR tag +HRESULT CEncoder::updateLameTagFrame(IStream* pStream) +{ + HRESULT hr = S_OK; + size_t n = lame_get_lametag_frame( pgf, 0, 0 ); /* ask for bufer size */ + + if ( n > 0 ) + { + unsigned char* buffer = 0; + ULONG m = n; + + if ( FAILED(hr = skipId3v2(pStream, n) )) + { + /*DispErr( "Error updating LAME-tag frame:\n\n" + "can't locate old frame\n" );*/ + return hr; + } + + buffer = (unsigned char*)malloc( n ); + + if ( buffer == 0 ) + { + /*DispErr( "Error updating LAME-tag frame:\n\n" + "can't allocate frame buffer\n" );*/ + return E_OUTOFMEMORY; + } + + /* Put it all to disk again */ + n = lame_get_lametag_frame( pgf, buffer, n ); + if ( n > 0 ) + { + hr = pStream->Write(buffer, n, &m); + } + free( buffer ); + + if ( m != n ) + { + /*DispErr( "Error updating LAME-tag frame:\n\n" + "couldn't write frame into file\n" );*/ + return E_FAIL; + } + } + return hr; +} diff --git a/dshow/Encoder.h b/dshow/Encoder.h new file mode 100644 index 0000000..f6794dc --- /dev/null +++ b/dshow/Encoder.h @@ -0,0 +1,172 @@ +/* + * LAME MP3 encoder for DirectShow + * LAME encoder wrapper + * + * Copyright (c) 2000-2005 Marie Orlova, Peter Gubanov, Vitaly Ivanov, Elecard Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#if !defined(AFX_VITECENCODER_H__40DC8A44_B937_11D2_A381_A2FD7C37FA15__INCLUDED_) +#define AFX_VITECENCODER_H__40DC8A44_B937_11D2_A381_A2FD7C37FA15__INCLUDED_ + +#if _MSC_VER >= 1000 +#pragma once +#endif // _MSC_VER >= 1000 + +#include + + +const unsigned int dwBitRateValue[2][14] = +{ + {32,40,48,56,64,80,96,112,128,160,192,224,256,320}, // MPEG-1 + {8,16,24,32,40,48,56,64,80,96,112,128,144,160} // MPEG-2/2.5 +}; +/* +#define STEREO 0 +#define JOINT_STEREO 1 +#define DUAL_CHANNEL 2 +#define MONO 3 +*/ + +#define OUT_BUFFER_SIZE 16384 +#define OUT_BUFFER_GUARD 8192 + +#define OUT_BUFFER_MAX (OUT_BUFFER_SIZE - OUT_BUFFER_GUARD) + +typedef struct { + DWORD dwSampleRate; //SF in Hz + DWORD dwBitrate; //BR in bit per second + vbr_mode vmVariable; + DWORD dwVariableMin; //specify a minimum allowed bitrate + DWORD dwVariableMax; //specify a maximum allowed bitrate + DWORD dwQuality; //Encoding quality + DWORD dwVBRq; // VBR quality setting (0=highest quality, 9=lowest) + long lLayer; //Layer: 1 or 2 + + MPEG_mode ChMode; //Channel coding mode: see doc + DWORD dwForceMS; + + DWORD bCRCProtect; //Is CRC protection activated? + DWORD bForceMono; + DWORD bSetDuration; + DWORD bCopyright; //Is the stream protected by copyright? + DWORD bOriginal; //Is the stream an original? + + DWORD dwPES; // PES header. Obsolete + + DWORD dwEnforceVBRmin; + DWORD dwVoiceMode; + DWORD dwKeepAllFreq; + DWORD dwStrictISO; + DWORD dwNoShortBlock; + DWORD dwXingTag; + DWORD dwModeFixed; + DWORD bSampleOverlap; +} MPEG_ENCODER_CONFIG; + + +class CEncoder +{ +public: + + CEncoder(); + virtual ~CEncoder(); + + // Initialize encoder with PCM stream properties + HRESULT SetInputType(LPWAVEFORMATEX lpwfex, bool bJustCheck = FALSE); // returns E_INVALIDARG if not supported + // GetInputType - returns current input type + HRESULT GetInputType(WAVEFORMATEX *pwfex) + { + if(m_bInpuTypeSet) + { + memcpy(pwfex, &m_wfex, sizeof(WAVEFORMATEX)); + return S_OK; + } + else + return E_UNEXPECTED; + } + + // Set MPEG audio parameters + HRESULT SetOutputType(MPEG_ENCODER_CONFIG &mabsi); // returns E_INVALIDARG if not supported or + // not compatible with input type + // Return current MPEG audio settings + HRESULT GetOutputType(MPEG_ENCODER_CONFIG* pmabsi) + { + if (m_bOutpuTypeSet) + { + memcpy(pmabsi, &m_mabsi, sizeof(MPEG_ENCODER_CONFIG)); + return S_OK; + } + else + return E_UNEXPECTED; + } + + // Set if output stream is a PES. Obsolete + void SetPES(bool bPES) + { + m_mabsi.dwPES = false;//bPES; + } + // Is output stream a PES. Obsolete + BOOL IsPES() const + { + return (BOOL)m_mabsi.dwPES; + } + + // Initialize encoder SDK + HRESULT Init(); + // Close encoder SDK + HRESULT Close(IStream* pStream); + + // Encode media sample data + int Encode(const short * pdata, int data_size); + int GetFrame(const unsigned char ** pframe); + + // Returns block of a mp3 file, witch size integer multiples of cbAlign + int GetBlockAligned(const unsigned char ** pblock, int* piBufferSize, const long& cbAlign); + + HRESULT Finish(); + +protected: + HRESULT updateLameTagFrame(IStream* pStream); + HRESULT skipId3v2(IStream *pStream, size_t lametag_frame_size); + HRESULT maybeSyncWord(IStream *pStream); + HRESULT SetDefaultOutputType(LPWAVEFORMATEX lpwfex); + + // Input media type + WAVEFORMATEX m_wfex; + + // Output media type + MPEG_ENCODER_CONFIG m_mabsi; + + // Compressor private data + lame_global_flags * pgf; + + // Compressor miscelaneous state + BOOL m_bInpuTypeSet; + BOOL m_bOutpuTypeSet; + + BOOL m_bFinished; + int m_frameCount; + + unsigned char * m_outFrameBuf; + int m_outOffset; + int m_outReadOffset; + + CCritSec m_lock; +}; + +#endif // !defined(AFX_VITECENCODER_H__40DC8A44_B937_11D2_A381_A2FD7C37FA15__INCLUDED_) diff --git a/dshow/Makefile.am b/dshow/Makefile.am new file mode 100644 index 0000000..dd70fe4 --- /dev/null +++ b/dshow/Makefile.am @@ -0,0 +1,25 @@ +## $Id: Makefile.am,v 1.6 2008/11/09 13:50:16 aleidinger Exp $ + +include $(top_srcdir)/Makefile.am.global + +EXTRA_DIST = \ + Encoder.cpp \ + Encoder.h \ + Mpegac.cpp \ + Mpegac.def \ + Mpegac.h \ + PropPage.cpp \ + PropPage.h \ + PropPage_adv.cpp \ + PropPage_adv.h \ + Property.rc \ + README \ + REG.CPP \ + REG.H \ + UIDS.H \ + aboutprp.cpp \ + aboutprp.h \ + elogo.ico \ + iaudioprops.h \ + resource.h + diff --git a/dshow/Makefile.in b/dshow/Makefile.in new file mode 100644 index 0000000..9091897 --- /dev/null +++ b/dshow/Makefile.in @@ -0,0 +1,491 @@ +# Makefile.in generated by automake 1.15.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2017 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# global section for every Makefile.am +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = dshow +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.global README +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_DEFS = @CONFIG_DEFS@ +CONFIG_MATH_LIB = @CONFIG_MATH_LIB@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CPUCCODE = @CPUCCODE@ +CPUTYPE = @CPUTYPE@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FRONTEND_CFLAGS = @FRONTEND_CFLAGS@ +FRONTEND_LDADD = @FRONTEND_LDADD@ +FRONTEND_LDFLAGS = @FRONTEND_LDFLAGS@ +GREP = @GREP@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_CONFIG = @GTK_CONFIG@ +GTK_LIBS = @GTK_LIBS@ +INCLUDES = @INCLUDES@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDADD = @LDADD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_MAJOR_VERSION = @LIB_MAJOR_VERSION@ +LIB_MINOR_VERSION = @LIB_MINOR_VERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEDEP = @MAKEDEP@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NASM = @NASM@ +NASM_FORMAT = @NASM_FORMAT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM_F = @RM_F@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_FRONTEND = @WITH_FRONTEND@ +WITH_MP3RTP = @WITH_MP3RTP@ +WITH_MP3X = @WITH_MP3X@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = 1.15 foreign +EXTRA_DIST = \ + Encoder.cpp \ + Encoder.h \ + Mpegac.cpp \ + Mpegac.def \ + Mpegac.h \ + PropPage.cpp \ + PropPage.h \ + PropPage_adv.cpp \ + PropPage_adv.h \ + Property.rc \ + README \ + REG.CPP \ + REG.H \ + UIDS.H \ + aboutprp.cpp \ + aboutprp.h \ + elogo.ico \ + iaudioprops.h \ + resource.h + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.global $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign dshow/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign dshow/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/Makefile.am.global $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# end global section + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/dshow/Mpegac.cpp b/dshow/Mpegac.cpp new file mode 100644 index 0000000..6c86255 --- /dev/null +++ b/dshow/Mpegac.cpp @@ -0,0 +1,2025 @@ +/* + * LAME MP3 encoder for DirectShow + * DirectShow filter implementation + * + * Copyright (c) 2000-2005 Marie Orlova, Peter Gubanov, Vitaly Ivanov, Elecard Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +//#include +#include "uids.h" +#include "iaudioprops.h" +#include "mpegac.h" +#include "resource.h" + +#include "PropPage.h" +#include "PropPage_adv.h" +#include "aboutprp.h" + +#include "Encoder.h" +#include "Reg.h" + +#ifndef _INC_MMREG +#include +#endif + +// default parameters +#define DEFAULT_LAYER 3 +#define DEFAULT_STEREO_MODE JOINT_STEREO +#define DEFAULT_FORCE_MS 0 +#define DEFAULT_MODE_FIXED 0 +#define DEFAULT_ENFORCE_MIN 0 +#define DEFAULT_VOICE 0 +#define DEFAULT_KEEP_ALL_FREQ 0 +#define DEFAULT_STRICT_ISO 0 +#define DEFAULT_DISABLE_SHORT_BLOCK 0 +#define DEFAULT_XING_TAG 0 +#define DEFAULT_SAMPLE_RATE 44100 +#define DEFAULT_BITRATE 128 +#define DEFAULT_VARIABLE 0 +#define DEFAULT_CRC 0 +#define DEFAULT_FORCE_MONO 0 +#define DEFAULT_SET_DURATION 1 +#define DEFAULT_SAMPLE_OVERLAP 1 +#define DEFAULT_COPYRIGHT 0 +#define DEFAULT_ORIGINAL 0 +#define DEFAULT_VARIABLEMIN 80 +#define DEFAULT_VARIABLEMAX 160 +#define DEFAULT_ENCODING_QUALITY 5 +#define DEFAULT_VBR_QUALITY 4 +#define DEFAULT_PES 0 + +#define DEFAULT_FILTER_MERIT MERIT_DO_NOT_USE // Standard compressor merit value + +#define GET_DATARATE(kbps) (kbps * 1000 / 8) +#define GET_FRAMELENGTH(bitrate, sample_rate) ((WORD)(((sample_rate < 32000 ? 72000 : 144000) * (bitrate))/(sample_rate))) +#define DECLARE_PTR(type, ptr, expr) type* ptr = (type*)(expr); + +// Create a list of all (or mostly all) of the encoder CBR output capabilities which +// will be parsed into a list of capabilities used by the IAMStreamConfig Interface +output_caps_t OutputCapabilities[] = +{ // {SampleRate, BitRate} + { 48000, 320 },{ 48000, 256 },{ 48000, 224 },{ 48000, 192 }, // MPEG 1.0 Spec @ 48KHz + { 48000, 160 },{ 48000, 128 },{ 48000, 112 },{ 48000, 96 }, + { 48000, 80 },{ 48000, 64 },{ 48000, 56 },{ 48000, 48 }, + { 48000, 40 },{ 48000, 32 }, + + { 24000, 160 },{ 24000, 144 },{ 24000, 128 },{ 24000, 112 }, // MPEG 2.0 Spec @ 24KHz + { 24000, 96 },{ 24000, 80 },{ 24000, 64 },{ 24000, 56 }, + { 24000, 48 },{ 24000, 40 },{ 24000, 32 },{ 24000, 24 }, + { 24000, 16 },{ 24000, 8 }, + + { 12000, 64 },{ 12000, 56 },{ 12000, 48 },{ 12000, 40 }, // MPEG 2.5 Spec @ 12KHz + { 12000, 32 },{ 12000, 24 },{ 12000, 16 },{ 12000, 8 }, + // --------------------------- -------------------------- + { 44100, 320 },{ 44100, 256 },{ 44100, 224 },{ 44100, 192 }, // MPEG 1.0 Spec @ 44.1KHz + { 44100, 160 },{ 44100, 128 },{ 44100, 112 },{ 44100, 96 }, + { 44100, 80 },{ 44100, 64 },{ 44100, 56 },{ 44100, 48 }, + { 44100, 40 },{ 44100, 32 }, + + { 22050, 160 },{ 22050, 144 },{ 22050, 128 },{ 22050, 112 }, // MPEG 2.0 Spec @ 22.05KHz + { 22050, 96 },{ 22050, 80 },{ 22050, 64 },{ 22050, 56 }, + { 22050, 48 },{ 22050, 40 },{ 22050, 32 },{ 22050, 24 }, + { 22050, 16 },{ 22050, 8 }, + + { 11025, 64 },{ 11025, 56 },{ 11025, 48 },{ 11025, 40 }, // MPEG 2.5 Spec @ 11.025KHz + { 11025, 32 },{ 11025, 24 },{ 11025, 16 },{ 11025, 8 }, + // --------------------------- -------------------------- + { 32000, 320 },{ 32000, 256 },{ 32000, 224 },{ 32000, 192 }, // MPEG 1.0 Spec @ 32KHz + { 32000, 160 },{ 32000, 128 },{ 32000, 112 },{ 32000, 96 }, + { 32000, 80 },{ 32000, 64 },{ 32000, 56 },{ 32000, 48 }, + { 32000, 40 },{ 32000, 32 }, + + { 16000, 160 },{ 16000, 144 },{ 16000, 128 },{ 16000, 112 }, // MPEG 2.0 Spec @ 16KHz + { 16000, 96 },{ 16000, 80 },{ 16000, 64 },{ 16000, 56 }, + { 16000, 48 },{ 16000, 40 },{ 16000, 32 },{ 16000, 24 }, + { 16000, 16 },{ 16000, 8 }, + + { 8000, 64 },{ 8000, 56 },{ 8000, 48 },{ 8000, 40 }, // MPEG 2.5 Spec @ 8KHz + { 8000, 32 },{ 8000, 24 },{ 8000, 16 },{ 8000, 8 } +}; + + +/* Registration setup stuff */ +// Setup data + + +AMOVIESETUP_MEDIATYPE sudMpgInputType[] = +{ + { &MEDIATYPE_Audio, &MEDIASUBTYPE_PCM } +}; +AMOVIESETUP_MEDIATYPE sudMpgOutputType[] = +{ + { &MEDIATYPE_Audio, &MEDIASUBTYPE_MPEG1AudioPayload }, + { &MEDIATYPE_Audio, &MEDIASUBTYPE_MPEG2_AUDIO }, + { &MEDIATYPE_Audio, &MEDIASUBTYPE_MP3 }, + { &MEDIATYPE_Stream, &MEDIASUBTYPE_MPEG1Audio } +}; + +AMOVIESETUP_PIN sudMpgPins[] = +{ + { L"PCM Input", + FALSE, // bRendered + FALSE, // bOutput + FALSE, // bZero + FALSE, // bMany + &CLSID_NULL, // clsConnectsToFilter + NULL, // ConnectsToPin + NUMELMS(sudMpgInputType), // Number of media types + sudMpgInputType + }, + { L"MPEG Output", + FALSE, // bRendered + TRUE, // bOutput + FALSE, // bZero + FALSE, // bMany + &CLSID_NULL, // clsConnectsToFilter + NULL, // ConnectsToPin + NUMELMS(sudMpgOutputType), // Number of media types + sudMpgOutputType + } +}; + +AMOVIESETUP_FILTER sudMpgAEnc = +{ + &CLSID_LAMEDShowFilter, + L"LAME Audio Encoder", + DEFAULT_FILTER_MERIT, // Standard compressor merit value + NUMELMS(sudMpgPins), // 2 pins + sudMpgPins +}; + +/*****************************************************************************/ +// COM Global table of objects in this dll +static WCHAR g_wszName[] = L"LAME Audio Encoder"; +CFactoryTemplate g_Templates[] = +{ + { g_wszName, &CLSID_LAMEDShowFilter, CMpegAudEnc::CreateInstance, NULL, &sudMpgAEnc }, + { L"LAME Audio Encoder Property Page", &CLSID_LAMEDShow_PropertyPage, CMpegAudEncPropertyPage::CreateInstance}, + { L"LAME Audio Encoder Property Page", &CLSID_LAMEDShow_PropertyPageAdv, CMpegAudEncPropertyPageAdv::CreateInstance}, + { L"LAME Audio Encoder About", &CLSID_LAMEDShow_About, CMAEAbout::CreateInstance} +}; +// Count of objects listed in g_cTemplates +int g_cTemplates = sizeof(g_Templates) / sizeof(g_Templates[0]); + + + +//////////////////////////////////////////// +// Declare the DirectShow filter information. + +// Used by IFilterMapper2() in the call to DllRegisterServer() +// to register the filter in the CLSID_AudioCompressorCategory. +REGFILTER2 rf2FilterReg = { + 1, // Version number. + DEFAULT_FILTER_MERIT, // Merit. This should match the merit specified in the AMOVIESETUP_FILTER definition + NUMELMS(sudMpgPins), // Number of pins. + sudMpgPins // Pointer to pin information. +}; + +STDAPI DllRegisterServer(void) +{ + HRESULT hr = AMovieDllRegisterServer2(TRUE); + if (FAILED(hr)) { + return hr; + } + + IFilterMapper2 *pFM2 = NULL; + hr = CoCreateInstance(CLSID_FilterMapper2, NULL, CLSCTX_INPROC_SERVER, IID_IFilterMapper2, (void **)&pFM2); + if (SUCCEEDED(hr)) { + hr = pFM2->RegisterFilter( + CLSID_LAMEDShowFilter, // Filter CLSID. + g_wszName, // Filter name. + NULL, // Device moniker. + &CLSID_AudioCompressorCategory, // Audio compressor category. + g_wszName, // Instance data. + &rf2FilterReg // Filter information. + ); + pFM2->Release(); + } + return hr; +} + +STDAPI DllUnregisterServer() +{ + HRESULT hr = AMovieDllRegisterServer2(FALSE); + if (FAILED(hr)) { + return hr; + } + + IFilterMapper2 *pFM2 = NULL; + hr = CoCreateInstance(CLSID_FilterMapper2, NULL, CLSCTX_INPROC_SERVER, IID_IFilterMapper2, (void **)&pFM2); + if (SUCCEEDED(hr)) { + hr = pFM2->UnregisterFilter(&CLSID_AudioCompressorCategory, g_wszName, CLSID_LAMEDShowFilter); + pFM2->Release(); + } + return hr; +} + + + +CUnknown *CMpegAudEnc::CreateInstance(LPUNKNOWN lpunk, HRESULT *phr) +{ + CMpegAudEnc *punk = new CMpegAudEnc(lpunk, phr); + if (punk == NULL) + *phr = E_OUTOFMEMORY; + return punk; +} + +CMpegAudEnc::CMpegAudEnc(LPUNKNOWN lpunk, HRESULT *phr) + : CTransformFilter(NAME("LAME Audio Encoder"), lpunk, CLSID_LAMEDShowFilter), + CPersistStream(lpunk, phr) +{ + // ENCODER OUTPUT PIN + // Override the output pin with our own which will implement the IAMStreamConfig Interface + CTransformOutputPin *pOut = new CMpegAudEncOutPin( this, phr ); + if (pOut == NULL) { + *phr = E_OUTOFMEMORY; + return; + } + else if (FAILED(*phr)) { // A failed return code should delete the object + delete pOut; + return; + } + m_pOutput = pOut; + + // ENCODER INPUT PIN + // Since we've created our own output pin we must also create + // the input pin ourselves because the CTransformFilter base class + // will create an extra output pin if the input pin wasn't created. + CTransformInputPin *pIn = new CTransformInputPin(NAME("LameEncoderInputPin"), + this, // Owner filter + phr, // Result code + L"Input"); // Pin name + + if (pIn == NULL) { + *phr = E_OUTOFMEMORY; + return; + } + else if (FAILED(*phr)) { // A failed return code should delete the object + delete pIn; + return; + } + m_pInput = pIn; + + + MPEG_ENCODER_CONFIG mec; + ReadPresetSettings(&mec); + m_Encoder.SetOutputType(mec); + + m_CapsNum = 0; + m_hasFinished = TRUE; + m_bStreamOutput = FALSE; + m_currentMediaTypeIndex = 0; +} + +CMpegAudEnc::~CMpegAudEnc(void) +{ +} + +LPAMOVIESETUP_FILTER CMpegAudEnc::GetSetupData() +{ + return &sudMpgAEnc; +} + + +HRESULT CMpegAudEnc::Receive(IMediaSample * pSample) +{ + CAutoLock lock(&m_cs); + + if (!pSample) + return S_OK; + + BYTE * pSourceBuffer = NULL; + + if (pSample->GetPointer(&pSourceBuffer) != S_OK || !pSourceBuffer) + return S_OK; + + long sample_size = pSample->GetActualDataLength(); + + REFERENCE_TIME rtStart, rtStop; + BOOL gotValidTime = (pSample->GetTime(&rtStart, &rtStop) != VFW_E_SAMPLE_TIME_NOT_SET); + + if (sample_size <= 0 || pSourceBuffer == NULL || m_hasFinished || (gotValidTime && rtStart < 0)) + return S_OK; + + if (gotValidTime) + { + if (m_rtStreamTime < 0) + { + m_rtStreamTime = rtStart; + m_rtEstimated = rtStart; + } + else + { + resync_point_t * sync = m_sync + m_sync_in_idx; + + if (sync->applied) + { + REFERENCE_TIME rtGap = rtStart - m_rtEstimated; + + // if old sync data is applied and gap is greater than 1 ms + // then make a new synchronization point + if (rtGap > 10000 || (m_allowOverlap && rtGap < -10000)) + { + sync->sample = m_samplesIn; + sync->delta = rtGap; + sync->applied = FALSE; + + m_rtEstimated += sync->delta; + + if (m_sync_in_idx < (RESYNC_COUNT - 1)) + m_sync_in_idx++; + else + m_sync_in_idx = 0; + } + } + } + } + + m_rtEstimated += (LONGLONG)(m_bytesToDuration * sample_size); + m_samplesIn += sample_size / m_bytesPerSample; + + while (sample_size > 0) + { + int bytes_processed = m_Encoder.Encode((short *)pSourceBuffer, sample_size); + + if (bytes_processed <= 0) + return S_OK; + + FlushEncodedSamples(); + + sample_size -= bytes_processed; + pSourceBuffer += bytes_processed; + } + + return S_OK; +} + + + + +HRESULT CMpegAudEnc::FlushEncodedSamples() +{ + IMediaSample * pOutSample = NULL; + BYTE * pDst = NULL; + + if(m_bStreamOutput) + { + HRESULT hr = S_OK; + const unsigned char * pblock = NULL; + int iBufferSize; + int iBlockLength = m_Encoder.GetBlockAligned(&pblock, &iBufferSize, m_cbStreamAlignment); + + if(!iBlockLength) + return S_OK; + + hr = m_pOutput->GetDeliveryBuffer(&pOutSample, NULL, NULL, 0); + if (hr == S_OK && pOutSample) + { + hr = pOutSample->GetPointer(&pDst); + if (hr == S_OK && pDst) + { + CopyMemory(pDst, pblock, iBlockLength); + REFERENCE_TIME rtEndPos = m_rtBytePos + iBufferSize; + EXECUTE_ASSERT(S_OK == pOutSample->SetTime(&m_rtBytePos, &rtEndPos)); + pOutSample->SetActualDataLength(iBufferSize); + m_rtBytePos += iBlockLength; + m_pOutput->Deliver(pOutSample); + } + + pOutSample->Release(); + } + return S_OK; + } + + if (m_rtStreamTime < 0) + m_rtStreamTime = 0; + + while (1) + { + const unsigned char * pframe = NULL; + int frame_size = m_Encoder.GetFrame(&pframe); + + if (frame_size <= 0 || !pframe) + break; + + if (!m_sync[m_sync_out_idx].applied && m_sync[m_sync_out_idx].sample <= m_samplesOut) + { + m_rtStreamTime += m_sync[m_sync_out_idx].delta; + m_sync[m_sync_out_idx].applied = TRUE; + + if (m_sync_out_idx < (RESYNC_COUNT - 1)) + m_sync_out_idx++; + else + m_sync_out_idx = 0; + } + + REFERENCE_TIME rtStart = m_rtStreamTime; + REFERENCE_TIME rtStop = rtStart + m_rtFrameTime; + + HRESULT hr = S_OK; + + hr = m_pOutput->GetDeliveryBuffer(&pOutSample, NULL, NULL, 0); + if (hr == S_OK && pOutSample) + { + hr = pOutSample->GetPointer(&pDst); + if (hr == S_OK && pDst) + { + CopyMemory(pDst, pframe, frame_size); + pOutSample->SetActualDataLength(frame_size); + + pOutSample->SetSyncPoint(TRUE); + pOutSample->SetTime(&rtStart, m_setDuration ? &rtStop : NULL); + + + m_pOutput->Deliver(pOutSample); + } + + pOutSample->Release(); + } + + + m_samplesOut += m_samplesPerFrame; + m_rtStreamTime = rtStop; + } + + return S_OK; +} + + +//////////////////////////////////////////////////////////////////////////// +// StartStreaming - prepare to receive new data +//////////////////////////////////////////////////////////////////////////// +HRESULT CMpegAudEnc::StartStreaming() +{ + WAVEFORMATEX * pwfxIn = (WAVEFORMATEX *) m_pInput->CurrentMediaType().Format(); + + m_bytesPerSample = pwfxIn->nChannels * sizeof(short); + DWORD dwOutSampleRate; + if(MEDIATYPE_Stream == m_pOutput->CurrentMediaType().majortype) + { + MPEG_ENCODER_CONFIG mcfg; + if(FAILED(m_Encoder.GetOutputType(&mcfg))) + return E_FAIL; + + dwOutSampleRate = mcfg.dwSampleRate; + } + else + { + dwOutSampleRate = ((WAVEFORMATEX *) m_pOutput->CurrentMediaType().Format())->nSamplesPerSec; + } + m_samplesPerFrame = (dwOutSampleRate >= 32000) ? 1152 : 576; + + m_rtFrameTime = MulDiv(10000000, m_samplesPerFrame, dwOutSampleRate); + + m_samplesIn = m_samplesOut = 0; + m_rtStreamTime = -1; + m_rtBytePos = 0; + + // initialize encoder + m_Encoder.Init(); + + m_hasFinished = FALSE; + + for (int i = 0; i < RESYNC_COUNT; i++) + { + m_sync[i].sample = 0; + m_sync[i].delta = 0; + m_sync[i].applied = TRUE; + } + + m_sync_in_idx = 0; + m_sync_out_idx = 0; + + get_SetDuration(&m_setDuration); + get_SampleOverlap(&m_allowOverlap); + + return S_OK; +} + + +HRESULT CMpegAudEnc::StopStreaming() +{ + IStream *pStream = NULL; + if(m_bStreamOutput && m_pOutput->IsConnected() != FALSE) + { + IPin * pDwnstrmInputPin = m_pOutput->GetConnected(); + if(pDwnstrmInputPin && FAILED(pDwnstrmInputPin->QueryInterface(IID_IStream, (LPVOID*)(&pStream)))) + { + pStream = NULL; + } + } + + + m_Encoder.Close(pStream); + + if(pStream) + pStream->Release(); + + return S_OK; +} + + +//////////////////////////////////////////////////////////////////////////// +// EndOfStream - stop data processing +//////////////////////////////////////////////////////////////////////////// +HRESULT CMpegAudEnc::EndOfStream() +{ + CAutoLock lock(&m_cs); + + // Flush data + m_Encoder.Finish(); + FlushEncodedSamples(); + + IStream *pStream = NULL; + if(m_bStreamOutput && m_pOutput->IsConnected() != FALSE) + { + IPin * pDwnstrmInputPin = m_pOutput->GetConnected(); + if(pDwnstrmInputPin) + { + if(FAILED(pDwnstrmInputPin->QueryInterface(IID_IStream, (LPVOID*)(&pStream)))) + { + pStream = NULL; + } + } + } + + if(pStream) + { + ULARGE_INTEGER size; + size.QuadPart = m_rtBytePos; + pStream->SetSize(size); + } + + m_Encoder.Close(pStream); + + if(pStream) + pStream->Release(); + + m_hasFinished = TRUE; + + return CTransformFilter::EndOfStream(); +} + + +//////////////////////////////////////////////////////////////////////////// +// BeginFlush - stop data processing +//////////////////////////////////////////////////////////////////////////// +HRESULT CMpegAudEnc::BeginFlush() +{ + HRESULT hr = CTransformFilter::BeginFlush(); + + if (SUCCEEDED(hr)) + { + CAutoLock lock(&m_cs); + + DWORD dwDstSize = 0; + + // Flush data + m_Encoder.Finish(); + FlushEncodedSamples(); + + IStream *pStream = NULL; + if(m_bStreamOutput && m_pOutput->IsConnected() != FALSE) + { + IPin * pDwnstrmInputPin = m_pOutput->GetConnected(); + if(pDwnstrmInputPin && SUCCEEDED(pDwnstrmInputPin->QueryInterface(IID_IStream, (LPVOID*)(&pStream)))) + { + ULARGE_INTEGER size; + size.QuadPart = m_rtBytePos; + pStream->SetSize(size); + pStream->Release(); + } + } + m_rtStreamTime = -1; + m_rtBytePos = 0; + } + + return hr; +} + + + +//////////////////////////////////////////////////////////////////////////// +// SetMediaType - called when filters are connecting +//////////////////////////////////////////////////////////////////////////// +HRESULT CMpegAudEnc::SetMediaType(PIN_DIRECTION direction, const CMediaType * pmt) +{ + HRESULT hr = S_OK; + + if (direction == PINDIR_INPUT) + { + if (*pmt->FormatType() != FORMAT_WaveFormatEx) + return VFW_E_INVALIDMEDIATYPE; + + if (pmt->FormatLength() < sizeof(WAVEFORMATEX)) + return VFW_E_INVALIDMEDIATYPE; + + DbgLog((LOG_TRACE,1,TEXT("CMpegAudEnc::SetMediaType(), direction = PINDIR_INPUT"))); + + // Pass input media type to encoder + m_Encoder.SetInputType((LPWAVEFORMATEX)pmt->Format()); + + WAVEFORMATEX * pwfx = (WAVEFORMATEX *)pmt->Format(); + + if (pwfx) + m_bytesToDuration = (float)1.e7 / (float)(pwfx->nChannels * sizeof(short) * pwfx->nSamplesPerSec); + else + m_bytesToDuration = 0.0; + + // Parse the encoder output capabilities into the subset of capabilities that are supported + // for the current input format. This listing will be utilized by the IAMStreamConfig Interface. + LoadOutputCapabilities(pwfx->nSamplesPerSec); + + Reconnect(); + } + else if (direction == PINDIR_OUTPUT) + { + // Before we set the output type, we might need to reconnect + // the input pin with a new type. + if (m_pInput && m_pInput->IsConnected()) + { + // Check if the current input type is compatible. + hr = CheckTransform(&m_pInput->CurrentMediaType(), &m_pOutput->CurrentMediaType()); + if (FAILED(hr)) { + // We need to reconnect the input pin. + // Note: The CheckMediaType method has already called QueryAccept on the upstream filter. + hr = m_pGraph->Reconnect(m_pInput); + return hr; + } + } + +// WAVEFORMATEX wfIn; +// m_Encoder.GetInputType(&wfIn); + +// if (wfIn.nSamplesPerSec % +// ((LPWAVEFORMATEX)pmt->Format())->nSamplesPerSec != 0) +// return VFW_E_TYPE_NOT_ACCEPTED; + } + + return hr; +} + +//////////////////////////////////////////////////////////////////////////// +// CheckInputType - check if you can support mtIn +//////////////////////////////////////////////////////////////////////////// +HRESULT CMpegAudEnc::CheckInputType(const CMediaType* mtIn) +{ + if (*mtIn->Type() == MEDIATYPE_Audio && *mtIn->FormatType() == FORMAT_WaveFormatEx) + if (mtIn->FormatLength() >= sizeof(WAVEFORMATEX)) + if (mtIn->IsTemporalCompressed() == FALSE) + return m_Encoder.SetInputType((LPWAVEFORMATEX)mtIn->Format(), true); + + return E_INVALIDARG; +} + +//////////////////////////////////////////////////////////////////////////// +// CheckTransform - checks if we can support the transform from this input to this output +//////////////////////////////////////////////////////////////////////////// +HRESULT CMpegAudEnc::CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut) +{ + if(MEDIATYPE_Stream != mtOut->majortype) + { + if (*mtOut->FormatType() != FORMAT_WaveFormatEx) + return VFW_E_INVALIDMEDIATYPE; + + if (mtOut->FormatLength() < sizeof(WAVEFORMATEX)) + return VFW_E_INVALIDMEDIATYPE; + + MPEG_ENCODER_CONFIG mec; + if(FAILED(m_Encoder.GetOutputType(&mec))) + return S_OK; + + if (((LPWAVEFORMATEX)mtIn->Format())->nSamplesPerSec % mec.dwSampleRate != 0) + return S_OK; + + if (mec.dwSampleRate != ((LPWAVEFORMATEX)mtOut->Format())->nSamplesPerSec) + return VFW_E_TYPE_NOT_ACCEPTED; + + return S_OK; + } + else if(mtOut->subtype == MEDIASUBTYPE_MPEG1Audio) + return S_OK; + + return VFW_E_TYPE_NOT_ACCEPTED; +} + +//////////////////////////////////////////////////////////////////////////// +// DecideBufferSize - sets output buffers number and size +//////////////////////////////////////////////////////////////////////////// +HRESULT CMpegAudEnc::DecideBufferSize( + IMemAllocator* pAllocator, + ALLOCATOR_PROPERTIES* pProperties) +{ + HRESULT hr = S_OK; + + if(m_bStreamOutput) + m_cbStreamAlignment = pProperties->cbAlign; + + /// + if (pProperties->cBuffers == 0) pProperties->cBuffers = 1; // If downstream filter didn't suggest a buffer count then default to 1 + pProperties->cbBuffer = OUT_BUFFER_SIZE; + // + + ASSERT(pProperties->cbBuffer); + + ALLOCATOR_PROPERTIES Actual; + hr = pAllocator->SetProperties(pProperties,&Actual); + if(FAILED(hr)) + return hr; + + if (Actual.cbBuffer < pProperties->cbBuffer || + Actual.cBuffers < pProperties->cBuffers) + {// can't use this allocator + return E_INVALIDARG; + } + return S_OK; +} + +//////////////////////////////////////////////////////////////////////////// +// GetMediaType - overrideable for suggesting output pin media types +//////////////////////////////////////////////////////////////////////////// +HRESULT CMpegAudEnc::GetMediaType(int iPosition, CMediaType *pMediaType) +{ + DbgLog((LOG_TRACE,1,TEXT("CMpegAudEnc::GetMediaType()"))); + + return m_pOutput->GetMediaType(iPosition, pMediaType); +} + +//////////////////////////////////////////////////////////////////////////// +// Reconnect - called after a manual change has been made to the +// encoder parameters to reset the filter output media type structure +// to match the current encoder out MPEG audio properties +//////////////////////////////////////////////////////////////////////////// +HRESULT CMpegAudEnc::Reconnect() +{ + HRESULT hr = S_FALSE; + + if (m_pOutput && m_pOutput->IsConnected() && m_State == State_Stopped) + { + MPEG_ENCODER_CONFIG mec; + hr = m_Encoder.GetOutputType(&mec); + + if ((hr = m_Encoder.SetOutputType(mec)) == S_OK) + { + // Create an updated output MediaType using the current encoder settings + CMediaType cmt; + cmt.InitMediaType(); + m_pOutput->GetMediaType(m_currentMediaTypeIndex, &cmt); + + // If the updated MediaType matches the current output MediaType no reconnect is needed + if (m_pOutput->CurrentMediaType() == cmt) return S_OK; + + // Attempt to reconnect the output pin using the updated MediaType + if (S_OK == (hr = m_pOutput->GetConnected()->QueryAccept(&cmt))) { + hr = m_pOutput->SetMediaType(&cmt); + if ( FAILED(hr) ) { return(hr); } + + hr = m_pGraph->Reconnect(m_pOutput); + } + else + hr = m_pOutput->SetMediaType(&cmt); + } + } + + return hr; +} + +//////////////////////////////////////////////////////////////////////////// +// LoadOutputCapabilities - create a list of the currently supported output +// format capabilities which will be used by the IAMStreamConfig Interface +//////////////////////////////////////////////////////////////////////////// +void CMpegAudEnc::LoadOutputCapabilities(DWORD sample_rate) +{ + m_CapsNum = 0; + + // Clear out any existing output capabilities + ZeroMemory(OutputCaps, sizeof(OutputCaps)); + + // Create the set of Constant Bit Rate output capabilities that are + // supported for the current input pin sampling rate. + for (int i = 0; i < NUMELMS(OutputCapabilities); i++) { + if (0 == sample_rate % OutputCapabilities[i].nSampleRate) { + + // Add this output capability to the OutputCaps list + OutputCaps[m_CapsNum] = OutputCapabilities[i]; + m_CapsNum++; + + // Don't overrun the hard-coded capabilities array limit + if (m_CapsNum > (int)MAX_IAMSTREAMCONFIG_CAPS) break; + } + } +} + + +// +// Read persistent configuration from Registry +// +void CMpegAudEnc::ReadPresetSettings(MPEG_ENCODER_CONFIG * pmec) +{ + DbgLog((LOG_TRACE,1,TEXT("CMpegAudEnc::ReadPresetSettings()"))); + + Lame::CRegKey rk(HKEY_CURRENT_USER, KEY_LAME_ENCODER); + + pmec->dwBitrate = rk.getDWORD(VALUE_BITRATE,DEFAULT_BITRATE); + pmec->dwVariableMin = rk.getDWORD(VALUE_VARIABLEMIN,DEFAULT_VARIABLEMIN); + pmec->dwVariableMax = rk.getDWORD(VALUE_VARIABLEMAX,DEFAULT_VARIABLEMAX); + pmec->vmVariable = rk.getDWORD(VALUE_VARIABLE, DEFAULT_VARIABLE) ? vbr_rh : vbr_off; + pmec->dwQuality = rk.getDWORD(VALUE_QUALITY,DEFAULT_ENCODING_QUALITY); + pmec->dwVBRq = rk.getDWORD(VALUE_VBR_QUALITY,DEFAULT_VBR_QUALITY); + pmec->lLayer = rk.getDWORD(VALUE_LAYER, DEFAULT_LAYER); + pmec->bCRCProtect = rk.getDWORD(VALUE_CRC, DEFAULT_CRC); + pmec->bForceMono = rk.getDWORD(VALUE_FORCE_MONO, DEFAULT_FORCE_MONO); + pmec->bSetDuration = rk.getDWORD(VALUE_SET_DURATION, DEFAULT_SET_DURATION); + pmec->bSampleOverlap = rk.getDWORD(VALUE_SAMPLE_OVERLAP, DEFAULT_SAMPLE_OVERLAP); + pmec->bCopyright = rk.getDWORD(VALUE_COPYRIGHT, DEFAULT_COPYRIGHT); + pmec->bOriginal = rk.getDWORD(VALUE_ORIGINAL, DEFAULT_ORIGINAL); + pmec->dwSampleRate = rk.getDWORD(VALUE_SAMPLE_RATE, DEFAULT_SAMPLE_RATE); + pmec->dwPES = rk.getDWORD(VALUE_PES, DEFAULT_PES); + + pmec->ChMode = (MPEG_mode)rk.getDWORD(VALUE_STEREO_MODE, DEFAULT_STEREO_MODE); + pmec->dwForceMS = rk.getDWORD(VALUE_FORCE_MS, DEFAULT_FORCE_MS); + + pmec->dwEnforceVBRmin = rk.getDWORD(VALUE_ENFORCE_MIN, DEFAULT_ENFORCE_MIN); + pmec->dwVoiceMode = rk.getDWORD(VALUE_VOICE, DEFAULT_VOICE); + pmec->dwKeepAllFreq = rk.getDWORD(VALUE_KEEP_ALL_FREQ, DEFAULT_KEEP_ALL_FREQ); + pmec->dwStrictISO = rk.getDWORD(VALUE_STRICT_ISO, DEFAULT_STRICT_ISO); + pmec->dwNoShortBlock = rk.getDWORD(VALUE_DISABLE_SHORT_BLOCK, DEFAULT_DISABLE_SHORT_BLOCK); + pmec->dwXingTag = rk.getDWORD(VALUE_XING_TAG, DEFAULT_XING_TAG); + pmec->dwModeFixed = rk.getDWORD(VALUE_MODE_FIXED, DEFAULT_MODE_FIXED); + + rk.Close(); +} + +//////////////////////////////////////////////////////////////// +// Property page handling +//////////////////////////////////////////////////////////////// +HRESULT CMpegAudEnc::GetPages(CAUUID *pcauuid) +{ + GUID *pguid; + + pcauuid->cElems = 3; + pcauuid->pElems = pguid = (GUID *) CoTaskMemAlloc(sizeof(GUID) * pcauuid->cElems); + + if (pcauuid->pElems == NULL) + return E_OUTOFMEMORY; + + pguid[0] = CLSID_LAMEDShow_PropertyPage; + pguid[1] = CLSID_LAMEDShow_PropertyPageAdv; + pguid[2] = CLSID_LAMEDShow_About; + + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::NonDelegatingQueryInterface(REFIID riid, void ** ppv) +{ + + if (riid == IID_ISpecifyPropertyPages) + return GetInterface((ISpecifyPropertyPages *) this, ppv); + else if(riid == IID_IPersistStream) + return GetInterface((IPersistStream *)this, ppv); +// else if (riid == IID_IVAudioEncSettings) +// return GetInterface((IVAudioEncSettings*) this, ppv); + else if (riid == IID_IAudioEncoderProperties) + return GetInterface((IAudioEncoderProperties*) this, ppv); + + return CTransformFilter::NonDelegatingQueryInterface(riid, ppv); +} + +//////////////////////////////////////////////////////////////// +//IVAudioEncSettings interface methods +//////////////////////////////////////////////////////////////// + +// +// IAudioEncoderProperties +// +STDMETHODIMP CMpegAudEnc::get_PESOutputEnabled(DWORD *dwEnabled) +{ + *dwEnabled = (DWORD)m_Encoder.IsPES(); + DbgLog((LOG_TRACE, 1, TEXT("get_PESOutputEnabled -> %d"), *dwEnabled)); + + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::set_PESOutputEnabled(DWORD dwEnabled) +{ + m_Encoder.SetPES((BOOL)!!dwEnabled); + DbgLog((LOG_TRACE, 1, TEXT("set_PESOutputEnabled(%d)"), !!dwEnabled)); + + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::get_MPEGLayer(DWORD *dwLayer) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + *dwLayer = (DWORD)mec.lLayer; + + DbgLog((LOG_TRACE, 1, TEXT("get_MPEGLayer -> %d"), *dwLayer)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::set_MPEGLayer(DWORD dwLayer) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + if (dwLayer == 2) + mec.lLayer = 2; + else if (dwLayer == 1) + mec.lLayer = 1; + m_Encoder.SetOutputType(mec); + + DbgLog((LOG_TRACE, 1, TEXT("set_MPEGLayer(%d)"), dwLayer)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::get_Bitrate(DWORD *dwBitrate) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + *dwBitrate = (DWORD)mec.dwBitrate; + DbgLog((LOG_TRACE, 1, TEXT("get_Bitrate -> %d"), *dwBitrate)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::set_Bitrate(DWORD dwBitrate) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + mec.dwBitrate = dwBitrate; + m_Encoder.SetOutputType(mec); + DbgLog((LOG_TRACE, 1, TEXT("set_Bitrate(%d)"), dwBitrate)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::get_Variable(DWORD *dwVariable) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + *dwVariable = (DWORD)(mec.vmVariable == vbr_off ? 0 : 1); + DbgLog((LOG_TRACE, 1, TEXT("get_Variable -> %d"), *dwVariable)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::set_Variable(DWORD dwVariable) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + + mec.vmVariable = dwVariable ? vbr_rh : vbr_off; + m_Encoder.SetOutputType(mec); + DbgLog((LOG_TRACE, 1, TEXT("set_Variable(%d)"), dwVariable)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::get_VariableMin(DWORD *dwMin) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + *dwMin = (DWORD)mec.dwVariableMin; + DbgLog((LOG_TRACE, 1, TEXT("get_Variablemin -> %d"), *dwMin)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::set_VariableMin(DWORD dwMin) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + mec.dwVariableMin = dwMin; + m_Encoder.SetOutputType(mec); + DbgLog((LOG_TRACE, 1, TEXT("set_Variablemin(%d)"), dwMin)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::get_VariableMax(DWORD *dwMax) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + *dwMax = (DWORD)mec.dwVariableMax; + DbgLog((LOG_TRACE, 1, TEXT("get_Variablemax -> %d"), *dwMax)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::set_VariableMax(DWORD dwMax) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + mec.dwVariableMax = dwMax; + m_Encoder.SetOutputType(mec); + DbgLog((LOG_TRACE, 1, TEXT("set_Variablemax(%d)"), dwMax)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::get_Quality(DWORD *dwQuality) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + *dwQuality=(DWORD)mec.dwQuality; + DbgLog((LOG_TRACE, 1, TEXT("get_Quality -> %d"), *dwQuality)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::set_Quality(DWORD dwQuality) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + mec.dwQuality = dwQuality; + m_Encoder.SetOutputType(mec); + DbgLog((LOG_TRACE, 1, TEXT("set_Quality(%d)"), dwQuality)); + return S_OK; +} +STDMETHODIMP CMpegAudEnc::get_VariableQ(DWORD *dwVBRq) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + *dwVBRq=(DWORD)mec.dwVBRq; + DbgLog((LOG_TRACE, 1, TEXT("get_VariableQ -> %d"), *dwVBRq)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::set_VariableQ(DWORD dwVBRq) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + mec.dwVBRq = dwVBRq; + m_Encoder.SetOutputType(mec); + DbgLog((LOG_TRACE, 1, TEXT("set_VariableQ(%d)"), dwVBRq)); + return S_OK; +} + + +STDMETHODIMP CMpegAudEnc::get_SourceSampleRate(DWORD *dwSampleRate) +{ + *dwSampleRate = 0; + + WAVEFORMATEX wf; + if(FAILED(m_Encoder.GetInputType(&wf))) + return E_FAIL; + + *dwSampleRate = wf.nSamplesPerSec; + DbgLog((LOG_TRACE, 1, TEXT("get_SourceSampleRate -> %d"), *dwSampleRate)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::get_SourceChannels(DWORD *dwChannels) +{ + WAVEFORMATEX wf; + if(FAILED(m_Encoder.GetInputType(&wf))) + return E_FAIL; + + *dwChannels = wf.nChannels; + DbgLog((LOG_TRACE, 1, TEXT("get_SourceChannels -> %d"), *dwChannels)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::get_SampleRate(DWORD *dwSampleRate) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + *dwSampleRate = mec.dwSampleRate; + DbgLog((LOG_TRACE, 1, TEXT("get_SampleRate -> %d"), *dwSampleRate)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::set_SampleRate(DWORD dwSampleRate) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + DWORD dwOldSampleRate = mec.dwSampleRate; + mec.dwSampleRate = dwSampleRate; + m_Encoder.SetOutputType(mec); + DbgLog((LOG_TRACE, 1, TEXT("set_SampleRate(%d)"), dwSampleRate)); + + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::get_ChannelMode(DWORD *dwChannelMode) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + *dwChannelMode = mec.ChMode; + DbgLog((LOG_TRACE, 1, TEXT("get_ChannelMode -> %d"), *dwChannelMode)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::set_ChannelMode(DWORD dwChannelMode) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + mec.ChMode = (MPEG_mode)dwChannelMode; + m_Encoder.SetOutputType(mec); + DbgLog((LOG_TRACE, 1, TEXT("set_ChannelMode(%d)"), dwChannelMode)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::get_ForceMS(DWORD *dwFlag) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + *dwFlag = mec.dwForceMS; + DbgLog((LOG_TRACE, 1, TEXT("get_ForceMS -> %d"), *dwFlag)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::set_ForceMS(DWORD dwFlag) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + mec.dwForceMS = dwFlag; + m_Encoder.SetOutputType(mec); + DbgLog((LOG_TRACE, 1, TEXT("set_ForceMS(%d)"), dwFlag)); + return S_OK; +} + + +STDMETHODIMP CMpegAudEnc::get_CRCFlag(DWORD *dwFlag) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + *dwFlag = mec.bCRCProtect; + DbgLog((LOG_TRACE, 1, TEXT("get_CRCFlag -> %d"), *dwFlag)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::get_ForceMono(DWORD *dwFlag) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + *dwFlag = mec.bForceMono; + DbgLog((LOG_TRACE, 1, TEXT("get_ForceMono -> %d"), *dwFlag)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::get_SetDuration(DWORD *dwFlag) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + *dwFlag = mec.bSetDuration; + DbgLog((LOG_TRACE, 1, TEXT("get_SetDuration -> %d"), *dwFlag)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::get_SampleOverlap(DWORD *dwFlag) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + *dwFlag = mec.bSampleOverlap; + DbgLog((LOG_TRACE, 1, TEXT("get_SampleOverlap -> %d"), *dwFlag)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::set_CRCFlag(DWORD dwFlag) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + mec.bCRCProtect = dwFlag; + m_Encoder.SetOutputType(mec); + DbgLog((LOG_TRACE, 1, TEXT("set_CRCFlag(%d)"), dwFlag)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::set_ForceMono(DWORD dwFlag) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + mec.bForceMono = dwFlag; + m_Encoder.SetOutputType(mec); + DbgLog((LOG_TRACE, 1, TEXT("set_ForceMono(%d)"), dwFlag)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::set_SetDuration(DWORD dwFlag) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + mec.bSetDuration = dwFlag; + m_Encoder.SetOutputType(mec); + DbgLog((LOG_TRACE, 1, TEXT("set_SetDuration(%d)"), dwFlag)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::set_SampleOverlap(DWORD dwFlag) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + mec.bSampleOverlap = dwFlag; + m_Encoder.SetOutputType(mec); + DbgLog((LOG_TRACE, 1, TEXT("set_SampleOverlap(%d)"), dwFlag)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::get_EnforceVBRmin(DWORD *dwFlag) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + *dwFlag = mec.dwEnforceVBRmin; + DbgLog((LOG_TRACE, 1, TEXT("get_EnforceVBRmin -> %d"), *dwFlag)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::set_EnforceVBRmin(DWORD dwFlag) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + mec.dwEnforceVBRmin = dwFlag; + m_Encoder.SetOutputType(mec); + DbgLog((LOG_TRACE, 1, TEXT("set_EnforceVBRmin(%d)"), dwFlag)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::get_VoiceMode(DWORD *dwFlag) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + *dwFlag = mec.dwVoiceMode; + DbgLog((LOG_TRACE, 1, TEXT("get_VoiceMode -> %d"), *dwFlag)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::set_VoiceMode(DWORD dwFlag) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + mec.dwVoiceMode = dwFlag; + m_Encoder.SetOutputType(mec); + DbgLog((LOG_TRACE, 1, TEXT("set_VoiceMode(%d)"), dwFlag)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::get_KeepAllFreq(DWORD *dwFlag) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + *dwFlag = mec.dwKeepAllFreq; + DbgLog((LOG_TRACE, 1, TEXT("get_KeepAllFreq -> %d"), *dwFlag)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::set_KeepAllFreq(DWORD dwFlag) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + mec.dwKeepAllFreq = dwFlag; + m_Encoder.SetOutputType(mec); + DbgLog((LOG_TRACE, 1, TEXT("set_KeepAllFreq(%d)"), dwFlag)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::get_StrictISO(DWORD *dwFlag) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + *dwFlag = mec.dwStrictISO; + DbgLog((LOG_TRACE, 1, TEXT("get_StrictISO -> %d"), *dwFlag)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::set_StrictISO(DWORD dwFlag) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + mec.dwStrictISO = dwFlag; + m_Encoder.SetOutputType(mec); + DbgLog((LOG_TRACE, 1, TEXT("set_StrictISO(%d)"), dwFlag)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::get_NoShortBlock(DWORD *dwNoShortBlock) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + *dwNoShortBlock = mec.dwNoShortBlock; + DbgLog((LOG_TRACE, 1, TEXT("get_NoShortBlock -> %d"), *dwNoShortBlock)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::set_NoShortBlock(DWORD dwNoShortBlock) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + mec.dwNoShortBlock = dwNoShortBlock; + m_Encoder.SetOutputType(mec); + DbgLog((LOG_TRACE, 1, TEXT("set_NoShortBlock(%d)"), dwNoShortBlock)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::get_XingTag(DWORD *dwXingTag) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + *dwXingTag = mec.dwXingTag; + DbgLog((LOG_TRACE, 1, TEXT("get_XingTag -> %d"), *dwXingTag)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::set_XingTag(DWORD dwXingTag) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + mec.dwXingTag = dwXingTag; + m_Encoder.SetOutputType(mec); + DbgLog((LOG_TRACE, 1, TEXT("set_XingTag(%d)"), dwXingTag)); + return S_OK; +} + + + +STDMETHODIMP CMpegAudEnc::get_OriginalFlag(DWORD *dwFlag) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + *dwFlag = mec.bOriginal; + DbgLog((LOG_TRACE, 1, TEXT("get_OriginalFlag -> %d"), *dwFlag)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::set_OriginalFlag(DWORD dwFlag) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + mec.bOriginal = dwFlag; + m_Encoder.SetOutputType(mec); + DbgLog((LOG_TRACE, 1, TEXT("set_OriginalFlag(%d)"), dwFlag)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::get_CopyrightFlag(DWORD *dwFlag) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + *dwFlag = mec.bCopyright; + DbgLog((LOG_TRACE, 1, TEXT("get_CopyrightFlag -> %d"), *dwFlag)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::set_CopyrightFlag(DWORD dwFlag) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + mec.bCopyright = dwFlag; + m_Encoder.SetOutputType(mec); + DbgLog((LOG_TRACE, 1, TEXT("set_CopyrightFlag(%d)"), dwFlag)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::get_ModeFixed(DWORD *dwModeFixed) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + *dwModeFixed = mec.dwModeFixed; + DbgLog((LOG_TRACE, 1, TEXT("get_ModeFixed -> %d"), *dwModeFixed)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::set_ModeFixed(DWORD dwModeFixed) +{ + MPEG_ENCODER_CONFIG mec; + m_Encoder.GetOutputType(&mec); + mec.dwModeFixed = dwModeFixed; + m_Encoder.SetOutputType(mec); + DbgLog((LOG_TRACE, 1, TEXT("set_ModeFixed(%d)"), dwModeFixed)); + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::get_ParameterBlockSize(BYTE *pcBlock, DWORD *pdwSize) +{ + DbgLog((LOG_TRACE, 1, TEXT("get_ParameterBlockSize -> %d%d"), *pcBlock, *pdwSize)); + + if (pcBlock != NULL) { + if (*pdwSize >= sizeof(MPEG_ENCODER_CONFIG)) { + m_Encoder.GetOutputType((MPEG_ENCODER_CONFIG*)pcBlock); + return S_OK; + } + else { + *pdwSize = sizeof(MPEG_ENCODER_CONFIG); + return E_FAIL; + } + } + else if (pdwSize != NULL) { + *pdwSize = sizeof(MPEG_ENCODER_CONFIG); + return S_OK; + } + + return E_FAIL; +} + +STDMETHODIMP CMpegAudEnc::set_ParameterBlockSize(BYTE *pcBlock, DWORD dwSize) +{ + DbgLog((LOG_TRACE, 1, TEXT("get_ParameterBlockSize(%d, %d)"), *pcBlock, dwSize)); + if (sizeof(MPEG_ENCODER_CONFIG) == dwSize){ + m_Encoder.SetOutputType(*(MPEG_ENCODER_CONFIG*)pcBlock); + return S_OK; + } + else return E_FAIL; +} + + +STDMETHODIMP CMpegAudEnc::DefaultAudioEncoderProperties() +{ + DbgLog((LOG_TRACE, 1, TEXT("DefaultAudioEncoderProperties()"))); + + HRESULT hr = InputTypeDefined(); + if (FAILED(hr)) + return hr; + + DWORD dwSourceSampleRate; + get_SourceSampleRate(&dwSourceSampleRate); + + set_PESOutputEnabled(DEFAULT_PES); + set_MPEGLayer(DEFAULT_LAYER); + + set_Bitrate(DEFAULT_BITRATE); + set_Variable(FALSE); + set_VariableMin(DEFAULT_VARIABLEMIN); + set_VariableMax(DEFAULT_VARIABLEMAX); + set_Quality(DEFAULT_ENCODING_QUALITY); + set_VariableQ(DEFAULT_VBR_QUALITY); + + set_SampleRate(dwSourceSampleRate); + set_CRCFlag(DEFAULT_CRC); + set_ForceMono(DEFAULT_FORCE_MONO); + set_SetDuration(DEFAULT_SET_DURATION); + set_SampleOverlap(DEFAULT_SAMPLE_OVERLAP); + set_OriginalFlag(DEFAULT_ORIGINAL); + set_CopyrightFlag(DEFAULT_COPYRIGHT); + + set_EnforceVBRmin(DEFAULT_ENFORCE_MIN); + set_VoiceMode(DEFAULT_VOICE); + set_KeepAllFreq(DEFAULT_KEEP_ALL_FREQ); + set_StrictISO(DEFAULT_STRICT_ISO); + set_NoShortBlock(DEFAULT_DISABLE_SHORT_BLOCK); + set_XingTag(DEFAULT_XING_TAG); + set_ForceMS(DEFAULT_FORCE_MS); + set_ChannelMode(DEFAULT_STEREO_MODE); + set_ModeFixed(DEFAULT_MODE_FIXED); + + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::LoadAudioEncoderPropertiesFromRegistry() +{ + DbgLog((LOG_TRACE, 1, TEXT("LoadAudioEncoderPropertiesFromRegistry()"))); + + MPEG_ENCODER_CONFIG mec; + ReadPresetSettings(&mec); + if(m_Encoder.SetOutputType(mec) == S_FALSE) + return S_FALSE; + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::SaveAudioEncoderPropertiesToRegistry() +{ + DbgLog((LOG_TRACE, 1, TEXT("SaveAudioEncoderPropertiesToRegistry()"))); + Lame::CRegKey rk; + + MPEG_ENCODER_CONFIG mec; + if(m_Encoder.GetOutputType(&mec) == S_FALSE) + return E_FAIL; + + if(rk.Create(HKEY_CURRENT_USER, KEY_LAME_ENCODER)) + { + rk.setDWORD(VALUE_BITRATE, mec.dwBitrate); + rk.setDWORD(VALUE_VARIABLE, mec.vmVariable); + rk.setDWORD(VALUE_VARIABLEMIN, mec.dwVariableMin); + rk.setDWORD(VALUE_VARIABLEMAX, mec.dwVariableMax); + rk.setDWORD(VALUE_QUALITY, mec.dwQuality); + rk.setDWORD(VALUE_VBR_QUALITY, mec.dwVBRq); + + rk.setDWORD(VALUE_CRC, mec.bCRCProtect); + rk.setDWORD(VALUE_FORCE_MONO, mec.bForceMono); + rk.setDWORD(VALUE_SET_DURATION, mec.bSetDuration); + rk.setDWORD(VALUE_SAMPLE_OVERLAP, mec.bSampleOverlap); + rk.setDWORD(VALUE_PES, mec.dwPES); + rk.setDWORD(VALUE_COPYRIGHT, mec.bCopyright); + rk.setDWORD(VALUE_ORIGINAL, mec.bOriginal); + rk.setDWORD(VALUE_SAMPLE_RATE, mec.dwSampleRate); + + rk.setDWORD(VALUE_STEREO_MODE, mec.ChMode); + rk.setDWORD(VALUE_FORCE_MS, mec.dwForceMS); + rk.setDWORD(VALUE_XING_TAG, mec.dwXingTag); + rk.setDWORD(VALUE_DISABLE_SHORT_BLOCK, mec.dwNoShortBlock); + rk.setDWORD(VALUE_STRICT_ISO, mec.dwStrictISO); + rk.setDWORD(VALUE_KEEP_ALL_FREQ, mec.dwKeepAllFreq); + rk.setDWORD(VALUE_VOICE, mec.dwVoiceMode); + rk.setDWORD(VALUE_ENFORCE_MIN, mec.dwEnforceVBRmin); + rk.setDWORD(VALUE_MODE_FIXED, mec.dwModeFixed); + + rk.Close(); + } + + // Reconnect filter graph + Reconnect(); + + return S_OK; +} + +STDMETHODIMP CMpegAudEnc::InputTypeDefined() +{ + WAVEFORMATEX wf; + if(FAILED(m_Encoder.GetInputType(&wf))) + { + DbgLog((LOG_TRACE, 1, TEXT("!InputTypeDefined()"))); + return E_FAIL; + } + + DbgLog((LOG_TRACE, 1, TEXT("InputTypeDefined()"))); + return S_OK; +} + + +STDMETHODIMP CMpegAudEnc::ApplyChanges() +{ + return Reconnect(); +} + +// +// CPersistStream stuff +// + +// what is our class ID? +STDMETHODIMP CMpegAudEnc::GetClassID(CLSID *pClsid) +{ + CheckPointer(pClsid, E_POINTER); + *pClsid = CLSID_LAMEDShowFilter; + return S_OK; +} + +HRESULT CMpegAudEnc::WriteToStream(IStream *pStream) +{ + DbgLog((LOG_TRACE,1,TEXT("WriteToStream()"))); + + MPEG_ENCODER_CONFIG mec; + + if(m_Encoder.GetOutputType(&mec) == S_FALSE) + return E_FAIL; + + return pStream->Write(&mec, sizeof(mec), 0); +} + + +// what device should we use? Used to re-create a .GRF file that we +// are in +HRESULT CMpegAudEnc::ReadFromStream(IStream *pStream) +{ + MPEG_ENCODER_CONFIG mec; + + HRESULT hr = pStream->Read(&mec, sizeof(mec), 0); + if(FAILED(hr)) + return hr; + + if(m_Encoder.SetOutputType(mec) == S_FALSE) + return S_FALSE; + + DbgLog((LOG_TRACE,1,TEXT("ReadFromStream() succeeded"))); + + hr = S_OK; + return hr; +} + + +// How long is our data? +int CMpegAudEnc::SizeMax() +{ + return sizeof(MPEG_ENCODER_CONFIG); +} + + + + + +////////////////////////////////////////////////////////////////////////// +// CMpegAudEncOutPin is the one and only output pin of CMpegAudEnc +// +////////////////////////////////////////////////////////////////////////// +CMpegAudEncOutPin::CMpegAudEncOutPin( CMpegAudEnc * pFilter, HRESULT * pHr ) : + CTransformOutputPin( NAME("LameEncoderOutputPin"), pFilter, pHr, L"Output\0" ), + m_pFilter(pFilter) +{ + m_SetFormat = FALSE; +} + +CMpegAudEncOutPin::~CMpegAudEncOutPin() +{ +} + +STDMETHODIMP CMpegAudEncOutPin::NonDelegatingQueryInterface(REFIID riid, void **ppv) +{ + if(riid == IID_IAMStreamConfig) { + CheckPointer(ppv, E_POINTER); + return GetInterface((IAMStreamConfig*)(this), ppv); + } + return CBaseOutputPin::NonDelegatingQueryInterface(riid, ppv); +} + + +////////////////////////////////////////////////////////////////////////// +// This is called after the output format has been negotiated and +// will update the LAME encoder settings so that it matches the +// settings specified in the MediaType structure. +////////////////////////////////////////////////////////////////////////// +HRESULT CMpegAudEncOutPin::SetMediaType(const CMediaType *pmt) +{ + // Retrieve the current LAME encoder configuration + MPEG_ENCODER_CONFIG mec; + m_pFilter->m_Encoder.GetOutputType(&mec); + + // Annotate if we are using the MEDIATYPE_Stream output type + m_pFilter->m_bStreamOutput = (pmt->majortype == MEDIATYPE_Stream); + + if (pmt->majortype == MEDIATYPE_Stream) { + // Update the encoder configuration using the settings that were + // cached in the CMpegAudEncOutPin::GetMediaType() call + mec.dwSampleRate = m_CurrentOutputFormat.nSampleRate; + mec.dwBitrate = m_CurrentOutputFormat.nBitRate; + mec.ChMode = m_CurrentOutputFormat.ChMode; + } + else { + // Update the encoder configuration directly using the values + // passed via the CMediaType structure. + MPEGLAYER3WAVEFORMAT *pfmt = (MPEGLAYER3WAVEFORMAT*) pmt->Format(); + mec.dwSampleRate = pfmt->wfx.nSamplesPerSec; + mec.dwBitrate = pfmt->wfx.nAvgBytesPerSec * 8 / 1000; + + if (pfmt->wfx.nChannels == 1) { mec.ChMode = MONO; } + else if (pfmt->wfx.nChannels == 2 && mec.ChMode == MONO && !mec.bForceMono) { mec.ChMode = STEREO; } + } + m_pFilter->m_Encoder.SetOutputType(mec); + + // Now configure this MediaType on the output pin + HRESULT hr = CTransformOutputPin::SetMediaType(pmt); + return hr; +} + + +////////////////////////////////////////////////////////////////////////// +// Retrieve the various MediaTypes that match the advertised formats +// supported on the output pin and configure an AM_MEDIA_TYPE output +// structure that is based on the selected format. +////////////////////////////////////////////////////////////////////////// +HRESULT CMpegAudEncOutPin::GetMediaType(int iPosition, CMediaType *pmt) +{ + if (iPosition < 0) return E_INVALIDARG; + + // If iPosition equals zero then we always return the currently configured MediaType + if (iPosition == 0) { + *pmt = m_mt; + return S_OK; + } + + switch (iPosition) + { + case 1: + { + pmt->SetType(&MEDIATYPE_Audio); + pmt->SetSubtype(&MEDIASUBTYPE_MP3); + break; + } + case 2: + { + pmt->SetType(&MEDIATYPE_Stream); + pmt->SetSubtype(&MEDIASUBTYPE_MPEG1Audio); + pmt->SetFormatType(&GUID_NULL); + break; + } + case 3: + { // The last case that we evaluate is the MPEG2_PES format, but if the + // encoder isn't configured for it then just return VFW_S_NO_MORE_ITEMS + if ( !m_pFilter->m_Encoder.IsPES() ) { return VFW_S_NO_MORE_ITEMS; } + + pmt->SetType(&MEDIATYPE_MPEG2_PES); + pmt->SetSubtype(&MEDIASUBTYPE_MPEG2_AUDIO); + break; + } + default: + return VFW_S_NO_MORE_ITEMS; + } + + + // Output capabilities are dependent on the input so insure it is connected + if ( !m_pFilter->m_pInput->IsConnected() ) { + pmt->SetFormatType(&FORMAT_None); + return NOERROR; + } + + + // Annotate the current MediaType index for recall in CMpegAudEnc::Reconnect() + m_pFilter->m_currentMediaTypeIndex = iPosition; + + // Configure the remaining AM_MEDIA_TYPE parameters using the cached encoder settings. + // Since MEDIATYPE_Stream doesn't have a format block the current settings + // for CHANNEL MODE, BITRATE and SAMPLERATE are cached in m_CurrentOutputFormat for use + // when we setup the LAME encoder in the call to CMpegAudEncOutPin::SetMediaType() + MPEG_ENCODER_CONFIG mec; + m_pFilter->m_Encoder.GetOutputType(&mec); // Retrieve the current encoder config + + WAVEFORMATEX wf; // Retrieve the input configuration + m_pFilter->m_Encoder.GetInputType(&wf); + + // Use the current encoder sample rate unless it isn't a modulus of the input rate + if ((wf.nSamplesPerSec % mec.dwSampleRate) == 0) { + m_CurrentOutputFormat.nSampleRate = mec.dwSampleRate; + } + else { + m_CurrentOutputFormat.nSampleRate = wf.nSamplesPerSec; + } + + // Select the output channel config based on the encoder config and input channel count + m_CurrentOutputFormat.ChMode = mec.ChMode; + switch (wf.nChannels) // Determine if we need to alter ChMode based upon the channel count and ForceMono flag + { + case 1: + { + m_CurrentOutputFormat.ChMode = MONO; + break; + } + case 2: + { + if (mec.ChMode == MONO && !mec.bForceMono) { m_CurrentOutputFormat.ChMode = STEREO; } + else if ( mec.bForceMono ) { m_CurrentOutputFormat.ChMode = MONO; } + break; + } + } + + // Select the encoder bit rate. In VBR mode we set the data rate parameter + // of the WAVE_FORMAT_MPEGLAYER3 structure to the minimum VBR value + m_CurrentOutputFormat.nBitRate = (mec.vmVariable == vbr_off) ? mec.dwBitrate : mec.dwVariableMin; + + if (pmt->majortype == MEDIATYPE_Stream) return NOERROR; // No further config required for MEDIATYPE_Stream + + + // Now configure the remainder of the WAVE_FORMAT_MPEGLAYER3 format block + // and its parent AM_MEDIA_TYPE structure + DECLARE_PTR(MPEGLAYER3WAVEFORMAT, p_mp3wvfmt, pmt->AllocFormatBuffer(sizeof(MPEGLAYER3WAVEFORMAT))); + ZeroMemory(p_mp3wvfmt, sizeof(MPEGLAYER3WAVEFORMAT)); + + p_mp3wvfmt->wfx.wFormatTag = WAVE_FORMAT_MPEGLAYER3; + p_mp3wvfmt->wfx.nChannels = (m_CurrentOutputFormat.ChMode == MONO) ? 1 : 2; + p_mp3wvfmt->wfx.nSamplesPerSec = m_CurrentOutputFormat.nSampleRate; + p_mp3wvfmt->wfx.nAvgBytesPerSec = GET_DATARATE(m_CurrentOutputFormat.nBitRate); + p_mp3wvfmt->wfx.nBlockAlign = 1; + p_mp3wvfmt->wfx.wBitsPerSample = 0; + p_mp3wvfmt->wfx.cbSize = sizeof(MPEGLAYER3WAVEFORMAT) - sizeof(WAVEFORMATEX); + + p_mp3wvfmt->wID = MPEGLAYER3_ID_MPEG; + p_mp3wvfmt->fdwFlags = MPEGLAYER3_FLAG_PADDING_ISO; + p_mp3wvfmt->nBlockSize = GET_FRAMELENGTH(m_CurrentOutputFormat.nBitRate, p_mp3wvfmt->wfx.nSamplesPerSec); + p_mp3wvfmt->nFramesPerBlock = 1; + p_mp3wvfmt->nCodecDelay = 0; + + pmt->SetTemporalCompression(FALSE); + pmt->SetSampleSize(OUT_BUFFER_SIZE); + pmt->SetFormat((LPBYTE)p_mp3wvfmt, sizeof(MPEGLAYER3WAVEFORMAT)); + pmt->SetFormatType(&FORMAT_WaveFormatEx); + + return NOERROR; +} + + +////////////////////////////////////////////////////////////////////////// +// This method is called to see if a given output format is supported +////////////////////////////////////////////////////////////////////////// +HRESULT CMpegAudEncOutPin::CheckMediaType(const CMediaType *pmtOut) +{ + // Fail if the input pin is not connected. + if (!m_pFilter->m_pInput->IsConnected()) { + return VFW_E_NOT_CONNECTED; + } + + // Reject any media types that we know in advance our + // filter cannot use. + if (pmtOut->majortype != MEDIATYPE_Audio && pmtOut->majortype != MEDIATYPE_Stream) { return S_FALSE; } + + // If SetFormat was previously called, check whether pmtOut exactly + // matches the format that was specified in SetFormat. + // Return S_OK if they match, or VFW_E_INVALIDMEDIATYPE otherwise.) + if ( m_SetFormat ) { + if (*pmtOut != m_mt) { return VFW_E_INVALIDMEDIATYPE; } + else { return S_OK; } + } + + // Now do the normal check for this media type. + HRESULT hr; + hr = m_pFilter->CheckTransform (&m_pFilter->m_pInput->CurrentMediaType(), // The input type. + pmtOut); // The proposed output type. + + if (hr == S_OK) { + return S_OK; // This format is compatible with the current input type. + } + + // This format is not compatible with the current input type. + // Maybe we can reconnect the input pin with a new input type. + + // Enumerate the upstream filter's preferred output types, and + // see if one of them will work. + CMediaType *pmtEnum; + BOOL fFound = FALSE; + IEnumMediaTypes *pEnum; + hr = m_pFilter->m_pInput->GetConnected()->EnumMediaTypes(&pEnum); + if (hr != S_OK) { + return E_FAIL; + } + + while (hr = pEnum->Next(1, (AM_MEDIA_TYPE **)&pmtEnum, NULL), hr == S_OK) + { + // Check this input type against the proposed output type. + hr = m_pFilter->CheckTransform(pmtEnum, pmtOut); + if (hr != S_OK) { + DeleteMediaType(pmtEnum); + continue; // Try the next one. + } + + // This input type is a possible candidate. But, we have to make + // sure that the upstream filter can switch to this type. + hr = m_pFilter->m_pInput->GetConnected()->QueryAccept(pmtEnum); + if (hr != S_OK) { + // The upstream filter will not switch to this type. + DeleteMediaType(pmtEnum); + continue; // Try the next one. + } + fFound = TRUE; + DeleteMediaType(pmtEnum); + break; + } + pEnum->Release(); + + if (fFound) { + // This output type is OK, but if we are asked to use it, we will + // need to reconnect our input pin. (See SetFormat, below.) + return S_OK; + } + else { + return VFW_E_INVALIDMEDIATYPE; + } +} + + + +////////////////////////////////////////////////////////////////////////// +// IAMStreamConfig +////////////////////////////////////////////////////////////////////////// + +HRESULT STDMETHODCALLTYPE CMpegAudEncOutPin::SetFormat(AM_MEDIA_TYPE *pmt) +{ + CheckPointer(pmt, E_POINTER); + HRESULT hr; + + // Hold the filter state lock, to make sure that streaming isn't + // in the middle of starting or stopping: + CAutoLock cObjectLock(&m_pFilter->m_csFilter); + + // Cannot set the format unless the filter is stopped. + if (m_pFilter->m_State != State_Stopped) { + return VFW_E_NOT_STOPPED; + } + + // The set of possible output formats depends on the input format, + // so if the input pin is not connected, return a failure code. + if (!m_pFilter->m_pInput->IsConnected()) { + return VFW_E_NOT_CONNECTED; + } + + // If the pin is already using this format, there's nothing to do. + if (IsConnected() && CurrentMediaType() == *pmt) { + if ( m_SetFormat ) return S_OK; + } + + // See if this media type is acceptable. + if ((hr = CheckMediaType((CMediaType *)pmt)) != S_OK) { + return hr; + } + + // If we're connected to a downstream filter, we have to make + // sure that the downstream filter accepts this media type. + if (IsConnected()) { + hr = GetConnected()->QueryAccept(pmt); + if (hr != S_OK) { + return VFW_E_INVALIDMEDIATYPE; + } + } + + // Now make a note that from now on, this is the only format allowed, + // and refuse anything but this in the CheckMediaType() code above. + m_SetFormat = TRUE; + m_mt = *pmt; + + // Changing the format means reconnecting if necessary. + if (IsConnected()) { + m_pFilter->m_pGraph->Reconnect(this); + } + + return NOERROR; +} + +HRESULT STDMETHODCALLTYPE CMpegAudEncOutPin::GetFormat(AM_MEDIA_TYPE **ppmt) +{ + *ppmt = CreateMediaType(&m_mt); + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CMpegAudEncOutPin::GetNumberOfCapabilities(int *piCount, int *piSize) +{ + // The set of possible output formats depends on the input format, + // so if the input pin is not connected, return a failure code. + if (!m_pFilter->m_pInput->IsConnected()) { + return VFW_E_NOT_CONNECTED; + } + + // Retrieve the current encoder configuration + MPEG_ENCODER_CONFIG mec; + m_pFilter->m_Encoder.GetOutputType(&mec); + + // If the encoder is in VBR mode GetStreamCaps() isn't implemented + if (mec.vmVariable != vbr_off) { *piCount = 0; } + else { *piCount = m_pFilter->m_CapsNum; } + + *piSize = sizeof(AUDIO_STREAM_CONFIG_CAPS); + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CMpegAudEncOutPin::GetStreamCaps(int iIndex, AM_MEDIA_TYPE **pmt, BYTE *pSCC) +{ + // The set of possible output formats depends on the input format, + // so if the input pin is not connected, return a failure code. + if (!m_pFilter->m_pInput->IsConnected()) { + return VFW_E_NOT_CONNECTED; + } + + // If we don't have a capabilities array GetStreamCaps() isn't implemented + if (m_pFilter->m_CapsNum == 0) return E_NOTIMPL; + + // If the encoder is in VBR mode GetStreamCaps() isn't implemented + MPEG_ENCODER_CONFIG mec; + m_pFilter->m_Encoder.GetOutputType(&mec); + if (mec.vmVariable != vbr_off) return E_NOTIMPL; + + if (iIndex < 0) return E_INVALIDARG; + if (iIndex > m_pFilter->m_CapsNum) return S_FALSE; + + // Load the MPEG Layer3 WaveFormatEx structure with the appropriate entries + // for this IAMStreamConfig index element. + *pmt = CreateMediaType(&m_mt); + if (*pmt == NULL) return E_OUTOFMEMORY; + + DECLARE_PTR(MPEGLAYER3WAVEFORMAT, p_mp3wvfmt, (*pmt)->pbFormat); + + (*pmt)->majortype = MEDIATYPE_Audio; + (*pmt)->subtype = MEDIASUBTYPE_MP3; + (*pmt)->bFixedSizeSamples = TRUE; + (*pmt)->bTemporalCompression = FALSE; + (*pmt)->lSampleSize = OUT_BUFFER_SIZE; + (*pmt)->formattype = FORMAT_WaveFormatEx; + (*pmt)->cbFormat = sizeof(MPEGLAYER3WAVEFORMAT); + + p_mp3wvfmt->wfx.wFormatTag = WAVE_FORMAT_MPEGLAYER3; + p_mp3wvfmt->wfx.nChannels = 2; + p_mp3wvfmt->wfx.nSamplesPerSec = m_pFilter->OutputCaps[iIndex].nSampleRate; + p_mp3wvfmt->wfx.nAvgBytesPerSec = GET_DATARATE(m_pFilter->OutputCaps[iIndex].nBitRate); + p_mp3wvfmt->wfx.nBlockAlign = 1; + p_mp3wvfmt->wfx.wBitsPerSample = 0; + p_mp3wvfmt->wfx.cbSize = sizeof(MPEGLAYER3WAVEFORMAT) - sizeof(WAVEFORMATEX); + + p_mp3wvfmt->wID = MPEGLAYER3_ID_MPEG; + p_mp3wvfmt->fdwFlags = MPEGLAYER3_FLAG_PADDING_ISO; + p_mp3wvfmt->nBlockSize = GET_FRAMELENGTH(m_pFilter->OutputCaps[iIndex].nBitRate, m_pFilter->OutputCaps[iIndex].nSampleRate); + p_mp3wvfmt->nFramesPerBlock = 1; + p_mp3wvfmt->nCodecDelay = 0; + + // Set up the companion AUDIO_STREAM_CONFIG_CAPS structure + // We are only using the CHANNELS element of the structure + DECLARE_PTR(AUDIO_STREAM_CONFIG_CAPS, pascc, pSCC); + + ZeroMemory(pascc, sizeof(AUDIO_STREAM_CONFIG_CAPS)); + pascc->guid = MEDIATYPE_Audio; + + pascc->MinimumChannels = 1; + pascc->MaximumChannels = 2; + pascc->ChannelsGranularity = 1; + + pascc->MinimumSampleFrequency = p_mp3wvfmt->wfx.nSamplesPerSec; + pascc->MaximumSampleFrequency = p_mp3wvfmt->wfx.nSamplesPerSec; + pascc->SampleFrequencyGranularity = 0; + + pascc->MinimumBitsPerSample = p_mp3wvfmt->wfx.wBitsPerSample; + pascc->MaximumBitsPerSample = p_mp3wvfmt->wfx.wBitsPerSample; + pascc->BitsPerSampleGranularity = 0; + + return S_OK; +} + diff --git a/dshow/Mpegac.def b/dshow/Mpegac.def new file mode 100644 index 0000000..d3a2be9 --- /dev/null +++ b/dshow/Mpegac.def @@ -0,0 +1,27 @@ +; +; LAME MP3 encoder for DirectShow +; +; Copyright (c) 2000-2005 Marie Orlova, Peter Gubanov, Vitaly Ivanov, Elecard Ltd. +; +; This library is free software; you can redistribute it and/or +; modify it under the terms of the GNU Library General Public +; License as published by the Free Software Foundation; either +; version 2 of the License, or (at your option) any later version. +; +; This library 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 +; Library General Public License for more details. +; +; You should have received a copy of the GNU Library General Public +; License along with this library; if not, write to the +; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +; Boston, MA 02111-1307, USA. +; + +LIBRARY lame.ax +EXPORTS + DllGetClassObject PRIVATE + DllCanUnloadNow PRIVATE + DllRegisterServer PRIVATE + DllUnregisterServer PRIVATE diff --git a/dshow/Mpegac.h b/dshow/Mpegac.h new file mode 100644 index 0000000..9341f0a --- /dev/null +++ b/dshow/Mpegac.h @@ -0,0 +1,287 @@ +/* + * LAME MP3 encoder for DirectShow + * DirectShow filter implementation + * + * Copyright (c) 2000-2005 Marie Orlova, Peter Gubanov, Vitaly Ivanov, Elecard Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include +#include "Encoder.h" + +#define KEY_LAME_ENCODER "SOFTWARE\\GNU\\LAME MPEG Layer III Audio Encoder Filter" + +#define VALUE_BITRATE "Bitrate" +#define VALUE_VARIABLE "Variable" +#define VALUE_VARIABLEMIN "VariableMin" +#define VALUE_VARIABLEMAX "VariableMax" +#define VALUE_QUALITY "Quality" +#define VALUE_VBR_QUALITY "VBR Quality" +#define VALUE_SAMPLE_RATE "Sample Rate" + +#define VALUE_STEREO_MODE "Stereo Mode" +#define VALUE_FORCE_MS "Force MS" + +#define VALUE_LAYER "Layer" +#define VALUE_ORIGINAL "Original" +#define VALUE_COPYRIGHT "Copyright" +#define VALUE_CRC "CRC" +#define VALUE_FORCE_MONO "Force Mono" +#define VALUE_SET_DURATION "Set Duration" +#define VALUE_SAMPLE_OVERLAP "Allow sample overlap" +#define VALUE_PES "PES" + +#define VALUE_ENFORCE_MIN "EnforceVBRmin" +#define VALUE_VOICE "Voice Mode" +#define VALUE_KEEP_ALL_FREQ "Keep All Frequencies" +#define VALUE_STRICT_ISO "Strict ISO" +#define VALUE_DISABLE_SHORT_BLOCK "No Short Block" +#define VALUE_XING_TAG "Xing Tag" +#define VALUE_MODE_FIXED "Mode Fixed" + + +typedef struct +{ + DWORD nSampleRate; + DWORD nBitRate; + MPEG_mode ChMode; //Channel coding mode +} current_output_format_t; + +typedef struct +{ + DWORD nSampleRate; + DWORD nBitRate; +} output_caps_t; + +typedef struct +{ + LONGLONG sample; + REFERENCE_TIME delta; + + BOOL applied; +} resync_point_t; + +#define RESYNC_COUNT 4 + +// The maximum number of capabilities that we can expose in our IAMStreamConfig +// implementation is currently set to 100. This number is larger than we +// should ever realistically need. However, a cleaner implementation might +// be to use a dynamically sized array like std::vector or CAtlArray to +// hold this data. +#define MAX_IAMSTREAMCONFIG_CAPS 100 + +/////////////////////////////////////////////////////////////////// +// CMpegAudEnc class - implementation for ITransformFilter interface +/////////////////////////////////////////////////////////////////// +class CMpegAudEncOutPin; +class CMpegAudEncPropertyPage; +class CMpegAudEnc : public CTransformFilter, + public ISpecifyPropertyPages, + public IAudioEncoderProperties, + public CPersistStream +{ +public: + DECLARE_IUNKNOWN + + static CUnknown *CreateInstance(LPUNKNOWN lpunk, HRESULT *phr); + + LPAMOVIESETUP_FILTER GetSetupData(); + + HRESULT Reconnect(); + + HRESULT Receive(IMediaSample *pSample); + + HRESULT CheckInputType(const CMediaType* mtIn); + HRESULT CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut); + HRESULT DecideBufferSize(IMemAllocator * pAllocator, ALLOCATOR_PROPERTIES *pprop); + + HRESULT GetMediaType (int iPosition, CMediaType *pMediaType); + HRESULT SetMediaType (PIN_DIRECTION direction,const CMediaType *pmt); + + + // + HRESULT StartStreaming(); + HRESULT StopStreaming(); + HRESULT EndOfStream(); + HRESULT BeginFlush(); + + ~CMpegAudEnc(void); + + // ISpecifyPropertyPages + STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void ** ppv); + STDMETHODIMP GetPages(CAUUID *pPages); + + // IAudioEncoderProperties + STDMETHODIMP get_PESOutputEnabled(DWORD *dwEnabled); // PES header. Obsolete + STDMETHODIMP set_PESOutputEnabled(DWORD dwEnabled); // PES header. Obsolete + + STDMETHODIMP get_MPEGLayer(DWORD *dwLayer); + STDMETHODIMP set_MPEGLayer(DWORD dwLayer); + + STDMETHODIMP get_Bitrate(DWORD *dwBitrate); + STDMETHODIMP set_Bitrate(DWORD dwBitrate); + STDMETHODIMP get_Variable(DWORD *dwVariable); + STDMETHODIMP set_Variable(DWORD dwVariable); + STDMETHODIMP get_VariableMin(DWORD *dwMin); + STDMETHODIMP set_VariableMin(DWORD dwMin); + STDMETHODIMP get_VariableMax(DWORD *dwMax); + STDMETHODIMP set_VariableMax(DWORD dwMax); + STDMETHODIMP get_Quality(DWORD *dwQuality); + STDMETHODIMP set_Quality(DWORD dwQuality); + STDMETHODIMP get_VariableQ(DWORD *dwVBRq); + STDMETHODIMP set_VariableQ(DWORD dwVBRq); + STDMETHODIMP get_SourceSampleRate(DWORD *dwSampleRate); + STDMETHODIMP get_SourceChannels(DWORD *dwChannels); + STDMETHODIMP get_SampleRate(DWORD *dwSampleRate); + STDMETHODIMP set_SampleRate(DWORD dwSampleRate); + + STDMETHODIMP get_ChannelMode(DWORD *dwChannelMode); + STDMETHODIMP set_ChannelMode(DWORD dwChannelMode); + STDMETHODIMP get_ForceMS(DWORD *dwFlag); + STDMETHODIMP set_ForceMS(DWORD dwFlag); + STDMETHODIMP get_EnforceVBRmin(DWORD *dwFlag); + STDMETHODIMP set_EnforceVBRmin(DWORD dwFlag); + STDMETHODIMP get_VoiceMode(DWORD *dwFlag); + STDMETHODIMP set_VoiceMode(DWORD dwFlag); + STDMETHODIMP get_KeepAllFreq(DWORD *dwFlag); + STDMETHODIMP set_KeepAllFreq(DWORD dwFlag); + STDMETHODIMP get_StrictISO(DWORD *dwFlag); + STDMETHODIMP set_StrictISO(DWORD dwFlag); + STDMETHODIMP get_NoShortBlock(DWORD *dwNoShortBlock); + STDMETHODIMP set_NoShortBlock(DWORD dwNoShortBlock); + STDMETHODIMP get_XingTag(DWORD *dwXingTag); + STDMETHODIMP set_XingTag(DWORD dwXingTag); + STDMETHODIMP get_ModeFixed(DWORD *dwModeFixed); + STDMETHODIMP set_ModeFixed(DWORD dwModeFixed); + + + STDMETHODIMP get_CRCFlag(DWORD *dwFlag); + STDMETHODIMP set_CRCFlag(DWORD dwFlag); + STDMETHODIMP get_ForceMono(DWORD *dwFlag); + STDMETHODIMP set_ForceMono(DWORD dwFlag); + STDMETHODIMP get_SetDuration(DWORD *dwFlag); + STDMETHODIMP set_SetDuration(DWORD dwFlag); + STDMETHODIMP get_OriginalFlag(DWORD *dwFlag); + STDMETHODIMP set_OriginalFlag(DWORD dwFlag); + STDMETHODIMP get_CopyrightFlag(DWORD *dwFlag); + STDMETHODIMP set_CopyrightFlag(DWORD dwFlag); + STDMETHODIMP get_SampleOverlap(DWORD *dwFlag); + STDMETHODIMP set_SampleOverlap(DWORD dwFlag); + + STDMETHODIMP get_ParameterBlockSize(BYTE *pcBlock, DWORD *pdwSize); + STDMETHODIMP set_ParameterBlockSize(BYTE *pcBlock, DWORD dwSize); + + STDMETHODIMP DefaultAudioEncoderProperties(); + STDMETHODIMP LoadAudioEncoderPropertiesFromRegistry(); + STDMETHODIMP SaveAudioEncoderPropertiesToRegistry(); + STDMETHODIMP InputTypeDefined(); + + STDMETHODIMP ApplyChanges(); + + // CPersistStream + HRESULT WriteToStream(IStream *pStream); + HRESULT ReadFromStream(IStream *pStream); + + int SizeMax(); + STDMETHODIMP GetClassID(CLSID *pClsid); + +private: + CMpegAudEnc(LPUNKNOWN lpunk, HRESULT *phr); + + HRESULT FlushEncodedSamples(); + + void ReadPresetSettings(MPEG_ENCODER_CONFIG *pmabsi); + + void LoadOutputCapabilities(DWORD sample_rate); + + // Encoder object + CEncoder m_Encoder; + + REFERENCE_TIME m_rtStreamTime; + REFERENCE_TIME m_rtFrameTime; + REFERENCE_TIME m_rtEstimated; + + // Synchronization data + LONGLONG m_samplesIn; + LONGLONG m_samplesOut; + int m_samplesPerFrame; + int m_bytesPerSample; + float m_bytesToDuration; + + resync_point_t m_sync[RESYNC_COUNT]; + int m_sync_in_idx; + int m_sync_out_idx; + + BOOL m_hasFinished; + + CCritSec m_cs; + + DWORD m_setDuration; + DWORD m_allowOverlap; + + REFERENCE_TIME m_rtBytePos; + + BOOL m_bStreamOutput; // Binary stream output + long m_cbStreamAlignment; // Stream block size + int m_CapsNum; + int m_currentMediaTypeIndex; + output_caps_t OutputCaps[MAX_IAMSTREAMCONFIG_CAPS]; + +protected: + friend class CMpegAudEncOutPin; + friend class CMpegAudEncPropertyPage; +}; + + +class CMpegAudEncOutPin : public CTransformOutputPin, public IAMStreamConfig +{ +public: + + ////////////////////////////////////////////////////////////////////////// + // IUnknown + ////////////////////////////////////////////////////////////////////////// + DECLARE_IUNKNOWN + STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void ** ppv); + + ////////////////////////////////////////////////////////////////////////// + // IAMStreamConfig + ////////////////////////////////////////////////////////////////////////// + HRESULT STDMETHODCALLTYPE SetFormat(AM_MEDIA_TYPE *pmt); + HRESULT STDMETHODCALLTYPE GetFormat(AM_MEDIA_TYPE **ppmt); + HRESULT STDMETHODCALLTYPE GetNumberOfCapabilities(int *piCount, int *piSize); + HRESULT STDMETHODCALLTYPE GetStreamCaps(int iIndex, AM_MEDIA_TYPE **pmt, BYTE *pSCC); + + ////////////////////////////////////////////////////////////////////////// + // CTransformOutputPin + ////////////////////////////////////////////////////////////////////////// + CMpegAudEncOutPin( CMpegAudEnc * pFilter, HRESULT * pHr ); + ~CMpegAudEncOutPin(); + + HRESULT CheckMediaType(const CMediaType *pmtOut); + HRESULT GetMediaType(int iPosition, CMediaType *pmt); + HRESULT SetMediaType(const CMediaType *pmt); + +private: + BOOL m_SetFormat; + CMpegAudEnc *m_pFilter; + + current_output_format_t m_CurrentOutputFormat; + +protected: + friend class CMpegAudEnc; + +}; diff --git a/dshow/PropPage.cpp b/dshow/PropPage.cpp new file mode 100644 index 0000000..7e0b3b7 --- /dev/null +++ b/dshow/PropPage.cpp @@ -0,0 +1,646 @@ +/* + * LAME MP3 encoder for DirectShow + * Basic property page + * + * Copyright (c) 2000-2005 Marie Orlova, Peter Gubanov, Vitaly Ivanov, Elecard Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include "iaudioprops.h" +#include "mpegac.h" +#include "resource.h" +#include "PropPage.h" +#include "Reg.h" + +// strings to appear in comboboxes +const char * szBitRateString[2][14] = { + { + "32 kbps","40 kbps","48 kbps","56 kbps", + "64 kbps","80 kbps","96 kbps","112 kbps", + "128 kbps","160 kbps","192 kbps","224 kbps", + "256 kbps","320 kbps" + }, + { + "8 kbps","16 kbps","24 kbps","32 kbps", + "40 kbps","48 kbps","56 kbps","64 kbps", + "80 kbps","96 kbps","112 kbps","128 kbps", + "144 kbps","160 kbps" + } +}; + +LPCSTR szQualityDesc[10] = { + "High", "High", "High", "High", "High", + "Medium", "Medium", + "Low", "Low", + "Fast mode" +}; + +LPCSTR szVBRqDesc[10] = { + "0 - ~1:4", + "1 - ~1:5", + "2 - ~1:6", + "3 - ~1:7", + "4 - ~1:9", + "5 - ~1:9", + "6 - ~1:10", + "7 - ~1:11", + "8 - ~1:12", + "9 - ~1:14" +}; + +struct SSampleRate { + DWORD dwSampleRate; + LPCSTR lpSampleRate; +}; + +SSampleRate srRates[9] = { + // MPEG-1 + {48000, "48 kHz"}, + {44100, "44.1 kHz"}, + {32000, "32 kHz"}, + + // MPEG-2 + {24000, "24 kHz"}, + {22050, "22.05 kHz"}, + {16000, "16 kHz"}, + + // MPEG-2.5 + {12000, "12 kHz"}, + {11025, "11.025 kHz"}, + { 8000, "8 kHz"} +}; + +//////////////////////////////////////////////////////////////// +// CreateInstance +//////////////////////////////////////////////////////////////// +CUnknown *CMpegAudEncPropertyPage::CreateInstance( LPUNKNOWN punk, HRESULT *phr ) +{ + CMpegAudEncPropertyPage *pNewObject + = new CMpegAudEncPropertyPage( punk, phr ); + + if( pNewObject == NULL ) + *phr = E_OUTOFMEMORY; + + return pNewObject; +} + +//////////////////////////////////////////////////////////////// +// Constructor +//////////////////////////////////////////////////////////////// +CMpegAudEncPropertyPage::CMpegAudEncPropertyPage(LPUNKNOWN punk, HRESULT *phr) + : CBasePropertyPage(NAME("Encoder Property Page"), + punk, IDD_AUDIOENCPROPS, IDS_AUDIO_PROPS_TITLE) + , m_pAEProps(NULL) +{ + ASSERT(phr); + + m_srIdx = 0; + + InitCommonControls(); +} + +// +// OnConnect +// +// Give us the filter to communicate with +HRESULT CMpegAudEncPropertyPage::OnConnect(IUnknown *pUnknown) +{ + ASSERT(m_pAEProps == NULL); + + // Ask the filter for it's control interface + + HRESULT hr = pUnknown->QueryInterface(IID_IAudioEncoderProperties,(void **)&m_pAEProps); + if (FAILED(hr)) + return E_NOINTERFACE; + + ASSERT(m_pAEProps); + + // Get current filter state + m_pAEProps->get_Bitrate(&m_dwBitrate); + m_pAEProps->get_Variable(&m_dwVariable); + m_pAEProps->get_VariableMin(&m_dwMin); + m_pAEProps->get_VariableMax(&m_dwMax); + m_pAEProps->get_Quality(&m_dwQuality); + m_pAEProps->get_VariableQ(&m_dwVBRq); + m_pAEProps->get_SampleRate(&m_dwSampleRate); + m_pAEProps->get_CRCFlag(&m_dwCRC); + m_pAEProps->get_ForceMono(&m_dwForceMono); + m_pAEProps->get_CopyrightFlag(&m_dwCopyright); + m_pAEProps->get_OriginalFlag(&m_dwOriginal); + + return NOERROR; +} + +// +// OnDisconnect +// +// Release the interface + +HRESULT CMpegAudEncPropertyPage::OnDisconnect() +{ + // Release the interface + if (m_pAEProps == NULL) + return E_UNEXPECTED; + + m_pAEProps->set_Bitrate(m_dwBitrate); + m_pAEProps->set_Variable(m_dwVariable); + m_pAEProps->set_VariableMin(m_dwMin); + m_pAEProps->set_VariableMax(m_dwMax); + m_pAEProps->set_Quality(m_dwQuality); + m_pAEProps->set_VariableQ(m_dwVBRq); + m_pAEProps->set_SampleRate(m_dwSampleRate); + m_pAEProps->set_CRCFlag(m_dwCRC); + m_pAEProps->set_ForceMono(m_dwForceMono); + m_pAEProps->set_CopyrightFlag(m_dwCopyright); + m_pAEProps->set_OriginalFlag(m_dwOriginal); + m_pAEProps->SaveAudioEncoderPropertiesToRegistry(); + + m_pAEProps->Release(); + m_pAEProps = NULL; + + return NOERROR; +} + +// +// OnActivate +// +// Called on dialog creation + +HRESULT CMpegAudEncPropertyPage::OnActivate(void) +{ + InitPropertiesDialog(m_hwnd); + + return NOERROR; +} + +// +// OnDeactivate +// +// Called on dialog destruction + +HRESULT CMpegAudEncPropertyPage::OnDeactivate(void) +{ + return NOERROR; +} + +//////////////////////////////////////////////////////////////// +// OnReceiveMessage - message handler function +//////////////////////////////////////////////////////////////// +BOOL CMpegAudEncPropertyPage::OnReceiveMessage(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam) +{ + switch (uMsg) + { + case WM_HSCROLL: + if ((HWND)lParam == m_hwndQuality) + { + int pos = SendMessage(m_hwndQuality, TBM_GETPOS, 0, 0); + if (pos >= 0 && pos < 10) + { + SetDlgItemText(hwnd,IDC_TEXT_QUALITY,szQualityDesc[pos]); + m_pAEProps->set_Quality(pos); + SetDirty(); + } + } + break; + + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case IDC_COMBO_CBR: + if (HIWORD(wParam) == CBN_SELCHANGE) + { + int nBitrate = SendDlgItemMessage(hwnd, IDC_COMBO_CBR, CB_GETCURSEL, 0, 0L); + DWORD dwSampleRate; + m_pAEProps->get_SampleRate(&dwSampleRate); + DWORD dwBitrate; + + if (dwSampleRate >= 32000) + { + // Consider MPEG-1 + dwBitrate = dwBitRateValue[0][nBitrate]; + } + else + { + // Consider MPEG-2/2.5 + dwBitrate = dwBitRateValue[1][nBitrate]; + } + + m_pAEProps->set_Bitrate(dwBitrate); + + SetDirty(); + } + break; + + case IDC_COMBO_VBRMIN: + if (HIWORD(wParam) == CBN_SELCHANGE) + { + int nVariableMin = SendDlgItemMessage(hwnd, IDC_COMBO_VBRMIN, CB_GETCURSEL, 0, 0L); + DWORD dwSampleRate; + m_pAEProps->get_SampleRate(&dwSampleRate); + DWORD dwMin; + + if (dwSampleRate >= 32000) + { + // Consider MPEG-1 + dwMin = dwBitRateValue[0][nVariableMin]; + } + else + { + // Consider MPEG-2/2.5 + dwMin = dwBitRateValue[1][nVariableMin]; + } + + m_pAEProps->set_VariableMin(dwMin); + + SetDirty(); + } + break; + + case IDC_COMBO_VBRMAX: + if (HIWORD(wParam) == CBN_SELCHANGE) + { + int nVariableMax = SendDlgItemMessage(hwnd, IDC_COMBO_VBRMAX, CB_GETCURSEL, 0, 0L); + DWORD dwSampleRate; + m_pAEProps->get_SampleRate(&dwSampleRate); + DWORD dwMax; + + if (dwSampleRate >= 32000) + { + // Consider MPEG-1 + dwMax = dwBitRateValue[0][nVariableMax]; + } + else + { + // Consider MPEG-2/2.5 + dwMax = dwBitRateValue[1][nVariableMax]; + } + + m_pAEProps->set_VariableMax(dwMax); + + SetDirty(); + } + break; + + case IDC_COMBO_SAMPLE_RATE: + if (HIWORD(wParam) == CBN_SELCHANGE) + { + int nSampleRate = SendDlgItemMessage(hwnd, IDC_COMBO_SAMPLE_RATE, CB_GETCURSEL, 0, 0L); + + if (nSampleRate < 0) + nSampleRate = 0; + else if (nSampleRate > 2) + nSampleRate = 2; + + DWORD dwSampleRate = srRates[nSampleRate * 3 + m_srIdx].dwSampleRate; + + m_pAEProps->set_SampleRate(dwSampleRate); + InitPropertiesDialog(hwnd); + SetDirty(); + } + break; + + case IDC_COMBO_VBRq: + if (HIWORD(wParam) == CBN_SELCHANGE) + { + int nVBRq = SendDlgItemMessage(hwnd, IDC_COMBO_VBRq, CB_GETCURSEL, 0, 0L); + if (nVBRq >=0 && nVBRq <=9) + m_pAEProps->set_VariableQ(nVBRq); + SetDirty(); + } + break; + + case IDC_RADIO_CBR: + case IDC_RADIO_VBR: + m_pAEProps->set_Variable(LOWORD(wParam)-IDC_RADIO_CBR); + SetDirty(); + break; + + case IDC_CHECK_PES: + m_pAEProps->set_PESOutputEnabled(IsDlgButtonChecked(hwnd, IDC_CHECK_PES)); + SetDirty(); + break; + + case IDC_CHECK_COPYRIGHT: + m_pAEProps->set_CopyrightFlag(IsDlgButtonChecked(hwnd, IDC_CHECK_COPYRIGHT)); + SetDirty(); + break; + + case IDC_CHECK_ORIGINAL: + m_pAEProps->set_OriginalFlag(IsDlgButtonChecked(hwnd, IDC_CHECK_ORIGINAL)); + SetDirty(); + break; + + case IDC_CHECK_CRC: + m_pAEProps->set_CRCFlag(IsDlgButtonChecked(hwnd, IDC_CHECK_CRC)); + SetDirty(); + break; + + case IDC_FORCE_MONO: + m_pAEProps->set_ForceMono(IsDlgButtonChecked(hwnd, IDC_FORCE_MONO)); + SetDirty(); + break; + } + return TRUE; + + case WM_DESTROY: + return TRUE; + + default: + return FALSE; + } + + return TRUE; +} + +// +// OnApplyChanges +// +HRESULT CMpegAudEncPropertyPage::OnApplyChanges() +{ + m_pAEProps->get_Bitrate(&m_dwBitrate); + m_pAEProps->get_Variable(&m_dwVariable); + m_pAEProps->get_VariableMin(&m_dwMin); + m_pAEProps->get_VariableMax(&m_dwMax); + m_pAEProps->get_Quality(&m_dwQuality); + m_pAEProps->get_VariableQ(&m_dwVBRq); + m_pAEProps->get_SampleRate(&m_dwSampleRate); + m_pAEProps->get_CRCFlag(&m_dwCRC); + m_pAEProps->get_ForceMono(&m_dwForceMono); + m_pAEProps->get_CopyrightFlag(&m_dwCopyright); + m_pAEProps->get_OriginalFlag(&m_dwOriginal); + m_pAEProps->SaveAudioEncoderPropertiesToRegistry(); + + m_pAEProps->ApplyChanges(); + + return S_OK; +} + +// +// Initialize dialogbox controls with proper values +// +void CMpegAudEncPropertyPage::InitPropertiesDialog(HWND hwndParent) +{ + EnableControls(hwndParent, TRUE); + + m_hwndQuality = GetDlgItem(hwndParent,IDC_SLIDER_QUALITY); + DWORD dwQuality; + m_pAEProps->get_Quality(&dwQuality); + SendDlgItemMessage(hwndParent, IDC_SLIDER_QUALITY, TBM_SETRANGE, 1, MAKELONG (2,9)); + SendDlgItemMessage(hwndParent, IDC_SLIDER_QUALITY, TBM_SETPOS, 1, dwQuality); + if (dwQuality>=0 && dwQuality<10) + SetDlgItemText(hwndParent,IDC_TEXT_QUALITY,szQualityDesc[dwQuality]); + + // + // initialize sample rate selection + // + DWORD dwSourceSampleRate; + m_pAEProps->get_SourceSampleRate(&dwSourceSampleRate); + + SendDlgItemMessage(hwndParent, IDC_COMBO_SAMPLE_RATE, CB_RESETCONTENT, 0, 0L); + + switch (dwSourceSampleRate) + { + case 48000: + case 24000: + case 12000: + m_srIdx = 0; + break; + + case 32000: + case 16000: + case 8000: + m_srIdx = 2; + break; + + case 44100: + case 22050: + case 11025: + default: + m_srIdx = 1; + } + + for (int i = 0; i < 3; i++) + SendDlgItemMessage(hwndParent, IDC_COMBO_SAMPLE_RATE, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)srRates[i * 3 + m_srIdx].lpSampleRate); + + DWORD dwSampleRate; + m_pAEProps->get_SampleRate(&dwSampleRate); + m_pAEProps->set_SampleRate(dwSampleRate); + + int nSR = 0; + while (dwSampleRate != srRates[nSR * 3 + m_srIdx].dwSampleRate && nSR < 3) + { + nSR++; + } + + if (nSR >= 3) + nSR = 0; + + SendDlgItemMessage(hwndParent, IDC_COMBO_SAMPLE_RATE, CB_SETCURSEL, nSR, 0); + + DWORD dwChannels; + m_pAEProps->get_SourceChannels(&dwChannels); + + // + //initialize VBRq combo box + // + int k; + SendDlgItemMessage(hwndParent, IDC_COMBO_VBRq, CB_RESETCONTENT, 0, 0); + for (k = 0; k < 10; k++) + SendDlgItemMessage(hwndParent, IDC_COMBO_VBRq, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)szVBRqDesc[k]); + DWORD dwVBRq; + m_pAEProps->get_VariableQ(&dwVBRq); + if (dwVBRq<0) + dwVBRq = 0; + if (dwVBRq>9) + dwVBRq = 9; + m_pAEProps->set_VariableQ(dwVBRq); + SendDlgItemMessage(hwndParent, IDC_COMBO_VBRq, CB_SETCURSEL, dwVBRq, 0); + +////////////////////////////////////// +// initialize CBR selection +////////////////////////////////////// + int nSt; + + SendDlgItemMessage(hwndParent, IDC_COMBO_CBR, CB_RESETCONTENT, 0, 0); + if (dwSampleRate >= 32000) + { + // If target sampling rate is less than 32000, consider + // MPEG 1 audio + nSt = 0; + for (int i = 0; i < 14; i++) + SendDlgItemMessage(hwndParent, IDC_COMBO_CBR, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)szBitRateString[0][i]); + } + else + { + // Consider MPEG 2 / 2.5 audio + nSt = 1; + for (int i = 0; i < 14 ; i++) + SendDlgItemMessage(hwndParent, IDC_COMBO_CBR, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)szBitRateString[1][i]); + } + + DWORD dwBitrate; + m_pAEProps->get_Bitrate(&dwBitrate); + + int nBitrateSel = 0; + // BitRateValue[][i] is in ascending order + // We use this fact. We also know there are 14 bitrate values available. + // We are going to use the closest possible, so we can limit loop with 13 + while (nBitrateSel < 13 && dwBitRateValue[nSt][nBitrateSel] < dwBitrate) + nBitrateSel++; + SendDlgItemMessage(hwndParent, IDC_COMBO_CBR, CB_SETCURSEL, nBitrateSel, 0); + + // check if the specified bitrate is found exactly and correct if not + if (dwBitRateValue[nSt][nBitrateSel] != dwBitrate) + { + dwBitrate = dwBitRateValue[nSt][nBitrateSel]; + // we can change it, because it is independent of any other parameters + // (but depends on some of them!) + m_pAEProps->set_Bitrate(dwBitrate); + } + + // + // Check VBR/CBR radio button + // + DWORD dwVariable; + m_pAEProps->get_Variable(&dwVariable); + CheckRadioButton(hwndParent, IDC_RADIO_CBR, IDC_RADIO_VBR, IDC_RADIO_CBR + dwVariable); + +////////////////////////////////////////////////// +// initialize VBR selection +////////////////////////////////////////////////// + //VBRMIN, VBRMAX + int j, nST; + + SendDlgItemMessage(hwndParent, IDC_COMBO_VBRMIN, CB_RESETCONTENT, 0, 0); + SendDlgItemMessage(hwndParent, IDC_COMBO_VBRMAX, CB_RESETCONTENT, 0, 0); + + if (dwSampleRate >= 32000) + { + nST = 0; + for (j=0; j<14 ;j++) { + SendDlgItemMessage(hwndParent, IDC_COMBO_VBRMIN, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)szBitRateString[0][j]); + SendDlgItemMessage(hwndParent, IDC_COMBO_VBRMAX, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)szBitRateString[0][j]); + } + } + else + { + nST = 1; + for (j = 0; j < 14; j++) + { + SendDlgItemMessage(hwndParent, IDC_COMBO_VBRMIN, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)szBitRateString[1][j]); + SendDlgItemMessage(hwndParent, IDC_COMBO_VBRMAX, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)szBitRateString[1][j]); + } + } + + DWORD dwMin,dwMax; + m_pAEProps->get_VariableMin(&dwMin); + m_pAEProps->get_VariableMax(&dwMax); + + int nVariableMinSel = 0; + int nVariableMaxSel = 0; + + // BitRateValue[][i] is in ascending order + // We use this fact. We also know there are 14 bitrate values available. + // We are going to use the closest possible, so we can limit loop with 13 + while (nVariableMinSel<13 && dwBitRateValue[nST][nVariableMinSel] < dwMin) + nVariableMinSel++; + SendDlgItemMessage(hwndParent, IDC_COMBO_VBRMIN, CB_SETCURSEL, nVariableMinSel, 0); + + while (nVariableMaxSel<13 && dwBitRateValue[nST][nVariableMaxSel] < dwMax) + nVariableMaxSel++; + SendDlgItemMessage(hwndParent, IDC_COMBO_VBRMAX, CB_SETCURSEL, nVariableMaxSel, 0); + + + // check if the specified bitrate is found exactly and correct if not + if (dwBitRateValue[nST][nVariableMinSel] != dwMin) + { + dwMin = dwBitRateValue[nST][nVariableMinSel]; + // we can change it, because it is independent of any other parameters + // (but depends on some of them!) + m_pAEProps->set_VariableMin(dwMin); + } + + // check if the specified bitrate is found exactly and correct if not + if (dwBitRateValue[nST][nVariableMaxSel] != dwMax) + { + dwMax = dwBitRateValue[nST][nVariableMaxSel]; + // we can change it, because it is independent of any other parameters + // (but depends on some of them!) + m_pAEProps->set_VariableMax(dwMax); + } + + // + // initialize checkboxes + // + DWORD dwPES; + m_pAEProps->get_PESOutputEnabled(&dwPES); + + dwPES = 0; + CheckDlgButton(hwndParent, IDC_CHECK_PES, dwPES ? BST_CHECKED : BST_UNCHECKED); + + DWORD dwCRC; + m_pAEProps->get_CRCFlag(&dwCRC); + CheckDlgButton(hwndParent, IDC_CHECK_CRC, dwCRC ? BST_CHECKED : BST_UNCHECKED); + + DWORD dwForceMono; + m_pAEProps->get_ForceMono(&dwForceMono); + CheckDlgButton(hwndParent, IDC_FORCE_MONO, dwForceMono ? BST_CHECKED : BST_UNCHECKED); + + DWORD dwCopyright; + m_pAEProps->get_CopyrightFlag(&dwCopyright); + CheckDlgButton(hwndParent, IDC_CHECK_COPYRIGHT, dwCopyright ? BST_CHECKED : BST_UNCHECKED); + + DWORD dwOriginal; + m_pAEProps->get_OriginalFlag(&dwOriginal); + CheckDlgButton(hwndParent, IDC_CHECK_ORIGINAL, dwOriginal ? BST_CHECKED : BST_UNCHECKED); +} + + +//////////////////////////////////////////////////////////////// +// EnableControls +//////////////////////////////////////////////////////////////// +void CMpegAudEncPropertyPage::EnableControls(HWND hwndParent, bool bEnable) +{ + EnableWindow(GetDlgItem(hwndParent, IDC_CHECK_PES), false);//bEnable); + EnableWindow(GetDlgItem(hwndParent, IDC_RADIO_CBR), bEnable); + EnableWindow(GetDlgItem(hwndParent, IDC_COMBO_CBR), bEnable); + EnableWindow(GetDlgItem(hwndParent, IDC_RADIO_VBR), bEnable); + EnableWindow(GetDlgItem(hwndParent, IDC_COMBO_VBRMIN), bEnable); + EnableWindow(GetDlgItem(hwndParent, IDC_COMBO_VBRMAX), bEnable); + EnableWindow(GetDlgItem(hwndParent, IDC_CHECK_COPYRIGHT), bEnable); + EnableWindow(GetDlgItem(hwndParent, IDC_CHECK_ORIGINAL), bEnable); + EnableWindow(GetDlgItem(hwndParent, IDC_CHECK_CRC), bEnable); + EnableWindow(GetDlgItem(hwndParent, IDC_FORCE_MONO), bEnable); + EnableWindow(GetDlgItem(hwndParent, IDC_SLIDER_QUALITY), bEnable); + EnableWindow(GetDlgItem(hwndParent, IDC_COMBO_SAMPLE_RATE), bEnable); +} + +// +// SetDirty +// +// notifies the property page site of changes + +void CMpegAudEncPropertyPage::SetDirty() +{ + m_bDirty = TRUE; + if (m_pPageSite) + m_pPageSite->OnStatusChange(PROPPAGESTATUS_DIRTY); +} + diff --git a/dshow/PropPage.h b/dshow/PropPage.h new file mode 100644 index 0000000..fa7fbe9 --- /dev/null +++ b/dshow/PropPage.h @@ -0,0 +1,60 @@ +/* + * LAME MP3 encoder for DirectShow + * Basic property page + * + * Copyright (c) 2000-2005 Marie Orlova, Peter Gubanov, Vitaly Ivanov, Elecard Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +class CMpegAudEncPropertyPage : public CBasePropertyPage +{ + +public: + static CUnknown *CreateInstance( LPUNKNOWN punk, HRESULT *phr ); + CMpegAudEncPropertyPage( LPUNKNOWN punk, HRESULT *phr ); + + HRESULT OnConnect(IUnknown *pUnknown); + HRESULT OnDisconnect(); + HRESULT OnActivate(); + HRESULT OnDeactivate(); + HRESULT OnApplyChanges(); + BOOL OnReceiveMessage(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam); + +private: + void InitPropertiesDialog(HWND hwndParent); + void EnableControls(HWND hwndParent, bool bEnable); + void SetDirty(void); + + DWORD m_dwBitrate; //constant bit rate + DWORD m_dwVariable; //flag - whether the variable bit rate set + DWORD m_dwMin; //specify a minimum allowed bitrate + DWORD m_dwMax; //specify a maximum allowed bitrate + DWORD m_dwQuality; //encoding quality + DWORD m_dwVBRq; //VBR quality setting (0=highest quality, 9=lowest) + DWORD m_dwSampleRate; + DWORD m_dwChannelMode; + DWORD m_dwCRC; + DWORD m_dwForceMono; + DWORD m_dwCopyright; + DWORD m_dwOriginal; + + HWND m_hwndQuality; //Slider window handle + + int m_srIdx; + + IAudioEncoderProperties *m_pAEProps; +}; diff --git a/dshow/PropPage_adv.cpp b/dshow/PropPage_adv.cpp new file mode 100644 index 0000000..54e4cbe --- /dev/null +++ b/dshow/PropPage_adv.cpp @@ -0,0 +1,367 @@ +/* + * LAME MP3 encoder for DirectShow + * Advanced property page + * + * Copyright (c) 2000-2005 Marie Orlova, Peter Gubanov, Vitaly Ivanov, Elecard Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include "iaudioprops.h" +#include "mpegac.h" +#include "resource.h" +#include "PropPage_adv.h" +#include "Reg.h" + +#define MPG_MD_STEREO 0 +#define MPG_MD_JOINT_STEREO 1 +#define MPG_MD_DUAL_CHANNEL 2 +#define MPG_MD_MONO 3 + +// Strings which apear in comboboxes +const char *chChMode[4] = { + "Mono", + "Standard stereo", + "Joint stereo", + "Dual channel"}; + +//////////////////////////////////////////////////////////////// +// CreateInstance +//////////////////////////////////////////////////////////////// +CUnknown *CMpegAudEncPropertyPageAdv::CreateInstance( LPUNKNOWN punk, HRESULT *phr ) +{ + CMpegAudEncPropertyPageAdv *pNewObject + = new CMpegAudEncPropertyPageAdv( punk, phr ); + + if( pNewObject == NULL ) + *phr = E_OUTOFMEMORY; + + return pNewObject; +} + +//////////////////////////////////////////////////////////////// +// Constructor +//////////////////////////////////////////////////////////////// +CMpegAudEncPropertyPageAdv::CMpegAudEncPropertyPageAdv(LPUNKNOWN punk, HRESULT *phr) : + CBasePropertyPage(NAME("Encoder Advanced Property Page"), punk, IDD_ADVPROPS, IDS_AUDIO_ADVANCED_TITLE), + m_pAEProps(NULL) +{ + ASSERT(phr); + + InitCommonControls(); +} + +// +// OnConnect +// +// Give us the filter to communicate with +HRESULT CMpegAudEncPropertyPageAdv::OnConnect(IUnknown *pUnknown) +{ + ASSERT(m_pAEProps == NULL); + + // Ask the filter for it's control interface + + HRESULT hr = pUnknown->QueryInterface(IID_IAudioEncoderProperties,(void **)&m_pAEProps); + if (FAILED(hr) || !m_pAEProps) + return E_NOINTERFACE; + + ASSERT(m_pAEProps); + + // Get current filter state +// m_pAEProps->LoadAudioEncoderPropertiesFromRegistry(); + + m_pAEProps->get_EnforceVBRmin(&m_dwEnforceVBRmin); + m_pAEProps->get_VoiceMode(&m_dwVoiceMode); + m_pAEProps->get_KeepAllFreq(&m_dwKeepAllFreq); + m_pAEProps->get_StrictISO(&m_dwStrictISO); + m_pAEProps->get_NoShortBlock(&m_dwNoShortBlock); + m_pAEProps->get_XingTag(&m_dwXingTag); + m_pAEProps->get_ChannelMode(&m_dwChannelMode); + m_pAEProps->get_ForceMS(&m_dwForceMS); + m_pAEProps->get_ModeFixed(&m_dwModeFixed); + m_pAEProps->get_SampleOverlap(&m_dwOverlap); + m_pAEProps->get_SetDuration(&m_dwSetStop); + + return NOERROR; +} + +// +// OnDisconnect +// +// Release the interface + +HRESULT CMpegAudEncPropertyPageAdv::OnDisconnect() +{ + // Release the interface + if (m_pAEProps == NULL) + return E_UNEXPECTED; + + m_pAEProps->set_EnforceVBRmin(m_dwEnforceVBRmin); + m_pAEProps->set_VoiceMode(m_dwVoiceMode); + m_pAEProps->set_KeepAllFreq(m_dwKeepAllFreq); + m_pAEProps->set_StrictISO(m_dwStrictISO); + m_pAEProps->set_NoShortBlock(m_dwNoShortBlock); + m_pAEProps->set_XingTag(m_dwXingTag); + m_pAEProps->set_ChannelMode(m_dwChannelMode); + m_pAEProps->set_ForceMS(m_dwForceMS); + m_pAEProps->set_ModeFixed(m_dwModeFixed); + m_pAEProps->set_SampleOverlap(m_dwOverlap); + m_pAEProps->set_SetDuration(m_dwSetStop); + m_pAEProps->SaveAudioEncoderPropertiesToRegistry(); + + m_pAEProps->Release(); + m_pAEProps = NULL; + + return NOERROR; +} + +// +// OnActivate +// +// Called on dialog creation + +HRESULT CMpegAudEncPropertyPageAdv::OnActivate(void) +{ + InitPropertiesDialog(m_hwnd); + + return NOERROR; +} + +// +// OnDeactivate +// +// Called on dialog destruction + +HRESULT CMpegAudEncPropertyPageAdv::OnDeactivate(void) +{ + return NOERROR; +} + +//////////////////////////////////////////////////////////////// +// OnReceiveMessage - message handler function +//////////////////////////////////////////////////////////////// +BOOL CMpegAudEncPropertyPageAdv::OnReceiveMessage(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam) +{ + switch (uMsg) + { + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case IDC_RADIO_STEREO: + case IDC_RADIO_JSTEREO: + case IDC_RADIO_DUAL: + case IDC_RADIO_MONO: + { + + DWORD dwChannelMode = LOWORD(wParam) - IDC_RADIO_STEREO; + CheckRadioButton(hwnd, IDC_RADIO_STEREO, IDC_RADIO_MONO, LOWORD(wParam)); + + if (dwChannelMode == MPG_MD_JOINT_STEREO) + EnableWindow(GetDlgItem(hwnd,IDC_CHECK_FORCE_MS),TRUE); + else + EnableWindow(GetDlgItem(hwnd,IDC_CHECK_FORCE_MS),FALSE); + + m_pAEProps->set_ChannelMode(dwChannelMode); + SetDirty(); + } + break; + + case IDC_CHECK_ENFORCE_MIN: + m_pAEProps->set_EnforceVBRmin(IsDlgButtonChecked(hwnd, IDC_CHECK_ENFORCE_MIN)); + SetDirty(); + break; + + case IDC_CHECK_VOICE: + m_pAEProps->set_VoiceMode(IsDlgButtonChecked(hwnd, IDC_CHECK_VOICE)); + SetDirty(); + break; + + case IDC_CHECK_KEEP_ALL_FREQ: + m_pAEProps->set_KeepAllFreq(IsDlgButtonChecked(hwnd, IDC_CHECK_KEEP_ALL_FREQ)); + SetDirty(); + break; + + case IDC_CHECK_STRICT_ISO: + m_pAEProps->set_StrictISO(IsDlgButtonChecked(hwnd, IDC_CHECK_STRICT_ISO)); + SetDirty(); + break; + + case IDC_CHECK_DISABLE_SHORT_BLOCK: + m_pAEProps->set_NoShortBlock(IsDlgButtonChecked(hwnd, IDC_CHECK_DISABLE_SHORT_BLOCK)); + SetDirty(); + break; + + case IDC_CHECK_XING_TAG: + m_pAEProps->set_XingTag(IsDlgButtonChecked(hwnd, IDC_CHECK_XING_TAG)); + SetDirty(); + break; + + case IDC_CHECK_FORCE_MS: + m_pAEProps->set_ForceMS(IsDlgButtonChecked(hwnd, IDC_CHECK_FORCE_MS)); + SetDirty(); + break; + + case IDC_CHECK_MODE_FIXED: + m_pAEProps->set_ModeFixed(IsDlgButtonChecked(hwnd, IDC_CHECK_MODE_FIXED)); + SetDirty(); + break; + + case IDC_CHECK_OVERLAP: + m_pAEProps->set_SampleOverlap(IsDlgButtonChecked(hwnd, IDC_CHECK_OVERLAP)); + SetDirty(); + break; + + case IDC_CHECK_STOP: + m_pAEProps->set_SetDuration(IsDlgButtonChecked(hwnd, IDC_CHECK_STOP)); + SetDirty(); + break; + } + + return TRUE; + + case WM_DESTROY: + return TRUE; + + default: + return FALSE; + } + + return TRUE; +} + +// +// OnApplyChanges +// +HRESULT CMpegAudEncPropertyPageAdv::OnApplyChanges() +{ + m_pAEProps->get_EnforceVBRmin(&m_dwEnforceVBRmin); + m_pAEProps->get_VoiceMode(&m_dwVoiceMode); + m_pAEProps->get_KeepAllFreq(&m_dwKeepAllFreq); + m_pAEProps->get_StrictISO(&m_dwStrictISO); + m_pAEProps->get_ChannelMode(&m_dwChannelMode); + m_pAEProps->get_ForceMS(&m_dwForceMS); + m_pAEProps->get_NoShortBlock(&m_dwNoShortBlock); + m_pAEProps->get_XingTag(&m_dwXingTag); + m_pAEProps->get_ModeFixed(&m_dwModeFixed); + m_pAEProps->get_SampleOverlap(&m_dwOverlap); + m_pAEProps->get_SetDuration(&m_dwSetStop); + m_pAEProps->SaveAudioEncoderPropertiesToRegistry(); + + m_pAEProps->ApplyChanges(); + + return S_OK; +} + +// +// Initialize dialogbox controls with proper values +// +void CMpegAudEncPropertyPageAdv::InitPropertiesDialog(HWND hwndParent) +{ + EnableControls(hwndParent, TRUE); + + // + // initialize radio bottons + // + DWORD dwChannelMode; + m_pAEProps->get_ChannelMode(&dwChannelMode); + CheckRadioButton(hwndParent, IDC_RADIO_STEREO, IDC_RADIO_MONO, IDC_RADIO_STEREO + dwChannelMode); + + if (dwChannelMode == MPG_MD_JOINT_STEREO) + EnableWindow(GetDlgItem(hwndParent, IDC_CHECK_FORCE_MS), TRUE); + else + EnableWindow(GetDlgItem(hwndParent, IDC_CHECK_FORCE_MS), FALSE); + + // + // initialize checkboxes + // + DWORD dwEnforceVBRmin; + m_pAEProps->get_EnforceVBRmin(&dwEnforceVBRmin); + CheckDlgButton(hwndParent, IDC_CHECK_ENFORCE_MIN, dwEnforceVBRmin ? BST_CHECKED : BST_UNCHECKED); + + DWORD dwVoiceMode; + m_pAEProps->get_VoiceMode(&dwVoiceMode); + CheckDlgButton(hwndParent, IDC_CHECK_VOICE, dwVoiceMode ? BST_CHECKED : BST_UNCHECKED); + + DWORD dwKeepAllFreq; + m_pAEProps->get_KeepAllFreq(&dwKeepAllFreq); + CheckDlgButton(hwndParent, IDC_CHECK_KEEP_ALL_FREQ, dwKeepAllFreq ? BST_CHECKED : BST_UNCHECKED); + + DWORD dwStrictISO; + m_pAEProps->get_StrictISO(&dwStrictISO); + CheckDlgButton(hwndParent, IDC_CHECK_STRICT_ISO, dwStrictISO ? BST_CHECKED : BST_UNCHECKED); + + DWORD dwNoShortBlock; + m_pAEProps->get_NoShortBlock(&dwNoShortBlock); + CheckDlgButton(hwndParent, IDC_CHECK_DISABLE_SHORT_BLOCK, dwNoShortBlock ? BST_CHECKED : BST_UNCHECKED); + + DWORD dwXingEnabled; + m_pAEProps->get_XingTag(&dwXingEnabled); + CheckDlgButton(hwndParent, IDC_CHECK_XING_TAG, dwXingEnabled ? BST_CHECKED : BST_UNCHECKED); + + DWORD dwForceMS; + m_pAEProps->get_ForceMS(&dwForceMS); + CheckDlgButton(hwndParent, IDC_CHECK_FORCE_MS, dwForceMS ? BST_CHECKED : BST_UNCHECKED); + + DWORD dwModeFixed; + m_pAEProps->get_ModeFixed(&dwModeFixed); + CheckDlgButton(hwndParent, IDC_CHECK_MODE_FIXED, dwModeFixed ? BST_CHECKED : BST_UNCHECKED); + + DWORD dwOverlap; + m_pAEProps->get_SampleOverlap(&dwOverlap); + CheckDlgButton(hwndParent, IDC_CHECK_OVERLAP, dwOverlap ? BST_CHECKED : BST_UNCHECKED); + + DWORD dwStopTime; + m_pAEProps->get_SetDuration(&dwStopTime); + CheckDlgButton(hwndParent, IDC_CHECK_STOP, dwStopTime ? BST_CHECKED : BST_UNCHECKED); +} + + +//////////////////////////////////////////////////////////////// +// EnableControls +//////////////////////////////////////////////////////////////// +void CMpegAudEncPropertyPageAdv::EnableControls(HWND hwndParent, bool bEnable) +{ + EnableWindow(GetDlgItem(hwndParent, IDC_CHECK_ENFORCE_MIN), bEnable); + EnableWindow(GetDlgItem(hwndParent, IDC_RADIO_STEREO), bEnable); + EnableWindow(GetDlgItem(hwndParent, IDC_RADIO_JSTEREO), bEnable); + EnableWindow(GetDlgItem(hwndParent, IDC_RADIO_DUAL), bEnable); + EnableWindow(GetDlgItem(hwndParent, IDC_RADIO_MONO), bEnable); + EnableWindow(GetDlgItem(hwndParent, IDC_CHECK_FORCE_MS), bEnable); + EnableWindow(GetDlgItem(hwndParent, IDC_CHECK_VOICE), bEnable); + EnableWindow(GetDlgItem(hwndParent, IDC_CHECK_KEEP_ALL_FREQ), bEnable); + EnableWindow(GetDlgItem(hwndParent, IDC_CHECK_STRICT_ISO), bEnable); + EnableWindow(GetDlgItem(hwndParent, IDC_CHECK_DISABLE_SHORT_BLOCK), bEnable); + EnableWindow(GetDlgItem(hwndParent, IDC_CHECK_XING_TAG), bEnable); + EnableWindow(GetDlgItem(hwndParent, IDC_CHECK_MODE_FIXED), bEnable); + EnableWindow(GetDlgItem(hwndParent, IDC_CHECK_OVERLAP), bEnable); + EnableWindow(GetDlgItem(hwndParent, IDC_CHECK_STOP), bEnable); +} + +// +// SetDirty +// +// notifies the property page site of changes + +void CMpegAudEncPropertyPageAdv::SetDirty() +{ + m_bDirty = TRUE; + if (m_pPageSite) + m_pPageSite->OnStatusChange(PROPPAGESTATUS_DIRTY); +} + diff --git a/dshow/PropPage_adv.h b/dshow/PropPage_adv.h new file mode 100644 index 0000000..67fabed --- /dev/null +++ b/dshow/PropPage_adv.h @@ -0,0 +1,55 @@ +/* + * LAME MP3 encoder for DirectShow + * Advanced property page + * + * Copyright (c) 2000-2005 Marie Orlova, Peter Gubanov, Vitaly Ivanov, Elecard Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +class CMpegAudEncPropertyPageAdv : public CBasePropertyPage +{ + +public: + static CUnknown *CreateInstance( LPUNKNOWN punk, HRESULT *phr ); + CMpegAudEncPropertyPageAdv( LPUNKNOWN punk, HRESULT *phr ); + + HRESULT OnConnect(IUnknown *pUnknown); + HRESULT OnDisconnect(); + HRESULT OnActivate(); + HRESULT OnDeactivate(); + HRESULT OnApplyChanges(); + BOOL OnReceiveMessage(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam); + +private: + void InitPropertiesDialog(HWND hwndParent); + void EnableControls(HWND hwndParent, bool bEnable); + void SetDirty(void); + + DWORD m_dwEnforceVBRmin; + DWORD m_dwVoiceMode; + DWORD m_dwKeepAllFreq; + DWORD m_dwStrictISO; + DWORD m_dwNoShortBlock; + DWORD m_dwXingTag; + DWORD m_dwChannelMode; + DWORD m_dwForceMS; + DWORD m_dwModeFixed; + DWORD m_dwOverlap; + DWORD m_dwSetStop; + + IAudioEncoderProperties *m_pAEProps; +}; diff --git a/dshow/Property.rc b/dshow/Property.rc new file mode 100644 index 0000000..3ada6f1 --- /dev/null +++ b/dshow/Property.rc @@ -0,0 +1,272 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#define APSTUDIO_HIDDEN_SYMBOLS +#include "windows.h" +#undef APSTUDIO_HIDDEN_SYMBOLS +#include "resource.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Russisch resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS) +#ifdef _WIN32 +LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""windows.h""\r\n" + "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""resource.h""\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // Russisch resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// Englisch (USA) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_AUDIOENCPROPS DIALOGEX 0, 0, 228, 121 +STYLE WS_CHILD | WS_VISIBLE +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + CONTROL "Constant Bit Rate",IDC_RADIO_CBR,"Button", + BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,4,2,71,10 + CONTROL "Variable Bit Rate",IDC_RADIO_VBR,"Button", + BS_AUTORADIOBUTTON,4,31,69,10 + COMBOBOX IDC_COMBO_CBR,52,14,76,92,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_GROUP | WS_TABSTOP + COMBOBOX IDC_COMBO_VBRMIN,52,44,76,85,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_COMBO_VBRMAX,52,62,76,86,CBS_DROPDOWNLIST | + CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP, + WS_EX_TRANSPARENT + CONTROL "Copyright",IDC_CHECK_COPYRIGHT,"Button",BS_AUTOCHECKBOX | + WS_GROUP | WS_TABSTOP,151,39,45,10 + CONTROL "Original/Copy",IDC_CHECK_ORIGINAL,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,151,51,59,10 + CONTROL "CRC Protected",IDC_CHECK_CRC,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,151,63,63,10 + CONTROL "Slider1",IDC_SLIDER_QUALITY,"msctls_trackbar32", + TBS_BOTH | TBS_NOTICKS | WS_GROUP | WS_TABSTOP,66,101,96, + 15 + LTEXT "kbps",IDC_STATIC,4,16,22,8 + CONTROL "Min",IDC_STATIC,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,4, + 46,13,11 + LTEXT "Max",IDC_STATIC,4,64,16,11 + LTEXT "Encoding Quality",IDC_STATIC,4,105,54,8,NOT WS_GROUP + LTEXT "0",IDC_TEXT_QUALITY,170,104,47,10 + COMBOBOX IDC_COMBO_SAMPLE_RATE,151,14,59,104,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + CONTROL "Target Sample Rate",IDC_STATIC,"Static", + SS_LEFTNOWORDWRAP | NOT WS_VISIBLE | WS_GROUP,152,2,66,8 + COMBOBOX IDC_COMBO_VBRq,52,80,76,90,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "VBR Quality",IDC_STATIC,4,82,40,8 + CONTROL "Force Mono",IDC_FORCE_MONO,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,151,75,54,10 +END + +IDD_ADVPROPS DIALOG DISCARDABLE 0, 0, 228, 129 +STYLE WS_CHILD | WS_VISIBLE +FONT 8, "MS Sans Serif" +BEGIN + CONTROL "Mono",IDC_RADIO_MONO,"Button",BS_AUTORADIOBUTTON | + WS_GROUP | WS_TABSTOP,109,93,34,10 + CONTROL "Standard stereo",IDC_RADIO_STEREO,"Button", + BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,109,36,67,11 + CONTROL "Joint stereo",IDC_RADIO_JSTEREO,"Button", + BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,109,51,60,10 + GROUPBOX "Mode Selection",IDC_STATIC,103,26,118,82,BS_CENTER | + WS_GROUP + CONTROL "Strictly enforce VBR min bitrate",IDC_CHECK_ENFORCE_MIN, + "Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,7,8,113, + 10 + CONTROL "Voice encoding mode",IDC_CHECK_VOICE,"Button", + BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,7,21,85,10 + CONTROL "Keep all frequencies",IDC_CHECK_KEEP_ALL_FREQ,"Button", + BS_AUTOCHECKBOX | WS_DISABLED | WS_GROUP | WS_TABSTOP,7, + 34,80,10 + CONTROL "Strict ISO compliance",IDC_CHECK_STRICT_ISO,"Button", + BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,7,47,84,10 + CONTROL "Disable short blocks",IDC_CHECK_DISABLE_SHORT_BLOCK, + "Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_GROUP | + WS_TABSTOP,7,60,79,10 + CONTROL "Enable Xing VBR tag",IDC_CHECK_XING_TAG,"Button", + BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,7,73,83,10 + CONTROL "Dual channel",IDC_RADIO_DUAL,"Button", + BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,109,79,58,10 + CONTROL "Forced mid / side stereo",IDC_CHECK_FORCE_MS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,122,65,92,10 + CONTROL "Mode Fixed",IDC_CHECK_MODE_FIXED,"Button", + BS_AUTOCHECKBOX | WS_DISABLED | WS_GROUP | WS_TABSTOP,7, + 86,53,10 + CONTROL "Allow sample overlap",IDC_CHECK_OVERLAP,"Button", + BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,7,99,82,10 + CONTROL "Set sample stop time",IDC_CHECK_STOP,"Button", + BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,7,112,81,10 +END + +IDD_ABOUT DIALOG DISCARDABLE 0, 0, 228, 121 +STYLE WS_CHILD +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "LAME Ain't MP3 Encoder (X.XX engine)",IDC_LAME_VER,7,8, + 208,8 + LTEXT "LAME Project Homepage: http://www.mp3dev.org", + IDC_LAME_URL,7,19,192,8 + EDITTEXT IDC_LAME_LA,7,31,214,83,ES_MULTILINE | ES_AUTOVSCROLL | + ES_AUTOHSCROLL | ES_READONLY | WS_VSCROLL +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO DISCARDABLE +BEGIN + IDD_AUDIOENCPROPS, DIALOG + BEGIN + RIGHTMARGIN, 223 + BOTTOMMARGIN, 118 + END + + IDD_ADVPROPS, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 221 + TOPMARGIN, 5 + BOTTOMMARGIN, 121 + END + + IDD_ABOUT, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 221 + TOPMARGIN, 7 + BOTTOMMARGIN, 114 + END +END +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,61,24875 + PRODUCTVERSION 1,0,61,24875 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "Comments", "LAME DirectShow Filter\0" + VALUE "CompanyName", "\0" + VALUE "FileDescription", "LAME Audio Encoder\0" + VALUE "FileVersion", "1, 0, 61, 90411\0" + VALUE "InternalName", "LAME Audio Encoder\0" + VALUE "LegalCopyright", "Copyright � 2005 Elecard Ltd.\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "lame.ax\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "LAME Audio Encoder\0" + VALUE "ProductVersion", "1, 0, 61, 90411\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + +#endif // !_MAC + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_AUDIO_PROPS_TITLE "MPEG Layer III Audio Encoder" + IDS_AUDIO_ADVANCED_TITLE "Advanced" + IDS_ABOUT "About" +END + +#endif // Englisch (USA) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/dshow/README b/dshow/README new file mode 100644 index 0000000..933d1fe --- /dev/null +++ b/dshow/README @@ -0,0 +1,70 @@ +LAME DirectShow Filter +Version 1.0 + +Copyright (c) 2000-2005 Marie Orlova, Peter Gubanov, Vitaly Ivanov, Elecard Ltd. + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +This library 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with this library; if not, write to the +Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. + +This library is a Microsoft(R) DirectShow(R) wrapper filter for +LAME library. It adds DirectShow interface to the library and two +property pages so you can tune some encoding parameters. + +We are interested to hear from you, when you use this package +as part of another project. + +Filter Homepage http://www.elecard.com/products/layer3encoder.shtml + +Vitaly Ivanov vitaly.ivanov@elecard.net.ru + + + +NOTE: +1st: build dx9sdk/Samples/DShow/BaseClasses Project +2nd: copy resulting strmbase.lib (or strmbasd.lib for debug support) + into LAME's DShow folder +3rd: add the BaseClasses directory path to the Visual Studio + Include and Library directory search path lists + i.e. for Visual Studio 6 choose: + + Tools -> Options -> Directories + +4th: build LAME .DLL builds (if you didn't yet) +5th: build LAME DShow Filter + + +TROUBLESHOOTING FAQ: +Q. When trying to open a workspace file (.dsw), I get an "empty" workspace +(i.e. there are no source files listed) and/or when trying to open a project +file (.dsp), I get a "This makefile was not generated by Developer Studio" +error. + +A. Often, this can be caused by having UNIX line breaks (LF) in the +.dsw and .dsp files, as opposed to Windows line breaks (CR\LF). It +is interesting to note that .dsw and .dsp files are just text files; +you can open them up in any text editor. If you open the .dsw and +.dsp files in a text editor that can't handle UNIX line breaks +(namely Notepad) you will probably see big, black squares at +the end of lines. You can "fix" this error by following this procedure. + +1) Do NOT let Microsoft Visual C++ attempt to fix the problem! Press "No" when prompted. + +2) Open the .dsw and .dsp files in a text editor that understands UNIX line breaks. +WordPad is one and it is available with most copies of Windows. + +3) Once open, simply re-save the file (In WordPad, make sure you set the Save +As type to "Text Document"). All UNIX line breaks should then be automatically +converted to Windows line breaks. + diff --git a/dshow/REG.CPP b/dshow/REG.CPP new file mode 100644 index 0000000..642f3c5 --- /dev/null +++ b/dshow/REG.CPP @@ -0,0 +1,289 @@ +/* + * LAME MP3 encoder for DirectShow + * Registry calls handling class + * + * Copyright (c) 2000-2005 Marie Orlova, Peter Gubanov, Vitaly Ivanov, Elecard Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include + +#include "reg.h" + +namespace Lame +{ + +CRegKey::CRegKey(void) +{ + m_hRootKey = NULL; + m_name[0] = 0; + m_hKey = NULL; +} + + +CRegKey::CRegKey(HKEY rt, PTSTR pName) +{ + m_hRootKey = rt; + m_hKey = NULL; + if(pName) + { + lstrcpy(m_name, pName); + Open(m_hRootKey, m_name); + } + else + m_name[0] = 0; +} + + +CRegKey::~CRegKey(void) +{ + Close(); +} + + + +BOOL CRegKey::Open(HKEY rootKey, PTSTR pName) +{ + if(m_hKey) + Close(); + + m_hRootKey = rootKey; + if(pName) + { + lstrcpy(m_name, pName); + if(RegOpenKeyEx(m_hRootKey, m_name, 0, KEY_ALL_ACCESS, &m_hKey) != ERROR_SUCCESS) + { + m_hKey = NULL; + return FALSE; + } + } + else + { + m_name[0] = 0; + m_hKey = m_hRootKey; + } + + return TRUE; +} + + +BOOL CRegKey::Create(HKEY rootKey, PTSTR pName) +{ + if(m_hKey) + Close(); + + m_hRootKey = rootKey; + if(pName) + { + lstrcpy(m_name, pName); + if(RegCreateKeyEx(m_hRootKey, pName, NULL, + TEXT(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, + &m_hKey, NULL) != ERROR_SUCCESS) + { + + m_hKey = NULL; + return FALSE; + } + } + else + { + m_name[0] = 0; + } + m_hRootKey = m_hKey; + + return TRUE; +} + + +BOOL CRegKey::Open(PTSTR an) +{ + TCHAR achName[MAX_PATH]; + + if(m_hKey) + Close(); + + lstrcpy(achName, m_name); + if(an) + lstrcat(achName, an); + + if(RegOpenKeyEx(m_hRootKey, achName, 0, KEY_ALL_ACCESS, &m_hKey) != ERROR_SUCCESS) + { + m_hKey = NULL; + return FALSE; + } + + return TRUE; +} + + +BOOL CRegKey::Create(PTSTR an) +{ + TCHAR achName[MAX_PATH]; + + if(m_hKey) + Close(); + + lstrcpy(achName, m_name); + if(an) + lstrcat(achName, an); + + if(RegCreateKeyEx(m_hRootKey, achName, NULL, + TEXT(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, + &m_hKey, NULL) != ERROR_SUCCESS) + { + + m_hKey = NULL; + return FALSE; + } + + return TRUE; +} + + +BOOL CRegKey::Close(void) +{ + if(m_hKey && m_hKey != m_hRootKey) + RegCloseKey(m_hKey); + + m_hKey = 0; + return TRUE; +} + +BOOL CRegKey::getFlag(PTSTR valuename, BOOL bDefault) +{ + if(!m_hKey) + return bDefault; + + DWORD cbData; + DWORD dwData; + DWORD dwType; + + cbData = sizeof(dwData); + if(RegQueryValueEx(m_hKey, valuename, NULL, &dwType, (PBYTE)&dwData, &cbData) == ERROR_SUCCESS) + { + if(dwType == REG_DWORD) + return (dwData) ? TRUE : FALSE; + } + return bDefault; +} + + +void CRegKey::setFlag(PTSTR valuename, BOOL bValue, BOOL bDefault) +{ + if(getFlag(valuename, bDefault) == bValue ) + return; + + RegSetValueEx(m_hKey, valuename, 0, REG_DWORD, (PBYTE)&bValue, sizeof(bValue)); +} + + +void CRegKey::setFlag(PTSTR valuename, BOOL bValue) +{ + RegSetValueEx(m_hKey, valuename, 0, REG_DWORD, (PBYTE)&bValue, sizeof(bValue)); +} + + +DWORD CRegKey::getDWORD(PTSTR valuename, DWORD bDefault) +{ + DWORD dwData; + DWORD cbData; + DWORD dwType; + + if(!m_hKey) + return bDefault; + + cbData = sizeof(dwData); + if(RegQueryValueEx(m_hKey, valuename, NULL, &dwType, (PBYTE)&dwData, &cbData) == ERROR_SUCCESS) { + if(dwType == REG_DWORD) + { + return (UINT)dwData; + } + } + + return bDefault; +} + + +void CRegKey::setDWORD(PTSTR valuename, DWORD dwValue, DWORD dwDefault) +{ + DWORD dwData = dwValue; + + if(getDWORD(valuename, dwDefault) == dwValue) + return; + + RegSetValueEx(m_hKey, valuename, 0, REG_DWORD, (PBYTE)&dwData, sizeof(dwData)); +} + + +void CRegKey::setDWORD(PTSTR valuename, DWORD dwValue) +{ + DWORD dwData = dwValue; + RegSetValueEx(m_hKey, valuename, 0, REG_DWORD, (PBYTE)&dwData, sizeof(dwData)); +} + + +DWORD CRegKey::getString(PTSTR valuename, PTSTR pDefault, PTSTR pResult, int cbSize) +{ + DWORD dwType; + + cbSize *= sizeof(TCHAR); // for unicode strings + + if(m_hKey) + { + if(RegQueryValueEx(m_hKey, valuename, NULL, &dwType, (LPBYTE)pResult, (LPDWORD)&cbSize) == ERROR_SUCCESS) + { + if(dwType == REG_SZ) + { + return(cbSize - 1); + } + } + } + lstrcpy(pResult, pDefault); + return lstrlen(pDefault); +} + + +void CRegKey::setString(PTSTR valuename, PTSTR pData) +{ + RegSetValueEx(m_hKey, valuename, 0, REG_SZ, (LPBYTE)pData, (lstrlen(pData) + 1)*sizeof(TCHAR)); +} + + +DWORD CRegKey::getBinary(PTSTR valuename, PVOID pDefault, PVOID pResult, int cbSize) +{ + DWORD dwType; + + if(RegQueryValueEx(m_hKey, valuename, NULL, &dwType, (LPBYTE)pResult, (LPDWORD)&cbSize) == ERROR_SUCCESS) + { + if(dwType == REG_BINARY) + { + return cbSize; + } + } + + memmove(pResult, pDefault, cbSize); + return cbSize; +} + + +DWORD CRegKey::setBinary(PTSTR valuename, PVOID pData, int cbSize) +{ + RegSetValueEx(m_hKey, valuename, 0, REG_BINARY, (LPBYTE)pData, cbSize); + return cbSize; +} + +} // namespace Lame diff --git a/dshow/REG.H b/dshow/REG.H new file mode 100644 index 0000000..e611eed --- /dev/null +++ b/dshow/REG.H @@ -0,0 +1,92 @@ +/* + * LAME MP3 encoder for DirectShow + * Registry calls handling class + * + * Copyright (c) 2000-2005 Marie Orlova, Peter Gubanov, Vitaly Ivanov, Elecard Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __REG__ +#define __REG__ + +namespace Lame +{ +class CRegKey +{ +protected: + TCHAR m_name[MAX_PATH]; + HKEY m_hKey; + HKEY m_hRootKey; +public: + CRegKey(void); + CRegKey(HKEY rootKey, PTSTR pName); + ~CRegKey(void); + + BOOL Open(HKEY rootKey, PTSTR pName); + BOOL Create(HKEY rootKey, PTSTR pName); + BOOL Open(PTSTR an = NULL); + BOOL Create(PTSTR an = NULL); + BOOL Close(void); + + operator HKEY () const { return m_hKey; }; + + BOOL getFlag(PTSTR valuename, BOOL bDefault); + void setFlag(PTSTR valuename, BOOL bValue, BOOL bDefault); + void setFlag(PTSTR valuename, BOOL bValue); + DWORD getDWORD(PTSTR valuename, DWORD bDefault); + void setDWORD(PTSTR valuename, DWORD dwValue); + void setDWORD(PTSTR valuename, DWORD dwValue, DWORD dwDefault); + DWORD getString(PTSTR valuename, PTSTR pDefault, PTSTR pResult, int cbSize); + void setString(PTSTR valuename, PTSTR pData); + DWORD getBinary(PTSTR valuename, PVOID pDefault, PVOID pResult, int cbSize); + DWORD setBinary(PTSTR valuename, PVOID pData, int cbSize); +}; + +class CRegEnumKey +{ +public: + CRegEnumKey(HKEY hKey) + { + m_hKey = hKey; + m_dwIndex = 0; + } + + ~CRegEnumKey() + { + } + + LONG Next(LPTSTR pszStr, DWORD cbName) + { + FILETIME ftLastWriteTime; + LONG lRet = RegEnumKeyEx(m_hKey, m_dwIndex, pszStr, + &cbName, NULL, NULL, NULL, &ftLastWriteTime); + + m_dwIndex++; + return lRet; + } + + + void Reset(void) + { + m_dwIndex = 0; + } +protected: + HKEY m_hKey; + DWORD m_dwIndex; +}; +} +#endif // __REG__ diff --git a/dshow/UIDS.H b/dshow/UIDS.H new file mode 100644 index 0000000..8e92631 --- /dev/null +++ b/dshow/UIDS.H @@ -0,0 +1,41 @@ +/* + * LAME MP3 encoder for DirectShow + * CLSIDs of the filter and property pages + * + * Copyright (c) 2000-2005 Marie Orlova, Peter Gubanov, Vitaly Ivanov, Elecard Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +// {b8d27088-df5f-4b7c-98dc-0e91a1696286} +DEFINE_GUID(CLSID_LAMEDShowFilter, +0xb8d27088, 0xff5f, 0x4b7c, 0x98, 0xdc, 0x0e, 0x91, 0xa1, 0x69, 0x62, 0x86); + + +// {b8d27089-df5f-4b7c-98dc-0e91a1696286} +DEFINE_GUID(CLSID_LAMEDShow_PropertyPage, +0xb8d27089, 0xff5f, 0x4b7c, 0x98, 0xdc, 0x0e, 0x91, 0xa1, 0x69, 0x62, 0x86); + +// {b8d2708a-df5f-4b7c-98dc-0e91a1696286} +DEFINE_GUID(CLSID_LAMEDShow_PropertyPageAdv, +0xb8d2708a, 0xff5f, 0x4b7c, 0x98, 0xdc, 0x0e, 0x91, 0xa1, 0x69, 0x62, 0x86); + +// {FE69EDD1-04CB-11d5-994A-000021D1FE2F} +DEFINE_GUID(CLSID_LAMEDShow_About, +0xfe69edd1, 0xf4cb, 0x11d5, 0x99, 0x4a, 0x0, 0x0, 0x21, 0xd1, 0xfe, 0x2f); + +DEFINE_GUID(MEDIASUBTYPE_MP3, +0x00000055, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71); \ No newline at end of file diff --git a/dshow/aboutprp.cpp b/dshow/aboutprp.cpp new file mode 100644 index 0000000..282ca26 --- /dev/null +++ b/dshow/aboutprp.cpp @@ -0,0 +1,195 @@ +/* + * LAME MP3 encoder for DirectShow + * About property page + * + * Copyright (c) 2000-2005 Marie Orlova, Peter Gubanov, Vitaly Ivanov, Elecard Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include +#include "iaudioprops.h" +#include "aboutprp.h" +#include "mpegac.h" +#include "resource.h" +#include "Reg.h" +#include + +// ------------------------------------------------------------------------- +// CMAEAbout +// ------------------------------------------------------------------------- + + +CHAR lpszText[] = "This library is free software; you can redistribute it \r\n" + "and/or modify it under the terms of the GNU \r\n" + "Library General Public License\r\n" + "as published by the Free Software Foundation;\r\n" + "either version 2 of the License,\r\n" + "or (at your option) any later version.\r\n" + "\r\n" + "This library is distributed in the hope that it will be useful,\r\n" + "but WITHOUT ANY WARRANTY;\r\n" + "without even the implied warranty of MERCHANTABILITY or \r\n" + "FITNESS FOR A PARTICULAR PURPOSE. See the GNU \r\n" + "Library General Public License for more details.\r\n" + "\r\n" + "You should have received a copy of the GNU\r\n" + "Library General Public License\r\n" + "along with this library; if not, write to the\r\n" + "Free Software Foundation,\r\n" + "Inc., 59 Temple Place - Suite 330,\r\n" + "Boston, MA 02111-1307, USA.\r\n"; + +// +// CreateInstance +// +CUnknown * WINAPI CMAEAbout::CreateInstance(LPUNKNOWN lpunk, HRESULT *phr) +{ + CUnknown *punk = new CMAEAbout(lpunk, phr); + if (punk == NULL) { + *phr = E_OUTOFMEMORY; + } + + return punk; +} + + +// +// Constructor +// +// Creaete a Property page object for the MPEG options +CMAEAbout::CMAEAbout(LPUNKNOWN lpunk, HRESULT *phr) + : CBasePropertyPage(NAME("About LAME Ain't MP3 Encoder"), lpunk, + IDD_ABOUT,IDS_ABOUT) + , m_fWindowInactive(TRUE) +{ + ASSERT(phr); + +// InitCommonControls(); +} + +// +// OnConnect +// +// Give us the filter to communicate with + +HRESULT CMAEAbout::OnConnect(IUnknown *pUnknown) +{ + return NOERROR; +} + + +// +// OnDisconnect +// +// Release the interface + +HRESULT CMAEAbout::OnDisconnect() +{ + // Release the interface + + return NOERROR; +} + + +// +// OnActivate +// +// Called on dialog creation + +HRESULT CMAEAbout::OnActivate(void) +{ + // Add text to the window. + m_fWindowInactive = FALSE; + SendDlgItemMessage(m_hwnd, IDC_LAME_LA, WM_SETTEXT, 0, (LPARAM)lpszText); + + + CHAR strbuf[250]; +#pragma warning(push) +#pragma warning(disable: 4995) + sprintf(strbuf, "LAME Encoder Version %s", get_lame_version()); + SendDlgItemMessage(m_hwnd, IDC_LAME_VER, WM_SETTEXT, 0, (LPARAM)strbuf); + + sprintf(strbuf, "LAME Project Homepage: %s", get_lame_url()); + SendDlgItemMessage(m_hwnd, IDC_LAME_URL, WM_SETTEXT, 0, (LPARAM)strbuf); +#pragma warning(pop) + return NOERROR; +} + +// +// OnDeactivate +// +// Called on dialog destruction + +HRESULT CMAEAbout::OnDeactivate(void) +{ + m_fWindowInactive = TRUE; + return NOERROR; +} + + +// +// OnApplyChanges +// +// User pressed the Apply button, remember the current settings + +HRESULT CMAEAbout::OnApplyChanges(void) +{ + return NOERROR; +} + + +// +// OnReceiveMessages +// +// Handles the messages for our property window + +BOOL CMAEAbout::OnReceiveMessage( HWND hwnd + , UINT uMsg + , WPARAM wParam + , LPARAM lParam) +{ + if (m_fWindowInactive) + return FALSE; + + switch (uMsg) + { + case WM_DESTROY: + return TRUE; + + default: + return FALSE; + } + + return TRUE; +} + +// +// SetDirty +// +// notifies the property page site of changes + +void CMAEAbout::SetDirty() +{ + m_bDirty = TRUE; + + if (m_pPageSite) + m_pPageSite->OnStatusChange(PROPPAGESTATUS_DIRTY); +} + diff --git a/dshow/aboutprp.h b/dshow/aboutprp.h new file mode 100644 index 0000000..664b50e --- /dev/null +++ b/dshow/aboutprp.h @@ -0,0 +1,41 @@ +/* + * LAME MP3 encoder for DirectShow + * About property page + * + * Copyright (c) 2000-2005 Marie Orlova, Peter Gubanov, Vitaly Ivanov, Elecard Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +class CMAEAbout: public CBasePropertyPage +{ +public: + + CMAEAbout(LPUNKNOWN lpUnk, HRESULT *phr); + static CUnknown * WINAPI CreateInstance(LPUNKNOWN lpunk, HRESULT *phr); + + HRESULT OnActivate(); + HRESULT OnConnect(IUnknown *pUnknown); + HRESULT OnDisconnect(); + HRESULT OnDeactivate(); + HRESULT OnApplyChanges(); + BOOL OnReceiveMessage(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam); + +private: + void SetDirty(void); + + BOOL m_fWindowInactive; +}; diff --git a/dshow/elogo.ico b/dshow/elogo.ico new file mode 100644 index 0000000..1eae73d Binary files /dev/null and b/dshow/elogo.ico differ diff --git a/dshow/iaudioprops.h b/dshow/iaudioprops.h new file mode 100644 index 0000000..481f5e0 --- /dev/null +++ b/dshow/iaudioprops.h @@ -0,0 +1,273 @@ +/* + * LAME MP3 encoder for DirectShow + * Interface definition + * + * Copyright (c) 2000-2005 Marie Orlova, Peter Gubanov, Vitaly Ivanov, Elecard Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +// A custom interface to allow the user to modify audio +// encoder properties +#ifndef __IAUDIOPROPERTIES__ +#define __IAUDIOPROPERTIES__ +#ifdef __cplusplus +extern "C" { +#endif + // {ca7e9ef0-1cbe-11d3-8d29-00a0c94bbfee} + DEFINE_GUID(IID_IAudioEncoderProperties, + 0xca7e9ef0, 0x1cbe, 0x11d3, 0x8d, 0x29, 0x00, 0xa0, 0xc9, 0x4b, 0xbf, 0xee); + // + // Configuring MPEG audio encoder parameters with unspecified + // input stream type may lead to misbehaviour and confusing + // results. In most cases the specified parameters will be + // overridden by defaults for the input media type. + // To archive proper results use this interface on the + // audio encoder filter with input pin connected to the valid + // source. + // + DECLARE_INTERFACE_(IAudioEncoderProperties, IUnknown) + { + // Is PES output enabled? Return TRUE or FALSE + STDMETHOD(get_PESOutputEnabled) (THIS_ + DWORD *dwEnabled + ) PURE; + // Enable/disable PES output + STDMETHOD(set_PESOutputEnabled) (THIS_ + DWORD dwEnabled + ) PURE; + // Get target compression bitrate in Kbits/s + STDMETHOD(get_Bitrate) (THIS_ + DWORD *dwBitrate + ) PURE; + // Set target compression bitrate in Kbits/s + // Not all numbers available! See spec for details! + STDMETHOD(set_Bitrate) (THIS_ + DWORD dwBitrate + ) PURE; + // Get variable bitrate flag + STDMETHOD(get_Variable) (THIS_ + DWORD *dwVariable + ) PURE; + // Set variable bitrate flag + STDMETHOD(set_Variable) (THIS_ + DWORD dwVariable + ) PURE; + // Get variable bitrate in Kbits/s + STDMETHOD(get_VariableMin) (THIS_ + DWORD *dwmin + ) PURE; + // Set variable bitrate in Kbits/s + // Not all numbers available! See spec for details! + STDMETHOD(set_VariableMin) (THIS_ + DWORD dwmin + ) PURE; + // Get variable bitrate in Kbits/s + STDMETHOD(get_VariableMax) (THIS_ + DWORD *dwmax + ) PURE; + // Set variable bitrate in Kbits/s + // Not all numbers available! See spec for details! + STDMETHOD(set_VariableMax) (THIS_ + DWORD dwmax + ) PURE; + // Get compression quality + STDMETHOD(get_Quality) (THIS_ + DWORD *dwQuality + ) PURE; + // Set compression quality + // Not all numbers available! See spec for details! + STDMETHOD(set_Quality) (THIS_ + DWORD dwQuality + ) PURE; + // Get VBR quality + STDMETHOD(get_VariableQ) (THIS_ + DWORD *dwVBRq + ) PURE; + // Set VBR quality + // Not all numbers available! See spec for details! + STDMETHOD(set_VariableQ) (THIS_ + DWORD dwVBRq + ) PURE; + // Get source sample rate. Return E_FAIL if input pin + // in not connected. + STDMETHOD(get_SourceSampleRate) (THIS_ + DWORD *dwSampleRate + ) PURE; + // Get source number of channels. Return E_FAIL if + // input pin is not connected. + STDMETHOD(get_SourceChannels) (THIS_ + DWORD *dwChannels + ) PURE; + // Get sample rate for compressed audio bitstream + STDMETHOD(get_SampleRate) (THIS_ + DWORD *dwSampleRate + ) PURE; + // Set sample rate. See genaudio spec for details + STDMETHOD(set_SampleRate) (THIS_ + DWORD dwSampleRate + ) PURE; + // Get channel mode. See genaudio.h for details + STDMETHOD(get_ChannelMode) (THIS_ + DWORD *dwChannelMode + ) PURE; + // Set channel mode + STDMETHOD(set_ChannelMode) (THIS_ + DWORD dwChannelMode + ) PURE; + // Is CRC enabled? + STDMETHOD(get_CRCFlag) (THIS_ + DWORD *dwFlag + ) PURE; + // Enable/disable CRC + STDMETHOD(set_CRCFlag) (THIS_ + DWORD dwFlag + ) PURE; + // Force mono + STDMETHOD(get_ForceMono) (THIS_ + DWORD *dwFlag + ) PURE; + // Force mono + STDMETHOD(set_ForceMono) (THIS_ + DWORD dwFlag + ) PURE; + // Set duration + STDMETHOD(get_SetDuration) (THIS_ + DWORD *dwFlag + ) PURE; + // Set duration + STDMETHOD(set_SetDuration) (THIS_ + DWORD dwFlag + ) PURE; + // Control 'original' flag + STDMETHOD(get_OriginalFlag) (THIS_ + DWORD *dwFlag + ) PURE; + STDMETHOD(set_OriginalFlag) (THIS_ + DWORD dwFlag + ) PURE; + // Control 'copyright' flag + STDMETHOD(get_CopyrightFlag) (THIS_ + DWORD *dwFlag + ) PURE; + STDMETHOD(set_CopyrightFlag) (THIS_ + DWORD dwFlag + ) PURE; + // Control 'Enforce VBR Minimum bitrate' flag + STDMETHOD(get_EnforceVBRmin) (THIS_ + DWORD *dwFlag + ) PURE; + STDMETHOD(set_EnforceVBRmin) (THIS_ + DWORD dwFlag + ) PURE; + // Control 'Voice' flag + STDMETHOD(get_VoiceMode) (THIS_ + DWORD *dwFlag + ) PURE; + STDMETHOD(set_VoiceMode) (THIS_ + DWORD dwFlag + ) PURE; + // Control 'Keep All Frequencies' flag + STDMETHOD(get_KeepAllFreq) (THIS_ + DWORD *dwFlag + ) PURE; + STDMETHOD(set_KeepAllFreq) (THIS_ + DWORD dwFlag + ) PURE; + // Control 'Strict ISO complience' flag + STDMETHOD(get_StrictISO) (THIS_ + DWORD *dwFlag + ) PURE; + STDMETHOD(set_StrictISO) (THIS_ + DWORD dwFlag + ) PURE; + // Control 'Disable short block' flag + STDMETHOD(get_NoShortBlock) (THIS_ + DWORD *dwDisable + ) PURE; + STDMETHOD(set_NoShortBlock) (THIS_ + DWORD dwDisable + ) PURE; + // Control 'Xing VBR Tag' flag + STDMETHOD(get_XingTag) (THIS_ + DWORD *dwXingTag + ) PURE; + STDMETHOD(set_XingTag) (THIS_ + DWORD dwXingTag + ) PURE; + // Control 'Forced mid/ side stereo' flag + STDMETHOD(get_ForceMS) (THIS_ + DWORD *dwFlag + ) PURE; + STDMETHOD(set_ForceMS) (THIS_ + DWORD dwFlag + ) PURE; + // Control 'ModeFixed' flag + STDMETHOD(get_ModeFixed) (THIS_ + DWORD *dwFlag + ) PURE; + STDMETHOD(set_ModeFixed) (THIS_ + DWORD dwFlag + ) PURE; + + //Receive the block of encoder + //configuration parametres + STDMETHOD(get_ParameterBlockSize) (THIS_ + BYTE *pcBlock, DWORD *pdwSize + ) PURE; + // Set encoder configuration parametres + STDMETHOD(set_ParameterBlockSize) (THIS_ + BYTE *pcBlock, DWORD dwSize + ) PURE; + // Set default audio encoder parameters depending + // on current input stream type + STDMETHOD(DefaultAudioEncoderProperties) (THIS_ + ) PURE; + // By default the modified properties are not saved to + // the registry immediately, so the filter needs to be + // forced to do this. Omitting this step may lead to + // misbehavior and confusing results. + STDMETHOD(LoadAudioEncoderPropertiesFromRegistry) (THIS_ + ) PURE; + STDMETHOD(SaveAudioEncoderPropertiesToRegistry) (THIS_ + ) PURE; + // Determine whether the filter can be configured. If this + // function returns E_FAIL then input format hasn't been + // specified and filter behavior is unpredictable. If S_OK, + // the filter could be configured with correct values. + STDMETHOD(InputTypeDefined) (THIS_ + ) PURE; + // Reconnects output pin (crucial for Fraunhofer MPEG Layer-3 Decoder) + STDMETHOD(ApplyChanges) (THIS_ + ) PURE; + + // Allow output sample overlap in terms of DirectShow + // timestamps (i.e. when sample's start time is less + // than previous sample's end time). Avi Mux doesn't like this + STDMETHOD(set_SampleOverlap) (THIS_ + DWORD dwFlag + ) PURE; + STDMETHOD(get_SampleOverlap) (THIS_ + DWORD *dwFlag + ) PURE; + }; +#ifdef __cplusplus +} +#endif +#endif // __IAUDIOPROPERTIES__ + + + diff --git a/dshow/resource.h b/dshow/resource.h new file mode 100644 index 0000000..2ec4034 --- /dev/null +++ b/dshow/resource.h @@ -0,0 +1,59 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by Property.rc +// +#define IDS_AUDIO_PROPS_TITLE 3 +#define IDS_AUDIO_ADVANCED_TITLE 4 +#define IDS_ABOUT 5 +#define IDD_AUDIOENCPROPS 100 +#define IDD_ADVPROPS 102 +#define IDD_ABOUT 105 +#define IDI_ICON2 106 +#define IDC_COMBO_CBR 1004 +#define IDC_CHECK_COPYRIGHT 1007 +#define IDC_CHECK_ORIGINAL 1008 +#define IDC_CHECK_CRC 1009 +#define IDC_CHECK_PES 1010 +#define IDC_COMBO_VBRMIN 1013 +#define IDC_TITLE_TEXT 1016 +#define IDC_RADIO_CBR 1019 +#define IDC_RADIO_VBR 1020 +#define IDC_SLIDER_QUALITY 1021 +#define IDC_TEXT_QUALITY 1023 +#define IDC_COMBO_VBRMAX 1024 +#define IDC_COMBO_SAMPLE_RATE 1025 +#define IDC_COMBO_VBRq 1026 +#define IDC_RADIO_STEREO 1027 +#define IDC_RADIO_JSTEREO 1028 +#define IDC_RADIO_DUAL 1029 +#define IDC_RADIO_MONO 1030 +#define IDC_CHECK_ENFORCE_MIN 1031 +#define IDC_CHECK_VOICE 1032 +#define IDC_CHECK_KEEP_ALL_FREQ 1033 +#define IDC_CHECK_STRICT_ISO 1034 +#define IDC_CHECK_DISABLE_SHORT_BLOCK 1035 +#define IDC_CHECK_XING_TAG 1036 +#define IDC_CHECK_FORCE_MS 1037 +#define IDC_CHECK_MODE_FIXED 1038 +#define IDC_RICHEDIT_LAME 1039 +#define IDC_CHECK_OVERLAP 1039 +#define IDC_CHECK_STOP 1040 +#define IDC_EDIT_TEXT 1044 +#define IDC_LAME_LA 1044 +#define IDC_FORCE_MONO 1045 +#define IDC_LAME_VER 1046 +#define IDC_LAME_URL 1047 +#define IDC_SET_DURATION 1048 +#define IDC_STATIC -1 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NO_MFC 1 +#define _APS_NEXT_RESOURCE_VALUE 107 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1049 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/frontend/Makefile.am b/frontend/Makefile.am new file mode 100644 index 0000000..a35cb17 --- /dev/null +++ b/frontend/Makefile.am @@ -0,0 +1,65 @@ +## $Id: Makefile.am,v 1.35 2011/10/16 13:09:01 robert Exp $ + +include $(top_srcdir)/Makefile.am.global + +bin_PROGRAMS = @WITH_FRONTEND@ @WITH_MP3RTP@ @WITH_MP3X@ +EXTRA_PROGRAMS = lame$(EXEEXT) mp3rtp$(EXEEXT) mp3x$(EXEEXT) + +EXTRA_DIST = \ + amiga_mpega.c + +DEFS = @DEFS@ @CONFIG_DEFS@ + +common_sources = \ + main.c \ + brhist.c \ + console.c \ + get_audio.c \ + lametime.c \ + parse.c \ + timestatus.c + +noinst_HEADERS = \ + brhist.h \ + console.h \ + get_audio.h \ + gtkanal.h \ + gpkplotting.h \ + lametime.h \ + main.h \ + parse.h \ + rtp.h \ + timestatus.h + +lame_SOURCES = lame_main.c $(common_sources) +mp3rtp_SOURCES = mp3rtp.c rtp.c $(common_sources) +mp3x_SOURCES = mp3x.c gtkanal.c gpkplotting.c $(common_sources) + +CFLAGS = @CFLAGS@ @GTK_CFLAGS@ @FRONTEND_CFLAGS@ @SNDFILE_CFLAGS@ +LDFLAGS = @LDFLAGS@ @FRONTEND_LDFLAGS@ @SNDFILE_LIBS@ + +INCLUDES = -I$(top_srcdir)/libmp3lame -I$(top_srcdir)/include -I$(top_builddir) + +LDADD = @LDADD@ \ + $(top_builddir)/libmp3lame/libmp3lame.la \ + @FRONTEND_LDADD@ + +mp3x_LDADD = $(LDADD) @GTK_LIBS@ + +CLEANFILES = lclint.txt $(EXTRA_PROGRAMS) + +LCLINTFLAGS= \ + +posixlib \ + +showsummary \ + +showalluses \ + +whichlib \ + +forcehints \ + -fixedformalarray \ + +matchanyintegral \ + -Dlint + +lclint.txt: ${lame_SOURCES} ${noinst_HEADERS} + @lclint ${LCLINTFLAGS} ${INCLUDES} ${DEFS} ${lame_SOURCES} 2>&1 >lclint.txt || true + +lclint: lclint.txt + more lclint.txt diff --git a/frontend/Makefile.in b/frontend/Makefile.in new file mode 100644 index 0000000..4f15e55 --- /dev/null +++ b/frontend/Makefile.in @@ -0,0 +1,745 @@ +# Makefile.in generated by automake 1.15.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2017 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# global section for every Makefile.am + + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = frontend +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ + $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" +PROGRAMS = $(bin_PROGRAMS) +am__objects_1 = main.$(OBJEXT) brhist.$(OBJEXT) console.$(OBJEXT) \ + get_audio.$(OBJEXT) lametime.$(OBJEXT) parse.$(OBJEXT) \ + timestatus.$(OBJEXT) +am_lame_OBJECTS = lame_main.$(OBJEXT) $(am__objects_1) +lame_OBJECTS = $(am_lame_OBJECTS) +lame_LDADD = $(LDADD) +lame_DEPENDENCIES = $(top_builddir)/libmp3lame/libmp3lame.la +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +am_mp3rtp_OBJECTS = mp3rtp.$(OBJEXT) rtp.$(OBJEXT) $(am__objects_1) +mp3rtp_OBJECTS = $(am_mp3rtp_OBJECTS) +mp3rtp_LDADD = $(LDADD) +mp3rtp_DEPENDENCIES = $(top_builddir)/libmp3lame/libmp3lame.la +am_mp3x_OBJECTS = mp3x.$(OBJEXT) gtkanal.$(OBJEXT) \ + gpkplotting.$(OBJEXT) $(am__objects_1) +mp3x_OBJECTS = $(am_mp3x_OBJECTS) +am__DEPENDENCIES_1 = $(top_builddir)/libmp3lame/libmp3lame.la +mp3x_DEPENDENCIES = $(am__DEPENDENCIES_1) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(lame_SOURCES) $(mp3rtp_SOURCES) $(mp3x_SOURCES) +DIST_SOURCES = $(lame_SOURCES) $(mp3rtp_SOURCES) $(mp3x_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +HEADERS = $(noinst_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.global $(top_srcdir)/depcomp depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ @GTK_CFLAGS@ @FRONTEND_CFLAGS@ @SNDFILE_CFLAGS@ +CONFIG_DEFS = @CONFIG_DEFS@ +CONFIG_MATH_LIB = @CONFIG_MATH_LIB@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CPUCCODE = @CPUCCODE@ +CPUTYPE = @CPUTYPE@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ @CONFIG_DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FRONTEND_CFLAGS = @FRONTEND_CFLAGS@ +FRONTEND_LDADD = @FRONTEND_LDADD@ +FRONTEND_LDFLAGS = @FRONTEND_LDFLAGS@ +GREP = @GREP@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_CONFIG = @GTK_CONFIG@ +GTK_LIBS = @GTK_LIBS@ +INCLUDES = -I$(top_srcdir)/libmp3lame -I$(top_srcdir)/include -I$(top_builddir) +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDADD = @LDADD@ \ + $(top_builddir)/libmp3lame/libmp3lame.la \ + @FRONTEND_LDADD@ + +LDFLAGS = @LDFLAGS@ @FRONTEND_LDFLAGS@ @SNDFILE_LIBS@ +LIBICONV = @LIBICONV@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_MAJOR_VERSION = @LIB_MAJOR_VERSION@ +LIB_MINOR_VERSION = @LIB_MINOR_VERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEDEP = @MAKEDEP@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NASM = @NASM@ +NASM_FORMAT = @NASM_FORMAT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM_F = @RM_F@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_FRONTEND = @WITH_FRONTEND@ +WITH_MP3RTP = @WITH_MP3RTP@ +WITH_MP3X = @WITH_MP3X@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = 1.15 foreign +bin_PROGRAMS = @WITH_FRONTEND@ @WITH_MP3RTP@ @WITH_MP3X@ +EXTRA_PROGRAMS = lame$(EXEEXT) mp3rtp$(EXEEXT) mp3x$(EXEEXT) +EXTRA_DIST = \ + amiga_mpega.c + +common_sources = \ + main.c \ + brhist.c \ + console.c \ + get_audio.c \ + lametime.c \ + parse.c \ + timestatus.c + +noinst_HEADERS = \ + brhist.h \ + console.h \ + get_audio.h \ + gtkanal.h \ + gpkplotting.h \ + lametime.h \ + main.h \ + parse.h \ + rtp.h \ + timestatus.h + +lame_SOURCES = lame_main.c $(common_sources) +mp3rtp_SOURCES = mp3rtp.c rtp.c $(common_sources) +mp3x_SOURCES = mp3x.c gtkanal.c gpkplotting.c $(common_sources) +mp3x_LDADD = $(LDADD) @GTK_LIBS@ +CLEANFILES = lclint.txt $(EXTRA_PROGRAMS) +LCLINTFLAGS = \ + +posixlib \ + +showsummary \ + +showalluses \ + +whichlib \ + +forcehints \ + -fixedformalarray \ + +matchanyintegral \ + -Dlint + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.global $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign frontend/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign frontend/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/Makefile.am.global $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p \ + || test -f $$p1 \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' \ + `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +lame$(EXEEXT): $(lame_OBJECTS) $(lame_DEPENDENCIES) $(EXTRA_lame_DEPENDENCIES) + @rm -f lame$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(lame_OBJECTS) $(lame_LDADD) $(LIBS) + +mp3rtp$(EXEEXT): $(mp3rtp_OBJECTS) $(mp3rtp_DEPENDENCIES) $(EXTRA_mp3rtp_DEPENDENCIES) + @rm -f mp3rtp$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(mp3rtp_OBJECTS) $(mp3rtp_LDADD) $(LIBS) + +mp3x$(EXEEXT): $(mp3x_OBJECTS) $(mp3x_DEPENDENCIES) $(EXTRA_mp3x_DEPENDENCIES) + @rm -f mp3x$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(mp3x_OBJECTS) $(mp3x_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/brhist.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/console.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get_audio.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpkplotting.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtkanal.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lame_main.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lametime.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mp3rtp.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mp3x.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtp.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timestatus.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(bindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ + clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ + ctags ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-binPROGRAMS \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am uninstall-binPROGRAMS + +.PRECIOUS: Makefile + + +# end global section + +lclint.txt: ${lame_SOURCES} ${noinst_HEADERS} + @lclint ${LCLINTFLAGS} ${INCLUDES} ${DEFS} ${lame_SOURCES} 2>&1 >lclint.txt || true + +lclint: lclint.txt + more lclint.txt + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/frontend/amiga_mpega.c b/frontend/amiga_mpega.c new file mode 100644 index 0000000..12f144f --- /dev/null +++ b/frontend/amiga_mpega.c @@ -0,0 +1,139 @@ +/* MPGLIB replacement using mpega.library (AmigaOS) + * Written by Thomas Wenzel and Sigbjrn (CISC) Skj�et. + * + * Big thanks to St�hane Tavernard for mpega.library. + * + */ + +/* $Id: amiga_mpega.c,v 1.3 2005/11/01 13:01:56 robert Exp $ */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifdef AMIGA_MPEGA + +#define __USE_SYSBASE +#include "lame.h" +#include +#include + +/* We need a small workaround here so GCC doesn't fail upon redefinition. :P */ +#define FLOAT _FLOAT +#include +#include +#undef _FLOAT + +#ifndef __GNUC__ +#include +#endif + +struct Library *MPEGABase = NULL; +MPEGA_STREAM *mstream = NULL; +MPEGA_CTRL mctrl; + +static const int smpls[2][4] = { +/* Layer x I II III */ + {0, 384, 1152, 1152}, /* MPEG-1 */ + {0, 384, 1152, 576} /* MPEG-2(.5) */ +}; + + +#ifndef __GNUC__ +static int +break_cleanup(void) +{ + /* Dummy break function to make atexit() work. :P */ + return 1; +} +#endif + +static void +exit_cleanup(void) +{ + if (mstream) { + MPEGA_close(mstream); + mstream = NULL; + } + if (MPEGABase) { + CloseLibrary(MPEGABase); + MPEGABase = NULL; + } +} + + +int +lame_decode_initfile(const char *fullname, mp3data_struct * mp3data) +{ + mctrl.bs_access = NULL; + + mctrl.layer_1_2.mono.quality = 2; + mctrl.layer_1_2.stereo.quality = 2; + mctrl.layer_1_2.mono.freq_div = 1; + mctrl.layer_1_2.stereo.freq_div = 1; + mctrl.layer_1_2.mono.freq_max = 48000; + mctrl.layer_1_2.stereo.freq_max = 48000; + mctrl.layer_3.mono.quality = 2; + mctrl.layer_3.stereo.quality = 2; + mctrl.layer_3.mono.freq_div = 1; + mctrl.layer_3.stereo.freq_div = 1; + mctrl.layer_3.mono.freq_max = 48000; + mctrl.layer_3.stereo.freq_max = 48000; + mctrl.layer_1_2.force_mono = 0; + mctrl.layer_3.force_mono = 0; + + MPEGABase = OpenLibrary("mpega.library", 2); + if (!MPEGABase) { + error_printf("Unable to open mpega.library v2\n"); + exit(1); + } +#ifndef __GNUC__ + onbreak(break_cleanup); +#endif + atexit(exit_cleanup); + + mp3data->header_parsed = 0; + mstream = MPEGA_open((char *) fullname, &mctrl); + if (!mstream) + return (-1); + + mp3data->header_parsed = 1; + mp3data->stereo = mstream->dec_channels; + mp3data->samplerate = mstream->dec_frequency; + mp3data->bitrate = mstream->bitrate; + mp3data->nsamp = (float) mstream->ms_duration / 1000 * mstream->dec_frequency; + mp3data->mode = mstream->mode; + mp3data->mode_ext = 0; /* mpega.library doesn't supply this info! :( */ + mp3data->framesize = smpls[mstream->norm - 1][mstream->layer]; + + return 0; +} + +int +lame_decode_fromfile(FILE * fd, short pcm_l[], short pcm_r[], mp3data_struct * mp3data) +{ + int outsize = 0; + WORD *b[MPEGA_MAX_CHANNELS]; + + b[0] = pcm_l; + b[1] = pcm_r; + + mp3data->header_parsed = 0; + while ((outsize == 0) || (outsize == MPEGA_ERR_BADFRAME)) /* Skip bad frames */ + outsize = MPEGA_decode_frame(mstream, b); + + if (outsize < 0) + return (-1); + + mp3data->header_parsed = 1; + mp3data->stereo = mstream->dec_channels; + mp3data->samplerate = mstream->dec_frequency; + mp3data->bitrate = mstream->bitrate; + mp3data->mode = mstream->mode; + mp3data->mode_ext = 0; /* mpega.library doesn't supply this info! :( */ + mp3data->framesize = smpls[mstream->norm - 1][mstream->layer]; + + return outsize; +} + +#endif /* AMIGA_MPEGA */ diff --git a/frontend/brhist.c b/frontend/brhist.c new file mode 100644 index 0000000..8912f3e --- /dev/null +++ b/frontend/brhist.c @@ -0,0 +1,382 @@ +/* + * Bitrate histogram source file + * + * Copyright (c) 2000 Mark Taylor + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* $Id: brhist.c,v 1.58 2013/06/11 08:41:31 rbrito Exp $ */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +/* basic #define's */ + +#ifndef BRHIST_WIDTH +# define BRHIST_WIDTH 14 +#endif +#ifndef BRHIST_RES +# define BRHIST_RES 14 +#endif + + +/* #includes */ + +#ifdef STDC_HEADERS +# include +# include +# include +#endif + +#include "brhist.h" +#include "console.h" + +#ifdef WITH_DMALLOC +#include +#endif + + +/* Structure holding all data related to the Console I/O + * may be this should be a more global frontend structure. So it + * makes sense to print all files instead with + * printf ( "blah\n") with printf ( "blah%s\n", Console_IO.str_clreoln ); + */ + +extern Console_IO_t Console_IO; + +static struct brhist_struct { + int vbr_bitrate_min_index; + int vbr_bitrate_max_index; + int kbps[BRHIST_WIDTH]; + int hist_printed_lines; + char bar_asterisk[512 + 1]; /* buffer filled up with a lot of '*' to print a bar */ + char bar_percent[512 + 1]; /* buffer filled up with a lot of '%' to print a bar */ + char bar_coded[512 + 1]; /* buffer filled up with a lot of ' ' to print a bar */ + char bar_space[512 + 1]; /* buffer filled up with a lot of ' ' to print a bar */ +} brhist; + +static int +calculate_index(const int *const array, const int len, const int value) +{ + int i; + + for (i = 0; i < len; i++) + if (array[i] == value) + return i; + return -1; +} + +int +brhist_init(const lame_global_flags * gf, const int bitrate_kbps_min, const int bitrate_kbps_max) +{ + brhist.hist_printed_lines = 0; + + /* initialize histogramming data structure */ + lame_bitrate_kbps(gf, brhist.kbps); + brhist.vbr_bitrate_min_index = calculate_index(brhist.kbps, BRHIST_WIDTH, bitrate_kbps_min); + brhist.vbr_bitrate_max_index = calculate_index(brhist.kbps, BRHIST_WIDTH, bitrate_kbps_max); + + if (brhist.vbr_bitrate_min_index >= BRHIST_WIDTH || + brhist.vbr_bitrate_max_index >= BRHIST_WIDTH) { + error_printf("lame internal error: VBR min %d kbps or VBR max %d kbps not allowed.\n", + bitrate_kbps_min, bitrate_kbps_max); + return -1; + } + + memset(brhist.bar_asterisk, '*', sizeof(brhist.bar_asterisk) - 1); + memset(brhist.bar_percent, '%', sizeof(brhist.bar_percent) - 1); + memset(brhist.bar_space, '-', sizeof(brhist.bar_space) - 1); + memset(brhist.bar_coded, '-', sizeof(brhist.bar_space) - 1); + + return 0; +} + +static int +digits(unsigned number) +{ + int ret = 1; + + if (number >= 100000000) { + ret += 8; + number /= 100000000; + } + if (number >= 10000) { + ret += 4; + number /= 10000; + } + if (number >= 100) { + ret += 2; + number /= 100; + } + if (number >= 10) { + ret += 1; + } + + return ret; +} + + +static void +brhist_disp_line(int i, int br_hist_TOT, int br_hist_LR, int full, int frames) +{ + char brppt[14]; /* [%] and max. 10 characters for kbps */ + int barlen_TOT; + int barlen_LR; + int res = digits(frames) + 3 + 4 + 1; + + if (full != 0) { + /* some problems when br_hist_TOT \approx br_hist_LR: You can't see that there are still MS frames */ + barlen_TOT = (br_hist_TOT * (Console_IO.disp_width - res) + full - 1) / full; /* round up */ + barlen_LR = (br_hist_LR * (Console_IO.disp_width - res) + full - 1) / full; /* round up */ + } + else { + barlen_TOT = barlen_LR = 0; + } + + sprintf(brppt, " [%*i]", digits(frames), br_hist_TOT); + + if (Console_IO.str_clreoln[0]) /* ClearEndOfLine available */ + console_printf("\n%3d%s %.*s%.*s%s", + brhist.kbps[i], brppt, + barlen_LR, brhist.bar_percent, + barlen_TOT - barlen_LR, brhist.bar_asterisk, Console_IO.str_clreoln); + else + console_printf("\n%3d%s %.*s%.*s%*s", + brhist.kbps[i], brppt, + barlen_LR, brhist.bar_percent, + barlen_TOT - barlen_LR, brhist.bar_asterisk, + Console_IO.disp_width - res - barlen_TOT, ""); + + brhist.hist_printed_lines++; +} + + + +static void +progress_line(const lame_global_flags * gf, int full, int frames) +{ + char rst[20] = "\0"; + int barlen_TOT = 0, barlen_COD = 0, barlen_RST = 0; + int res = 1; + float time_in_sec = 0; + unsigned int hour, min, sec; + int fsize = lame_get_framesize(gf); + int srate = lame_get_out_samplerate(gf); + + if (full < frames) { + full = frames; + } + if (srate > 0) { + time_in_sec = (float)(full - frames); + time_in_sec *= fsize; + time_in_sec /= srate; + } + hour = (unsigned int)(time_in_sec / 3600); + time_in_sec -= hour * 3600; + min = (unsigned int)(time_in_sec / 60); + time_in_sec -= min * 60; + sec = (unsigned int)time_in_sec; + if (full != 0) { + if (hour > 0) { + sprintf(rst, "%*u:%02u:%02u", digits(hour), hour, min, sec); + res += digits(hour) + 1 + 5; + } + else { + sprintf(rst, "%02u:%02u", min, sec); + res += 5; + } + /* some problems when br_hist_TOT \approx br_hist_LR: You can't see that there are still MS frames */ + barlen_TOT = (full * (Console_IO.disp_width - res) + full - 1) / full; /* round up */ + barlen_COD = (frames * (Console_IO.disp_width - res) + full - 1) / full; /* round up */ + barlen_RST = barlen_TOT - barlen_COD; + if (barlen_RST == 0) { + sprintf(rst, "%.*s", res - 1, brhist.bar_coded); + } + } + else { + barlen_TOT = barlen_COD = barlen_RST = 0; + } + if (Console_IO.str_clreoln[0]) { /* ClearEndOfLine available */ + console_printf("\n%.*s%s%.*s%s", + barlen_COD, brhist.bar_coded, + rst, barlen_RST, brhist.bar_space, Console_IO.str_clreoln); + } + else { + console_printf("\n%.*s%s%.*s%*s", + barlen_COD, brhist.bar_coded, + rst, barlen_RST, brhist.bar_space, Console_IO.disp_width - res - barlen_TOT, + ""); + } + brhist.hist_printed_lines++; +} + + +static int +stats_value(double x) +{ + if (x > 0.0) { + console_printf(" %5.1f", x); + return 6; + } + return 0; +} + +static int +stats_head(double x, const char *txt) +{ + if (x > 0.0) { + console_printf(txt); + return 6; + } + return 0; +} + + +static void +stats_line(double *stat) +{ + int n = 1; + console_printf("\n kbps "); + n += 12; + n += stats_head(stat[1], " mono"); + n += stats_head(stat[2], " IS "); + n += stats_head(stat[3], " LR "); + n += stats_head(stat[4], " MS "); + console_printf(" %% "); + n += 6; + n += stats_head(stat[5], " long "); + n += stats_head(stat[6], "switch"); + n += stats_head(stat[7], " short"); + n += stats_head(stat[8], " mixed"); + n += console_printf(" %%"); + if (Console_IO.str_clreoln[0]) { /* ClearEndOfLine available */ + console_printf("%s", Console_IO.str_clreoln); + } + else { + console_printf("%*s", Console_IO.disp_width - n, ""); + } + brhist.hist_printed_lines++; + + n = 1; + console_printf("\n %5.1f ", stat[0]); + n += 12; + n += stats_value(stat[1]); + n += stats_value(stat[2]); + n += stats_value(stat[3]); + n += stats_value(stat[4]); + console_printf(" "); + n += 6; + n += stats_value(stat[5]); + n += stats_value(stat[6]); + n += stats_value(stat[7]); + n += stats_value(stat[8]); + if (Console_IO.str_clreoln[0]) { /* ClearEndOfLine available */ + console_printf("%s", Console_IO.str_clreoln); + } + else { + console_printf("%*s", Console_IO.disp_width - n, ""); + } + brhist.hist_printed_lines++; +} + + +/* Yes, not very good */ +#define LR 0 +#define MS 2 + +void +brhist_disp(const lame_global_flags * gf) +{ + int i, lines_used = 0; + int br_hist[BRHIST_WIDTH]; /* how often a frame size was used */ + int br_sm_hist[BRHIST_WIDTH][4]; /* how often a special frame size/stereo mode commbination was used */ + int st_mode[4]; + int bl_type[6]; + int frames; /* total number of encoded frames */ + int most_often; /* usage count of the most often used frame size, but not smaller than Console_IO.disp_width-BRHIST_RES (makes this sense?) and 1 */ + double sum = 0.; + + double stat[9] = { 0 }; + int st_frames = 0; + + + brhist.hist_printed_lines = 0; /* printed number of lines for the brhist functionality, used to skip back the right number of lines */ + + lame_bitrate_stereo_mode_hist(gf, br_sm_hist); + lame_bitrate_hist(gf, br_hist); + lame_stereo_mode_hist(gf, st_mode); + lame_block_type_hist(gf, bl_type); + + frames = most_often = 0; + for (i = 0; i < BRHIST_WIDTH; i++) { + frames += br_hist[i]; + sum += br_hist[i] * brhist.kbps[i]; + if (most_often < br_hist[i]) + most_often = br_hist[i]; + if (br_hist[i]) + ++lines_used; + } + + for (i = 0; i < BRHIST_WIDTH; i++) { + int show = br_hist[i]; + show = show && (lines_used > 1); + if (show || (i >= brhist.vbr_bitrate_min_index && i <= brhist.vbr_bitrate_max_index)) + brhist_disp_line(i, br_hist[i], br_sm_hist[i][LR], most_often, frames); + } + for (i = 0; i < 4; i++) { + st_frames += st_mode[i]; + } + if (frames > 0) { + stat[0] = sum / frames; + stat[1] = 100. * (frames - st_frames) / frames; + } + if (st_frames > 0) { + stat[2] = 0.0; + stat[3] = 100. * st_mode[LR] / st_frames; + stat[4] = 100. * st_mode[MS] / st_frames; + } + if (bl_type[5] > 0) { + stat[5] = 100. * bl_type[0] / bl_type[5]; + stat[6] = 100. * (bl_type[1] + bl_type[3]) / bl_type[5]; + stat[7] = 100. * bl_type[2] / bl_type[5]; + stat[8] = 100. * bl_type[4] / bl_type[5]; + } + progress_line(gf, lame_get_totalframes(gf), frames); + stats_line(stat); +} + +void +brhist_jump_back(void) +{ + console_up(brhist.hist_printed_lines); + brhist.hist_printed_lines = 0; +} + +/* + * 1) + * + * Taken from Termcap_Manual.html: + * + * With the Unix version of termcap, you must allocate space for the description yourself and pass + * the address of the space as the argument buffer. There is no way you can tell how much space is + * needed, so the convention is to allocate a buffer 2048 characters long and assume that is + * enough. (Formerly the convention was to allocate 1024 characters and assume that was enough. + * But one day, for one kind of terminal, that was not enough.) + */ + + diff --git a/frontend/brhist.h b/frontend/brhist.h new file mode 100644 index 0000000..15b16c6 --- /dev/null +++ b/frontend/brhist.h @@ -0,0 +1,40 @@ +/* + * Bitrate histogram include file + * + * Copyright (c) 2000 Mark Taylor + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef LAME_BRHIST_H +#define LAME_BRHIST_H + +#include "lame.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +int brhist_init(const lame_global_flags * gf, const int bitrate_kbps_min, + const int bitrate_kbps_max); +void brhist_disp(const lame_global_flags * gf); +void brhist_jump_back(void); + +#if defined(__cplusplus) +} +#endif + +#endif /* LAME_BRHIST_H */ diff --git a/frontend/console.c b/frontend/console.c new file mode 100644 index 0000000..43d73ac --- /dev/null +++ b/frontend/console.c @@ -0,0 +1,310 @@ +#ifdef HAVE_CONFIG_H +# include +#endif + +#ifdef STDC_HEADERS +# include +# include +#else +# ifndef HAVE_STRCHR +# define strchr index +# define strrchr rindex +# endif +char *strchr(), *strrchr(); +# ifndef HAVE_MEMCPY +# define memcpy(d, s, n) bcopy ((s), (d), (n)) +# define memmove(d, s, n) bcopy ((s), (d), (n)) +# endif +#endif + +#if defined(HAVE_NCURSES_TERMCAP_H) +# include +#elif defined(HAVE_TERMCAP_H) +# include +#elif defined(HAVE_TERMCAP) +# include +# if !defined(__bsdi__) +# include +# endif +#endif + +#include +#include +#include "console.h" +#include "main.h" + +#ifdef WITH_DMALLOC +#include +#endif + +#define CLASS_ID 0x434F4E53 +#define REPORT_BUFF_SIZE 1024 + +#if defined(_WIN32) && !defined(__CYGWIN__) +# include +#endif + + + +static int +my_console_printing(FILE * fp, const char *format, va_list ap) +{ + if (fp != NULL) + return vfprintf(fp, format, ap); + return 0; +} + +static int +my_error_printing(FILE * fp, const char *format, va_list ap) +{ + if (fp != NULL) + return vfprintf(fp, format, ap); + return 0; +} + +static int +my_report_printing(FILE * fp, const char *format, va_list ap) +{ + if (fp != NULL) + return vfprintf(fp, format, ap); + return 0; +} + + +/* + * Taken from Termcap_Manual.html: + * + * With the Unix version of termcap, you must allocate space for the description yourself and pass + * the address of the space as the argument buffer. There is no way you can tell how much space is + * needed, so the convention is to allocate a buffer 2048 characters long and assume that is + * enough. (Formerly the convention was to allocate 1024 characters and assume that was enough. + * But one day, for one kind of terminal, that was not enough.) + */ + +#ifdef HAVE_TERMCAP + +static void +get_termcap_string(char const* id, char* dest, size_t n) +{ + char tc[16]; + char *tp = tc; + tp[0] = '\0'; + tp = tgetstr(id, &tp); + if (tp != NULL && dest != NULL && n > 0) { + strncpy(dest, tp, n); + dest[n-1] = '\0'; + } +} + +static void +get_termcap_number(char const* id, int* dest, int low, int high) +{ + int const val = tgetnum(id); + if (low <= val && val <= high) { + *dest = val; + } +} + +static void +apply_termcap_settings(Console_IO_t * const mfp) +{ + /* try to catch additional information about special console sequences */ + char const* term_name = getenv("TERM"); + if (NULL != term_name) { + char term_buff[4096]; + int const ret = tgetent(term_buff, term_name); + if (1 == ret) { + get_termcap_number("co", &mfp->disp_width, 40, 512); + get_termcap_number("li", &mfp->disp_height, 16, 256); + get_termcap_string("up", mfp->str_up, sizeof(mfp->str_up)); + get_termcap_string("md", mfp->str_emph, sizeof(mfp->str_emph)); + get_termcap_string("me", mfp->str_norm, sizeof(mfp->str_norm)); + get_termcap_string("ce", mfp->str_clreoln, sizeof(mfp->str_clreoln)); + } + } +} +#endif /* TERMCAP_AVAILABLE */ + +static int +init_console(Console_IO_t * const mfp) +{ + /* setup basics of brhist I/O channels */ + mfp->disp_width = 80; + mfp->disp_height = 25; + mfp->Console_fp = stderr; + mfp->Error_fp = stderr; + mfp->Report_fp = NULL; + + /*mfp -> Console_buff = calloc ( 1, REPORT_BUFF_SIZE ); */ + setvbuf(mfp->Console_fp, mfp->Console_buff, _IOFBF, sizeof(mfp->Console_buff)); +/* setvbuf ( mfp -> Error_fp , NULL , _IONBF, 0 ); */ + +#if defined(_WIN32) && !defined(__CYGWIN__) + mfp->Console_Handle = GetStdHandle(STD_ERROR_HANDLE); +#endif + + strcpy(mfp->str_up, "\033[A"); + +#ifdef HAVE_TERMCAP + apply_termcap_settings(mfp); +#endif /* TERMCAP_AVAILABLE */ + + mfp->ClassID = CLASS_ID; + +#if defined(_WIN32) && !defined(__CYGWIN__) + mfp->Console_file_type = GetFileType(Console_IO.Console_Handle); +#else + mfp->Console_file_type = 0; +#endif + return 0; +} + +static void +deinit_console(Console_IO_t * const mfp) +{ + if (mfp->Report_fp != NULL) { + fclose(mfp->Report_fp); + mfp->Report_fp = NULL; + } + fflush(mfp->Console_fp); + setvbuf(mfp->Console_fp, NULL, _IONBF, (size_t) 0); + + memset(mfp->Console_buff, 0x55, REPORT_BUFF_SIZE); +} + + +/* LAME console + */ +Console_IO_t Console_IO; + +int +frontend_open_console(void) +{ + return init_console(&Console_IO); +} + +void +frontend_close_console(void) +{ + deinit_console(&Console_IO); +} + +void +frontend_debugf(const char *format, va_list ap) +{ + (void) my_report_printing(Console_IO.Report_fp, format, ap); +} + +void +frontend_msgf(const char *format, va_list ap) +{ + (void) my_console_printing(Console_IO.Console_fp, format, ap); +} + +void +frontend_errorf(const char *format, va_list ap) +{ + (void) my_error_printing(Console_IO.Error_fp, format, ap); +} + +void +frontend_print_null(const char *format, va_list ap) +{ + (void) format; + (void) ap; +} + +int +console_printf(const char *format, ...) +{ + va_list args; + int ret; + + va_start(args, format); + ret = my_console_printing(Console_IO.Console_fp, format, args); + va_end(args); + + return ret; +} + +int +error_printf(const char *format, ...) +{ + va_list args; + int ret; + + va_start(args, format); + ret = my_console_printing(Console_IO.Error_fp, format, args); + va_end(args); + + return ret; +} + +int +report_printf(const char *format, ...) +{ + va_list args; + int ret; + + va_start(args, format); + ret = my_console_printing(Console_IO.Report_fp, format, args); + va_end(args); + + return ret; +} + +void +console_flush() +{ + fflush(Console_IO.Console_fp); +} + +void +error_flush() +{ + fflush(Console_IO.Error_fp); +} + +void +report_flush() +{ + fflush(Console_IO.Report_fp); +} + +void +console_up(int n_lines) +{ +#if defined(_WIN32) && !defined(__CYGWIN__) + if (Console_IO.Console_file_type != FILE_TYPE_PIPE) { + COORD Pos; + CONSOLE_SCREEN_BUFFER_INFO CSBI; + + console_flush(); + GetConsoleScreenBufferInfo(Console_IO.Console_Handle, &CSBI); + Pos.Y = (SHORT)(CSBI.dwCursorPosition.Y - n_lines); + Pos.X = 0; + SetConsoleCursorPosition(Console_IO.Console_Handle, Pos); + } +#else + while (n_lines-- > 0) + fputs(Console_IO.str_up, Console_IO.Console_fp); + console_flush(); +#endif +} + + +void +set_debug_file(const char *fn) +{ + if (Console_IO.Report_fp == NULL) { + Console_IO.Report_fp = lame_fopen(fn, "a"); + if (Console_IO.Report_fp != NULL) { + error_printf("writing debug info into: %s\n", fn); + } + else { + error_printf("Error: can't open for debug info: %s\n", fn); + } + } +} + +/* end of console.c */ diff --git a/frontend/console.h b/frontend/console.h new file mode 100644 index 0000000..80e1aa3 --- /dev/null +++ b/frontend/console.h @@ -0,0 +1,66 @@ +/* + * frontend/console.h + * + * This + * + * + */ + +#ifndef LAME_CONSOLE_H +#define LAME_CONSOLE_H + +#if defined(_WIN32) && !defined(__CYGWIN__) +# include +#endif + +#if defined(__cplusplus) +extern "C" { +#endif + +typedef struct console_io_struct { + unsigned long ClassID; + unsigned long ClassProt; + FILE *Console_fp; /* filepointer to stream reporting information */ + FILE *Error_fp; /* filepointer to stream fatal error reporting information */ + FILE *Report_fp; /* filepointer to stream reports (normally a text file or /dev/null) */ +#if defined(_WIN32) && !defined(__CYGWIN__) + HANDLE Console_Handle; +#endif + int disp_width; + int disp_height; + char str_up[10]; + char str_clreoln[10]; + char str_emph[10]; + char str_norm[10]; + char Console_buff[2048]; + int Console_file_type; +} Console_IO_t; + +extern Console_IO_t Console_IO; +extern int frontend_open_console(void); +extern void frontend_close_console(void); + +extern void frontend_msgf(const char *format, va_list ap); +extern void frontend_debugf(const char *format, va_list ap); +extern void frontend_errorf(const char *format, va_list ap); +extern void frontend_print_null(const char *format, va_list ap); + +int console_printf(const char *format, ...); +int error_printf(const char *format, ...); +int report_printf(const char *format, ...); + +void console_flush(void); +void error_flush(void); +void report_flush(void); + +void console_up(int n_lines); + +void set_debug_file(const char *fn); + +#if defined(__cplusplus) +} +#endif + +#endif /* LAME_CONSOLE_H */ + +/* end of console.h */ diff --git a/frontend/depcomp b/frontend/depcomp new file mode 100755 index 0000000..b39f98f --- /dev/null +++ b/frontend/depcomp @@ -0,0 +1,791 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2016-01-11.22; # UTC + +# Copyright (C) 1999-2017 Free Software Foundation, Inc. + +# This program 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 2, or (at your option) +# any later version. + +# This program 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 this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by 'PROGRAMS ARGS'. + object Object file output by 'PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputting dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +# Get the directory component of the given path, and save it in the +# global variables '$dir'. Note that this directory component will +# be either empty or ending with a '/' character. This is deliberate. +set_dir_from () +{ + case $1 in + */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; + *) dir=;; + esac +} + +# Get the suffix-stripped basename of the given path, and save it the +# global variable '$base'. +set_base_from () +{ + base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` +} + +# If no dependency file was actually created by the compiler invocation, +# we still have to create a dummy depfile, to avoid errors with the +# Makefile "include basename.Plo" scheme. +make_dummy_depfile () +{ + echo "#dummy" > "$depfile" +} + +# Factor out some common post-processing of the generated depfile. +# Requires the auxiliary global variable '$tmpdepfile' to be set. +aix_post_process_depfile () +{ + # If the compiler actually managed to produce a dependency file, + # post-process it. + if test -f "$tmpdepfile"; then + # Each line is of the form 'foo.o: dependency.h'. + # Do two passes, one to just change these to + # $object: dependency.h + # and one to simply output + # dependency.h: + # which is needed to avoid the deleted-header problem. + { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" + sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" + } > "$depfile" + rm -f "$tmpdepfile" + else + make_dummy_depfile + fi +} + +# A tabulation character. +tab=' ' +# A newline character. +nl=' +' +# Character ranges might be problematic outside the C locale. +# These definitions help. +upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ +lower=abcdefghijklmnopqrstuvwxyz +digits=0123456789 +alpha=${upper}${lower} + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Avoid interferences from the environment. +gccflag= dashmflag= + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvisualcpp +fi + +if test "$depmode" = msvc7msys; then + # This is just like msvc7 but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvc7 +fi + +if test "$depmode" = xlc; then + # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. + gccflag=-qmakedep=gcc,-MF + depmode=gcc +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. +## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. +## (see the conditional assignment to $gccflag above). +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). Also, it might not be +## supported by the other compilers which use the 'gcc' depmode. +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The second -e expression handles DOS-style file names with drive + # letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the "deleted header file" problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. +## Some versions of gcc put a space before the ':'. On the theory +## that the space means something, we add a space to the output as +## well. hp depmode also adds that space, but also prefixes the VPATH +## to the object. Take care to not repeat it in the output. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like '#:fec' to the end of the + # dependency line. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ + | tr "$nl" ' ' >> "$depfile" + echo >> "$depfile" + # The second pass generates a dummy entry for each header file. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" + ;; + +xlc) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts '$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + aix_post_process_depfile + ;; + +tcc) + # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 + # FIXME: That version still under development at the moment of writing. + # Make that this statement remains true also for stable, released + # versions. + # It will wrap lines (doesn't matter whether long or short) with a + # trailing '\', as in: + # + # foo.o : \ + # foo.c \ + # foo.h \ + # + # It will put a trailing '\' even on the last line, and will use leading + # spaces rather than leading tabs (at least since its commit 0394caf7 + # "Emit spaces for -MD"). + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. + # We have to change lines of the first kind to '$object: \'. + sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" + # And for each line of the second kind, we have to emit a 'dep.h:' + # dummy dependency, to avoid the deleted-header problem. + sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" + rm -f "$tmpdepfile" + ;; + +## The order of this option in the case statement is important, since the +## shell code in configure will try each of these formats in the order +## listed in this file. A plain '-MD' option would be understood by many +## compilers, so we must ensure this comes after the gcc and icc options. +pgcc) + # Portland's C compiler understands '-MD'. + # Will always output deps to 'file.d' where file is the root name of the + # source file under compilation, even if file resides in a subdirectory. + # The object file name does not affect the name of the '.d' file. + # pgcc 10.2 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using '\' : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + set_dir_from "$object" + # Use the source, not the object, to determine the base name, since + # that's sadly what pgcc will do too. + set_base_from "$source" + tmpdepfile=$base.d + + # For projects that build the same source file twice into different object + # files, the pgcc approach of using the *source* file root name can cause + # problems in parallel builds. Use a locking strategy to avoid stomping on + # the same $tmpdepfile. + lockdir=$base.d-lock + trap " + echo '$0: caught signal, cleaning up...' >&2 + rmdir '$lockdir' + exit 1 + " 1 2 13 15 + numtries=100 + i=$numtries + while test $i -gt 0; do + # mkdir is a portable test-and-set. + if mkdir "$lockdir" 2>/dev/null; then + # This process acquired the lock. + "$@" -MD + stat=$? + # Release the lock. + rmdir "$lockdir" + break + else + # If the lock is being held by a different process, wait + # until the winning process is done or we timeout. + while test -d "$lockdir" && test $i -gt 0; do + sleep 1 + i=`expr $i - 1` + done + fi + i=`expr $i - 1` + done + trap - 1 2 13 15 + if test $i -le 0; then + echo "$0: failed to acquire lock after $numtries attempts" >&2 + echo "$0: check lockdir '$lockdir'" >&2 + exit 1 + fi + + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" + # Add 'dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in 'foo.d' instead, so we check for that too. + # Subdirectories are respected. + set_dir_from "$object" + set_base_from "$object" + + if test "$libtool" = yes; then + # Libtool generates 2 separate objects for the 2 libraries. These + # two compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir$base.o.d # libtool 1.5 + tmpdepfile2=$dir.libs/$base.o.d # Likewise. + tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + # Same post-processing that is required for AIX mode. + aix_post_process_depfile + ;; + +msvc7) + if test "$libtool" = yes; then + showIncludes=-Wc,-showIncludes + else + showIncludes=-showIncludes + fi + "$@" $showIncludes > "$tmpdepfile" + stat=$? + grep -v '^Note: including file: ' "$tmpdepfile" + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The first sed program below extracts the file names and escapes + # backslashes for cygpath. The second sed program outputs the file + # name when reading, but also accumulates all include files in the + # hold buffer in order to output them again at the end. This only + # works with sed implementations that can handle large buffers. + sed < "$tmpdepfile" -n ' +/^Note: including file: *\(.*\)/ { + s//\1/ + s/\\/\\\\/g + p +}' | $cygpath_u | sort -u | sed -n ' +s/ /\\ /g +s/\(.*\)/'"$tab"'\1 \\/p +s/.\(.*\) \\/\1:/ +H +$ { + s/.*/'"$tab"'/ + G + p +}' >> "$depfile" + echo >> "$depfile" # make sure the fragment doesn't end with a backslash + rm -f "$tmpdepfile" + ;; + +msvc7msys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for ':' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. + "$@" $dashmflag | + sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this sed invocation + # correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + # makedepend may prepend the VPATH from the source file name to the object. + # No need to regex-escape $object, excess matching of '.' is harmless. + sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process the last invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed '1,2d' "$tmpdepfile" \ + | tr ' ' "$nl" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E \ + | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + | sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" + echo "$tab" >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/frontend/get_audio.c b/frontend/get_audio.c new file mode 100644 index 0000000..1690dbc --- /dev/null +++ b/frontend/get_audio.c @@ -0,0 +1,2290 @@ +/* + * Get Audio routines source file + * + * Copyright (c) 1999 Albert L Faber + * 2008-2017 Robert Hegemann + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* $Id: get_audio.c,v 1.167 2017/09/06 15:07:29 robert Exp $ */ + + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#ifdef HAVE_LIMITS_H +# include +#endif + +#include + +#ifdef STDC_HEADERS +# include +# include +#else +# ifndef HAVE_STRCHR +# define strchr index +# define strrchr rindex +# endif +char *strchr(), *strrchr(); +# ifndef HAVE_MEMCPY +# define memcpy(d, s, n) bcopy ((s), (d), (n)) +# define memmove(d, s, n) bcopy ((s), (d), (n)) +# endif +#endif + +#ifdef HAVE_INTTYPES_H +# include +#else +# ifdef HAVE_STDINT_H +# include +# endif +#endif + +#define MAX_U_32_NUM 0xFFFFFFFF + + +#include + +#if defined(__riscos__) +# include +# include +#elif defined(_WIN32) +# include +# include +#else +# include +#endif + +#ifdef __sun__ +/* woraround for SunOS 4.x, it has SEEK_* defined here */ +#include +#endif + +#include "lame.h" +#include "main.h" +#include "get_audio.h" +#include "lametime.h" +#include "console.h" + +#ifdef WITH_DMALLOC +#include +#endif + +#ifndef STR +# define __STR(x) #x +# define STR(x) __STR(x) +#define __LOC__ __FILE__ "("STR(__LINE__)") : " +#endif + + +#define FLOAT_TO_UNSIGNED(f) ((unsigned long)(((long)((f) - 2147483648.0)) + 2147483647L + 1)) +#define UNSIGNED_TO_FLOAT(u) (((double)((long)((u) - 2147483647L - 1))) + 2147483648.0) + +static unsigned int uint32_high_low(unsigned char *bytes) +{ + uint32_t const hh = bytes[0]; + uint32_t const hl = bytes[1]; + uint32_t const lh = bytes[2]; + uint32_t const ll = bytes[3]; + return (hh << 24) | (hl << 16) | (lh << 8) | ll; +} + +static double +read_ieee_extended_high_low(FILE * fp) +{ + unsigned char bytes[10]; + memset(bytes, 0, 10); + fread(bytes, 1, 10, fp); + { + int32_t const s = (bytes[0] & 0x80); + int32_t const e_h = (bytes[0] & 0x7F); + int32_t const e_l = bytes[1]; + int32_t e = (e_h << 8) | e_l; + uint32_t const hm = uint32_high_low(bytes + 2); + uint32_t const lm = uint32_high_low(bytes + 6); + double result = 0; + if (e != 0 || hm != 0 || lm != 0) { + if (e == 0x7fff) { + result = HUGE_VAL; + } + else { + double mantissa_h = UNSIGNED_TO_FLOAT(hm); + double mantissa_l = UNSIGNED_TO_FLOAT(lm); + e -= 0x3fff; + e -= 31; + result = ldexp(mantissa_h, e); + e -= 32; + result += ldexp(mantissa_l, e); + } + } + return s ? -result : result; + } +} + + +static int +read_16_bits_low_high(FILE * fp) +{ + unsigned char bytes[2] = { 0, 0 }; + fread(bytes, 1, 2, fp); + { + int32_t const low = bytes[0]; + int32_t const high = (signed char) (bytes[1]); + return (high << 8) | low; + } +} + + +static int +read_32_bits_low_high(FILE * fp) +{ + unsigned char bytes[4] = { 0, 0, 0, 0 }; + fread(bytes, 1, 4, fp); + { + int32_t const low = bytes[0]; + int32_t const medl = bytes[1]; + int32_t const medh = bytes[2]; + int32_t const high = (signed char) (bytes[3]); + return (high << 24) | (medh << 16) | (medl << 8) | low; + } +} + +static int +read_16_bits_high_low(FILE * fp) +{ + unsigned char bytes[2] = { 0, 0 }; + fread(bytes, 1, 2, fp); + { + int32_t const low = bytes[1]; + int32_t const high = (signed char) (bytes[0]); + return (high << 8) | low; + } +} + +static int +read_32_bits_high_low(FILE * fp) +{ + unsigned char bytes[4] = { 0, 0, 0, 0 }; + fread(bytes, 1, 4, fp); + { + int32_t const low = bytes[3]; + int32_t const medl = bytes[2]; + int32_t const medh = bytes[1]; + int32_t const high = (signed char) (bytes[0]); + return (high << 24) | (medh << 16) | (medl << 8) | low; + } +} + +static void +write_16_bits_low_high(FILE * fp, int val) +{ + unsigned char bytes[2]; + bytes[0] = (val & 0xff); + bytes[1] = ((val >> 8) & 0xff); + fwrite(bytes, 1, 2, fp); +} + +static void +write_32_bits_low_high(FILE * fp, int val) +{ + unsigned char bytes[4]; + bytes[0] = (val & 0xff); + bytes[1] = ((val >> 8) & 0xff); + bytes[2] = ((val >> 16) & 0xff); + bytes[3] = ((val >> 24) & 0xff); + fwrite(bytes, 1, 4, fp); +} + +#ifdef LIBSNDFILE + +#include + + +#else + +typedef void SNDFILE; + +#endif /* ifdef LIBSNDFILE */ + + + +typedef struct blockAlign_struct { + unsigned long offset; + unsigned long blockSize; +} blockAlign; + +typedef struct IFF_AIFF_struct { + short numChannels; + unsigned long numSampleFrames; + short sampleSize; + double sampleRate; + unsigned long sampleType; + blockAlign blkAlgn; +} IFF_AIFF; + + + +struct PcmBuffer { + void *ch[2]; /* buffer for each channel */ + int w; /* sample width */ + int n; /* number samples allocated */ + int u; /* number samples used */ + int skip_start; /* number samples to ignore at the beginning */ + int skip_end; /* number samples to ignore at the end */ +}; + +typedef struct PcmBuffer PcmBuffer; + +static void +initPcmBuffer(PcmBuffer * b, int w) +{ + b->ch[0] = 0; + b->ch[1] = 0; + b->w = w; + b->n = 0; + b->u = 0; + b->skip_start = 0; + b->skip_end = 0; +} + +static void +freePcmBuffer(PcmBuffer * b) +{ + if (b != 0) { + free(b->ch[0]); + free(b->ch[1]); + b->ch[0] = 0; + b->ch[1] = 0; + b->n = 0; + b->u = 0; + } +} + +static int +addPcmBuffer(PcmBuffer * b, void *a0, void *a1, int read) +{ + int a_n; + + if (b == 0) { + return 0; + } + if (read < 0) { + return b->u - b->skip_end; + } + if (b->skip_start >= read) { + b->skip_start -= read; + return b->u - b->skip_end; + } + a_n = read - b->skip_start; + + if (b != 0 && a_n > 0) { + int const a_skip = b->w * b->skip_start; + int const a_want = b->w * a_n; + int const b_used = b->w * b->u; + int const b_have = b->w * b->n; + int const b_need = b->w * (b->u + a_n); + if (b_have < b_need) { + b->n = b->u + a_n; + b->ch[0] = realloc(b->ch[0], b_need); + b->ch[1] = realloc(b->ch[1], b_need); + } + b->u += a_n; + if (b->ch[0] != 0 && a0 != 0) { + char *src = a0; + char *dst = b->ch[0]; + memcpy(dst + b_used, src + a_skip, a_want); + } + if (b->ch[1] != 0 && a1 != 0) { + char *src = a1; + char *dst = b->ch[1]; + memcpy(dst + b_used, src + a_skip, a_want); + } + } + b->skip_start = 0; + return b->u - b->skip_end; +} + +static int +takePcmBuffer(PcmBuffer * b, void *a0, void *a1, int a_n, int mm) +{ + if (a_n > mm) { + a_n = mm; + } + if (b != 0 && a_n > 0) { + int const a_take = b->w * a_n; + if (a0 != 0 && b->ch[0] != 0) { + memcpy(a0, b->ch[0], a_take); + } + if (a1 != 0 && b->ch[1] != 0) { + memcpy(a1, b->ch[1], a_take); + } + b->u -= a_n; + if (b->u < 0) { + b->u = 0; + return a_n; + } + if (b->ch[0] != 0) { + memmove(b->ch[0], (char *) b->ch[0] + a_take, b->w * b->u); + } + if (b->ch[1] != 0) { + memmove(b->ch[1], (char *) b->ch[1] + a_take, b->w * b->u); + } + } + return a_n; +} + +/* global data for get_audio.c. */ +typedef struct get_audio_global_data_struct { + int count_samples_carefully; + int pcmbitwidth; + int pcmswapbytes; + int pcm_is_unsigned_8bit; + int pcm_is_ieee_float; + unsigned int num_samples_read; + FILE *music_in; + SNDFILE *snd_file; + hip_t hip; + PcmBuffer pcm32; + PcmBuffer pcm16; + size_t in_id3v2_size; + unsigned char* in_id3v2_tag; +} get_audio_global_data; + +static get_audio_global_data global; + + + +#ifdef AMIGA_MPEGA +int lame_decode_initfile(const char *fullname, mp3data_struct * const mp3data); +#else +int lame_decode_initfile(FILE * fd, mp3data_struct * mp3data, int *enc_delay, int *enc_padding); +#endif + +/* read mp3 file until mpglib returns one frame of PCM data */ +static int lame_decode_fromfile(FILE * fd, short int pcm_l[], short int pcm_r[], + mp3data_struct * mp3data); + + +static int read_samples_pcm(FILE * musicin, int sample_buffer[2304], int samples_to_read); +static int read_samples_mp3(lame_t gfp, FILE * musicin, short int mpg123pcm[2][1152]); +#ifdef LIBSNDFILE +static SNDFILE *open_snd_file(lame_t gfp, char const *inPath); +#endif +static FILE *open_mpeg_file(lame_t gfp, char const *inPath, int *enc_delay, int *enc_padding); +static FILE *open_wave_file(lame_t gfp, char const *inPath, int *enc_delay, int *enc_padding); +static int close_input_file(FILE * musicin); + + +static size_t +min_size_t(size_t a, size_t b) +{ + if (a < b) { + return a; + } + return b; +} + +enum ByteOrder machine_byte_order(void); + +enum ByteOrder +machine_byte_order(void) +{ + long one = 1; + return !(*((char *) (&one))) ? ByteOrderBigEndian : ByteOrderLittleEndian; +} + + + +/* Replacement for forward fseek(,,SEEK_CUR), because fseek() fails on pipes */ + + +static int +fskip(FILE * fp, long offset, int whence) +{ +#ifndef PIPE_BUF + char buffer[4096]; +#else + char buffer[PIPE_BUF]; +#endif + +/* S_ISFIFO macro is defined on newer Linuxes */ +#ifndef S_ISFIFO +# ifdef _S_IFIFO + /* _S_IFIFO is defined on Win32 and Cygwin */ +# define S_ISFIFO(m) (((m)&_S_IFIFO) == _S_IFIFO) +# endif +#endif + +#ifdef S_ISFIFO + /* fseek is known to fail on pipes with several C-Library implementations + workaround: 1) test for pipe + 2) for pipes, only relatvie seeking is possible + 3) and only in forward direction! + else fallback to old code + */ + { + int const fd = fileno(fp); + struct stat file_stat; + + if (fstat(fd, &file_stat) == 0) { + if (S_ISFIFO(file_stat.st_mode)) { + if (whence != SEEK_CUR || offset < 0) { + return -1; + } + while (offset > 0) { + size_t const bytes_to_skip = min_size_t(sizeof(buffer), offset); + size_t const read = fread(buffer, 1, bytes_to_skip, fp); + if (read < 1) { + return -1; + } + assert( read <= LONG_MAX ); + offset -= (long) read; + } + return 0; + } + } + } +#endif + if (0 == fseek(fp, offset, whence)) { + return 0; + } + + if (whence != SEEK_CUR || offset < 0) { + if (global_ui_config.silent < 10) { + error_printf + ("fskip problem: Mostly the return status of functions is not evaluate so it is more secure to polute .\n"); + } + return -1; + } + + while (offset > 0) { + size_t const bytes_to_skip = min_size_t(sizeof(buffer), offset); + size_t const read = fread(buffer, 1, bytes_to_skip, fp); + if (read < 1) { + return -1; + } + assert( read <= LONG_MAX ); + offset -= (long) read; + } + + return 0; +} + + +static off_t +lame_get_file_size(FILE * fp) +{ + struct stat sb; + int fd = fileno(fp); + + if (0 == fstat(fd, &sb)) + return sb.st_size; + return (off_t) - 1; +} + + +FILE * +init_outfile(char const *outPath, int decode) +{ + FILE *outf; + + /* open the output file */ + if (0 == strcmp(outPath, "-")) { + outf = stdout; + lame_set_stream_binary_mode(outf); + } + else { + outf = lame_fopen(outPath, "w+b"); +#ifdef __riscos__ + /* Assign correct file type */ + if (outf != NULL) { + char *p, *out_path = strdup(outPath); + for (p = out_path; *p; p++) { /* ugly, ugly to modify a string */ + switch (*p) { + case '.': + *p = '/'; + break; + case '/': + *p = '.'; + break; + } + } + SetFiletype(out_path, decode ? 0xFB1 /*WAV*/ : 0x1AD /*AMPEG*/); + free(out_path); + } +#else + (void) decode; +#endif + } + return outf; +} + + +static void +setSkipStartAndEnd(lame_t gfp, int enc_delay, int enc_padding) +{ + int skip_start = 0, skip_end = 0; + + if (global_decoder.mp3_delay_set) + skip_start = global_decoder.mp3_delay; + + switch (global_reader.input_format) { + case sf_mp123: + break; + + case sf_mp3: + if (skip_start == 0) { + if (enc_delay > -1 || enc_padding > -1) { + if (enc_delay > -1) + skip_start = enc_delay + 528 + 1; + if (enc_padding > -1) + skip_end = enc_padding - (528 + 1); + } + else + skip_start = lame_get_encoder_delay(gfp) + 528 + 1; + } + else { + /* user specified a value of skip. just add for decoder */ + skip_start += 528 + 1; /* mp3 decoder has a 528 sample delay, plus user supplied "skip" */ + } + break; + case sf_mp2: + skip_start += 240 + 1; + break; + case sf_mp1: + skip_start += 240 + 1; + break; + case sf_raw: + skip_start += 0; /* other formats have no delay *//* is += 0 not better ??? */ + break; + case sf_wave: + skip_start += 0; /* other formats have no delay *//* is += 0 not better ??? */ + break; + case sf_aiff: + skip_start += 0; /* other formats have no delay *//* is += 0 not better ??? */ + break; + default: + skip_start += 0; /* other formats have no delay *//* is += 0 not better ??? */ + break; + } + skip_start = skip_start < 0 ? 0 : skip_start; + skip_end = skip_end < 0 ? 0 : skip_end; + global. pcm16.skip_start = global.pcm32.skip_start = skip_start; + global. pcm16.skip_end = global.pcm32.skip_end = skip_end; +} + + + +int +init_infile(lame_t gfp, char const *inPath) +{ + int enc_delay = 0, enc_padding = 0; + /* open the input file */ + global. count_samples_carefully = 0; + global. num_samples_read = 0; + global. pcmbitwidth = global_raw_pcm.in_bitwidth; + global. pcmswapbytes = global_reader.swapbytes; + global. pcm_is_unsigned_8bit = global_raw_pcm.in_signed == 1 ? 0 : 1; + global. pcm_is_ieee_float = 0; + global. hip = 0; + global. music_in = 0; + global. snd_file = 0; + global. in_id3v2_size = 0; + global. in_id3v2_tag = 0; + if (is_mpeg_file_format(global_reader.input_format)) { + global. music_in = open_mpeg_file(gfp, inPath, &enc_delay, &enc_padding); + } + else { +#ifdef LIBSNDFILE + if (strcmp(inPath, "-") != 0) { /* not for stdin */ + global. snd_file = open_snd_file(gfp, inPath); + } +#endif + if (global.snd_file == 0) { + global. music_in = open_wave_file(gfp, inPath, &enc_delay, &enc_padding); + } + } + initPcmBuffer(&global.pcm32, sizeof(int)); + initPcmBuffer(&global.pcm16, sizeof(short)); + setSkipStartAndEnd(gfp, enc_delay, enc_padding); + { + unsigned long n = lame_get_num_samples(gfp); + if (n != MAX_U_32_NUM) { + unsigned long const discard = global.pcm32.skip_start + global.pcm32.skip_end; + lame_set_num_samples(gfp, n > discard ? n - discard : 0); + } + } + return (global.snd_file != NULL || global.music_in != NULL) ? 1 : -1; +} + +int +samples_to_skip_at_start(void) +{ + return global.pcm32.skip_start; +} + +int +samples_to_skip_at_end(void) +{ + return global.pcm32.skip_end; +} + +void +close_infile(void) +{ +#if defined(HAVE_MPGLIB) + if (global.hip != 0) { + hip_decode_exit(global.hip); /* release mp3decoder memory */ + global. hip = 0; + } +#endif + close_input_file(global.music_in); +#ifdef LIBSNDFILE + if (global.snd_file) { + if (sf_close(global.snd_file) != 0) { + if (global_ui_config.silent < 10) { + error_printf("Could not close sound file \n"); + } + } + global. snd_file = 0; + } +#endif + freePcmBuffer(&global.pcm32); + freePcmBuffer(&global.pcm16); + global. music_in = 0; + free(global.in_id3v2_tag); + global.in_id3v2_tag = 0; + global.in_id3v2_size = 0; +} + + +static int + get_audio_common(lame_t gfp, int buffer[2][1152], short buffer16[2][1152]); + +/************************************************************************ +* +* get_audio() +* +* PURPOSE: reads a frame of audio data from a file to the buffer, +* aligns the data for future processing, and separates the +* left and right channels +* +************************************************************************/ +int +get_audio(lame_t gfp, int buffer[2][1152]) +{ + int used = 0, read = 0; + do { + read = get_audio_common(gfp, buffer, NULL); + used = addPcmBuffer(&global.pcm32, buffer[0], buffer[1], read); + } while (used <= 0 && read > 0); + if (read < 0) { + return read; + } + if (global_reader.swap_channel == 0) + return takePcmBuffer(&global.pcm32, buffer[0], buffer[1], used, 1152); + else + return takePcmBuffer(&global.pcm32, buffer[1], buffer[0], used, 1152); +} + +/* + get_audio16 - behave as the original get_audio function, with a limited + 16 bit per sample output +*/ +int +get_audio16(lame_t gfp, short buffer[2][1152]) +{ + int used = 0, read = 0; + do { + read = get_audio_common(gfp, NULL, buffer); + used = addPcmBuffer(&global.pcm16, buffer[0], buffer[1], read); + } while (used <= 0 && read > 0); + if (read < 0) { + return read; + } + if (global_reader.swap_channel == 0) + return takePcmBuffer(&global.pcm16, buffer[0], buffer[1], used, 1152); + else + return takePcmBuffer(&global.pcm16, buffer[1], buffer[0], used, 1152); +} + +/************************************************************************ + get_audio_common - central functionality of get_audio* + in: gfp + buffer output to the int buffer or 16-bit buffer + out: buffer int output (if buffer != NULL) + buffer16 16-bit output (if buffer == NULL) +returns: samples read +note: either buffer or buffer16 must be allocated upon call +*/ +static int +get_audio_common(lame_t gfp, int buffer[2][1152], short buffer16[2][1152]) +{ + const int num_channels = lame_get_num_channels(gfp); + const int framesize = lame_get_framesize(gfp); + int insamp[2 * 1152]; + short buf_tmp16[2][1152]; + int samples_read; + int samples_to_read; + unsigned int remaining; + int i; + int *p; + + /* sanity checks, that's what we expect to be true */ + if ((num_channels < 1 || 2 < num_channels) + ||(framesize < 1 || 1152 < framesize)) { + if (global_ui_config.silent < 10) { + error_printf("Error: internal problem!\n"); + } + return -1; + } + + /* + * NOTE: LAME can now handle arbritray size input data packets, + * so there is no reason to read the input data in chuncks of + * size "framesize". EXCEPT: the LAME graphical frame analyzer + * will get out of sync if we read more than framesize worth of data. + */ + + samples_to_read = framesize; + + /* if this flag has been set, then we are carefull to read + * exactly num_samples and no more. This is useful for .wav and .aiff + * files which have id3 or other tags at the end. Note that if you + * are using LIBSNDFILE, this is not necessary + */ + if (global.count_samples_carefully) { + unsigned int tmp_num_samples; + /* get num_samples */ + if (is_mpeg_file_format(global_reader.input_format)) { + tmp_num_samples = global_decoder.mp3input_data.nsamp; + } + else { + tmp_num_samples = lame_get_num_samples(gfp); + } + if (global.num_samples_read < tmp_num_samples) { + remaining = tmp_num_samples - global.num_samples_read; + } + else { + remaining = 0; + } + if (remaining < (unsigned int) framesize && 0 != tmp_num_samples) + /* in case the input is a FIFO (at least it's reproducible with + a FIFO) tmp_num_samples may be 0 and therefore remaining + would be 0, but we need to read some samples, so don't + change samples_to_read to the wrong value in this case */ + samples_to_read = remaining; + } + + if (is_mpeg_file_format(global_reader.input_format)) { + if (buffer != NULL) + samples_read = read_samples_mp3(gfp, global.music_in, buf_tmp16); + else + samples_read = read_samples_mp3(gfp, global.music_in, buffer16); + if (samples_read < 0) { + return samples_read; + } + } + else { + if (global.snd_file) { +#ifdef LIBSNDFILE + samples_read = sf_read_int(global.snd_file, insamp, num_channels * samples_to_read); +#else + samples_read = 0; +#endif + } + else { + samples_read = + read_samples_pcm(global.music_in, insamp, num_channels * samples_to_read); + } + if (samples_read < 0) { + return samples_read; + } + p = insamp + samples_read; + samples_read /= num_channels; + if (buffer != NULL) { /* output to int buffer */ + if (num_channels == 2) { + for (i = samples_read; --i >= 0;) { + buffer[1][i] = *--p; + buffer[0][i] = *--p; + } + } + else if (num_channels == 1) { + memset(buffer[1], 0, samples_read * sizeof(int)); + for (i = samples_read; --i >= 0;) { + buffer[0][i] = *--p; + } + } + else + assert(0); + } + else { /* convert from int; output to 16-bit buffer */ + if (num_channels == 2) { + for (i = samples_read; --i >= 0;) { + buffer16[1][i] = *--p >> (8 * sizeof(int) - 16); + buffer16[0][i] = *--p >> (8 * sizeof(int) - 16); + } + } + else if (num_channels == 1) { + memset(buffer16[1], 0, samples_read * sizeof(short)); + for (i = samples_read; --i >= 0;) { + buffer16[0][i] = *--p >> (8 * sizeof(int) - 16); + } + } + else + assert(0); + } + } + + /* LAME mp3 output 16bit - convert to int, if necessary */ + if (is_mpeg_file_format(global_reader.input_format)) { + if (buffer != NULL) { + for (i = samples_read; --i >= 0;) + buffer[0][i] = buf_tmp16[0][i] << (8 * sizeof(int) - 16); + if (num_channels == 2) { + for (i = samples_read; --i >= 0;) + buffer[1][i] = buf_tmp16[1][i] << (8 * sizeof(int) - 16); + } + else if (num_channels == 1) { + memset(buffer[1], 0, samples_read * sizeof(int)); + } + else + assert(0); + } + } + + + /* if ... then it is considered infinitely long. + Don't count the samples */ + if (global.count_samples_carefully) + global. num_samples_read += samples_read; + + return samples_read; +} + + + +static int +read_samples_mp3(lame_t gfp, FILE * musicin, short int mpg123pcm[2][1152]) +{ + int out; +#if defined(AMIGA_MPEGA) || defined(HAVE_MPGLIB) + int samplerate; + static const char type_name[] = "MP3 file"; + + out = lame_decode_fromfile(musicin, mpg123pcm[0], mpg123pcm[1], &global_decoder.mp3input_data); + /* + * out < 0: error, probably EOF + * out = 0: not possible with lame_decode_fromfile() ??? + * out > 0: number of output samples + */ + if (out < 0) { + memset(mpg123pcm, 0, sizeof(**mpg123pcm) * 2 * 1152); + return 0; + } + + if (lame_get_num_channels(gfp) != global_decoder.mp3input_data.stereo) { + if (global_ui_config.silent < 10) { + error_printf("Error: number of channels has changed in %s - not supported\n", + type_name); + } + out = -1; + } + samplerate = global_reader.input_samplerate; + if (samplerate == 0) { + samplerate = global_decoder.mp3input_data.samplerate; + } + if (lame_get_in_samplerate(gfp) != samplerate) { + if (global_ui_config.silent < 10) { + error_printf("Error: sample frequency has changed in %s - not supported\n", type_name); + } + out = -1; + } +#else + out = -1; +#endif + return out; +} + +static +int set_input_num_channels(lame_t gfp, int num_channels) +{ + if (gfp) { + if (-1 == lame_set_num_channels(gfp, num_channels)) { + if (global_ui_config.silent < 10) { + error_printf("Unsupported number of channels: %d\n", num_channels); + } + return 0; + } + } + return 1; +} + +static +int set_input_samplerate(lame_t gfp, int input_samplerate) +{ + if (gfp) { + int sr = global_reader.input_samplerate; + if (sr == 0) sr = input_samplerate; + if (-1 == lame_set_in_samplerate(gfp, sr)) { + if (global_ui_config.silent < 10) { + error_printf("Unsupported sample rate: %d\n", sr); + } + return 0; + } + } + return 1; +} + +int +WriteWaveHeader(FILE * const fp, int pcmbytes, int freq, int channels, int bits) +{ + int bytes = (bits + 7) / 8; + + /* quick and dirty, but documented */ + fwrite("RIFF", 1, 4, fp); /* label */ + write_32_bits_low_high(fp, pcmbytes + 44 - 8); /* length in bytes without header */ + fwrite("WAVEfmt ", 2, 4, fp); /* 2 labels */ + write_32_bits_low_high(fp, 2 + 2 + 4 + 4 + 2 + 2); /* length of PCM format declaration area */ + write_16_bits_low_high(fp, 1); /* is PCM? */ + write_16_bits_low_high(fp, channels); /* number of channels */ + write_32_bits_low_high(fp, freq); /* sample frequency in [Hz] */ + write_32_bits_low_high(fp, freq * channels * bytes); /* bytes per second */ + write_16_bits_low_high(fp, channels * bytes); /* bytes per sample time */ + write_16_bits_low_high(fp, bits); /* bits per sample */ + fwrite("data", 1, 4, fp); /* label */ + write_32_bits_low_high(fp, pcmbytes); /* length in bytes of raw PCM data */ + + return ferror(fp) ? -1 : 0; +} + + + + +#if defined(LIBSNDFILE) + +extern SNDFILE *sf_wchar_open(wchar_t const *wpath, int mode, SF_INFO * sfinfo); + +static SNDFILE * +open_snd_file(lame_t gfp, char const *inPath) +{ + char const *lpszFileName = inPath; + SNDFILE *gs_pSndFileIn = NULL; + SF_INFO gs_wfInfo; + + { +#if defined( _WIN32 ) && !defined(__MINGW32__) + wchar_t *file_name = utf8ToUnicode(lpszFileName); +#endif + /* Try to open the sound file */ + memset(&gs_wfInfo, 0, sizeof(gs_wfInfo)); +#if defined( _WIN32 ) && !defined(__MINGW32__) + gs_pSndFileIn = sf_wchar_open(file_name, SFM_READ, &gs_wfInfo); +#else + gs_pSndFileIn = sf_open(lpszFileName, SFM_READ, &gs_wfInfo); +#endif + + if (gs_pSndFileIn == NULL) { + if (global_raw_pcm.in_signed == 0 && global_raw_pcm.in_bitwidth != 8) { + error_printf("Unsigned input only supported with bitwidth 8\n"); +#if defined( _WIN32 ) && !defined(__MINGW32__) + free(file_name); +#endif + return 0; + } + /* set some defaults incase input is raw PCM */ + gs_wfInfo.seekable = (global_reader.input_format != sf_raw); /* if user specified -r, set to not seekable */ + gs_wfInfo.samplerate = lame_get_in_samplerate(gfp); + gs_wfInfo.channels = lame_get_num_channels(gfp); + gs_wfInfo.format = SF_FORMAT_RAW; + if ((global_raw_pcm.in_endian == ByteOrderLittleEndian) ^ (global_reader.swapbytes != + 0)) { + gs_wfInfo.format |= SF_ENDIAN_LITTLE; + } + else { + gs_wfInfo.format |= SF_ENDIAN_BIG; + } + switch (global_raw_pcm.in_bitwidth) { + case 8: + gs_wfInfo.format |= + global_raw_pcm.in_signed == 0 ? SF_FORMAT_PCM_U8 : SF_FORMAT_PCM_S8; + break; + case 16: + gs_wfInfo.format |= SF_FORMAT_PCM_16; + break; + case 24: + gs_wfInfo.format |= SF_FORMAT_PCM_24; + break; + case 32: + gs_wfInfo.format |= SF_FORMAT_PCM_32; + break; + default: + break; + } +#if defined( _WIN32 ) && !defined(__MINGW32__) + gs_pSndFileIn = sf_wchar_open(file_name, SFM_READ, &gs_wfInfo); +#else + gs_pSndFileIn = sf_open(lpszFileName, SFM_READ, &gs_wfInfo); +#endif + } +#if defined( _WIN32 ) && !defined(__MINGW32__) + free(file_name); +#endif + + /* Check result */ + if (gs_pSndFileIn == NULL) { + sf_perror(gs_pSndFileIn); + if (global_ui_config.silent < 10) { + error_printf("Could not open sound file \"%s\".\n", lpszFileName); + } + return 0; + } + sf_command(gs_pSndFileIn, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE); + + if ((gs_wfInfo.format & SF_FORMAT_RAW) == SF_FORMAT_RAW) { + global_reader.input_format = sf_raw; + } + +#ifdef _DEBUG_SND_FILE + printf("\n\nSF_INFO structure\n"); + printf("samplerate :%d\n", gs_wfInfo.samplerate); + printf("samples :%d\n", gs_wfInfo.frames); + printf("channels :%d\n", gs_wfInfo.channels); + printf("format :"); + + /* new formats from sbellon@sbellon.de 1/2000 */ + + switch (gs_wfInfo.format & SF_FORMAT_TYPEMASK) { + case SF_FORMAT_WAV: + printf("Microsoft WAV format (big endian). "); + break; + case SF_FORMAT_AIFF: + printf("Apple/SGI AIFF format (little endian). "); + break; + case SF_FORMAT_AU: + printf("Sun/NeXT AU format (big endian). "); + break; + /* + case SF_FORMAT_AULE: + DEBUGF("DEC AU format (little endian). "); + break; + */ + case SF_FORMAT_RAW: + printf("RAW PCM data. "); + break; + case SF_FORMAT_PAF: + printf("Ensoniq PARIS file format. "); + break; + case SF_FORMAT_SVX: + printf("Amiga IFF / SVX8 / SV16 format. "); + break; + case SF_FORMAT_NIST: + printf("Sphere NIST format. "); + break; + default: + assert(0); + break; + } + + switch (gs_wfInfo.format & SF_FORMAT_SUBMASK) { + /* + case SF_FORMAT_PCM: + DEBUGF("PCM data in 8, 16, 24 or 32 bits."); + break; + */ + case SF_FORMAT_FLOAT: + printf("32 bit Intel x86 floats."); + break; + case SF_FORMAT_ULAW: + printf("U-Law encoded."); + break; + case SF_FORMAT_ALAW: + printf("A-Law encoded."); + break; + case SF_FORMAT_IMA_ADPCM: + printf("IMA ADPCM."); + break; + case SF_FORMAT_MS_ADPCM: + printf("Microsoft ADPCM."); + break; + /* + case SF_FORMAT_PCM_BE: + DEBUGF("Big endian PCM data."); + break; + case SF_FORMAT_PCM_LE: + DEBUGF("Little endian PCM data."); + break; + */ + case SF_FORMAT_PCM_S8: + printf("Signed 8 bit PCM."); + break; + case SF_FORMAT_PCM_U8: + printf("Unsigned 8 bit PCM."); + break; + case SF_FORMAT_PCM_16: + printf("Signed 16 bit PCM."); + break; + case SF_FORMAT_PCM_24: + printf("Signed 24 bit PCM."); + break; + case SF_FORMAT_PCM_32: + printf("Signed 32 bit PCM."); + break; + /* + case SF_FORMAT_SVX_FIB: + DEBUGF("SVX Fibonacci Delta encoding."); + break; + case SF_FORMAT_SVX_EXP: + DEBUGF("SVX Exponential Delta encoding."); + break; + */ + default: + assert(0); + break; + } + + printf("\n"); + printf("sections :%d\n", gs_wfInfo.sections); + printf("seekable :%d\n", gs_wfInfo.seekable); +#endif + /* Check result */ + if (gs_pSndFileIn == NULL) { + sf_perror(gs_pSndFileIn); + if (global_ui_config.silent < 10) { + error_printf("Could not open sound file \"%s\".\n", lpszFileName); + } + return 0; + } + + + if(gs_wfInfo.frames >= 0 && gs_wfInfo.frames < (sf_count_t)(unsigned)MAX_U_32_NUM) + (void) lame_set_num_samples(gfp, gs_wfInfo.frames); + else + (void) lame_set_num_samples(gfp, MAX_U_32_NUM); + if (!set_input_num_channels(gfp, gs_wfInfo.channels)) { + sf_close(gs_pSndFileIn); + return 0; + } + if (!set_input_samplerate(gfp, gs_wfInfo.samplerate)) { + sf_close(gs_pSndFileIn); + return 0; + } + global. pcmbitwidth = 32; + } +#if 0 + if (lame_get_num_samples(gfp) == MAX_U_32_NUM) { + /* try to figure out num_samples */ + double const flen = lame_get_file_size(lpszFileName); + if (flen >= 0) { + /* try file size, assume 2 bytes per sample */ + lame_set_num_samples(gfp, flen / (2 * lame_get_num_channels(gfp))); + } + } +#endif + return gs_pSndFileIn; +} + +#endif /* defined(LIBSNDFILE) */ + + + +/************************************************************************ +unpack_read_samples - read and unpack signed low-to-high byte or unsigned + single byte input. (used for read_samples function) + Output integers are stored in the native byte order + (little or big endian). -jd + in: samples_to_read + bytes_per_sample + swap_order - set for high-to-low byte order input stream + i/o: pcm_in + out: sample_buffer (must be allocated up to samples_to_read upon call) +returns: number of samples read +*/ +static int +unpack_read_samples(const int samples_to_read, const int bytes_per_sample, + const int swap_order, int *sample_buffer, FILE * pcm_in) +{ + int samples_read; + int i; + int *op; /* output pointer */ + unsigned char *ip = (unsigned char *) sample_buffer; /* input pointer */ + const int b = sizeof(int) * 8; + + { + size_t samples_read_ = fread(sample_buffer, bytes_per_sample, samples_to_read, pcm_in); + assert( samples_read_ <= INT_MAX ); + samples_read = (int) samples_read_; + } + op = sample_buffer + samples_read; + +#define GA_URS_IFLOOP( ga_urs_bps ) \ + if( bytes_per_sample == ga_urs_bps ) \ + for( i = samples_read * bytes_per_sample; (i -= bytes_per_sample) >=0;) + + if (swap_order == 0) { + GA_URS_IFLOOP(1) + * --op = ip[i] << (b - 8); + GA_URS_IFLOOP(2) + * --op = ip[i] << (b - 16) | ip[i + 1] << (b - 8); + GA_URS_IFLOOP(3) + * --op = ip[i] << (b - 24) | ip[i + 1] << (b - 16) | ip[i + 2] << (b - 8); + GA_URS_IFLOOP(4) + * --op = + ip[i] << (b - 32) | ip[i + 1] << (b - 24) | ip[i + 2] << (b - 16) | ip[i + 3] << (b - + 8); + } + else { + GA_URS_IFLOOP(1) + * --op = (ip[i] ^ 0x80) << (b - 8) | 0x7f << (b - 16); /* convert from unsigned */ + GA_URS_IFLOOP(2) + * --op = ip[i] << (b - 8) | ip[i + 1] << (b - 16); + GA_URS_IFLOOP(3) + * --op = ip[i] << (b - 8) | ip[i + 1] << (b - 16) | ip[i + 2] << (b - 24); + GA_URS_IFLOOP(4) + * --op = + ip[i] << (b - 8) | ip[i + 1] << (b - 16) | ip[i + 2] << (b - 24) | ip[i + 3] << (b - + 32); + } +#undef GA_URS_IFLOOP + if (global.pcm_is_ieee_float) { + ieee754_float32_t const m_max = INT_MAX; + ieee754_float32_t const m_min = -(ieee754_float32_t) INT_MIN; + ieee754_float32_t *x = (ieee754_float32_t *) sample_buffer; + assert(sizeof(ieee754_float32_t) == sizeof(int)); + for (i = 0; i < samples_to_read; ++i) { + ieee754_float32_t const u = x[i]; + int v; + if (u >= 1) { + v = INT_MAX; + } + else if (u <= -1) { + v = INT_MIN; + } + else if (u >= 0) { + v = (int) (u * m_max + 0.5f); + } + else { + v = (int) (u * m_min - 0.5f); + } + sample_buffer[i] = v; + } + } + return (samples_read); +} + + + +/************************************************************************ +* +* read_samples() +* +* PURPOSE: reads the PCM samples from a file to the buffer +* +* SEMANTICS: +* Reads #samples_read# number of shorts from #musicin# filepointer +* into #sample_buffer[]#. Returns the number of samples read. +* +************************************************************************/ + +static int +read_samples_pcm(FILE * musicin, int sample_buffer[2304], int samples_to_read) +{ + int samples_read; + int bytes_per_sample = global.pcmbitwidth / 8; + int swap_byte_order; /* byte order of input stream */ + + switch (global.pcmbitwidth) { + case 32: + case 24: + case 16: + if (global_raw_pcm.in_signed == 0) { + if (global_ui_config.silent < 10) { + error_printf("Unsigned input only supported with bitwidth 8\n"); + } + return -1; + } + swap_byte_order = (global_raw_pcm.in_endian != ByteOrderLittleEndian) ? 1 : 0; + if (global.pcmswapbytes) { + swap_byte_order = !swap_byte_order; + } + break; + + case 8: + swap_byte_order = global.pcm_is_unsigned_8bit; + break; + + default: + if (global_ui_config.silent < 10) { + error_printf("Only 8, 16, 24 and 32 bit input files supported \n"); + } + return -1; + } + if (samples_to_read < 0 || samples_to_read > 2304) { + if (global_ui_config.silent < 10) { + error_printf("Error: unexpected number of samples to read: %d\n", samples_to_read); + } + return -1; + } + samples_read = unpack_read_samples(samples_to_read, bytes_per_sample, swap_byte_order, + sample_buffer, musicin); + if (ferror(musicin)) { + if (global_ui_config.silent < 10) { + error_printf("Error reading input file\n"); + } + return -1; + } + + return samples_read; +} + + + +/* AIFF Definitions */ + +static int const IFF_ID_FORM = 0x464f524d; /* "FORM" */ +static int const IFF_ID_AIFF = 0x41494646; /* "AIFF" */ +static int const IFF_ID_AIFC = 0x41494643; /* "AIFC" */ +static int const IFF_ID_COMM = 0x434f4d4d; /* "COMM" */ +static int const IFF_ID_SSND = 0x53534e44; /* "SSND" */ +static int const IFF_ID_MPEG = 0x4d504547; /* "MPEG" */ + +static int const IFF_ID_NONE = 0x4e4f4e45; /* "NONE" *//* AIFF-C data format */ +static int const IFF_ID_2CBE = 0x74776f73; /* "twos" *//* AIFF-C data format */ +static int const IFF_ID_2CLE = 0x736f7774; /* "sowt" *//* AIFF-C data format */ + +static int const WAV_ID_RIFF = 0x52494646; /* "RIFF" */ +static int const WAV_ID_WAVE = 0x57415645; /* "WAVE" */ +static int const WAV_ID_FMT = 0x666d7420; /* "fmt " */ +static int const WAV_ID_DATA = 0x64617461; /* "data" */ + +#ifndef WAVE_FORMAT_PCM +static short const WAVE_FORMAT_PCM = 0x0001; +#endif +#ifndef WAVE_FORMAT_IEEE_FLOAT +static short const WAVE_FORMAT_IEEE_FLOAT = 0x0003; +#endif +#ifndef WAVE_FORMAT_EXTENSIBLE +static short const WAVE_FORMAT_EXTENSIBLE = 0xFFFE; +#endif + + +static long +make_even_number_of_bytes_in_length(long x) +{ + if ((x & 0x01) != 0) { + return x + 1; + } + return x; +} + + +/***************************************************************************** + * + * Read Microsoft Wave headers + * + * By the time we get here the first 32-bits of the file have already been + * read, and we're pretty sure that we're looking at a WAV file. + * + *****************************************************************************/ + +static int +parse_wave_header(lame_global_flags * gfp, FILE * sf) +{ + int format_tag = 0; + int channels = 0; + int bits_per_sample = 0; + int samples_per_sec = 0; + + + int is_wav = 0; + unsigned long data_length = 0, subSize = 0; + int loop_sanity = 0; + + (void) read_32_bits_high_low(sf); /* file_length */ + if (read_32_bits_high_low(sf) != WAV_ID_WAVE) + return -1; + + for (loop_sanity = 0; loop_sanity < 20; ++loop_sanity) { + int type = read_32_bits_high_low(sf); + + if (type == WAV_ID_FMT) { + subSize = read_32_bits_low_high(sf); + subSize = make_even_number_of_bytes_in_length(subSize); + if (subSize < 16) { + /*DEBUGF( + "'fmt' chunk too short (only %ld bytes)!", subSize); */ + return -1; + } + + format_tag = read_16_bits_low_high(sf); + subSize -= 2; + channels = read_16_bits_low_high(sf); + subSize -= 2; + samples_per_sec = read_32_bits_low_high(sf); + subSize -= 4; + (void) read_32_bits_low_high(sf); /* avg_bytes_per_sec */ + subSize -= 4; + (void) read_16_bits_low_high(sf); /* block_align */ + subSize -= 2; + bits_per_sample = read_16_bits_low_high(sf); + subSize -= 2; + + /* WAVE_FORMAT_EXTENSIBLE support */ + if ((subSize > 9) && (format_tag == WAVE_FORMAT_EXTENSIBLE)) { + read_16_bits_low_high(sf); /* cbSize */ + read_16_bits_low_high(sf); /* ValidBitsPerSample */ + read_32_bits_low_high(sf); /* ChannelMask */ + /* SubType coincident with format_tag for PCM int or float */ + format_tag = read_16_bits_low_high(sf); + subSize -= 10; + } + + /* DEBUGF(" skipping %d bytes\n", subSize); */ + + if (subSize > 0) { + if (fskip(sf, (long) subSize, SEEK_CUR) != 0) + return -1; + }; + + } + else if (type == WAV_ID_DATA) { + subSize = read_32_bits_low_high(sf); + data_length = subSize; + is_wav = 1; + /* We've found the audio data. Read no further! */ + break; + + } + else { + subSize = read_32_bits_low_high(sf); + subSize = make_even_number_of_bytes_in_length(subSize); + if (fskip(sf, (long) subSize, SEEK_CUR) != 0) { + return -1; + } + } + } + if (is_wav) { + if (format_tag == 0x0050 || format_tag == 0x0055) { + return sf_mp123; + } + if (format_tag != WAVE_FORMAT_PCM && format_tag != WAVE_FORMAT_IEEE_FLOAT) { + if (global_ui_config.silent < 10) { + error_printf("Unsupported data format: 0x%04X\n", format_tag); + } + return 0; /* oh no! non-supported format */ + } + + + /* make sure the header is sane */ + if (!set_input_num_channels(gfp, channels)) + return 0; + if (!set_input_samplerate(gfp, samples_per_sec)) + return 0; + /* avoid division by zero */ + if (bits_per_sample < 1) { + if (global_ui_config.silent < 10) + error_printf("Unsupported bits per sample: %d\n", bits_per_sample); + return -1; + } + global. pcmbitwidth = bits_per_sample; + global. pcm_is_unsigned_8bit = 1; + global. pcm_is_ieee_float = (format_tag == WAVE_FORMAT_IEEE_FLOAT ? 1 : 0); + if (data_length == MAX_U_32_NUM) + (void) lame_set_num_samples(gfp, MAX_U_32_NUM); + else + (void) lame_set_num_samples(gfp, data_length / (channels * ((bits_per_sample + 7) / 8))); + return 1; + } + return -1; +} + + + +/************************************************************************ +* aiff_check2 +* +* PURPOSE: Checks AIFF header information to make sure it is valid. +* returns 0 on success, 1 on errors +************************************************************************/ + +static int +aiff_check2(IFF_AIFF * const pcm_aiff_data) +{ + if (pcm_aiff_data->sampleType != (unsigned long) IFF_ID_SSND) { + if (global_ui_config.silent < 10) { + error_printf("ERROR: input sound data is not PCM\n"); + } + return 1; + } + switch (pcm_aiff_data->sampleSize) { + case 32: + case 24: + case 16: + case 8: + break; + default: + if (global_ui_config.silent < 10) { + error_printf("ERROR: input sound data is not 8, 16, 24 or 32 bits\n"); + } + return 1; + } + if (pcm_aiff_data->numChannels != 1 && pcm_aiff_data->numChannels != 2) { + if (global_ui_config.silent < 10) { + error_printf("ERROR: input sound data is not mono or stereo\n"); + } + return 1; + } + if (pcm_aiff_data->blkAlgn.blockSize != 0) { + if (global_ui_config.silent < 10) { + error_printf("ERROR: block size of input sound data is not 0 bytes\n"); + } + return 1; + } + /* A bug, since we correctly skip the offset earlier in the code. + if (pcm_aiff_data->blkAlgn.offset != 0) { + error_printf("Block offset is not 0 bytes in '%s'\n", file_name); + return 1; + } */ + + return 0; +} + + +/***************************************************************************** + * + * Read Audio Interchange File Format (AIFF) headers. + * + * By the time we get here the first 32 bits of the file have already been + * read, and we're pretty sure that we're looking at an AIFF file. + * + *****************************************************************************/ + +static int +parse_aiff_header(lame_global_flags * gfp, FILE * sf) +{ + long chunkSize = 0, subSize = 0, typeID = 0, dataType = IFF_ID_NONE; + IFF_AIFF aiff_info; + int seen_comm_chunk = 0, seen_ssnd_chunk = 0; + long pcm_data_pos = -1; + + memset(&aiff_info, 0, sizeof(aiff_info)); + chunkSize = read_32_bits_high_low(sf); + + typeID = read_32_bits_high_low(sf); + if ((typeID != IFF_ID_AIFF) && (typeID != IFF_ID_AIFC)) + return -1; + + while (chunkSize > 0) { + long ckSize; + int type = read_32_bits_high_low(sf); + chunkSize -= 4; + + /* DEBUGF( + "found chunk type %08x '%4.4s'\n", type, (char*)&type); */ + + /* don't use a switch here to make it easier to use 'break' for SSND */ + if (type == IFF_ID_COMM) { + seen_comm_chunk = seen_ssnd_chunk + 1; + subSize = read_32_bits_high_low(sf); + ckSize = make_even_number_of_bytes_in_length(subSize); + chunkSize -= ckSize; + + aiff_info.numChannels = (short) read_16_bits_high_low(sf); + ckSize -= 2; + aiff_info.numSampleFrames = read_32_bits_high_low(sf); + ckSize -= 4; + aiff_info.sampleSize = (short) read_16_bits_high_low(sf); + ckSize -= 2; + aiff_info.sampleRate = read_ieee_extended_high_low(sf); + ckSize -= 10; + if (typeID == IFF_ID_AIFC) { + dataType = read_32_bits_high_low(sf); + ckSize -= 4; + } + if (fskip(sf, ckSize, SEEK_CUR) != 0) + return -1; + } + else if (type == IFF_ID_SSND) { + seen_ssnd_chunk = 1; + subSize = read_32_bits_high_low(sf); + ckSize = make_even_number_of_bytes_in_length(subSize); + chunkSize -= ckSize; + + aiff_info.blkAlgn.offset = read_32_bits_high_low(sf); + ckSize -= 4; + aiff_info.blkAlgn.blockSize = read_32_bits_high_low(sf); + ckSize -= 4; + + aiff_info.sampleType = IFF_ID_SSND; + + if (seen_comm_chunk > 0) { + if (fskip(sf, (long) aiff_info.blkAlgn.offset, SEEK_CUR) != 0) + return -1; + /* We've found the audio data. Read no further! */ + break; + } + pcm_data_pos = ftell(sf); + if (pcm_data_pos >= 0) { + pcm_data_pos += aiff_info.blkAlgn.offset; + } + if (fskip(sf, ckSize, SEEK_CUR) != 0) + return -1; + } + else { + subSize = read_32_bits_high_low(sf); + ckSize = make_even_number_of_bytes_in_length(subSize); + chunkSize -= ckSize; + + if (fskip(sf, ckSize, SEEK_CUR) != 0) + return -1; + } + } + if (dataType == IFF_ID_2CLE) { + global. pcmswapbytes = global_reader.swapbytes; + } + else if (dataType == IFF_ID_2CBE) { + global. pcmswapbytes = !global_reader.swapbytes; + } + else if (dataType == IFF_ID_NONE) { + global. pcmswapbytes = !global_reader.swapbytes; + } + else { + return -1; + } + + /* DEBUGF("Parsed AIFF %d\n", is_aiff); */ + if (seen_comm_chunk && (seen_ssnd_chunk > 0 || aiff_info.numSampleFrames == 0)) { + /* make sure the header is sane */ + if (0 != aiff_check2(&aiff_info)) + return 0; + if (!set_input_num_channels(gfp, aiff_info.numChannels)) + return 0; + if (!set_input_samplerate(gfp, (int) aiff_info.sampleRate)) + return 0; + (void) lame_set_num_samples(gfp, aiff_info.numSampleFrames); + global. pcmbitwidth = aiff_info.sampleSize; + global. pcm_is_unsigned_8bit = 0; + global. pcm_is_ieee_float = 0; /* FIXME: possible ??? */ + if (pcm_data_pos >= 0) { + if (fseek(sf, pcm_data_pos, SEEK_SET) != 0) { + if (global_ui_config.silent < 10) { + error_printf("Can't rewind stream to audio data position\n"); + } + return 0; + } + } + + return 1; + } + return -1; +} + + + +/************************************************************************ +* +* parse_file_header +* +* PURPOSE: Read the header from a bytestream. Try to determine whether +* it's a WAV file or AIFF without rewinding, since rewind +* doesn't work on pipes and there's a good chance we're reading +* from stdin (otherwise we'd probably be using libsndfile). +* +* When this function returns, the file offset will be positioned at the +* beginning of the sound data. +* +************************************************************************/ + +static int +parse_file_header(lame_global_flags * gfp, FILE * sf) +{ + + int type = read_32_bits_high_low(sf); + /* + DEBUGF( + "First word of input stream: %08x '%4.4s'\n", type, (char*) &type); + */ + global. count_samples_carefully = 0; + global. pcm_is_unsigned_8bit = global_raw_pcm.in_signed == 1 ? 0 : 1; + /*global_reader.input_format = sf_raw; commented out, because it is better to fail + here as to encode some hundreds of input files not supported by LAME + If you know you have RAW PCM data, use the -r switch + */ + + if (type == WAV_ID_RIFF) { + /* It's probably a WAV file */ + int const ret = parse_wave_header(gfp, sf); + if (ret == sf_mp123) { + global. count_samples_carefully = 1; + return sf_mp123; + } + if (ret > 0) { + if (lame_get_num_samples(gfp) == MAX_U_32_NUM || global_reader.ignorewavlength == 1) + { + global. count_samples_carefully = 0; + lame_set_num_samples(gfp, MAX_U_32_NUM); + } + else + global. count_samples_carefully = 1; + return sf_wave; + } + if (ret < 0) { + if (global_ui_config.silent < 10) { + error_printf("Warning: corrupt or unsupported WAVE format\n"); + } + } + } + else if (type == IFF_ID_FORM) { + /* It's probably an AIFF file */ + int const ret = parse_aiff_header(gfp, sf); + if (ret > 0) { + global. count_samples_carefully = 1; + return sf_aiff; + } + if (ret < 0) { + if (global_ui_config.silent < 10) { + error_printf("Warning: corrupt or unsupported AIFF format\n"); + } + } + } + else { + if (global_ui_config.silent < 10) { + error_printf("Warning: unsupported audio format\n"); + } + } + return sf_unknown; +} + + +static int +open_mpeg_file_part2(lame_t gfp, FILE* musicin, char const *inPath, int *enc_delay, int *enc_padding) +{ +#ifdef HAVE_MPGLIB + if (-1 == lame_decode_initfile(musicin, &global_decoder.mp3input_data, enc_delay, enc_padding)) { + if (global_ui_config.silent < 10) { + error_printf("Error reading headers in mp3 input file %s.\n", inPath); + } + return 0; + } +#endif + if (!set_input_num_channels(gfp, global_decoder.mp3input_data.stereo)) { + return 0; + } + if (!set_input_samplerate(gfp, global_decoder.mp3input_data.samplerate)) { + return 0; + } + (void) lame_set_num_samples(gfp, global_decoder.mp3input_data.nsamp); + return 1; +} + + +static FILE * +open_wave_file(lame_t gfp, char const *inPath, int *enc_delay, int *enc_padding) +{ + FILE *musicin; + + /* set the defaults from info incase we cannot determine them from file */ + lame_set_num_samples(gfp, MAX_U_32_NUM); + + if (!strcmp(inPath, "-")) { + lame_set_stream_binary_mode(musicin = stdin); /* Read from standard input. */ + } + else { + if ((musicin = lame_fopen(inPath, "rb")) == NULL) { + if (global_ui_config.silent < 10) { + error_printf("Could not find \"%s\".\n", inPath); + } + return 0; + } + } + + if (global_reader.input_format == sf_ogg) { + if (global_ui_config.silent < 10) { + error_printf("sorry, vorbis support in LAME is deprecated.\n"); + } + close_input_file(musicin); + return 0; + } + else if (global_reader.input_format == sf_raw) { + /* assume raw PCM */ + if (global_ui_config.silent < 9) { + console_printf("Assuming raw pcm input file"); + if (global_reader.swapbytes) + console_printf(" : Forcing byte-swapping\n"); + else + console_printf("\n"); + } + global. pcmswapbytes = global_reader.swapbytes; + } + else { + global_reader.input_format = parse_file_header(gfp, musicin); + } + if (global_reader.input_format == sf_mp123) { + if (open_mpeg_file_part2(gfp, musicin, inPath, enc_delay, enc_padding)) + return musicin; + close_input_file(musicin); + return 0; + } + if (global_reader.input_format == sf_unknown) { + close_input_file(musicin); + return 0; + } + + if (lame_get_num_samples(gfp) == MAX_U_32_NUM && musicin != stdin) { + int const tmp_num_channels = lame_get_num_channels(gfp); + double const flen = lame_get_file_size(musicin); /* try to figure out num_samples */ + if (flen >= 0 && tmp_num_channels > 0 ) { + /* try file size, assume 2 bytes per sample */ + unsigned long fsize = (unsigned long) (flen / (2 * tmp_num_channels)); + (void) lame_set_num_samples(gfp, fsize); + global. count_samples_carefully = 0; + } + } + return musicin; +} + + + +static FILE * +open_mpeg_file(lame_t gfp, char const *inPath, int *enc_delay, int *enc_padding) +{ + FILE *musicin; + + /* set the defaults from info incase we cannot determine them from file */ + lame_set_num_samples(gfp, MAX_U_32_NUM); + + if (strcmp(inPath, "-") == 0) { + musicin = stdin; + lame_set_stream_binary_mode(musicin); /* Read from standard input. */ + } + else { + musicin = lame_fopen(inPath, "rb"); + if (musicin == NULL) { + if (global_ui_config.silent < 10) { + error_printf("Could not find \"%s\".\n", inPath); + } + return 0; + } + } +#ifdef AMIGA_MPEGA + if (-1 == lame_decode_initfile(inPath, &global_decoder.mp3input_data)) { + if (global_ui_config.silent < 10) { + error_printf("Error reading headers in mp3 input file %s.\n", inPath); + } + close_input_file(musicin); + return 0; + } +#endif + if ( 0 == open_mpeg_file_part2(gfp, musicin, inPath, enc_delay, enc_padding) ) { + close_input_file(musicin); + return 0; + } + if (lame_get_num_samples(gfp) == MAX_U_32_NUM && musicin != stdin) { + double flen = lame_get_file_size(musicin); /* try to figure out num_samples */ + if (flen >= 0) { + /* try file size, assume 2 bytes per sample */ + if (global_decoder.mp3input_data.bitrate > 0) { + double totalseconds = + (flen * 8.0 / (1000.0 * global_decoder.mp3input_data.bitrate)); + unsigned long tmp_num_samples = + (unsigned long) (totalseconds * lame_get_in_samplerate(gfp)); + + (void) lame_set_num_samples(gfp, tmp_num_samples); + global_decoder.mp3input_data.nsamp = tmp_num_samples; + global. count_samples_carefully = 0; + } + } + } + return musicin; +} + + +static int +close_input_file(FILE * musicin) +{ + int ret = 0; + + if (musicin != stdin && musicin != 0) { + ret = fclose(musicin); + } + if (ret != 0) { + if (global_ui_config.silent < 10) { + error_printf("Could not close audio input file\n"); + } + } + return ret; +} + + + +#if defined(HAVE_MPGLIB) +static int +check_aid(const unsigned char *header) +{ + return 0 == memcmp(header, "AiD\1", 4); +} + +/* + * Please check this and don't kill me if there's a bug + * This is a (nearly?) complete header analysis for a MPEG-1/2/2.5 Layer I, II or III + * data stream + */ + +static int +is_syncword_mp123(const void *const headerptr) +{ + const unsigned char *const p = headerptr; + static const char abl2[16] = { 0, 7, 7, 7, 0, 7, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8 }; + + if ((p[0] & 0xFF) != 0xFF) + return 0; /* first 8 bits must be '1' */ + if ((p[1] & 0xE0) != 0xE0) + return 0; /* next 3 bits are also */ + if ((p[1] & 0x18) == 0x08) + return 0; /* no MPEG-1, -2 or -2.5 */ + switch (p[1] & 0x06) { + default: + case 0x00: /* illegal Layer */ + return 0; + + case 0x02: /* Layer3 */ + if (global_reader.input_format != sf_mp3 && global_reader.input_format != sf_mp123) { + return 0; + } + global_reader.input_format = sf_mp3; + break; + + case 0x04: /* Layer2 */ + if (global_reader.input_format != sf_mp2 && global_reader.input_format != sf_mp123) { + return 0; + } + global_reader.input_format = sf_mp2; + break; + + case 0x06: /* Layer1 */ + if (global_reader.input_format != sf_mp1 && global_reader.input_format != sf_mp123) { + return 0; + } + global_reader.input_format = sf_mp1; + break; + } + if ((p[1] & 0x06) == 0x00) + return 0; /* no Layer I, II and III */ + if ((p[2] & 0xF0) == 0xF0) + return 0; /* bad bitrate */ + if ((p[2] & 0x0C) == 0x0C) + return 0; /* no sample frequency with (32,44.1,48)/(1,2,4) */ + if ((p[1] & 0x18) == 0x18 && (p[1] & 0x06) == 0x04 && abl2[p[2] >> 4] & (1 << (p[3] >> 6))) + return 0; + if ((p[3] & 3) == 2) + return 0; /* reserved enphasis mode */ + return 1; +} + +static size_t +lenOfId3v2Tag(unsigned char const* buf) +{ + unsigned int b0 = buf[0] & 127; + unsigned int b1 = buf[1] & 127; + unsigned int b2 = buf[2] & 127; + unsigned int b3 = buf[3] & 127; + return (((((b0 << 7) + b1) << 7) + b2) << 7) + b3; +} + +int +lame_decode_initfile(FILE * fd, mp3data_struct * mp3data, int *enc_delay, int *enc_padding) +{ + /* VBRTAGDATA pTagData; */ + /* int xing_header,len2,num_frames; */ + unsigned char buf[100]; + int ret; + size_t len; + int aid_header; + short int pcm_l[1152], pcm_r[1152]; + int freeformat = 0; + + memset(mp3data, 0, sizeof(mp3data_struct)); + if (global.hip) { + hip_decode_exit(global.hip); + } + global. hip = hip_decode_init(); + hip_set_msgf(global.hip, global_ui_config.silent < 10 ? &frontend_msgf : 0); + hip_set_errorf(global.hip, global_ui_config.silent < 10 ? &frontend_errorf : 0); + hip_set_debugf(global.hip, &frontend_debugf); + + len = 4; + if (fread(buf, 1, len, fd) != len) + return -1; /* failed */ + while (buf[0] == 'I' && buf[1] == 'D' && buf[2] == '3') { + len = 6; + if (fread(&buf[4], 1, len, fd) != len) + return -1; /* failed */ + len = lenOfId3v2Tag(&buf[6]); + if (global.in_id3v2_size < 1) { + global.in_id3v2_size = 10 + len; + global.in_id3v2_tag = malloc(global.in_id3v2_size); + if (global.in_id3v2_tag) { + memcpy(global.in_id3v2_tag, buf, 10); + if (fread(&global.in_id3v2_tag[10], 1, len, fd) != len) + return -1; /* failed */ + len = 0; /* copied, nothing to skip */ + } + else { + global.in_id3v2_size = 0; + } + } + assert( len <= LONG_MAX ); + fskip(fd, (long) len, SEEK_CUR); + len = 4; + if (fread(&buf, 1, len, fd) != len) + return -1; /* failed */ + } + aid_header = check_aid(buf); + if (aid_header) { + if (fread(&buf, 1, 2, fd) != 2) + return -1; /* failed */ + aid_header = (unsigned char) buf[0] + 256 * (unsigned char) buf[1]; + if (global_ui_config.silent < 9) { + console_printf("Album ID found. length=%i \n", aid_header); + } + /* skip rest of AID, except for 6 bytes we have already read */ + fskip(fd, aid_header - 6, SEEK_CUR); + + /* read 4 more bytes to set up buffer for MP3 header check */ + if (fread(&buf, 1, len, fd) != len) + return -1; /* failed */ + } + len = 4; + while (!is_syncword_mp123(buf)) { + unsigned int i; + for (i = 0; i < len - 1; i++) + buf[i] = buf[i + 1]; + if (fread(buf + len - 1, 1, 1, fd) != 1) + return -1; /* failed */ + } + + if ((buf[2] & 0xf0) == 0) { + if (global_ui_config.silent < 9) { + console_printf("Input file is freeformat.\n"); + } + freeformat = 1; + } + /* now parse the current buffer looking for MP3 headers. */ + /* (as of 11/00: mpglib modified so that for the first frame where */ + /* headers are parsed, no data will be decoded. */ + /* However, for freeformat, we need to decode an entire frame, */ + /* so mp3data->bitrate will be 0 until we have decoded the first */ + /* frame. Cannot decode first frame here because we are not */ + /* yet prepared to handle the output. */ + ret = hip_decode1_headersB(global.hip, buf, len, pcm_l, pcm_r, mp3data, enc_delay, enc_padding); + if (-1 == ret) + return -1; + + /* repeat until we decode a valid mp3 header. */ + while (!mp3data->header_parsed) { + len = fread(buf, 1, sizeof(buf), fd); + if (len != sizeof(buf)) + return -1; + ret = + hip_decode1_headersB(global.hip, buf, len, pcm_l, pcm_r, mp3data, enc_delay, + enc_padding); + if (-1 == ret) + return -1; + } + + if (mp3data->bitrate == 0 && !freeformat) { + if (global_ui_config.silent < 10) { + error_printf("fail to sync...\n"); + } + return lame_decode_initfile(fd, mp3data, enc_delay, enc_padding); + } + + if (mp3data->totalframes > 0) { + /* mpglib found a Xing VBR header and computed nsamp & totalframes */ + } + else { + /* set as unknown. Later, we will take a guess based on file size + * ant bitrate */ + mp3data->nsamp = MAX_U_32_NUM; + } + + + /* + report_printf("ret = %i NEED_MORE=%i \n",ret,MP3_NEED_MORE); + report_printf("stereo = %i \n",mp.fr.stereo); + report_printf("samp = %i \n",freqs[mp.fr.sampling_frequency]); + report_printf("framesize = %i \n",framesize); + report_printf("bitrate = %i \n",mp3data->bitrate); + report_printf("num frames = %ui \n",num_frames); + report_printf("num samp = %ui \n",mp3data->nsamp); + report_printf("mode = %i \n",mp.fr.mode); + */ + + return 0; +} + +/* +For lame_decode_fromfile: return code + -1 error + n number of samples output. either 576 or 1152 depending on MP3 file. + + +For lame_decode1_headers(): return code + -1 error + 0 ok, but need more data before outputing any samples + n number of samples output. either 576 or 1152 depending on MP3 file. +*/ +static int +lame_decode_fromfile(FILE * fd, short pcm_l[], short pcm_r[], mp3data_struct * mp3data) +{ + int ret = 0; + size_t len = 0; + unsigned char buf[1024]; + + /* first see if we still have data buffered in the decoder: */ + ret = hip_decode1_headers(global.hip, buf, len, pcm_l, pcm_r, mp3data); + if (ret != 0) + return ret; + + + /* read until we get a valid output frame */ + for (;;) { + len = fread(buf, 1, 1024, fd); + if (len == 0) { + /* we are done reading the file, but check for buffered data */ + ret = hip_decode1_headers(global.hip, buf, len, pcm_l, pcm_r, mp3data); + if (ret <= 0) { + return -1; /* done with file */ + } + break; + } + + ret = hip_decode1_headers(global.hip, buf, len, pcm_l, pcm_r, mp3data); + if (ret == -1) { + return -1; + } + if (ret > 0) + break; + } + return ret; +} +#endif /* defined(HAVE_MPGLIB) */ + + +int +is_mpeg_file_format(int input_file_format) +{ + switch (input_file_format) { + case sf_mp1: + return 1; + case sf_mp2: + return 2; + case sf_mp3: + return 3; + case sf_mp123: + return -1; + default: + break; + } + return 0; +} + + +#define LOW__BYTE(x) (x & 0x00ff) +#define HIGH_BYTE(x) ((x >> 8) & 0x00ff) + +void +put_audio16(FILE * outf, short Buffer[2][1152], int iread, int nch) +{ + char data[2 * 1152 * 2]; + int i, m = 0; + + if (global_decoder.disable_wav_header && global_reader.swapbytes) { + if (nch == 1) { + for (i = 0; i < iread; i++) { + short x = Buffer[0][i]; + /* write 16 Bits High Low */ + data[m++] = HIGH_BYTE(x); + data[m++] = LOW__BYTE(x); + } + } + else { + for (i = 0; i < iread; i++) { + short x = Buffer[0][i], y = Buffer[1][i]; + /* write 16 Bits High Low */ + data[m++] = HIGH_BYTE(x); + data[m++] = LOW__BYTE(x); + /* write 16 Bits High Low */ + data[m++] = HIGH_BYTE(y); + data[m++] = LOW__BYTE(y); + } + } + } + else { + if (nch == 1) { + for (i = 0; i < iread; i++) { + short x = Buffer[0][i]; + /* write 16 Bits Low High */ + data[m++] = LOW__BYTE(x); + data[m++] = HIGH_BYTE(x); + } + } + else { + for (i = 0; i < iread; i++) { + short x = Buffer[0][i], y = Buffer[1][i]; + /* write 16 Bits Low High */ + data[m++] = LOW__BYTE(x); + data[m++] = HIGH_BYTE(x); + /* write 16 Bits Low High */ + data[m++] = LOW__BYTE(y); + data[m++] = HIGH_BYTE(y); + } + } + } + if (m > 0) { + fwrite(data, 1, m, outf); + } + if (global_writer.flush_write == 1) { + fflush(outf); + } +} + +hip_t +get_hip(void) +{ + return global.hip; +} + +size_t +sizeOfOldTag(lame_t gf) +{ + (void) gf; + return global.in_id3v2_size; +} + +unsigned char* +getOldTag(lame_t gf) +{ + (void) gf; + return global.in_id3v2_tag; +} + +/* end of get_audio.c */ diff --git a/frontend/get_audio.h b/frontend/get_audio.h new file mode 100644 index 0000000..028ca6b --- /dev/null +++ b/frontend/get_audio.h @@ -0,0 +1,90 @@ +/* + * Get Audio routines include file + * + * Copyright (c) 1999 Albert L Faber + * 2010 Robert Hegemann + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + + +#ifndef LAME_GET_AUDIO_H +#define LAME_GET_AUDIO_H +#include "lame.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum sound_file_format_e { + sf_unknown, + sf_raw, + sf_wave, + sf_aiff, + sf_mp1, /* MPEG Layer 1, aka mpg */ + sf_mp2, /* MPEG Layer 2 */ + sf_mp3, /* MPEG Layer 3 */ + sf_mp123, /* MPEG Layer 1,2 or 3; whatever .mp3, .mp2, .mp1 or .mpg contains */ + sf_ogg +} sound_file_format; + +int is_mpeg_file_format( int input_format ); + +int init_infile(lame_t gfp, char const * inPath); +int samples_to_skip_at_start(void); +int samples_to_skip_at_end(void); +void close_infile(void); +int get_audio(lame_t gfp, int buffer[2][1152]); +int get_audio16(lame_t gfp, short buffer[2][1152]); +int get_audio_float(lame_t gfp, float buffer[2][1152]); +int get_audio_double(lame_t gfp, double buffer[2][1152]); +hip_t get_hip(void); + +FILE *init_outfile(char const *outPath, int decode); +int WriteWaveHeader(FILE * const fp, int pcmbytes, int freq, int channels, int bits); +void put_audio16(FILE* outf, short Buffer[2][1152], int iread, int nch); + +/* +struct AudioReader; +typedef struct AudioReader* AudioReader; + +AudioReader ar_open(lame_t gfp, char const* inPath); +int ar_samplesToSkipAtStart(AudioReader ar); +int ar_samplesToSkipAtEnd(AudioReader ar); +void ar_close(AudioReader ar); +int ar_readInt(AudioReader ar, lame_t gfp, int buffer[2][1152]); +int ar_readShort(AudioReader ar, lame_t gfp, short buffer[2][1152]); +int ar_readFloat(AudioReader ar, lame_t gfp, float buffer[2][1152]); + +struct AudioWriter; +typedef struct AudioWriter* AudioWriter; + +AudioWriter aw_open(lame_t gfp, char const* outPath, int pcmbystes, int freq, int channels, int bits); +int aw_writeWaveHeader(AudioWriter aw); +int aw_write(AudioWriter aw, short buffer[2][1152], int n); +int aw_write(AudioWriter aw, float buffer[2][1152], int n); + +*/ + +extern size_t sizeOfOldTag(lame_t gf); +extern unsigned char* getOldTag(lame_t gf); + +#ifdef _cplusplus +} +#endif + +#endif /* ifndef LAME_GET_AUDIO_H */ diff --git a/frontend/gpkplotting.c b/frontend/gpkplotting.c new file mode 100644 index 0000000..d90877b --- /dev/null +++ b/frontend/gpkplotting.c @@ -0,0 +1,331 @@ +/* + * GTK plotting routines source file + * + * Copyright (c) 1999 Mark Taylor + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* $Id: gpkplotting.c,v 1.12 2011/05/07 16:05:17 rbrito Exp $ */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "gpkplotting.h" + +#ifdef STDC_HEADERS +# include +#else +# ifndef HAVE_STRCHR +# define strchr index +# define strrchr rindex +# endif +char *strchr(), *strrchr(); +# ifndef HAVE_MEMCPY +# define memcpy(d, s, n) bcopy ((s), (d), (n)) +# define memmove(d, s, n) bcopy ((s), (d), (n)) +# endif +#endif + +#ifdef WITH_DMALLOC +#include +#endif + +static gint num_plotwindows = 0; +static gint max_plotwindows = 10; +static GdkPixmap *pixmaps[10]; +static GtkWidget *pixmapboxes[10]; + + + + +/* compute a gdkcolor */ +void +setcolor(GtkWidget * widget, GdkColor * color, gint red, gint green, gint blue) +{ + + /* colors in GdkColor are taken from 0 to 65535, not 0 to 255. */ + color->red = red * (65535 / 255); + color->green = green * (65535 / 255); + color->blue = blue * (65535 / 255); + color->pixel = (gulong) (color->red * 65536 + color->green * 256 + color->blue); + /* find closest in colormap, if needed */ + gdk_color_alloc(gtk_widget_get_colormap(widget), color); +} + + +void +gpk_redraw(GdkPixmap * pixmap, GtkWidget * pixmapbox) +{ + /* redraw the entire pixmap */ + gdk_draw_pixmap(pixmapbox->window, + pixmapbox->style->fg_gc[GTK_WIDGET_STATE(pixmapbox)], + pixmap, 0, 0, 0, 0, pixmapbox->allocation.width, pixmapbox->allocation.height); +} + + +static GdkPixmap ** +findpixmap(GtkWidget * widget) +{ + int i; + for (i = 0; i < num_plotwindows && widget != pixmapboxes[i]; i++); + if (i >= num_plotwindows) { + g_print("findpixmap(): bad argument widget \n"); + return NULL; + } + return &pixmaps[i]; +} + +void +gpk_graph_draw(GtkWidget * widget, /* plot on this widged */ + int n, /* number of data points */ + gdouble * xcord, gdouble * ycord, /* data */ + gdouble xmn, gdouble ymn, /* coordinates of corners */ + gdouble xmx, gdouble ymx, int clear, /* clear old plot first */ + char *title, /* add a title (only if clear=1) */ + GdkColor * color) +{ + GdkPixmap **ppixmap; + GdkPoint *points; + int i; + gint16 width, height; + GdkFont *fixed_font; + GdkGC *gc; + + gc = gdk_gc_new(widget->window); + gdk_gc_set_foreground(gc, color); + + + + if ((ppixmap = findpixmap(widget))) { + width = widget->allocation.width; + height = widget->allocation.height; + + + if (clear) { + /* white background */ + gdk_draw_rectangle(*ppixmap, widget->style->white_gc, TRUE, 0, 0, width, height); + /* title */ +#ifdef _WIN32 + fixed_font = gdk_font_load("-misc-fixed-large-r-*-*-*-100-*-*-*-*-*-*"); +#else + fixed_font = gdk_font_load("-misc-fixed-medium-r-*-*-*-100-*-*-*-*-iso8859-1"); +#endif + + gdk_draw_text(*ppixmap, fixed_font, + widget->style->fg_gc[GTK_WIDGET_STATE(widget)], + 0, 10, title, strlen(title)); + } + + + points = g_malloc(n * sizeof(GdkPoint)); + for (i = 0; i < n; i++) { + points[i].x = .5 + ((xcord[i] - xmn) * (width - 1) / (xmx - xmn)); + points[i].y = .5 + ((ycord[i] - ymx) * (height - 1) / (ymn - ymx)); + } + gdk_draw_lines(*ppixmap, gc, points, n); + g_free(points); + gpk_redraw(*ppixmap, widget); + } + gdk_gc_destroy(gc); +} + + + +void +gpk_rectangle_draw(GtkWidget * widget, /* plot on this widged */ + gdouble * xcord, gdouble * ycord, /* corners */ + gdouble xmn, gdouble ymn, /* coordinates of corners */ + gdouble xmx, gdouble ymx, GdkColor * color) +{ + GdkPixmap **ppixmap; + GdkPoint points[2]; + int i; + gint16 width, height; + GdkGC *gc; + + + gc = gdk_gc_new(widget->window); + gdk_gc_set_foreground(gc, color); + + + if ((ppixmap = findpixmap(widget))) { + width = widget->allocation.width; + height = widget->allocation.height; + + + for (i = 0; i < 2; i++) { + points[i].x = .5 + ((xcord[i] - xmn) * (width - 1) / (xmx - xmn)); + points[i].y = .5 + ((ycord[i] - ymx) * (height - 1) / (ymn - ymx)); + } + width = points[1].x - points[0].x + 1; + height = points[1].y - points[0].y + 1; + gdk_draw_rectangle(*ppixmap, gc, TRUE, points[0].x, points[0].y, width, height); + gpk_redraw(*ppixmap, widget); + } + gdk_gc_destroy(gc); +} + + + +void +gpk_bargraph_draw(GtkWidget * widget, /* plot on this widged */ + int n, /* number of data points */ + gdouble * xcord, gdouble * ycord, /* data */ + gdouble xmn, gdouble ymn, /* coordinates of corners */ + gdouble xmx, gdouble ymx, int clear, /* clear old plot first */ + char *title, /* add a title (only if clear=1) */ + int barwidth, /* bar width. 0=compute based on window size */ + GdkColor * color) +{ + GdkPixmap **ppixmap; + GdkPoint points[2]; + int i; + gint16 width, height, x, y, barheight; + GdkFont *fixed_font; + GdkGC *gc; + int titleSplit; + + + gc = gdk_gc_new(widget->window); + gdk_gc_set_foreground(gc, color); + + + if ((ppixmap = findpixmap(widget))) { + width = widget->allocation.width; + height = widget->allocation.height; + + + if (clear) { + /* white background */ + gdk_draw_rectangle(*ppixmap, widget->style->white_gc, TRUE, 0, 0, width, height); + /* title */ +#ifdef _WIN32 + fixed_font = gdk_font_load("-misc-fixed-large-r-*-*-*-100-*-*-*-*-*-*"); +#else + fixed_font = gdk_font_load("-misc-fixed-medium-r-*-*-*-100-*-*-*-*-iso8859-1"); +#endif + + titleSplit = strcspn(title, "\n"); + + if (titleSplit && (titleSplit != strlen(title))) { + gdk_draw_text(*ppixmap, fixed_font, + widget->style->fg_gc[GTK_WIDGET_STATE(widget)], + 0, 10, title, titleSplit); + + gdk_draw_text(*ppixmap, fixed_font, + widget->style->fg_gc[GTK_WIDGET_STATE(widget)], + 0, 22, title + titleSplit + 1, (strlen(title) - titleSplit) - 1); + + + } + else { + gdk_draw_text(*ppixmap, fixed_font, + widget->style->fg_gc[GTK_WIDGET_STATE(widget)], + 0, 10, title, strlen(title)); + } + } + + + for (i = 0; i < n; i++) { + points[1].x = .5 + ((xcord[i] - xmn) * (width - 1) / (xmx - xmn)); + points[1].y = .5 + ((ycord[i] - ymx) * (height - 1) / (ymn - ymx)); + points[0].x = points[1].x; + points[0].y = height - 1; + + x = .5 + ((xcord[i] - xmn) * (width - 1) / (xmx - xmn)); + y = .5 + ((ycord[i] - ymx) * (height - 1) / (ymn - ymx)); + if (!barwidth) + barwidth = (width / (n + 1)) - 1; + barwidth = barwidth > 5 ? 5 : barwidth; + barwidth = barwidth < 1 ? 1 : barwidth; + barheight = height - 1 - y; + /* gdk_draw_lines(*ppixmap,gc,points,2); */ + gdk_draw_rectangle(*ppixmap, gc, TRUE, x, y, barwidth, barheight); + + } + gpk_redraw(*ppixmap, widget); + } + gdk_gc_destroy(gc); +} + + + + + +/* Create a new backing pixmap of the appropriate size */ +static gint +configure_event(GtkWidget * widget, GdkEventConfigure * event, gpointer data) +{ + GdkPixmap **ppixmap; + if ((ppixmap = findpixmap(widget))) { + if (*ppixmap) + gdk_pixmap_unref(*ppixmap); + *ppixmap = gdk_pixmap_new(widget->window, + widget->allocation.width, widget->allocation.height, -1); + gdk_draw_rectangle(*ppixmap, + widget->style->white_gc, + TRUE, 0, 0, widget->allocation.width, widget->allocation.height); + } + return TRUE; +} + + + +/* Redraw the screen from the backing pixmap */ +static gint +expose_event(GtkWidget * widget, GdkEventExpose * event, gpointer data) +{ + GdkPixmap **ppixmap; + if ((ppixmap = findpixmap(widget))) { + gdk_draw_pixmap(widget->window, + widget->style->fg_gc[GTK_WIDGET_STATE(widget)], + *ppixmap, + event->area.x, event->area.y, + event->area.x, event->area.y, event->area.width, event->area.height); + } + + return FALSE; +} + + + + + +GtkWidget * +gpk_plot_new(int width, int height) +{ + GtkWidget *pixmapbox; + + pixmapbox = gtk_drawing_area_new(); + gtk_drawing_area_size(GTK_DRAWING_AREA(pixmapbox), width, height); + gtk_signal_connect(GTK_OBJECT(pixmapbox), "expose_event", (GtkSignalFunc) expose_event, NULL); + gtk_signal_connect(GTK_OBJECT(pixmapbox), "configure_event", + (GtkSignalFunc) configure_event, NULL); + gtk_widget_set_events(pixmapbox, GDK_EXPOSURE_MASK); + + if (num_plotwindows < max_plotwindows) { + pixmapboxes[num_plotwindows] = pixmapbox; + pixmaps[num_plotwindows] = NULL; + num_plotwindows++; + } + else { + g_print("gtk_plotarea_new(): exceeded maximum of 10 plotarea windows\n"); + } + + return pixmapbox; +} diff --git a/frontend/gpkplotting.h b/frontend/gpkplotting.h new file mode 100644 index 0000000..221b422 --- /dev/null +++ b/frontend/gpkplotting.h @@ -0,0 +1,51 @@ +/* + * GTK plotting routines include file + * + * Copyright (c) 1999 Mark Taylor + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef LAME_GPKPLOTTING_H +#define LAME_GPKPLOTTING_H + +#include + +/* allocate a graphing widget */ +GtkWidget *gpk_plot_new(int width, int height); + +/* graph a function in the graphing widged */ +void gpk_graph_draw(GtkWidget * widget, + int n, gdouble * xcord, gdouble * ycord, + gdouble xmn, gdouble ymn, gdouble xmx, gdouble ymx, + int clear, char *title, GdkColor * color); + +/* draw a rectangle in the graphing widget */ +void gpk_rectangle_draw(GtkWidget * widget, /* plot on this widged */ + gdouble xcord[2], gdouble ycord[2], /* corners */ + gdouble xmn, gdouble ymn, /* coordinates of corners */ + gdouble xmx, gdouble ymx, GdkColor * color); /* color to use */ + +/* make a bar graph in the graphing widged */ +void gpk_bargraph_draw(GtkWidget * widget, + int n, gdouble * xcord, gdouble * ycord, + gdouble xmn, gdouble ymn, gdouble xmx, gdouble ymx, + int clear, char *title, int bwidth, GdkColor * color); + +/* set forground color */ +void setcolor(GtkWidget * widget, GdkColor * color, int red, int green, int blue); + +#endif diff --git a/frontend/gtkanal.c b/frontend/gtkanal.c new file mode 100644 index 0000000..e865b41 --- /dev/null +++ b/frontend/gtkanal.c @@ -0,0 +1,1645 @@ +/* + * GTK plotting routines source file + * + * Copyright (c) 1999 Mark Taylor + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* $Id: gtkanal.c,v 1.50 2017/08/28 12:48:39 robert Exp $ */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#include "main.h" +#include "lame.h" +#include "machine.h" +#include "encoder.h" +#include "lame-analysis.h" +#include "get_audio.h" +#include "gtkanal.h" +#include "gpkplotting.h" +#include "lame_global_flags.h" + +/* this file should be removed. The few data items accessed in 'gfc' + should be made accessable by writing a lame_set_variable() function */ +#include "util.h" + +#include "console.h" + + +#ifdef _WIN32 +# include +# define msleep(t) Sleep(t) +#else +# include +# define msleep(t) usleep((t) * 1000) +#endif + + + + +/*! Stringify \a x. */ +#define STR(x) #x +/*! Stringify \a x, perform macro expansion. */ +#define XSTR(x) STR(x) + +#define MP3X_MAJOR_VERSION 0 /* Major version number */ +#define MP3X_MINOR_VERSION 82 /* Minor version number */ +#define MP3X_ALPHA_VERSION 0 /* Set number if this is an alpha version, otherwise zero */ +#define MP3X_BETA_VERSION 0 /* Set number if this is a beta version, otherwise zero */ + + +plotting_data *pinfo; +plotting_data *pplot; +plotting_data Pinfo[NUMPINFO]; + + +/* global variables for the state of the system */ +static gint idle_keepgoing; /* processing of frames is ON */ +static gint idle_count_max; /* number of frames to process before plotting */ +static gint idle_count; /* pause & plot when idle_count=idel_count_max */ +static gint idle_end = 0; /* process all frames, stop at last frame */ +static gint idle_back = 0; /* set when we are displaying the old data */ +static int mp3done = 0; /* last frame has been read */ +static GtkWidget *frameprogress; /* progress bar */ +static GtkWidget *framecounter; /* progress counter */ + +static int subblock_draw[3] = { 1, 1, 1 }; + +/* main window */ +GtkWidget *window; +/* Backing pixmap for drawing areas */ +GtkWidget *pcmbox; /* PCM data plotted here */ +GtkWidget *winbox; /* mpg123 synthesis data plotted here */ +GtkWidget *enerbox[2]; /* spectrum, gr=0,1 plotted here */ +GtkWidget *mdctbox[2]; /* mdct coefficients gr=0,1 plotted here */ +GtkWidget *sfbbox[2]; /* scalefactors gr=0,1 plotted here */ +GtkWidget *headerbox; /* mpg123 header info shown here */ + + +struct gtkinfostruct { + int filetype; /* input file type 0=WAV, 1=MP3 */ + int msflag; /* toggle between L&R vs M&S PCM data display */ + int chflag; /* toggle between L & R channels */ + int kbflag; /* toggle between wave # and barks */ + int flag123; /* show mpg123 frame info, OR ISO encoder frame info */ + double avebits; /* running average bits per frame */ + int approxbits; /* (approx) bits per frame */ + int maxbits; /* max bits per frame used so far */ + int totemph; /* total of frames with de-emphasis */ + int totms; /* total frames with ms_stereo */ + int totis; /* total frames with i_stereo */ + int totshort; /* total granules with short blocks */ + int totmix; /* total granules with mixed blocks */ + int totpreflag; /* total granules with preflag */ + int pupdate; /* plot while processing, or only when needed */ + int sfblines; /* plot scalefactor bands in MDCT plot */ + int difference; /* plot original - decoded instead of orig vs. decoded */ + int totalframes; +} gtkinfo; + + +static lame_global_flags *gfp; +lame_internal_flags *gfc; +hip_t hip; /* decoder handle of just encoded data */ + +/********************************************************************** + * read one frame and encode it + **********************************************************************/ +int +gtkmakeframe(void) +{ + int iread = 0; + static int init = 0; + static int mpglag; + static short int Buffer[2][1152]; + short int mpg123pcm[2][1152]; + int ch, j; + int mp3count = 0; + int mp3out = 0; + int channels_out; + unsigned char mp3buffer[LAME_MAXMP3BUFFER]; + static int frameNum = 0; + int framesize = lame_get_framesize(gfp); + + channels_out = (lame_get_mode(gfp) == MONO) ? 1 : 2; + + pinfo->frameNum = frameNum; + pinfo->sampfreq = lame_get_out_samplerate(gfp); + pinfo->framesize = framesize; + pinfo->stereo = channels_out; + + /* If the analsys code is enabled, lame will writes data into gfc->pinfo, + * and mpg123 will write data into pinfo. Set these so + * the libraries put this data in the right place: */ + gfc->pinfo = pinfo; + hip_set_pinfo(hip, pinfo); + + if (is_mpeg_file_format(global_reader.input_format)) { + hip_set_pinfo(get_hip(), pplot); + iread = get_audio16(gfp, Buffer); + + + /* add a delay of framesize-DECDELAY, which will make the total delay + * exactly one frame, so we can sync MP3 output with WAV input */ + for (ch = 0; ch < channels_out; ch++) { + for (j = 0; j < framesize - DECDELAY; j++) + pinfo->pcmdata2[ch][j] = pinfo->pcmdata2[ch][j + framesize]; + for (j = 0; j < framesize; j++) /*rescale from int to short int */ + pinfo->pcmdata2[ch][j + framesize - DECDELAY] = Buffer[ch][j]; + } + + pinfo->frameNum123 = frameNum - 1; + ++frameNum; + + } + else { + + /* feed data to encoder until encoder produces some output */ + while (lame_get_frameNum(gfp) == pinfo->frameNum) { + + if (!init) { + init = 1; + mpglag = 1; + if (hip) { + hip_decode_exit(hip); + } + hip = hip_decode_init(); + hip_set_pinfo(hip, pinfo); + } + + iread = get_audio16(gfp, Buffer); + if (iread > framesize) { + /* NOTE: frame analyzer requires that we encode one frame + * for each pass through this loop. If lame_encode_buffer() + * is feed data too quickly, it will sometimes encode multiple frames + * breaking this loop. + */ + error_printf("Warning: get_audio is returning too much data.\n"); + } + if (iread <= 0) + break; /* eof */ + + mp3count = lame_encode_buffer(gfp, Buffer[0], Buffer[1], iread, + mp3buffer, sizeof(mp3buffer)); + + assert(!(mp3count > 0 && lame_get_frameNum(gfp) == pinfo->frameNum)); + /* not possible to produce mp3 data without encoding at least + * one frame of data which would increment frameNum */ + } + frameNum = lame_get_frameNum(gfp); /* use the internal MP3 frame counter */ + + + /* decode one frame of output */ + mp3out = hip_decode1(hip, mp3buffer, mp3count, mpg123pcm[0], mpg123pcm[1]); /* re-synthesis to pcm */ + /* mp3out = 0: need more data to decode */ + /* mp3out = -1: error. Lets assume 0 pcm output */ + /* mp3out = number of samples output */ + if (mp3out > 0) + assert(mp3out == pinfo->framesize); + if (mp3out != 0) { + /* decoded output is for frame pinfo->frameNum123 + * add a delay of framesize-DECDELAY, which will make the total delay + * exactly one frame */ + pinfo->frameNum123 = pinfo->frameNum - mpglag; + for (ch = 0; ch < pinfo->stereo; ch++) { + for (j = 0; j < pinfo->framesize - DECDELAY; j++) + pinfo->pcmdata2[ch][j] = pinfo->pcmdata2[ch][j + pinfo->framesize]; + for (j = 0; j < pinfo->framesize; j++) { + pinfo->pcmdata2[ch][j + pinfo->framesize - DECDELAY] = + (mp3out == -1) ? 0 : mpg123pcm[ch][j]; + } + } + } + else { + if (mpglag == MAXMPGLAG) { + error_printf("READ_AHEAD set too low - not enough frame buffering.\n" + "MP3x display of input and output PCM data out of sync.\n"); + error_flush(); + } + else + mpglag++; + pinfo->frameNum123 = -1; /* no frame output */ + } + } + return iread; +} + + +void +plot_frame(void) +{ + int i, j, n, ch, gr; + gdouble *xcord, *ycord; + gdouble xmx, xmn, ymx, ymn; + double *data, *data2, *data3; + char title2[80]; + char label[80], label2[80]; + char *title; + plotting_data *pplot1; + plotting_data *pplot2 = NULL; + + double en, samp; + /*int sampindex, version = 0;*/ + int barthick; + static int firstcall = 1; + static GdkColor *barcolor, *color, *grcolor[2]; + static GdkColor yellow, gray, cyan, magenta, orange, pink, red, green, blue, black, oncolor, + offcolor; + int blocktype[2][2]; + int headbits; + int mode_gr = 2; + + /* find the frame where mpg123 produced output coming from input frame + * pinfo. i.e.: out_frame + out_frame_lag = input_frame */ + for (i = 1; i <= MAXMPGLAG; i++) { + if ((pplot - i)->frameNum123 == pplot->frameNum) { + pplot2 = pplot - i; + break; + } + } + if (i > MAXMPGLAG) { + error_printf("input/output pcm syncing problem. should not happen!\n"); + pplot2 = pplot - 1; + } + + + /* however, the PCM data is delayed by 528 samples in the encoder filterbanks. + * We added another 1152-528 delay to this so the PCM data is *exactly* one + * frame behind the header & MDCT information */ + pplot1 = pplot2 + 1; /* back one frame for header info, MDCT */ + + /* allocate these GC's only once */ + if (firstcall) { + firstcall = 0; + /* grcolor[0] = &magenta; */ + grcolor[0] = &blue; + grcolor[1] = &green; + barcolor = &gray; + + setcolor(headerbox, &oncolor, 255, 0, 0); + setcolor(headerbox, &offcolor, 175, 175, 175); + setcolor(pcmbox, &red, 255, 0, 0); + setcolor(pcmbox, &pink, 255, 0, 255); + setcolor(pcmbox, &magenta, 255, 0, 100); + setcolor(pcmbox, &orange, 255, 127, 0); + setcolor(pcmbox, &cyan, 0, 255, 255); + setcolor(pcmbox, &green, 0, 255, 0); + setcolor(pcmbox, &blue, 0, 0, 255); + setcolor(pcmbox, &black, 0, 0, 0); + setcolor(pcmbox, &gray, 100, 100, 100); + setcolor(pcmbox, &yellow, 255, 255, 0); + + } + + /******************************************************************* + * frame header info + *******************************************************************/ + if (pplot1->sampfreq) + samp = pplot1->sampfreq; + else + samp = 1; + /*sampindex = SmpFrqIndex((long) samp, &version);*/ + + ch = gtkinfo.chflag; + + headbits = 32 + ((pplot1->stereo == 2) ? 256 : 136); + gtkinfo.approxbits = (pplot1->bitrate * 1000 * 1152.0 / samp) - headbits; + sprintf(title2, "%3.1fkHz %ikbs ", samp / 1000, pplot1->bitrate); + gtk_text_freeze(GTK_TEXT(headerbox)); + gtk_text_backward_delete(GTK_TEXT(headerbox), gtk_text_get_length(GTK_TEXT(headerbox))); + gtk_text_set_point(GTK_TEXT(headerbox), 0); + gtk_text_insert(GTK_TEXT(headerbox), NULL, &oncolor, NULL, title2, -1); + title = " mono "; + if (2 == pplot1->stereo) + title = pplot1->js ? " js " : " s "; + gtk_text_insert(GTK_TEXT(headerbox), NULL, &oncolor, NULL, title, -1); + color = pplot1->ms_stereo ? &oncolor : &offcolor; + gtk_text_insert(GTK_TEXT(headerbox), NULL, color, NULL, "ms ", -1); + color = pplot1->i_stereo ? &oncolor : &offcolor; + gtk_text_insert(GTK_TEXT(headerbox), NULL, color, NULL, "is ", -1); + + color = pplot1->crc ? &oncolor : &offcolor; + gtk_text_insert(GTK_TEXT(headerbox), NULL, color, NULL, "crc ", -1); + color = pplot1->padding ? &oncolor : &offcolor; + gtk_text_insert(GTK_TEXT(headerbox), NULL, color, NULL, "pad ", -1); + + color = pplot1->emph ? &oncolor : &offcolor; + gtk_text_insert(GTK_TEXT(headerbox), NULL, color, NULL, "em ", -1); + + sprintf(title2, "bv=%i,%i ", pplot1->big_values[0][ch], pplot1->big_values[1][ch]); + gtk_text_insert(GTK_TEXT(headerbox), NULL, &black, NULL, title2, -1); + + color = pplot1->scfsi[ch] ? &oncolor : &offcolor; + sprintf(title2, "scfsi=%i ", pplot1->scfsi[ch]); + gtk_text_insert(GTK_TEXT(headerbox), NULL, color, NULL, title2, -1); + if (gtkinfo.filetype) + sprintf(title2, " mdb=%i %i/NA", pplot1->maindata, pplot1->totbits); + else + sprintf(title2, " mdb=%i %i/%i", + pplot1->maindata, pplot1->totbits, pplot1->totbits + pplot->resvsize); + gtk_text_insert(GTK_TEXT(headerbox), NULL, &oncolor, NULL, title2, -1); + gtk_text_thaw(GTK_TEXT(headerbox)); + + + + /******************************************************************* + * block type + *******************************************************************/ + for (gr = 0; gr < mode_gr; gr++) + if (gtkinfo.flag123) + blocktype[gr][ch] = pplot1->mpg123blocktype[gr][ch]; + else + blocktype[gr][ch] = pplot->blocktype[gr][ch]; + + + /******************************************************************* + * draw the PCM data * + *******************************************************************/ + n = 1600; /* PCM frame + FFT window: 224 + 1152 + 224 */ + xcord = g_malloc(n * sizeof(gdouble)); + ycord = g_malloc(n * sizeof(gdouble)); + + + if (gtkinfo.msflag) + title = ch ? "Side Channel" : "Mid Channel"; + else + title = ch ? "Right Channel" : "Left Channel"; + + sprintf(title2, "%s mask_ratio=%3.2f %3.2f ener_ratio=%3.2f %3.2f", + title, + pplot->ms_ratio[0], pplot->ms_ratio[1], + pplot->ms_ener_ratio[0], pplot->ms_ener_ratio[1]); + + + ymn = -32767; + ymx = 32767; + xmn = 0; + xmx = 1600 - 1; + + /* 0 ... 224 draw in black, connecting to 224 pixel + * 1375 .. 1599 draw in black connecting to 1375 pixel + * 224 ... 1375 MP3 frame. draw in blue + */ + + /* draw the title */ + gpk_graph_draw(pcmbox, 0, xcord, ycord, xmn, ymn, xmx, ymx, 1, title2, &black); + + + /* draw some hash marks dividing the frames */ + ycord[0] = ymx * .8; + ycord[1] = ymn * .8; + for (gr = 0; gr <= 2; gr++) { + xcord[0] = 223.5 + gr * 576; + xcord[1] = 223.5 + gr * 576; + gpk_rectangle_draw(pcmbox, xcord, ycord, xmn, ymn, xmx, ymx, &yellow); + } + for (gr = 0; gr < mode_gr; gr++) { + if (blocktype[gr][ch] == 2) + for (i = 1; i <= 2; i++) { + xcord[0] = 223.5 + gr * 576 + i * 192; + xcord[1] = 223.5 + gr * 576 + i * 192; + gpk_rectangle_draw(pcmbox, xcord, ycord, xmn, ymn, xmx, ymx, &yellow); + } + } + /* bars representing FFT windows */ + xcord[0] = 0; + ycord[0] = ymn + 3000; + xcord[1] = 1024 - 1; + ycord[1] = ymn + 1000; + gpk_rectangle_draw(pcmbox, xcord, ycord, xmn, ymn, xmx, ymx, grcolor[0]); + xcord[0] = 576; + ycord[0] = ymn + 2000; + xcord[1] = 576 + 1024 - 1; + ycord[1] = ymn; + gpk_rectangle_draw(pcmbox, xcord, ycord, xmn, ymn, xmx, ymx, grcolor[1]); + + + /* plot PCM data */ + for (i = 0; i < n; i++) { + xcord[i] = i; + if (gtkinfo.msflag) + ycord[i] = ch ? .5 * (pplot->pcmdata[0][i] - pplot->pcmdata[1][i]) : + .5 * (pplot->pcmdata[0][i] + pplot->pcmdata[1][i]); + else + ycord[i] = pplot->pcmdata[ch][i]; + } + + /* skip plot if we are doing an mp3 file */ + if (!gtkinfo.filetype) { + gpk_graph_draw(pcmbox, n, xcord, ycord, xmn, ymn, xmx, ymx, 0, title2, &black); + } + + + /*******************************************************************/ + /* draw the PCM re-synthesis data */ + /*******************************************************************/ + n = 1152; + /* + sprintf(title2,"Re-synthesis mask_ratio=%3.2f %3.2f ener_ratio=%3.2f %3.2f", + pplot->ms_ratio[0],pplot->ms_ratio[1], + pplot->ms_ener_ratio[0],pplot->ms_ener_ratio[1]); + */ + title = "Re-synthesis"; + if (gtkinfo.difference) + title = "Re-synthesis difference (amplified 20db)"; + + + ymn = -32767; + ymx = 32767; + xmn = 0; + xmx = 1600 - 1; + gpk_graph_draw(winbox, 0, xcord, ycord, xmn, ymn, xmx, ymx, 1, title, &black); + /* draw some hash marks dividing the frames */ + ycord[0] = ymx * .8; + ycord[1] = ymn * .8; + for (gr = 0; gr <= 2; gr++) { + xcord[0] = 223.5 + gr * 576; + xcord[1] = 223.5 + gr * 576; + gpk_rectangle_draw(winbox, xcord, ycord, xmn, ymn, xmx, ymx, &yellow); + } + for (gr = 0; gr < 2; gr++) { + if (blocktype[gr][ch] == 2) + for (i = 1; i <= 2; i++) { + xcord[0] = 223.5 + gr * 576 + i * 192; + xcord[1] = 223.5 + gr * 576 + i * 192; + gpk_rectangle_draw(winbox, xcord, ycord, xmn, ymn, xmx, ymx, &yellow); + } + } + + /* this piece of PCM data from previous frame */ + n = 224; + for (j = 1152 - n, i = 0; i < n; i++, j++) { + xcord[i] = i; + if (gtkinfo.msflag) + ycord[i] = ch ? .5 * (pplot1->pcmdata2[0][j] - + pplot1->pcmdata2[1][j]) : + .5 * (pplot1->pcmdata2[0][j] + pplot1->pcmdata2[1][j]); + else + ycord[i] = pplot1->pcmdata2[ch][j]; + } + + /* this piece of PCM data from current frame */ + n = 1152; + for (i = 0; i < n; i++) { + xcord[i + 224] = i + 224; + if (gtkinfo.msflag) + ycord[i + 224] = ch ? .5 * (pplot2->pcmdata2[0][i] - pplot2->pcmdata2[1][i]) : + .5 * (pplot2->pcmdata2[0][i] + pplot2->pcmdata2[1][i]); + else + ycord[i + 224] = pplot2->pcmdata2[ch][i]; + } + + n = 1152 + 224; + if (gtkinfo.difference) { + for (i = 0; i < n; i++) { + if (gtkinfo.msflag) + ycord[i] -= ch ? .5 * (pplot->pcmdata[0][i] - pplot->pcmdata[1][i]) : + .5 * (pplot->pcmdata[0][i] + pplot->pcmdata[1][i]); + else + ycord[i] -= pplot->pcmdata[ch][i]; + } + ycord[i] *= 100; + } + + + gpk_graph_draw(winbox, n, xcord, ycord, xmn, ymn, xmx, ymx, 0, title, &black); + + + + + + /*******************************************************************/ + /* draw the MDCT energy spectrum */ + /*******************************************************************/ + for (gr = 0; gr < mode_gr; gr++) { + int bits, bits2; + char *blockname = ""; + switch (blocktype[gr][ch]) { + case 0: + blockname = "normal"; + break; + case 1: + blockname = "start"; + break; + case 2: + blockname = "short"; + break; + case 3: + blockname = "end"; + break; + } + strcpy(label, blockname); + if (pplot1->mixed[gr][ch]) + strcat(label, "(mixed)"); + + + + + n = 576; + if (gtkinfo.flag123) { + data = pplot1->mpg123xr[gr][0]; + data2 = pplot1->mpg123xr[gr][1]; + } + else { + data = pplot->xr[gr][0]; + data2 = pplot->xr[gr][1]; + } + + + xmn = 0; + xmx = n - 1; + ymn = 0; + ymx = 11; + + /* draw title, erase old plot */ + if (gtkinfo.flag123) { + bits = pplot1->mainbits[gr][ch]; + bits2 = pplot1->sfbits[gr][ch]; + } + else { + bits = pplot->LAMEmainbits[gr][ch]; + bits2 = pplot->LAMEsfbits[gr][ch]; + } + sprintf(title2, "MDCT%1i(%s) bits=%i/%i ", gr, label, bits, bits2); + gpk_bargraph_draw(mdctbox[gr], 0, xcord, ycord, xmn, ymn, xmx, ymx, 1, title2, 0, barcolor); + + /* draw some hash marks showing scalefactor bands */ + if (gtkinfo.sfblines) { + int fac, nsfb, *scalefac; + if (blocktype[gr][ch] == SHORT_TYPE) { + nsfb = SBMAX_s; + i = nsfb - 7; + fac = 3; + scalefac = gfc->scalefac_band.s; + } + else { + nsfb = SBMAX_l; + i = nsfb - 10; + fac = 1; + scalefac = gfc->scalefac_band.l; + } + for (; i < nsfb; i++) { + ycord[0] = .8 * ymx; + ycord[1] = ymn; + xcord[0] = fac * scalefac[i]; + xcord[1] = xcord[0]; + gpk_rectangle_draw(mdctbox[gr], xcord, ycord, xmn, ymn, xmx, ymx, &yellow); + } + } + + + + ymn = 9e20; + ymx = -9e20; + for (i = 0; i < n; i++) { + double coeff; + xcord[i] = i; + if (gtkinfo.msflag) { + coeff = ch ? .5 * (data[i] - data2[i]) : .5 * (data[i] + data2[i]); + } + else { + coeff = ch ? data2[i] : data[i]; + } + if (blocktype[gr][ch] == SHORT_TYPE && !subblock_draw[i % 3]) + coeff = 0; + ycord[i] = coeff * coeff * 1e10; + ycord[i] = log10(MAX(ycord[i], (double) 1)); + +#if 0 + if (ch == 0) + if (i == 26) + if (data[i] != 0) + console_printf("%i %i i=%i mdct: (db) %f %f \n", pplot->frameNum, gr, i, + 10 * log10(data[i] * data[i]), + 10 * log10(.33 * + (data[i - 1] * data[i - 1] + data[i] * data[i] + + data[i + 1] * data[i + 1])) + ); +#endif + + ymx = (ycord[i] > ymx) ? ycord[i] : ymx; + ymn = (ycord[i] < ymn) ? ycord[i] : ymn; + } + /* print the min/max + sprintf(title2,"MDCT%1i %5.2f %5.2f bits=%i",gr,ymn,ymx, + pplot1->mainbits[gr][ch]); + */ + if (gtkinfo.flag123) + bits = pplot1->mainbits[gr][ch]; + else + bits = pplot->LAMEmainbits[gr][ch]; + + + sprintf(title2, "MDCT%1i(%s) bits=%i ", gr, label, bits); + + xmn = 0; + xmx = n - 1; + ymn = 0; + ymx = 11; + gpk_bargraph_draw(mdctbox[gr], n, xcord, ycord, xmn, ymn, xmx, ymx, 0, title2, 0, barcolor); + } + + + + + /******************************************************************* + * draw the psy model energy spectrum (k space) + * l3psy.c computes pe, en, thm for THIS granule. + *******************************************************************/ + if (gtkinfo.kbflag) { + for (gr = 0; gr < mode_gr; gr++) { + n = HBLKSIZE; /* only show half the spectrum */ + + data = &pplot->energy[gr][ch][0]; + + ymn = 9e20; + ymx = -9e20; + for (i = 0; i < n; i++) { + xcord[i] = i + 1; + if (blocktype[gr][ch] == SHORT_TYPE && !subblock_draw[i % 3]) + ycord[i] = 0; + else + ycord[i] = log10(MAX(data[i], (double) 1)); + ymx = (ycord[i] > ymx) ? ycord[i] : ymx; + ymn = (ycord[i] < ymn) ? ycord[i] : ymn; + } + for (en = 0, j = 0; j < BLKSIZE; j++) + en += pplot->energy[gr][ch][j]; + + sprintf(title2, "FFT%1i pe=%5.2fK en=%5.2e ", gr, pplot->pe[gr][ch] / 1000, en); + + ymn = 3; + ymx = 15; + xmn = 1; + xmx = n; + gpk_bargraph_draw(enerbox[gr], n, xcord, ycord, + xmn, ymn, xmx, ymx, 1, title2, 0, barcolor); + + } + } + else { + /******************************************************************* + * draw the psy model energy spectrum (scalefactor bands) + *******************************************************************/ + for (gr = 0; gr < mode_gr; gr++) { + + if (blocktype[gr][ch] == 2) { + n = 3 * SBMAX_s; + data = &pplot->en_s[gr][ch][0]; + data2 = &pplot->thr_s[gr][ch][0]; + data3 = &pplot->xfsf_s[gr][ch][0]; + } + else { + n = SBMAX_l; + data = &pplot->en[gr][ch][0]; + data2 = &pplot->thr[gr][ch][0]; + data3 = &pplot->xfsf[gr][ch][0]; + } + ymn = 9e20; + ymx = -9e20; + for (i = 0; i < n; i++) { + xcord[i] = i + 1; + if (blocktype[gr][ch] == SHORT_TYPE && !subblock_draw[i % 3]) + ycord[i] = 0; + else + ycord[i] = log10(MAX(data[i], (double) 1)); + /* + ymx=(ycord[i] > ymx) ? ycord[i] : ymx; + ymn=(ycord[i] < ymn) ? ycord[i] : ymn; + */ + } + + + + /* en = max energy difference amoung the 3 short FFTs for this granule */ + en = pplot->ers[gr][ch]; + if (en > 999) + en = 999; + sprintf(title2, + "FFT%1i pe=%5.2fK/%3.1f \nnoise ovr_b:%i/max:%3.1f/ovr:%3.1f/tot:%3.1f/ssd:%i", + gr, pplot->pe[gr][ch] / 1000, en, pplot->over[gr][ch], pplot->max_noise[gr][ch], + pplot->over_noise[gr][ch], pplot->tot_noise[gr][ch], pplot->over_SSD[gr][ch]); + + barthick = 3; + if (blocktype[gr][ch] == SHORT_TYPE) + barthick = 2; + if (!(subblock_draw[0] && subblock_draw[1] && subblock_draw[2])) + barthick = 3; + + ymn = 3; + ymx = 15; + xmn = 1; + xmx = n + 1; /* a little extra because of the bar thickness */ + gpk_bargraph_draw(enerbox[gr], n, xcord, ycord, + xmn, ymn, xmx, ymx, 1, title2, barthick, barcolor); + + for (i = 0; i < n; i++) { + xcord[i] = i + 1 + .20; + if (blocktype[gr][ch] == SHORT_TYPE && !subblock_draw[i % 3]) + ycord[i] = 0; + else + ycord[i] = log10(MAX(data2[i], (double) 1)); + } + + gpk_bargraph_draw(enerbox[gr], n, xcord, ycord, + xmn, ymn, xmx, ymx, 0, title2, barthick, grcolor[gr]); + + for (i = 0; i < n; i++) { + xcord[i] = i + 1 + .40; + if (blocktype[gr][ch] == SHORT_TYPE && !subblock_draw[i % 3]) + ycord[i] = 0; + else + ycord[i] = log10(MAX(data3[i], (double) 1)); + } + gpk_bargraph_draw(enerbox[gr], n, xcord, ycord, + xmn, ymn, xmx, ymx, 0, title2, barthick, &red); + + } + } + + /******************************************************************* + * draw scalefactors + *******************************************************************/ + for (gr = 0; gr < mode_gr; gr++) { + int ggain; + if (blocktype[gr][ch] == 2) { + n = 3 * SBMAX_s; + if (gtkinfo.flag123) + data = pplot1->sfb_s[gr][ch]; + else + data = pplot->LAMEsfb_s[gr][ch]; + } + else { + n = SBMAX_l; + if (gtkinfo.flag123) + data = pplot1->sfb[gr][ch]; + else + data = pplot->LAMEsfb[gr][ch]; + } + + ymn = -1; + ymx = 10; + for (i = 0; i < n; i++) { + xcord[i] = i + 1; + if (blocktype[gr][ch] == SHORT_TYPE && !subblock_draw[i % 3]) + ycord[i] = 0; + else + ycord[i] = -data[i]; + + ymx = (ycord[i] > ymx - 2) ? ycord[i] + 2 : ymx; + ymn = (ycord[i] < ymn) ? ycord[i] - 1 : ymn; + } + + if (blocktype[gr][ch] == 2) { + sprintf(label2, + "SFB scale=%i preflag=%i %i%i%i", + pplot1->scalefac_scale[gr][ch], + pplot1->preflag[gr][ch], + pplot1->sub_gain[gr][ch][0], + pplot1->sub_gain[gr][ch][1], pplot1->sub_gain[gr][ch][2]); + } + else { + sprintf(label2, "SFB scale=%i preflag=%i", pplot1->scalefac_scale[gr][ch], + pplot1->preflag[gr][ch]); + } + + if (gtkinfo.flag123) + ggain = (pplot1->qss[gr][ch]); + else + ggain = (pplot->LAMEqss[gr][ch]); + + sprintf(title2, " ggain=%i", ggain); + strcat(label2, title2); + + xmn = 1; + xmx = n + 1; + gpk_bargraph_draw(sfbbox[gr], n, xcord, ycord, + xmn, ymn, xmx, ymx, 1, label2, 0, grcolor[gr]); + + ycord[0] = ycord[1] = 0; + xcord[0] = 1; + xcord[1] = n + 1; + gpk_rectangle_draw(sfbbox[gr], xcord, ycord, xmn, ymn, xmx, ymx, &yellow); + + + } + + +} + + + +static void +update_progress(void) +{ + char label[80]; + + int tf = lame_get_totalframes(gfp); + if (gtkinfo.totalframes > 0) + tf = gtkinfo.totalframes; + + sprintf(label, "Frame:%4i/%4i %6.2fs", pplot->frameNum, (int) tf - 1, pplot->frametime); + gtk_progress_set_value(GTK_PROGRESS(frameprogress), (gdouble) pplot->frameNum); + gtk_label_set_text(GTK_LABEL(framecounter), label); +} + + + +static void +analyze(void) +{ + if (idle_keepgoing) { + idle_count = 0; + idle_count_max = 0; + idle_keepgoing = 0; + idle_end = 0; + } + plot_frame(); + update_progress(); +} + +static void +plotclick(GtkWidget * widget, gpointer data) +{ + analyze(); +} + + + + +static int +frameadv1(GtkWidget * widget, gpointer data) +{ + int i; + if (idle_keepgoing) { + if (idle_back) { + /* frame displayed is the old frame. to advance, just swap in new frame */ + idle_back--; + pplot = &Pinfo[READ_AHEAD + idle_back]; + } + else { + /* advance the frame by reading in a new frame */ + pplot = &Pinfo[READ_AHEAD]; + if (mp3done) { + /* dont try to read any more frames, and quit if "finish MP3" was selected */ + /* if (idle_finish) gtk_main_quit(); */ + idle_count_max = 0; + idle_end = 0; + } + else { + /* read in the next frame */ + for (i = NUMPINFO - 1; i > 0; i--) + memcpy(&Pinfo[i], &Pinfo[i - 1], sizeof(plotting_data)); + pinfo = &Pinfo[0]; + pinfo->num_samples = gtkmakeframe(); + if (pinfo->num_samples == 0 && gtkinfo.totalframes == 0) + /* allow an extra frame to flush decoder buffers */ + gtkinfo.totalframes = pinfo->frameNum + 2; + + if (pinfo->sampfreq) + pinfo->frametime = (pinfo->frameNum) * 1152.0 / pinfo->sampfreq; + else + pinfo->frametime = 0; + + /* eof? + if (!pinfo->num_samples) if (idle_finish) gtk_main_quit(); + */ + + pinfo->totbits = 0; + { + int gr, ch; + for (gr = 0; gr < 2; gr++) + for (ch = 0; ch < 2; ch++) { + gtkinfo.totshort += (pinfo->mpg123blocktype[gr][ch] == 2); + gtkinfo.totmix += !(pinfo->mixed[gr][ch] == 0); + gtkinfo.totpreflag += (pinfo->preflag[gr][ch] == 1); + pinfo->totbits += pinfo->mainbits[gr][ch]; + } + } + if (pinfo->frameNum > 0) /* start averaging at second frame */ + gtkinfo.avebits = (gtkinfo.avebits * ((pinfo->frameNum) - 1) + + pinfo->totbits) / (pinfo->frameNum); + + gtkinfo.maxbits = MAX(gtkinfo.maxbits, pinfo->totbits); + gtkinfo.totemph += !(pinfo->emph == 0); + gtkinfo.totms += !(pinfo->ms_stereo == 0); + gtkinfo.totis += !(pinfo->i_stereo == 0); + + if (gtkinfo.totalframes > 0) + if (pplot->frameNum >= gtkinfo.totalframes - 1) + mp3done = 1; + } + } + + idle_count++; + if (gtkinfo.pupdate) + plot_frame(); + update_progress(); + if ((idle_count >= idle_count_max) && (!idle_end)) + analyze(); + } + else { + /*no processing to do, sleep in order to not monopolize CPU */ + msleep(10); + } + return 1; +} + + +static void +frameadv(GtkWidget * widget, gpointer data) +{ + int adv; + + if (!strcmp((char *) data, "-1")) { + /* ignore if we've already gone back as far as possible */ + if (pplot->frameNum == 0 || (idle_back == NUMBACK)) + return; + idle_back++; + pplot = &Pinfo[READ_AHEAD + idle_back]; + analyze(); + return; + } + + + adv = 1; + if (!strcmp((char *) data, "1")) + adv = 1; + if (!strcmp((char *) data, "10")) + adv = 10; + if (!strcmp((char *) data, "100")) + adv = 100; + if (!strcmp((char *) data, "finish")) + idle_end = 1; + + + if (idle_keepgoing) { + /* already running - que up additional frame advance requests */ + idle_count_max += adv; + } + else { + /* turn on idleing */ + idle_count_max = adv; + idle_count = 0; + idle_keepgoing = 1; + } +} + + + + +/* another callback */ +static void +delete_event(GtkWidget * widget, GdkEvent * event, gpointer data) +{ + /* set MP3 done flag in case the File/Quit menu item has been selected */ + mp3done = 1; + + if (hip) { + hip_decode_exit(hip); + hip = 0; + } + gtk_main_quit(); +} + + + + + + + +static void +channel_option(GtkWidget * widget, gpointer data) +{ + long option; + option = (long) data; + switch (option) { + case 1: + gtkinfo.msflag = 0; + gtkinfo.chflag = 0; + break; + case 2: + gtkinfo.msflag = 0; + gtkinfo.chflag = 1; + break; + case 3: + gtkinfo.msflag = 1; + gtkinfo.chflag = 0; + break; + case 4: + gtkinfo.msflag = 1; + gtkinfo.chflag = 1; + } + analyze(); +} +static void +spec_option(GtkWidget * widget, gpointer data) +{ + long option; + option = (long) data; + switch (option) { + case 1: + gtkinfo.kbflag = 0; + break; + case 2: + gtkinfo.kbflag = 1; + break; + case 3: + gtkinfo.flag123 = 0; + break; + case 4: + gtkinfo.flag123 = 1; + break; + case 5: + gtkinfo.pupdate = 1; + break; + case 6: + gtkinfo.pupdate = 0; + break; + case 7: + gtkinfo.sfblines = !gtkinfo.sfblines; + break; + case 8: + gtkinfo.difference = !gtkinfo.difference; + break; + } + analyze(); +} + +static gint +key_press_event(GtkWidget * widget, GdkEventKey * event) +{ + /* is a switch() statement in lame forbidden? */ + if (event->keyval == '1') { + subblock_draw[0] = 1; + subblock_draw[1] = 0; + subblock_draw[2] = 0; + analyze(); + } + else if (event->keyval == '2') { + subblock_draw[0] = 0; + subblock_draw[1] = 1; + subblock_draw[2] = 0; + analyze(); + } + else if (event->keyval == '3') { + subblock_draw[0] = 0; + subblock_draw[1] = 0; + subblock_draw[2] = 1; + analyze(); + } + else if (event->keyval == '0') { + subblock_draw[0] = 1; + subblock_draw[1] = 1; + subblock_draw[2] = 1; + analyze(); + } + /* analyze(); */ /* dont redraw entire window for every key! */ + return 0; +} + + +/*! Get the mp3x version string. */ +/*! + \param void + \return a pointer to a string which describes the version of mp3x. +*/ +const char * +get_mp3x_version(void) +{ +#if MP3X_ALPHA_VERSION > 0 + static /*@observer@ */ const char *const str = + XSTR(MP3X_MAJOR_VERSION) "." XSTR(MP3X_MINOR_VERSION) + " (alpha " XSTR(MP3X_ALPHA_VERSION) ", " __DATE__ " " __TIME__ ")"; +#elif MP3X_BETA_VERSION > 0 + static /*@observer@ */ const char *const str = + XSTR(MP3X_MAJOR_VERSION) "." XSTR(MP3X_MINOR_VERSION) + " (beta " XSTR(MP3X_BETA_VERSION) ", " __DATE__ ")"; +#else + static /*@observer@ */ const char *const str = + XSTR(MP3X_MAJOR_VERSION) "." XSTR(MP3X_MINOR_VERSION); +#endif + + return str; +} + + +static void +text_window(GtkWidget * widget, gpointer data) +{ + long option; + GtkWidget *hbox, *vbox, *button, *box; + GtkWidget *textwindow, *vscrollbar; + char text[256]; + + option = (long) data; + + textwindow = gtk_window_new(GTK_WINDOW_DIALOG); + gtk_signal_connect_object(GTK_OBJECT(window), "delete_event", + GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(textwindow)); + + gtk_container_set_border_width(GTK_CONTAINER(textwindow), 0); + vbox = gtk_vbox_new(FALSE, 0); + hbox = gtk_hbox_new(FALSE, 0); + + button = gtk_button_new_with_label("close"); + gtk_signal_connect_object(GTK_OBJECT(button), "clicked", + GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(textwindow)); + + box = gtk_text_new(NULL, NULL); + gtk_text_set_editable(GTK_TEXT(box), FALSE); + vscrollbar = gtk_vscrollbar_new(GTK_TEXT(box)->vadj); + + + switch (option) { + case 0: + gtk_window_set_title(GTK_WINDOW(textwindow), "Documentation"); + gtk_widget_set_usize(box, 450, 500); + gtk_text_set_word_wrap(GTK_TEXT(box), TRUE); + /* text should be moved outside this function, may be in a separate file */ + gtk_text_insert(GTK_TEXT(box), NULL, NULL, NULL, + "Frame header information: " + "First the bitrate, sampling frequency and mono, stereo or jstereo " + "indicators are displayed . If the bitstream is jstereo, then mid/side " + "stereo or intensity stereo may be on (indicated in red). If " + "de-emphasis is used, this is also indicated in red. The mdb value is " + "main_data_begin. The encoded data starts this many bytes *before* the " + "frame header. A large value of mdb means the bitstream has saved some " + "bits into the reservoir, which it may allocate for some future frame. " + "The two numbers after mdb are the size (in bits) used to encode the " + "MDCT coefficients for this frame, followed byt the size of the bit " + "resevoir before encoding this frame. The maximum frame size and a " + "running average are given in the Stats pull down menu. A large " + "maximum frame size indicates the bitstream has made use of the bit " + "reservoir. \n\n", -1); + + gtk_text_insert(GTK_TEXT(box), NULL, NULL, NULL, + "PCM data (top graph): " + "The PCM data is plotted in black. The layer3 frame is divided into 2 " + "granules of 576 samples (marked with yellow vertical lines). In the " + "case of normal, start and stop blocks, the MDCT coefficients for each " + "granule are computed using a 1152 sample window centered over the " + "granule. In the case of short blocks, the granule is further divided " + "into 3 blocks of 192 samples (also marked with yellow vertical lines)." + "The MDCT coefficients for these blocks are computed using 384 sample " + "windows centered over the 192 sample window. (This info not available " + "when analyzing .mp3 files.) For the psycho-acoustic model, a windowed " + "FFT is computed for each granule. The range of these windows " + "is denoted by the blue and green bars.\n\n", -1); + + gtk_text_insert(GTK_TEXT(box), NULL, NULL, NULL, + "PCM re-synthesis data (second graph): " + "Same as the PCM window described above. The data displayed is the " + "result of encoding and then decoding the original sample. \n\n", -1); + + gtk_text_insert(GTK_TEXT(box), NULL, NULL, NULL, + "MDCT windows: " + "Shows the energy in the MDCT spectrum for granule 0 (left window) " + "and granule 1 (right window). The text also shows the blocktype " + "used, the number of bits used to encode the coefficients and the " + "number of extra bits allocated from the reservoir. The MDCT pull down " + "window will toggle between the original unquantized MDCT coefficients " + "and the compressed (quantized) coefficients.\n\n", -1); + + gtk_text_insert(GTK_TEXT(box), NULL, NULL, NULL, + "FFT window: " + "The gray bars show the energy in the FFT spectrum used by the " + "psycho-acoustic model. Granule 0 is in the left window, granule 1 in " + "the right window. The green and blue bars show how much distortion is " + "allowable, as computed by the psycho-acoustic model. The red bars show " + "the actual distortion after encoding. There is one FFT for each " + "granule, computed with a 1024 Hann window centered over the " + "appropriate granule. (the range of this 1024 sample window is shown " + "by the blue and green bars in the PCM data window). The Spectrum pull " + "down window will toggle between showing the energy in equally spaced " + "frequency domain and the scale factor bands used by layer3. Finally, " + "the perceptual entropy, total energy and number of scalefactor bands " + "with audible distortion is shown. (This info not available when " + "analyzing .mp3 files.)", -1); + + break; + case 1: + /* Set the about box information */ + gtk_window_set_title(GTK_WINDOW(textwindow), "About"); + gtk_widget_set_usize(box, 350, 260); + + sprintf(text, "LAME version %s \n%s\n\n", get_lame_version(), get_lame_url()); + gtk_text_insert(GTK_TEXT(box), NULL, NULL, NULL, text, -1); + + sprintf(text, "psycho-acoustic model: GPSYCHO version %s\n", get_psy_version()); + gtk_text_insert(GTK_TEXT(box), NULL, NULL, NULL, text, -1); + + sprintf(text, "frame analyzer: MP3x version %s\n\n", get_mp3x_version()); + gtk_text_insert(GTK_TEXT(box), NULL, NULL, NULL, text, -1); + + gtk_text_insert(GTK_TEXT(box), NULL, NULL, NULL, + "decoder: mpg123/mpglib .59q \nMichael Hipp (www.mpg123.de)\n\n", -1); + + gtk_text_insert(GTK_TEXT(box), NULL, NULL, NULL, + "Encoder, decoder & psy-models based on ISO\ndemonstration source. ", -1); + break; + + case 2: + gtk_window_set_title(GTK_WINDOW(textwindow), "Statistics"); + gtk_widget_set_usize(box, 350, 260); + sprintf(text, "frames processed so far: %i \n", Pinfo[0].frameNum + 1); + gtk_text_insert(GTK_TEXT(box), NULL, NULL, NULL, text, -1); + sprintf(text, "granules processed so far: %i \n\n", 4 * (Pinfo[0].frameNum + 1)); + gtk_text_insert(GTK_TEXT(box), NULL, NULL, NULL, text, -1); + sprintf(text, "mean bits/frame (approximate): %i\n", gtkinfo.approxbits); + gtk_text_insert(GTK_TEXT(box), NULL, NULL, NULL, text, -1); + sprintf(text, "mean bits/frame (from LAME): %i\n", 4 * Pinfo[0].mean_bits); + gtk_text_insert(GTK_TEXT(box), NULL, NULL, NULL, text, -1); + sprintf(text, "bitsize of largest frame: %i \n", gtkinfo.maxbits); + gtk_text_insert(GTK_TEXT(box), NULL, NULL, NULL, text, -1); + sprintf(text, "average bits/frame: %3.1f \n\n", gtkinfo.avebits); + gtk_text_insert(GTK_TEXT(box), NULL, NULL, NULL, text, -1); + sprintf(text, "ms_stereo frames: %i \n", gtkinfo.totms); + gtk_text_insert(GTK_TEXT(box), NULL, NULL, NULL, text, -1); + sprintf(text, "i_stereo frames: %i \n", gtkinfo.totis); + gtk_text_insert(GTK_TEXT(box), NULL, NULL, NULL, text, -1); + sprintf(text, "de-emphasis frames: %i \n", gtkinfo.totemph); + gtk_text_insert(GTK_TEXT(box), NULL, NULL, NULL, text, -1); + sprintf(text, "short block granules: %i \n", gtkinfo.totshort); + gtk_text_insert(GTK_TEXT(box), NULL, NULL, NULL, text, -1); + sprintf(text, "mixed block granules: %i \n", gtkinfo.totmix); + gtk_text_insert(GTK_TEXT(box), NULL, NULL, NULL, text, -1); + sprintf(text, "preflag granules: %i \n", gtkinfo.totpreflag); + gtk_text_insert(GTK_TEXT(box), NULL, NULL, NULL, text, -1); + break; + } + + + + gtk_widget_show(vscrollbar); + gtk_widget_show(box); + gtk_widget_show(vbox); + gtk_widget_show(hbox); + gtk_widget_show(button); + + gtk_box_pack_start(GTK_BOX(hbox), box, FALSE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(hbox), vscrollbar, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0); + gtk_box_pack_end(GTK_BOX(vbox), button, FALSE, TRUE, 0); + gtk_container_add(GTK_CONTAINER(textwindow), vbox); + gtk_widget_show(textwindow); + +} + + + + +/* #include */ + + +/* This is the GtkItemFactoryEntry structure used to generate new menus. + Item 1: The menu path. The letter after the underscore indicates an + accelerator key once the menu is open. + Item 2: The accelerator key for the entry + Item 3: The callback function. + Item 4: The callback action. This changes the parameters with + which the function is called. The default is 0. + Item 5: The item type, used to define what kind of an item it is. + Here are the possible values: + + NULL -> "" + "" -> "" + "" -> create a title item + "<Item>" -> create a simple item + "<CheckItem>" -> create a check item + "<ToggleItem>" -> create a toggle item + "<RadioItem>" -> create a radio item + <path> -> path of a radio item to link against + "<Separator>" -> create a separator + "<Branch>" -> create an item to hold sub items + "<LastBranch>" -> create a right justified branch +*/ + + +#define C(chr) "<control>" #chr +#define func(name) (GtkItemFactoryCallback) (name) + +static const GtkItemFactoryEntry menu_items[] = { + {"/_File", NULL, NULL, 0, "<Branch>"}, +#if 0 + {"/File/_New", C(N), func(print_hello), 0, NULL}, + {"/File/_Open", C(O), func(print_hello), 0, NULL}, + {"/File/_Save", C(S), func(print_hello), 0, NULL}, + {"/File/Save _As", NULL, NULL, 0, NULL}, + {"/File/sep1", NULL, NULL, 0, "<Separator>"}, + {"/File/Quit", C(Q), func(gtk_main_quit), 0, NULL}, +#endif + {"/File/_Quit", C(Q), func(delete_event), 0, NULL}, + + {"/_Plotting", NULL, NULL, 0, "<Branch>"}, + {"/Plotting/_While advancing", NULL, func(spec_option), 5, NULL}, + {"/Plotting/_After advancing", NULL, func(spec_option), 6, NULL}, + {"/Plotting/Toggle SFB lines", NULL, func(spec_option), 7, NULL}, + {"/Plotting/Toggle orig-diff", NULL, func(spec_option), 8, NULL}, + + {"/_Channel", NULL, NULL, 0, "<Branch>"}, + {"/Channel/show _Left", NULL, func(channel_option), 1, NULL}, + {"/Channel/show _Right", NULL, func(channel_option), 2, NULL}, + {"/Channel/show _Mid", NULL, func(channel_option), 3, NULL}, + {"/Channel/show _Side", NULL, func(channel_option), 4, NULL}, + + {"/_Spectrum", NULL, NULL, 0, "<Branch>"}, + {"/Spectrum/_Scalefactor bands", NULL, func(spec_option), 1, NULL}, + {"/Spectrum/_Wave number", NULL, func(spec_option), 2, NULL}, + + {"/_MDCT", NULL, NULL, 0, "<Branch>"}, + {"/MDCT/_Original", NULL, func(spec_option), 3, NULL}, + {"/MDCT/_Compressed", NULL, func(spec_option), 4, NULL}, + {"/MDCT/_Toggle SFB lines", NULL, func(spec_option), 7, NULL}, + + {"/_Stats", NULL, NULL, 0, "<Branch>"}, + {"/Stats/_Show", NULL, func(text_window), 2, NULL}, + + {"/_Help", NULL, NULL, 0, "<LastBranch>"}, + {"/_Help/_Documentation", NULL, func(text_window), 0, NULL}, + {"/_Help/_About", NULL, func(text_window), 1, NULL}, +}; + +#undef C +#undef func + + +static void +get_main_menu(GtkWidget * windows, GtkWidget ** menubar) +{ + unsigned int nmenu_items = sizeof(menu_items) / sizeof(menu_items[0]); + GtkItemFactory *item_factory; + GtkAccelGroup *accel_group; + + accel_group = gtk_accel_group_new(); + + /* This function initializes the item factory. + Param 1: The type of menu - can be GTK_TYPE_MENU_BAR, GTK_TYPE_MENU, + or GTK_TYPE_OPTION_MENU. + Param 2: The path of the menu. + Param 3: A pointer to a gtk_accel_group. The item factory sets up + the accelerator table while generating menus. + */ + + item_factory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "<main>", accel_group); + + /* This function generates the menu items. Pass the item factory, + the number of items in the array, the array itself, and any + callback data for the the menu items. */ + gtk_item_factory_create_items(item_factory, nmenu_items, (GtkItemFactoryEntry *) menu_items, + NULL); + + /* Attach the new accelerator group to the window. */ + gtk_accel_group_attach(accel_group, GTK_OBJECT(windows)); + + if (menubar) + /* Finally, return the actual menu bar created by the item factory. */ + *menubar = gtk_item_factory_get_widget(item_factory, "<main>"); +} + + + + + + + + + + + + + + + + +int +gtkcontrol(lame_global_flags * gfp2, char *inPath) +{ + /* GtkWidget is the storage type for widgets */ + GtkWidget *button; + GtkAdjustment *adj; + GtkWidget *mbox; /* main box */ + GtkWidget *box1; /* frame control buttons go */ + GtkWidget *box2; /* frame counters */ + GtkWidget *box3; /* frame header info */ + GtkWidget *table; /* table for all the plotting areas */ + GtkWidget *menubar; + + gint tableops, graphx, graphy; + char frameinfo[80]; + + graphx = 600; /* minimum allowed size of pixmap */ + graphy = 95; + + gfp = gfp2; + gfc = gfp->internal_flags; + + /* set some global defaults/variables */ + gtkinfo.filetype = is_mpeg_file_format(global_reader.input_format) ? 1 : 0; + gtkinfo.msflag = 0; + gtkinfo.chflag = 0; + gtkinfo.kbflag = 0; + gtkinfo.flag123 = is_mpeg_file_format(global_reader.input_format) ? 1 : 0; /* MP3 file=use mpg123 output */ + gtkinfo.pupdate = 0; + gtkinfo.avebits = 0; + gtkinfo.maxbits = 0; + gtkinfo.approxbits = 0; + gtkinfo.totemph = 0; + gtkinfo.totms = 0; + gtkinfo.totis = 0; + gtkinfo.totshort = 0; + gtkinfo.totmix = 0; + gtkinfo.sfblines = 1; + gtkinfo.difference = 0; + gtkinfo.totalframes = 0; + + memset((char *) Pinfo, 0, sizeof(Pinfo)); + pplot = &Pinfo[READ_AHEAD]; + + strcpy(frameinfo, "MP3x: "); + strncat(frameinfo, inPath, 70); + + window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_title(GTK_WINDOW(window), frameinfo); + gtk_signal_connect(GTK_OBJECT(window), "delete_event", GTK_SIGNAL_FUNC(delete_event), NULL); + + gtk_signal_connect_object(GTK_OBJECT(window), "key_press_event", + GTK_SIGNAL_FUNC(key_press_event), GTK_OBJECT(window)); + + gtk_container_set_border_width(GTK_CONTAINER(window), 0); + + + mbox = gtk_vbox_new(FALSE, 0); + + + /* layout of mbox */ + box1 = gtk_hbox_new(FALSE, 0); + box2 = gtk_hbox_new(FALSE, 0); + box3 = gtk_hbox_new(FALSE, 0); + table = gtk_table_new(5, 2, FALSE); + tableops = GTK_FILL | GTK_EXPAND | GTK_SHRINK; + get_main_menu(window, &menubar); + + gtk_box_pack_start(GTK_BOX(mbox), menubar, FALSE, TRUE, 0); + gtk_box_pack_end(GTK_BOX(mbox), box1, FALSE, TRUE, 0); + gtk_box_pack_end(GTK_BOX(mbox), box2, FALSE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(mbox), box3, FALSE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(mbox), table, TRUE, TRUE, 0); + gtk_container_add(GTK_CONTAINER(window), mbox); + + + /*********************************************************************/ + /* stuff in box3 frame header info */ + /*********************************************************************/ + /* + headerbox = gtk_label_new(" "); + gtk_label_set_justify(GTK_LABEL(headerbox),GTK_JUSTIFY_LEFT); + */ + headerbox = gtk_text_new(NULL, NULL); + gtk_text_set_editable(GTK_TEXT(headerbox), FALSE); + gtk_widget_set_usize(headerbox, 200, 20); + gtk_widget_show(headerbox); + gtk_box_pack_start(GTK_BOX(box3), headerbox, TRUE, TRUE, 0); + + + + /*********************************************************************/ + /* stuff in box2 frame counters */ + /*********************************************************************/ + framecounter = gtk_label_new(""); + gtk_widget_show(framecounter); + gtk_box_pack_start(GTK_BOX(box2), framecounter, FALSE, TRUE, 0); + + adj = (GtkAdjustment *) gtk_adjustment_new(0, 0, (gint) lame_get_totalframes(gfp) - 1, 0, 0, 0); + frameprogress = gtk_progress_bar_new_with_adjustment(adj); + /* Set the format of the string that can be displayed in the + * trough of the progress bar: + * %p - percentage + * %v - value + * %l - lower range value + * %u - upper range value */ + gtk_progress_set_format_string(GTK_PROGRESS(frameprogress), "%p%%"); + gtk_progress_set_value(GTK_PROGRESS(frameprogress), (gdouble) 0); + gtk_progress_set_show_text(GTK_PROGRESS(frameprogress), TRUE); + gtk_widget_show(frameprogress); + gtk_box_pack_end(GTK_BOX(box2), frameprogress, FALSE, TRUE, 0); + + + + /*********************************************************************/ + /* stuff in box1 buttons along bottom */ + /*********************************************************************/ + button = gtk_button_new_with_label("-1"); + gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(frameadv), (gpointer) "-1"); + gtk_box_pack_start(GTK_BOX(box1), button, TRUE, TRUE, 0); + gtk_widget_show(button); + + button = gtk_button_new_with_label("+1"); + gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(frameadv), (gpointer) "1"); + gtk_box_pack_start(GTK_BOX(box1), button, TRUE, TRUE, 0); + gtk_widget_show(button); + + button = gtk_button_new_with_label("+10"); + gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(frameadv), (gpointer) "10"); + gtk_box_pack_start(GTK_BOX(box1), button, TRUE, TRUE, 0); + gtk_widget_show(button); + + button = gtk_button_new_with_label("+100"); + gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(frameadv), (gpointer) "100"); + gtk_box_pack_start(GTK_BOX(box1), button, TRUE, TRUE, 0); + gtk_widget_show(button); + + button = gtk_button_new_with_label("last frame"); + gtk_signal_connect(GTK_OBJECT(button), "clicked", + GTK_SIGNAL_FUNC(frameadv), (gpointer) "finish"); + gtk_box_pack_start(GTK_BOX(box1), button, TRUE, TRUE, 0); + gtk_widget_show(button); + + button = gtk_button_new_with_label("stop/plot"); + gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(plotclick), NULL); + gtk_box_pack_start(GTK_BOX(box1), button, TRUE, TRUE, 0); + gtk_widget_show(button); + + + /*********************************************************************/ + /* stuff in table. all the plotting windows */ + /*********************************************************************/ + pcmbox = gpk_plot_new(graphx, graphy); + gtk_table_attach(GTK_TABLE(table), pcmbox, 0, 2, 0, 1, tableops, tableops, 2, 2); + gtk_widget_show(pcmbox); + + winbox = gpk_plot_new(graphy, graphy); + gtk_table_attach(GTK_TABLE(table), winbox, 0, 2, 1, 2, tableops, tableops, 2, 2); + gtk_widget_show(winbox); + + + mdctbox[0] = gpk_plot_new(graphy, graphy); + gtk_table_attach(GTK_TABLE(table), mdctbox[0], 0, 1, 2, 3, tableops, tableops, 2, 2); + gtk_widget_show(mdctbox[0]); + + mdctbox[1] = gpk_plot_new(graphy, graphy); + gtk_table_attach(GTK_TABLE(table), mdctbox[1], 1, 2, 2, 3, tableops, tableops, 2, 2); + gtk_widget_show(mdctbox[1]); + + enerbox[0] = gpk_plot_new(graphy, graphy); + gtk_table_attach(GTK_TABLE(table), enerbox[0], 0, 1, 3, 4, tableops, tableops, 2, 2); + gtk_widget_show(enerbox[0]); + + enerbox[1] = gpk_plot_new(graphy, graphy); + gtk_table_attach(GTK_TABLE(table), enerbox[1], 1, 2, 3, 4, tableops, tableops, 2, 2); + gtk_widget_show(enerbox[1]); + + sfbbox[0] = gpk_plot_new(graphy, graphy); + gtk_table_attach(GTK_TABLE(table), sfbbox[0], 0, 1, 4, 5, tableops, tableops, 2, 2); + gtk_widget_show(sfbbox[0]); + + sfbbox[1] = gpk_plot_new(graphy, graphy); + gtk_table_attach(GTK_TABLE(table), sfbbox[1], 1, 2, 4, 5, tableops, tableops, 2, 2); + gtk_widget_show(sfbbox[1]); + + + + + gtk_idle_add((GtkFunction) frameadv1, NULL); + gtk_widget_show(menubar); + gtk_widget_show(box2); + gtk_widget_show(box3); + gtk_widget_show(table); + gtk_widget_show(box1); + gtk_widget_show(mbox); + gtk_widget_show(window); /* show smallest allowed window */ + + /* make window bigger. */ + /* now the user will be able to shrink it, if desired */ + /* gtk_widget_set_usize(mbox,500,500); */ + /* gtk_widget_show (window); */ /* show smallest allowed window */ + + + + idle_keepgoing = 1; /* processing of frames is ON */ + idle_count_max = READ_AHEAD + 1; /* number of frames to process before plotting */ + idle_count = 0; /* pause & plot when idle_count=idle_count_max */ + + gtk_main(); + + assert(mp3done); + return (0); +} diff --git a/frontend/gtkanal.h b/frontend/gtkanal.h new file mode 100644 index 0000000..cf6854b --- /dev/null +++ b/frontend/gtkanal.h @@ -0,0 +1,25 @@ +/* + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef LAME_GTKCONTROL_H +#define LAME_GTKCONTROL_H + + +int gtkcontrol(lame_global_flags * gfp2, char *inPath); + +#endif diff --git a/frontend/lame_main.c b/frontend/lame_main.c new file mode 100644 index 0000000..bb8fb48 --- /dev/null +++ b/frontend/lame_main.c @@ -0,0 +1,661 @@ +/* + * Command line frontend program + * + * Copyright (c) 1999 Mark Taylor + * 2000 Takehiro TOMINAGA + * 2010-2017 Robert Hegemann + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* $Id: lame_main.c,v 1.18 2017/08/31 14:14:46 robert Exp $ */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <assert.h> +#include <stdio.h> + +#ifdef STDC_HEADERS +# include <stdlib.h> +# include <string.h> +#else +# ifndef HAVE_STRCHR +# define strchr index +# define strrchr rindex +# endif +char *strchr(), *strrchr(); +# ifndef HAVE_MEMCPY +# define memcpy(d, s, n) bcopy ((s), (d), (n)) +# define memmove(d, s, n) bcopy ((s), (d), (n)) +# endif +#endif + +#ifdef HAVE_FCNTL_H +# include <fcntl.h> +#endif + +#ifdef __sun__ +/* woraround for SunOS 4.x, it has SEEK_* defined here */ +#include <unistd.h> +#endif + +#if defined(_WIN32) +# include <windows.h> +#endif + + +/* + main.c is example code for how to use libmp3lame.a. To use this library, + you only need the library and lame.h. All other .h files are private + to the library. +*/ +#include "lame.h" + +#include "console.h" +#include "parse.h" +#include "main.h" +#include "get_audio.h" +#include "timestatus.h" + +/* PLL 14/04/2000 */ +#if macintosh +#include <console.h> +#endif + +#ifdef WITH_DMALLOC +#include <dmalloc.h> +#endif + + + + +/************************************************************************ +* +* main +* +* PURPOSE: MPEG-1,2 Layer III encoder with GPSYCHO +* psychoacoustic model. +* +************************************************************************/ + + +static FILE * +init_files(lame_global_flags * gf, char const *inPath, char const *outPath) +{ + FILE *outf; + /* Mostly it is not useful to use the same input and output name. + This test is very easy and buggy and don't recognize different names + assigning the same file + */ + if (0 != strcmp("-", outPath) && 0 == strcmp(inPath, outPath)) { + error_printf("Input file and Output file are the same. Abort.\n"); + return NULL; + } + + /* open the wav/aiff/raw pcm or mp3 input file. This call will + * open the file, try to parse the headers and + * set gf.samplerate, gf.num_channels, gf.num_samples. + * if you want to do your own file input, skip this call and set + * samplerate, num_channels and num_samples yourself. + */ + if (init_infile(gf, inPath) < 0) { + error_printf("Can't init infile '%s'\n", inPath); + return NULL; + } + if ((outf = init_outfile(outPath, lame_get_decode_only(gf))) == NULL) { + error_printf("Can't init outfile '%s'\n", outPath); + return NULL; + } + + return outf; +} + + +static void +printInputFormat(lame_t gfp) +{ + int const v_main = 2 - lame_get_version(gfp); + char const *v_ex = lame_get_out_samplerate(gfp) < 16000 ? ".5" : ""; + switch (global_reader.input_format) { + case sf_mp123: /* FIXME: !!! */ + break; + case sf_mp3: + console_printf("MPEG-%u%s Layer %s", v_main, v_ex, "III"); + break; + case sf_mp2: + console_printf("MPEG-%u%s Layer %s", v_main, v_ex, "II"); + break; + case sf_mp1: + console_printf("MPEG-%u%s Layer %s", v_main, v_ex, "I"); + break; + case sf_raw: + console_printf("raw PCM data"); + break; + case sf_wave: + console_printf("Microsoft WAVE"); + break; + case sf_aiff: + console_printf("SGI/Apple AIFF"); + break; + default: + console_printf("unknown"); + break; + } +} + +/* the simple lame decoder */ +/* After calling lame_init(), lame_init_params() and + * init_infile(), call this routine to read the input MP3 file + * and output .wav data to the specified file pointer*/ +/* lame_decoder will ignore the first 528 samples, since these samples + * represent the mpglib delay (and are all 0). skip = number of additional + * samples to skip, to (for example) compensate for the encoder delay */ + +static int +lame_decoder_loop(lame_t gfp, FILE * outf, char *inPath, char *outPath) +{ + short int Buffer[2][1152]; + int i, iread; + double wavsize; + int tmp_num_channels = lame_get_num_channels(gfp); + int skip_start = samples_to_skip_at_start(); + int skip_end = samples_to_skip_at_end(); + DecoderProgress dp = 0; + + if (!(tmp_num_channels >= 1 && tmp_num_channels <= 2)) { + error_printf("Internal error. Aborting."); + return -1; + } + + if (global_ui_config.silent < 9) { + console_printf("\rinput: %s%s(%g kHz, %i channel%s, ", + strcmp(inPath, "-") ? inPath : "<stdin>", + strlen(inPath) > 26 ? "\n\t" : " ", + lame_get_in_samplerate(gfp) / 1.e3, + tmp_num_channels, tmp_num_channels != 1 ? "s" : ""); + + printInputFormat(gfp); + + console_printf(")\noutput: %s%s(16 bit, Microsoft WAVE)\n", + strcmp(outPath, "-") ? outPath : "<stdout>", + strlen(outPath) > 45 ? "\n\t" : " "); + + if (skip_start > 0) + console_printf("skipping initial %i samples (encoder+decoder delay)\n", skip_start); + if (skip_end > 0) + console_printf("skipping final %i samples (encoder padding-decoder delay)\n", skip_end); + + switch (global_reader.input_format) { + case sf_mp3: + case sf_mp2: + case sf_mp1: + dp = decoder_progress_init(lame_get_num_samples(gfp), + global_decoder.mp3input_data.framesize); + break; + case sf_raw: + case sf_wave: + case sf_aiff: + default: + dp = decoder_progress_init(lame_get_num_samples(gfp), + lame_get_in_samplerate(gfp) < 32000 ? 576 : 1152); + break; + } + } + + if (0 == global_decoder.disable_wav_header) + WriteWaveHeader(outf, 0x7FFFFFFF, lame_get_in_samplerate(gfp), tmp_num_channels, 16); + /* unknown size, so write maximum 32 bit signed value */ + + wavsize = 0; + do { + iread = get_audio16(gfp, Buffer); /* read in 'iread' samples */ + if (iread >= 0) { + wavsize += iread; + if (dp != 0) { + decoder_progress(dp, &global_decoder.mp3input_data, iread); + } + put_audio16(outf, Buffer, iread, tmp_num_channels); + } + } while (iread > 0); + + i = (16 / 8) * tmp_num_channels; + assert(i > 0); + if (wavsize <= 0) { + if (global_ui_config.silent < 10) + error_printf("WAVE file contains 0 PCM samples\n"); + wavsize = 0; + } + else if (wavsize > 0xFFFFFFD0 / i) { + if (global_ui_config.silent < 10) + error_printf("Very huge WAVE file, can't set filesize accordingly\n"); + wavsize = 0xFFFFFFD0; + } + else { + wavsize *= i; + } + /* if outf is seekable, rewind and adjust length */ + if (!global_decoder.disable_wav_header && strcmp("-", outPath) + && !fseek(outf, 0l, SEEK_SET)) + WriteWaveHeader(outf, (int) wavsize, lame_get_in_samplerate(gfp), tmp_num_channels, 16); + + if (dp != 0) + decoder_progress_finish(dp); + return 0; +} + +static int +lame_decoder(lame_t gfp, FILE * outf, char *inPath, char *outPath) +{ + int ret; + + ret = lame_decoder_loop(gfp, outf, inPath, outPath); + fclose(outf); /* close the output file */ + close_infile(); /* close the input file */ + return ret; +} + + +static void +print_trailing_info(lame_global_flags * gf) +{ + if (lame_get_findReplayGain(gf)) { + int RadioGain = lame_get_RadioGain(gf); + console_printf("ReplayGain: %s%.1fdB\n", RadioGain > 0 ? "+" : "", + ((float) RadioGain) / 10.0); + if (RadioGain > 0x1FE || RadioGain < -0x1FE) + error_printf + ("WARNING: ReplayGain exceeds the -51dB to +51dB range. Such a result is too\n" + " high to be stored in the header.\n"); + } + + /* if (the user requested printing info about clipping) and (decoding + on the fly has actually been performed) */ + if (global_ui_config.print_clipping_info && lame_get_decode_on_the_fly(gf)) { + float noclipGainChange = (float) lame_get_noclipGainChange(gf) / 10.0f; + float noclipScale = lame_get_noclipScale(gf); + + if (noclipGainChange > 0.0) { /* clipping occurs */ + console_printf + ("WARNING: clipping occurs at the current gain. Set your decoder to decrease\n" + " the gain by at least %.1fdB or encode again ", noclipGainChange); + + /* advice the user on the scale factor */ + if (noclipScale > 0) { + console_printf("using --scale %.2f\n", noclipScale * lame_get_scale(gf)); + console_printf(" or less (the value under --scale is approximate).\n"); + } + else { + /* the user specified his own scale factor. We could suggest + * the scale factor of (32767.0/gfp->PeakSample)*(gfp->scale) + * but it's usually very inaccurate. So we'd rather advice him to + * disable scaling first and see our suggestion on the scale factor then. */ + console_printf("using --scale <arg>\n" + " (For a suggestion on the optimal value of <arg> encode\n" + " with --scale 1 first)\n"); + } + + } + else { /* no clipping */ + if (noclipGainChange > -0.1) + console_printf + ("\nThe waveform does not clip and is less than 0.1dB away from full scale.\n"); + else + console_printf + ("\nThe waveform does not clip and is at least %.1fdB away from full scale.\n", + -noclipGainChange); + } + } + +} + + +static int +write_xing_frame(lame_global_flags * gf, FILE * outf, size_t offset) +{ + unsigned char mp3buffer[LAME_MAXMP3BUFFER]; + size_t imp3, owrite; + + imp3 = lame_get_lametag_frame(gf, mp3buffer, sizeof(mp3buffer)); + if (imp3 <= 0) { + return 0; /* nothing to do */ + } + if (global_ui_config.silent <= 0) { + console_printf("Writing LAME Tag..."); + } + if (imp3 > sizeof(mp3buffer)) { + error_printf + ("Error writing LAME-tag frame: buffer too small: buffer size=%d frame size=%d\n", + sizeof(mp3buffer), imp3); + return -1; + } + assert( offset <= LONG_MAX ); + if (fseek(outf, (long) offset, SEEK_SET) != 0) { + error_printf("fatal error: can't update LAME-tag frame!\n"); + return -1; + } + owrite = fwrite(mp3buffer, 1, imp3, outf); + if (owrite != imp3) { + error_printf("Error writing LAME-tag \n"); + return -1; + } + if (global_ui_config.silent <= 0) { + console_printf("done\n"); + } + assert( imp3 <= INT_MAX ); + return (int) imp3; +} + + +static int +write_id3v1_tag(lame_t gf, FILE * outf) +{ + unsigned char mp3buffer[128]; + size_t imp3, owrite; + + imp3 = lame_get_id3v1_tag(gf, mp3buffer, sizeof(mp3buffer)); + if (imp3 <= 0) { + return 0; + } + if (imp3 > sizeof(mp3buffer)) { + error_printf("Error writing ID3v1 tag: buffer too small: buffer size=%d ID3v1 size=%d\n", + sizeof(mp3buffer), imp3); + return 0; /* not critical */ + } + owrite = fwrite(mp3buffer, 1, imp3, outf); + if (owrite != imp3) { + error_printf("Error writing ID3v1 tag \n"); + return 1; + } + return 0; +} + + +static int +lame_encoder_loop(lame_global_flags * gf, FILE * outf, int nogap, char *inPath, char *outPath) +{ + unsigned char mp3buffer[LAME_MAXMP3BUFFER]; + int Buffer[2][1152]; + int iread, imp3, owrite, in_limit=0; + size_t id3v2_size; + + encoder_progress_begin(gf, inPath, outPath); + + id3v2_size = lame_get_id3v2_tag(gf, 0, 0); + if (id3v2_size > 0) { + unsigned char *id3v2tag = malloc(id3v2_size); + if (id3v2tag != 0) { + size_t n_bytes = lame_get_id3v2_tag(gf, id3v2tag, id3v2_size); + size_t written = fwrite(id3v2tag, 1, n_bytes, outf); + free(id3v2tag); + if (written != n_bytes) { + encoder_progress_end(gf); + error_printf("Error writing ID3v2 tag \n"); + return 1; + } + } + } + else { + unsigned char* id3v2tag = getOldTag(gf); + id3v2_size = sizeOfOldTag(gf); + if ( id3v2_size > 0 ) { + size_t owrite = fwrite(id3v2tag, 1, id3v2_size, outf); + if (owrite != id3v2_size) { + encoder_progress_end(gf); + error_printf("Error writing ID3v2 tag \n"); + return 1; + } + } + } + if (global_writer.flush_write == 1) { + fflush(outf); + } + + /* do not feed more than in_limit PCM samples in one encode call + otherwise the mp3buffer is likely too small + */ + in_limit = lame_get_maximum_number_of_samples(gf, sizeof(mp3buffer)); + if (in_limit < 1) + in_limit = 1; + + /* encode until we hit eof */ + do { + /* read in 'iread' samples */ + iread = get_audio(gf, Buffer); + + if (iread >= 0) { + const int* buffer_l = Buffer[0]; + const int* buffer_r = Buffer[1]; + int rest = iread; + do { + int const chunk = rest < in_limit ? rest : in_limit; + encoder_progress(gf); + + /* encode */ + + imp3 = lame_encode_buffer_int(gf, buffer_l, buffer_r, chunk, + mp3buffer, sizeof(mp3buffer)); + buffer_l += chunk; + buffer_r += chunk; + rest -= chunk; + + /* was our output buffer big enough? */ + if (imp3 < 0) { + if (imp3 == -1) + error_printf("mp3 buffer is not big enough... \n"); + else + error_printf("mp3 internal error: error code=%i\n", imp3); + return 1; + } + owrite = (int) fwrite(mp3buffer, 1, imp3, outf); + if (owrite != imp3) { + error_printf("Error writing mp3 output \n"); + return 1; + } + } while (rest > 0); + } + if (global_writer.flush_write == 1) { + fflush(outf); + } + } while (iread > 0); + + if (nogap) + imp3 = lame_encode_flush_nogap(gf, mp3buffer, sizeof(mp3buffer)); /* may return one more mp3 frame */ + else + imp3 = lame_encode_flush(gf, mp3buffer, sizeof(mp3buffer)); /* may return one more mp3 frame */ + + if (imp3 < 0) { + if (imp3 == -1) + error_printf("mp3 buffer is not big enough... \n"); + else + error_printf("mp3 internal error: error code=%i\n", imp3); + return 1; + + } + + encoder_progress_end(gf); + + owrite = (int) fwrite(mp3buffer, 1, imp3, outf); + if (owrite != imp3) { + error_printf("Error writing mp3 output \n"); + return 1; + } + if (global_writer.flush_write == 1) { + fflush(outf); + } + imp3 = write_id3v1_tag(gf, outf); + if (global_writer.flush_write == 1) { + fflush(outf); + } + if (imp3) { + return 1; + } + write_xing_frame(gf, outf, id3v2_size); + if (global_writer.flush_write == 1) { + fflush(outf); + } + if (global_ui_config.silent <= 0) { + print_trailing_info(gf); + } + return 0; +} + + +static int +lame_encoder(lame_global_flags * gf, FILE * outf, int nogap, char *inPath, char *outPath) +{ + int ret; + + ret = lame_encoder_loop(gf, outf, nogap, inPath, outPath); + fclose(outf); /* close the output file */ + close_infile(); /* close the input file */ + return ret; +} + + +int +lame_main(lame_t gf, int argc, char **argv) +{ + char inPath[PATH_MAX + 1]; + char outPath[PATH_MAX + 1]; + char nogapdir[PATH_MAX + 1]; + /* support for "nogap" encoding of up to 200 .wav files */ +#define MAX_NOGAP 200 + int nogapout = 0; + int max_nogap = MAX_NOGAP; + char nogap_inPath_[MAX_NOGAP][PATH_MAX + 1]; + char *nogap_inPath[MAX_NOGAP]; + char nogap_outPath_[MAX_NOGAP][PATH_MAX + 1]; + char *nogap_outPath[MAX_NOGAP]; + + int ret; + int i; + FILE *outf = NULL; + + lame_set_msgf(gf, &frontend_msgf); + lame_set_errorf(gf, &frontend_errorf); + lame_set_debugf(gf, &frontend_debugf); + if (argc <= 1) { + usage(stderr, argv[0]); /* no command-line args, print usage, exit */ + return 1; + } + + memset(inPath, 0, sizeof(inPath)); + memset(nogap_inPath_, 0, sizeof(nogap_inPath_)); + for (i = 0; i < MAX_NOGAP; ++i) { + nogap_inPath[i] = &nogap_inPath_[i][0]; + } + memset(nogap_outPath_, 0, sizeof(nogap_outPath_)); + for (i = 0; i < MAX_NOGAP; ++i) { + nogap_outPath[i] = &nogap_outPath_[i][0]; + } + + /* parse the command line arguments, setting various flags in the + * struct 'gf'. If you want to parse your own arguments, + * or call libmp3lame from a program which uses a GUI to set arguments, + * skip this call and set the values of interest in the gf struct. + * (see the file API and lame.h for documentation about these parameters) + */ + ret = parse_args(gf, argc, argv, inPath, outPath, nogap_inPath, &max_nogap); + if (ret < 0) { + return ret == -2 ? 0 : 1; + } + if (global_ui_config.update_interval < 0.) + global_ui_config.update_interval = 2.; + + if (outPath[0] != '\0' && max_nogap > 0) { + strncpy(nogapdir, outPath, PATH_MAX + 1); + nogapdir[PATH_MAX] = '\0'; + nogapout = 1; + } + + /* initialize input file. This also sets samplerate and as much + other data on the input file as available in the headers */ + if (max_nogap > 0) { + /* for nogap encoding of multiple input files, it is not possible to + * specify the output file name, only an optional output directory. */ + for (i = 0; i < max_nogap; ++i) { + char const* outdir = nogapout ? nogapdir : ""; + if (generateOutPath(nogap_inPath[i], outdir, ".mp3", nogap_outPath[i]) != 0) { + error_printf("processing nogap file %d: %s\n", i+1, nogap_inPath[i]); + return -1; + } + } + outf = init_files(gf, nogap_inPath[0], nogap_outPath[0]); + } + else { + outf = init_files(gf, inPath, outPath); + } + if (outf == NULL) { + close_infile(); + return -1; + } + /* turn off automatic writing of ID3 tag data into mp3 stream + * we have to call it before 'lame_init_params', because that + * function would spit out ID3v2 tag data. + */ + lame_set_write_id3tag_automatic(gf, 0); + + /* Now that all the options are set, lame needs to analyze them and + * set some more internal options and check for problems + */ + ret = lame_init_params(gf); + if (ret < 0) { + if (ret == -1) { + display_bitrates(stderr); + } + error_printf("fatal error during initialization\n"); + fclose(outf); + close_infile(); + return ret; + } + + if (global_ui_config.silent > 0) { + global_ui_config.brhist = 0; /* turn off VBR histogram */ + } + + if (lame_get_decode_only(gf)) { + /* decode an mp3 file to a .wav */ + ret = lame_decoder(gf, outf, inPath, outPath); + } + else if (max_nogap == 0) { + /* encode a single input file */ + ret = lame_encoder(gf, outf, 0, inPath, outPath); + } + else { + /* encode multiple input files using nogap option */ + for (i = 0; i < max_nogap; ++i) { + int use_flush_nogap = (i != (max_nogap - 1)); + if (i > 0) { + /* note: if init_files changes anything, like + samplerate, num_channels, etc, we are screwed */ + outf = init_files(gf, nogap_inPath[i], nogap_outPath[i]); + if (outf == NULL) { + close_infile(); + return -1; + } + /* reinitialize bitstream for next encoding. this is normally done + * by lame_init_params(), but we cannot call that routine twice */ + lame_init_bitstream(gf); + } + lame_set_nogap_total(gf, max_nogap); + lame_set_nogap_currentindex(gf, i); + ret = lame_encoder(gf, outf, use_flush_nogap, nogap_inPath[i], nogap_outPath[i]); + } + } + return ret; +} diff --git a/frontend/lametime.c b/frontend/lametime.c new file mode 100644 index 0000000..f11d2e6 --- /dev/null +++ b/frontend/lametime.c @@ -0,0 +1,149 @@ +/* + * Lame time routines source file + * + * Copyright (c) 2000 Mark Taylor + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* $Id: lametime.c,v 1.21 2011/05/07 16:05:17 rbrito Exp $ */ + +/* + * name: GetCPUTime ( void ) + * + * description: returns CPU time used by the process + * input: none + * output: time in seconds + * known bugs: may not work in SMP and RPC + * conforming: ANSI C + * + * There is some old difficult to read code at the end of this file. + * Can someone integrate this into this function (if useful)? + */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <assert.h> +#include <stdio.h> +#include <time.h> + +#ifdef WITH_DMALLOC +#include <dmalloc.h> +#endif + +#include "lametime.h" + +#if !defined(CLOCKS_PER_SEC) +# warning Your system does not define CLOCKS_PER_SEC, guessing one... +# define CLOCKS_PER_SEC 1000000 +#endif + + +double +GetCPUTime(void) +{ + clock_t t; + +#if defined(_MSC_VER) || defined(__BORLANDC__) + t = clock(); +#else + t = clock(); +#endif + return t / (double) CLOCKS_PER_SEC; +} + + +/* + * name: GetRealTime ( void ) + * + * description: returns real (human) time elapsed relative to a fixed time (mostly 1970-01-01 00:00:00) + * input: none + * output: time in seconds + * known bugs: bad precision with time() + */ + +#if defined(__unix__) || defined(SVR4) || defined(BSD) + +# include <sys/time.h> +# include <unistd.h> + +double +GetRealTime(void) +{ /* conforming: SVr4, BSD 4.3 */ + struct timeval t; + + if (0 != gettimeofday(&t, NULL)) + assert(0); + return t.tv_sec + 1.e-6 * t.tv_usec; +} + +#elif defined(WIN16) || defined(WIN32) + +# include <stdio.h> +# include <sys/types.h> +# include <sys/timeb.h> + +double +GetRealTime(void) +{ /* conforming: Win 95, Win NT */ + struct timeb t; + + ftime(&t); + return t.time + 1.e-3 * t.millitm; +} + +#else + +double +GetRealTime(void) +{ /* conforming: SVr4, SVID, POSIX, X/OPEN, BSD 4.3 */ /* BUT NOT GUARANTEED BY ANSI */ + time_t t; + + t = time(NULL); + return (double) t; +} + +#endif + + +#if defined(_WIN32) || defined(__CYGWIN__) +# include <io.h> +# include <fcntl.h> +#else +# include <unistd.h> +#endif + +int +lame_set_stream_binary_mode(FILE * const fp) +{ +#if defined __EMX__ + _fsetmode(fp, "b"); +#elif defined __BORLANDC__ + setmode(_fileno(fp), O_BINARY); +#elif defined __CYGWIN__ + setmode(fileno(fp), _O_BINARY); +#elif defined _WIN32 + _setmode(_fileno(fp), _O_BINARY); +#else + (void) fp; /* doing nothing here, silencing the compiler only. */ +#endif + return 0; +} + + +/* End of lametime.c */ diff --git a/frontend/lametime.h b/frontend/lametime.h new file mode 100644 index 0000000..fb4252f --- /dev/null +++ b/frontend/lametime.h @@ -0,0 +1,41 @@ +/* + * Lame time routines include file + * + * Copyright (c) 2000 Mark Taylor + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef LAME_LAMETIME_H +#define LAME_LAMETIME_H + +#include <sys/types.h> +#include "lame.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +extern double GetCPUTime(void); +extern double GetRealTime(void); + +extern int lame_set_stream_binary_mode(FILE * const fp); + +#if defined(__cplusplus) +} +#endif + +#endif /* LAME_LAMETIME_H */ diff --git a/frontend/main.c b/frontend/main.c new file mode 100644 index 0000000..a2e34f7 --- /dev/null +++ b/frontend/main.c @@ -0,0 +1,495 @@ +/* + * Command line frontend program + * + * Copyright (c) 1999 Mark Taylor + * 2000 Takehiro TOMINAGA + * 2010-2012 Robert Hegemann + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* $Id: main.c,v 1.131 2017/08/12 18:56:15 robert Exp $ */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <assert.h> +#include <stdio.h> + +#ifdef STDC_HEADERS +# include <stdlib.h> +# include <string.h> +#else +# ifndef HAVE_STRCHR +# define strchr index +# define strrchr rindex +# endif +char *strchr(), *strrchr(); +# ifndef HAVE_MEMCPY +# define memcpy(d, s, n) bcopy ((s), (d), (n)) +# define memmove(d, s, n) bcopy ((s), (d), (n)) +# endif +#endif + +#ifdef HAVE_FCNTL_H +# include <fcntl.h> +#endif + +#ifdef __sun__ +/* woraround for SunOS 4.x, it has SEEK_* defined here */ +#include <unistd.h> +#endif + +#ifdef __OS2__ +#include <os2.h> +#define PRTYC_IDLE 1 +#define PRTYC_REGULAR 2 +#define PRTYD_MINIMUM -31 +#define PRTYD_MAXIMUM 31 +#endif + +#if defined(_WIN32) +# include <windows.h> +#endif + + +/* + main.c is example code for how to use libmp3lame.a. To use this library, + you only need the library and lame.h. All other .h files are private + to the library. +*/ +#include "lame.h" + +#include "console.h" +#include "main.h" + +/* PLL 14/04/2000 */ +#if macintosh +#include <console.h> +#endif + +#ifdef WITH_DMALLOC +#include <dmalloc.h> +#endif + + +static int c_main(int argc, char *argv[]); +extern int lame_main(lame_t gf, int argc, char *argv[]); + + +/************************************************************************ +* +* main +* +* PURPOSE: MPEG-1,2 Layer III encoder with GPSYCHO +* psychoacoustic model. +* +************************************************************************/ + + +#if defined( _WIN32 ) && !defined(__MINGW32__) +static void +set_process_affinity() +{ +#if 0 + /* rh 061207 + the following fix seems to be a workaround for a problem in the + parent process calling LAME. It would be better to fix the broken + application => code disabled. + */ +#if defined(_WIN32) + /* set affinity back to all CPUs. Fix for EAC/lame on SMP systems from + "Todd Richmond" <todd.richmond@openwave.com> */ + typedef BOOL(WINAPI * SPAMFunc) (HANDLE, DWORD_PTR); + SPAMFunc func; + SYSTEM_INFO si; + + if ((func = (SPAMFunc) GetProcAddress(GetModuleHandleW(L"KERNEL32.DLL"), + "SetProcessAffinityMask")) != NULL) { + GetSystemInfo(&si); + func(GetCurrentProcess(), si.dwActiveProcessorMask); + } +#endif +#endif +} +#endif + +#if defined(WIN32) + +/** + * Long Filename support for the WIN32 platform + * + */ + +void +dosToLongFileName(char *fn) +{ + const size_t MSIZE = PATH_MAX + 1 - 4; /* we wanna add ".mp3" later */ + WIN32_FIND_DATAA lpFindFileData; + HANDLE h = FindFirstFileA(fn, &lpFindFileData); + if (h != INVALID_HANDLE_VALUE) { + size_t a; + char *q, *p; + FindClose(h); + for (a = 0; a < MSIZE; a++) { + if ('\0' == lpFindFileData.cFileName[a]) + break; + } + if (a >= MSIZE || a == 0) + return; + q = strrchr(fn, '\\'); + p = strrchr(fn, '/'); + if (p - q > 0) + q = p; + if (q == NULL) + q = strrchr(fn, ':'); + if (q == NULL) + strncpy(fn, lpFindFileData.cFileName, a); + else { + a += q - fn + 1; + if (a >= MSIZE) + return; + strncpy(++q, lpFindFileData.cFileName, MSIZE - a); + } + } +} + +BOOL +SetPriorityClassMacro(DWORD p) +{ + HANDLE op = GetCurrentProcess(); + return SetPriorityClass(op, p); +} + +void +setProcessPriority(int Priority) +{ + switch (Priority) { + case 0: + case 1: + SetPriorityClassMacro(IDLE_PRIORITY_CLASS); + console_printf("==> Priority set to Low.\n"); + break; + default: + case 2: + SetPriorityClassMacro(NORMAL_PRIORITY_CLASS); + console_printf("==> Priority set to Normal.\n"); + break; + case 3: + case 4: + SetPriorityClassMacro(HIGH_PRIORITY_CLASS); + console_printf("==> Priority set to High.\n"); + break; + } +} +#endif + + +#if defined(__OS2__) +/* OS/2 priority functions */ +static void +setProcessPriority(int Priority) +{ + int rc; + + switch (Priority) { + + case 0: + rc = DosSetPriority(0, /* Scope: only one process */ + PRTYC_IDLE, /* select priority class (idle, regular, etc) */ + 0, /* set delta */ + 0); /* Assume current process */ + console_printf("==> Priority set to 0 (Low priority).\n"); + break; + + case 1: + rc = DosSetPriority(0, /* Scope: only one process */ + PRTYC_IDLE, /* select priority class (idle, regular, etc) */ + PRTYD_MAXIMUM, /* set delta */ + 0); /* Assume current process */ + console_printf("==> Priority set to 1 (Medium priority).\n"); + break; + + case 2: + rc = DosSetPriority(0, /* Scope: only one process */ + PRTYC_REGULAR, /* select priority class (idle, regular, etc) */ + PRTYD_MINIMUM, /* set delta */ + 0); /* Assume current process */ + console_printf("==> Priority set to 2 (Regular priority).\n"); + break; + + case 3: + rc = DosSetPriority(0, /* Scope: only one process */ + PRTYC_REGULAR, /* select priority class (idle, regular, etc) */ + 0, /* set delta */ + 0); /* Assume current process */ + console_printf("==> Priority set to 3 (High priority).\n"); + break; + + case 4: + rc = DosSetPriority(0, /* Scope: only one process */ + PRTYC_REGULAR, /* select priority class (idle, regular, etc) */ + PRTYD_MAXIMUM, /* set delta */ + 0); /* Assume current process */ + console_printf("==> Priority set to 4 (Maximum priority). I hope you enjoy it :)\n"); + break; + + default: + console_printf("==> Invalid priority specified! Assuming idle priority.\n"); + } +} +#endif + + +/*********************************************************************** +* +* Message Output +* +***********************************************************************/ + + +#if defined( _WIN32 ) && !defined(__MINGW32__) +/* Idea for unicode support in LAME, work in progress + * - map UTF-16 to UTF-8 + * - advantage, the rest can be kept unchanged (mostly) + * - make sure, fprintf on console is in correct code page + * + normal text in source code is in ASCII anyway + * + ID3 tags and filenames coming from command line need attention + * - call wfopen with UTF-16 names where needed + * + * why not wchar_t all the way? + * well, that seems to be a big mess and not portable at all + */ +#ifndef NDEBUG +#define _CRTDBG_MAP_ALLOC +#include <stdlib.h> +#include <crtdbg.h> +#endif +#include <wchar.h> +#include <mbstring.h> + +static wchar_t *mbsToUnicode(const char *mbstr, int code_page) +{ + int n = MultiByteToWideChar(code_page, 0, mbstr, -1, NULL, 0); + wchar_t* wstr = malloc( n*sizeof(wstr[0]) ); + if ( wstr !=0 ) { + n = MultiByteToWideChar(code_page, 0, mbstr, -1, wstr, n); + if ( n==0 ) { + free( wstr ); + wstr = 0; + } + } + return wstr; +} + +static char *unicodeToMbs(const wchar_t *wstr, int code_page) +{ + int n = 1+WideCharToMultiByte(code_page, 0, wstr, -1, 0, 0, 0, 0); + char* mbstr = malloc( n*sizeof(mbstr[0]) ); + if ( mbstr !=0 ) { + n = WideCharToMultiByte(code_page, 0, wstr, -1, mbstr, n, 0, 0); + if( n == 0 ){ + free( mbstr ); + mbstr = 0; + } + } + return mbstr; +} + +char* mbsToMbs(const char* str, int cp_from, int cp_to) +{ + wchar_t* wstr = mbsToUnicode(str, cp_from); + if ( wstr != 0 ) { + char* local8bit = unicodeToMbs(wstr, cp_to); + free( wstr ); + return local8bit; + } + return 0; +} + +enum { cp_utf8, cp_console, cp_actual }; + +wchar_t *utf8ToUnicode(const char *mbstr) +{ + return mbsToUnicode(mbstr, CP_UTF8); +} + +char *unicodeToUtf8(const wchar_t *wstr) +{ + return unicodeToMbs(wstr, CP_UTF8); +} + +char* utf8ToLocal8Bit(const char* str) +{ + return mbsToMbs(str, CP_UTF8, CP_ACP); +} + +char* utf8ToConsole8Bit(const char* str) +{ + return mbsToMbs(str, CP_UTF8, GetConsoleOutputCP()); +} + +char* local8BitToUtf8(const char* str) +{ + return mbsToMbs(str, CP_ACP, CP_UTF8); +} + +char* console8BitToUtf8(const char* str) +{ + return mbsToMbs(str, GetConsoleOutputCP(), CP_UTF8); +} + +char* utf8ToLatin1(char const* str) +{ + return mbsToMbs(str, CP_UTF8, 28591); /* Latin-1 is code page 28591 */ +} + +unsigned short* utf8ToUtf16(char const* mbstr) /* additional Byte-Order-Marker */ +{ + int n = MultiByteToWideChar(CP_UTF8, 0, mbstr, -1, NULL, 0); + wchar_t* wstr = malloc( (n+1)*sizeof(wstr[0]) ); + if ( wstr !=0 ) { + wstr[0] = 0xfeff; /* BOM */ + n = MultiByteToWideChar(CP_UTF8, 0, mbstr, -1, wstr+1, n); + if ( n==0 ) { + free( wstr ); + wstr = 0; + } + } + return wstr; +} + +static +void setDebugMode() +{ +#ifndef NDEBUG + if ( IsDebuggerPresent() ) { + // Get current flag + int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG ); + //tmpFlag |= _CRTDBG_DELAY_FREE_MEM_DF; + tmpFlag |= _CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF; + // Set flag to the new value. + _CrtSetDbgFlag( tmpFlag ); + _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE); + _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR); + } +#endif +} + +int wmain(int argc, wchar_t* argv[]) +{ + char **utf8_argv; + int i, ret; + setDebugMode(); + utf8_argv = calloc(argc, sizeof(char*)); + for (i = 0; i < argc; ++i) { + utf8_argv[i] = unicodeToUtf8(argv[i]); + } + ret = c_main(argc, utf8_argv); + for (i = 0; i < argc; ++i) { + free( utf8_argv[i] ); + } + free( utf8_argv ); + return ret; +} + +FILE* lame_fopen(char const* file, char const* mode) +{ + FILE* fh = 0; + wchar_t* wfile = utf8ToUnicode(file); + wchar_t* wmode = utf8ToUnicode(mode); + if (wfile != 0 && wmode != 0) { + fh = _wfopen(wfile, wmode); + } + else { + fh = fopen(file, mode); + } + free(wfile); + free(wmode); + return fh; +} + +char* lame_getenv(char const* var) +{ + char* str = 0; + wchar_t* wvar = utf8ToUnicode(var); + if (wvar != 0) { + wchar_t* wstr = _wgetenv(wvar); + if (wstr != 0) { + str = unicodeToUtf8(wstr); + } + } + free(wvar); + return str; +} + +#else + +FILE* lame_fopen(char const* file, char const* mode) +{ + return fopen(file, mode); +} + +char* lame_getenv(char const* var) +{ + char* str = getenv(var); + if (str) { + return strdup(str); + } + return 0; +} + +int main(int argc, char *argv[]) +{ + return c_main(argc, argv); +} + +#endif + + + + +static int +c_main(int argc, char *argv[]) +{ + lame_t gf; + int ret; + +#if macintosh + argc = ccommand(&argv); +#endif +#ifdef __EMX__ + /* This gives wildcard expansion on Non-POSIX shells with OS/2 */ + _wildcard(&argc, &argv); +#endif +#if defined( _WIN32 ) && !defined(__MINGW32__) + set_process_affinity(); +#endif + + frontend_open_console(); + gf = lame_init(); /* initialize libmp3lame */ + if (NULL == gf) { + error_printf("fatal error during initialization\n"); + ret = 1; + } + else { + ret = lame_main(gf, argc, argv); + lame_close(gf); + } + frontend_close_console(); + return ret; +} diff --git a/frontend/main.h b/frontend/main.h new file mode 100644 index 0000000..4e705bf --- /dev/null +++ b/frontend/main.h @@ -0,0 +1,110 @@ +/* + * Command line frontend program + * + * Copyright (c) 1999 Mark Taylor + * 2000 Takehiro TOMIANGA + * 2010-2011 Robert Hegemann + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef MAIN_H_INCLUDED +#define MAIN_H_INCLUDED + +#ifdef HAVE_LIMITS_H +# include <limits.h> +#endif + +#include "get_audio.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +#ifndef PATH_MAX +#define PATH_MAX 1024 +#endif + + +/* GLOBAL VARIABLES used by parse.c and main.c. + instantiated in parce.c. ugly, ugly */ + +typedef struct ReaderConfig +{ + sound_file_format input_format; + int swapbytes; /* force byte swapping default=0 */ + int swap_channel; /* 0: no-op, 1: swaps input channels */ + int input_samplerate; + int ignorewavlength; +} ReaderConfig; + +typedef struct WriterConfig +{ + int flush_write; +} WriterConfig; + +typedef struct UiConfig +{ + int silent; /* Verbosity */ + int brhist; + int print_clipping_info; /* print info whether waveform clips */ + float update_interval; /* to use Frank's time status display */ +} UiConfig; + +typedef struct DecoderConfig +{ + int mp3_delay; /* to adjust the number of samples truncated during decode */ + int mp3_delay_set; /* user specified the value of the mp3 encoder delay to assume for decoding */ + int disable_wav_header; + mp3data_struct mp3input_data; +} DecoderConfig; + +typedef enum ByteOrder { ByteOrderLittleEndian, ByteOrderBigEndian } ByteOrder; + +typedef struct RawPCMConfig +{ + int in_bitwidth; + int in_signed; + ByteOrder in_endian; +} RawPCMConfig; + +extern ReaderConfig global_reader; +extern WriterConfig global_writer; +extern UiConfig global_ui_config; +extern DecoderConfig global_decoder; +extern RawPCMConfig global_raw_pcm; + + +extern FILE* lame_fopen(char const* file, char const* mode); +extern char* utf8ToConsole8Bit(const char* str); +extern char* utf8ToLocal8Bit(const char* str); +extern unsigned short* utf8ToUtf16(char const* str); +extern char* utf8ToLatin1(char const* str); +#ifdef _WIN32 +extern wchar_t* utf8ToUnicode(char const* str); +#endif + +extern void dosToLongFileName(char* filename); +extern void setProcessPriority(int priority); + +extern int lame_main(lame_t gf, int argc, char** argv); +extern char* lame_getenv(char const* var); + +#if defined(__cplusplus) +} +#endif + +#endif diff --git a/frontend/mp3rtp.c b/frontend/mp3rtp.c new file mode 100644 index 0000000..eb8ab57 --- /dev/null +++ b/frontend/mp3rtp.c @@ -0,0 +1,269 @@ +/* + * mp3rtp command line frontend program + * + * initially contributed by Felix von Leitner + * + * Copyright (c) 2000 Mark Taylor + * 2010 Robert Hegemann + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* $Id: mp3rtp.c,v 1.37 2017/08/24 20:43:10 robert Exp $ */ + +/* Still under work ..., need a client for test, where can I get one? */ + +/* An audio player named Zinf (aka freeamp) can play rtp streams */ + +/* + * experimental translation: + * + * gcc -I..\include -I..\libmp3lame -o mp3rtp mp3rtp.c ../libmp3lame/libmp3lame.a lametime.c get_audio.c ieeefloat.c timestatus.c parse.c rtp.c -lm + * + * wavrec -t 14400 -s 44100 -S /proc/self/fd/1 | ./mp3rtp 10.1.1.42 -V2 -b128 -B256 - my_mp3file.mp3 + */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#ifdef HAVE_STDINT_H +# include <stdint.h> +#endif + +#ifdef STDC_HEADERS +# include <stdlib.h> +# include <string.h> +#endif + +#include <time.h> + +#ifdef HAVE_UNISTD_H +# include <unistd.h> +#endif + +#include "lame.h" +#include "main.h" +#include "parse.h" +#include "lametime.h" +#include "timestatus.h" +#include "get_audio.h" +#include "rtp.h" +#include "console.h" + +#ifdef WITH_DMALLOC +#include <dmalloc.h> +#endif + +/* + * Encode (via LAME) to mp3 with RTP streaming of the output. + * + * Author: Felix von Leitner <leitner@vim.org> + * + * mp3rtp ip[:port[:ttl]] [lame encoding options] infile outfile + * + * examples: + * arecord -b 16 -s 22050 -w | ./mp3rtp 224.17.23.42:5004:2 -b 56 - /dev/null + * arecord -b 16 -s 44100 -w | ./mp3rtp 10.1.1.42 -V2 -b128 -B256 - my_mp3file.mp3 + * + */ + + +static unsigned int +maxvalue(int Buffer[2][1152]) +{ + int max = 0; + int i; + + for (i = 0; i < 1152; i++) { + if (abs(Buffer[0][i]) > max) + max = abs(Buffer[0][i]); + if (abs(Buffer[1][i]) > max) + max = abs(Buffer[1][i]); + } + return max >> 16; +} + +static void +levelmessage(unsigned int maxv, int* maxx, int* tmpx) +{ + char buff[] = "| . | . | . | . | . | . | . | . | . | . | \r"; + int tmp = *tmpx, max = *maxx; + + buff[tmp] = '+'; + tmp = (maxv * 61 + 16384) / (32767 + 16384 / 61); + if (tmp > sizeof(buff) - 2) + tmp = sizeof(buff) - 2; + if (max < tmp) + max = tmp; + buff[max] = 'x'; + buff[tmp] = '#'; + console_printf(buff); + console_flush(); + *maxx = max; + *tmpx = tmp; +} + + +/************************************************************************ +* +* main +* +* PURPOSE: MPEG-1,2 Layer III encoder with GPSYCHO +* psychoacoustic model. +* +************************************************************************/ + +int +lame_main(lame_t gf, int argc, char **argv) +{ + unsigned char mp3buffer[LAME_MAXMP3BUFFER]; + char inPath[PATH_MAX + 1]; + char outPath[PATH_MAX + 1]; + int Buffer[2][1152]; + + int maxx = 0, tmpx = 0; + int ret; + int wavsamples; + int mp3bytes; + FILE *outf; + + char ip[16]; + unsigned int port = 5004; + unsigned int ttl = 2; + char dummy; + + if (argc <= 2) { + console_printf("Encode (via LAME) to mp3 with RTP streaming of the output\n" + "\n" + " mp3rtp ip[:port[:ttl]] [lame encoding options] infile outfile\n" + "\n" + " examples:\n" + " arecord -b 16 -s 22050 -w | ./mp3rtp 224.17.23.42:5004:2 -b 56 - /dev/null\n" + " arecord -b 16 -s 44100 -w | ./mp3rtp 10.1.1.42 -V2 -b128 -B256 - my_mp3file.mp3\n" + "\n"); + return 1; + } + + switch (sscanf(argv[1], "%11[.0-9]:%u:%u%c", ip, &port, &ttl, &dummy)) { + case 1: + case 2: + case 3: + break; + default: + error_printf("Illegal destination selector '%s', must be ip[:port[:ttl]]\n", argv[1]); + return -1; + } + rtp_initialization(); + if (rtp_socket(ip, port, ttl)) { + rtp_deinitialization(); + error_printf("fatal error during initialization\n"); + return 1; + } + + lame_set_errorf(gf, &frontend_errorf); + lame_set_debugf(gf, &frontend_debugf); + lame_set_msgf(gf, &frontend_msgf); + + /* Remove the argumets that are rtp related, and then + * parse the command line arguments, setting various flags in the + * struct pointed to by 'gf'. If you want to parse your own arguments, + * or call libmp3lame from a program which uses a GUI to set arguments, + * skip this call and set the values of interest in the gf struct. + * (see lame.h for documentation about these parameters) + */ + { + int i; + int argc_mod = argc-1; /* leaving out exactly one argument */ + char** argv_mod = calloc(argc_mod, sizeof(char*)); + argv_mod[0] = argv[0]; + for (i = 2; i < argc; ++i) { /* leaving out argument number 1, parsed above */ + argv_mod[i-1] = argv[i]; + } + parse_args(gf, argc_mod, argv_mod, inPath, outPath, NULL, NULL); + free(argv_mod); + } + + /* open the output file. Filename parsed into gf.inPath */ + if (0 == strcmp(outPath, "-")) { + lame_set_stream_binary_mode(outf = stdout); + } + else { + if ((outf = lame_fopen(outPath, "wb+")) == NULL) { + rtp_deinitialization(); + error_printf("Could not create \"%s\".\n", outPath); + return 1; + } + } + + + /* open the wav/aiff/raw pcm or mp3 input file. This call will + * open the file with name gf.inFile, try to parse the headers and + * set gf.samplerate, gf.num_channels, gf.num_samples. + * if you want to do your own file input, skip this call and set + * these values yourself. + */ + if (init_infile(gf, inPath) < 0) { + rtp_deinitialization(); + fclose(outf); + error_printf("Can't init infile '%s'\n", inPath); + return 1; + } + + + /* Now that all the options are set, lame needs to analyze them and + * set some more options + */ + ret = lame_init_params(gf); + if (ret < 0) { + if (ret == -1) + display_bitrates(stderr); + rtp_deinitialization(); + fclose(outf); + close_infile(); + error_printf("fatal error during initialization\n"); + return -1; + } + + lame_print_config(gf); /* print useful information about options being used */ + + if (global_ui_config.update_interval < 0.) + global_ui_config.update_interval = 2.; + + /* encode until we hit EOF */ + while ((wavsamples = get_audio(gf, Buffer)) > 0) { /* read in 'wavsamples' samples */ + levelmessage(maxvalue(Buffer), &maxx, &tmpx); + mp3bytes = lame_encode_buffer_int(gf, /* encode the frame */ + Buffer[0], Buffer[1], wavsamples, + mp3buffer, sizeof(mp3buffer)); + rtp_output(mp3buffer, mp3bytes); /* write MP3 output to RTP port */ + fwrite(mp3buffer, 1, mp3bytes, outf); /* write the MP3 output to file */ + } + + mp3bytes = lame_encode_flush(gf, /* may return one or more mp3 frame */ + mp3buffer, sizeof(mp3buffer)); + rtp_output(mp3buffer, mp3bytes); /* write MP3 output to RTP port */ + fwrite(mp3buffer, 1, mp3bytes, outf); /* write the MP3 output to file */ + + lame_mp3_tags_fid(gf, outf); /* add VBR tags to mp3 file */ + + rtp_deinitialization(); + fclose(outf); + close_infile(); /* close the sound input file */ + return 0; +} + +/* end of mp3rtp.c */ diff --git a/frontend/mp3x.c b/frontend/mp3x.c new file mode 100644 index 0000000..e8472a9 --- /dev/null +++ b/frontend/mp3x.c @@ -0,0 +1,65 @@ +/* $Id: mp3x.c,v 1.28 2010/04/08 11:07:50 robert Exp $ */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <stdio.h> + +#include "lame.h" +#include "machine.h" +#include "encoder.h" +#include "lame-analysis.h" +#include <gtk/gtk.h> +#include "parse.h" +#include "get_audio.h" +#include "gtkanal.h" +#include "lametime.h" + +#include "main.h" +#include "console.h" + + +/************************************************************************ +* +* main +* +* PURPOSE: MPEG-1,2 Layer III encoder with GPSYCHO +* psychoacoustic model. +* +************************************************************************/ +int +lame_main(lame_t gf, int argc, char **argv) +{ + unsigned char mp3buffer[LAME_MAXMP3BUFFER]; + char outPath[PATH_MAX + 1]; + char inPath[PATH_MAX + 1]; + int ret; + + lame_set_errorf(gf, &frontend_errorf); + lame_set_debugf(gf, &frontend_debugf); + lame_set_msgf(gf, &frontend_msgf); + if (argc <= 1) { + usage(stderr, argv[0]); /* no command-line args */ + return -1; + } + ret = parse_args(gf, argc, argv, inPath, outPath, NULL, NULL); + if (ret < 0) { + return ret == -2 ? 0 : 1; + } + (void) lame_set_analysis(gf, 1); + + if (init_infile(gf, inPath) < 0) { + error_printf("Can't init infile '%s'\n", inPath); + return 1; + } + lame_init_params(gf); + lame_print_config(gf); + + gtk_init(&argc, &argv); + gtkcontrol(gf, inPath); + + lame_encode_flush(gf, mp3buffer, sizeof(mp3buffer)); + close_infile(); + return 0; +} diff --git a/frontend/parse.c b/frontend/parse.c new file mode 100644 index 0000000..752613f --- /dev/null +++ b/frontend/parse.c @@ -0,0 +1,2624 @@ +/* + * Command line parsing related functions + * + * Copyright (c) 1999 Mark Taylor + * 2000-2017 Robert Hegemann + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* $Id: parse.c,v 1.307 2017/09/26 12:25:07 robert Exp $ */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <assert.h> +#include <ctype.h> +#include <math.h> + +#ifdef STDC_HEADERS +# include <stdio.h> +# include <stdlib.h> +# include <string.h> +#else +# ifndef HAVE_STRCHR +# define strchr index +# define strrchr rindex +# endif +char *strchr(), *strrchr(); +# ifndef HAVE_MEMCPY +# define memcpy(d, s, n) bcopy ((s), (d), (n)) +# define memmove(d, s, n) bcopy ((s), (d), (n)) +# endif +#endif + + +#ifdef HAVE_LIMITS_H +# include <limits.h> +#endif + +#include "lame.h" + +#include "parse.h" +#include "main.h" +#include "get_audio.h" +#include "version.h" +#include "console.h" + +#undef dimension_of +#define dimension_of(array) (sizeof(array)/sizeof(array[0])) + +#ifdef WITH_DMALLOC +#include <dmalloc.h> +#endif + + +#ifdef HAVE_ICONV +#include <iconv.h> +#include <errno.h> +#include <locale.h> +#include <langinfo.h> +#endif + +#if defined _ALLOW_INTERNAL_OPTIONS +#define INTERNAL_OPTS 1 +#else +#define INTERNAL_OPTS 0 +#endif + +#if (INTERNAL_OPTS!=0) +#include "set_get.h" +#define DEV_HELP(a) a +#else +#define DEV_HELP(a) +#define lame_set_tune(a,b) (void)0 +#define lame_set_short_threshold(a,b,c) (void)0 +#define lame_set_maskingadjust(a,b) (void)0 +#define lame_set_maskingadjust_short(a,b) (void)0 +#define lame_set_ATHcurve(a,b) (void)0 +#define lame_set_preset_notune(a,b) (void)0 +#define lame_set_substep(a,b) (void)0 +#define lame_set_subblock_gain(a,b) (void)0 +#define lame_set_sfscale(a,b) (void)0 +#endif + +static int const lame_alpha_version_enabled = LAME_ALPHA_VERSION; +static int const internal_opts_enabled = INTERNAL_OPTS; + +/* GLOBAL VARIABLES. set by parse_args() */ +/* we need to clean this up */ + +ReaderConfig global_reader = { sf_unknown, 0, 0, 0, 0 }; +WriterConfig global_writer = { 0 }; + +UiConfig global_ui_config = {0,0,0,0}; + +DecoderConfig global_decoder; + +RawPCMConfig global_raw_pcm = +{ /* in_bitwidth */ 16 +, /* in_signed */ -1 +, /* in_endian */ ByteOrderLittleEndian +}; + + + +/* possible text encodings */ +typedef enum TextEncoding +{ TENC_RAW /* bytes will be stored as-is into ID3 tags, which are Latin1 per definition */ +, TENC_LATIN1 /* text will be converted from local encoding to Latin1, as ID3 needs it */ +, TENC_UTF16 /* text will be converted from local encoding to Unicode, as ID3v2 wants it */ +} TextEncoding; + +#ifdef HAVE_ICONV +#define ID3TAGS_EXTENDED +/* search for Zero termination in multi-byte strings */ +static size_t +strlenMultiByte(char const* str, size_t w) +{ + size_t n = 0; + if (str != 0) { + size_t i, x = 0; + for (n = 0; ; ++n) { + x = 0; + for (i = 0; i < w; ++i) { + x += *str++ == 0 ? 1 : 0; + } + if (x == w) { + break; + } + } + } + return n; +} + + +static size_t +currCharCodeSize(void) +{ + size_t n = 1; + char dst[32]; + char* src = "A"; + char* cur_code = nl_langinfo(CODESET); + iconv_t xiconv = iconv_open(cur_code, "ISO_8859-1"); + if (xiconv != (iconv_t)-1) { + for (n = 0; n < 32; ++n) { + char* i_ptr = src; + char* o_ptr = dst; + size_t srcln = 1; + size_t avail = n; + size_t rc = iconv(xiconv, &i_ptr, &srcln, &o_ptr, &avail); + if (rc != (size_t)-1) { + break; + } + } + iconv_close(xiconv); + } + return n; +} + +#if 0 +static +char* fromLatin1( char* src ) +{ + char* dst = 0; + if (src != 0) { + size_t const l = strlen(src); + size_t const n = l*4; + dst = calloc(n+4, 4); + if (dst != 0) { + char* cur_code = nl_langinfo(CODESET); + iconv_t xiconv = iconv_open(cur_code, "ISO_8859-1"); + if (xiconv != (iconv_t)-1) { + char* i_ptr = src; + char* o_ptr = dst; + size_t srcln = l; + size_t avail = n; + iconv(xiconv, &i_ptr, &srcln, &o_ptr, &avail); + iconv_close(xiconv); + } + } + } + return dst; +} + +static +char* fromUtf16( char* src ) +{ + char* dst = 0; + if (src != 0) { + size_t const l = strlenMultiByte(src, 2); + size_t const n = l*4; + dst = calloc(n+4, 4); + if (dst != 0) { + char* cur_code = nl_langinfo(CODESET); + iconv_t xiconv = iconv_open(cur_code, "UTF-16LE"); + if (xiconv != (iconv_t)-1) { + char* i_ptr = (char*)src; + char* o_ptr = dst; + size_t srcln = l*2; + size_t avail = n; + iconv(xiconv, &i_ptr, &srcln, &o_ptr, &avail); + iconv_close(xiconv); + } + } + } + return dst; +} +#endif + +static +char* toLatin1( char* src ) +{ + size_t w = currCharCodeSize(); + char* dst = 0; + if (src != 0) { + size_t const l = strlenMultiByte(src, w); + size_t const n = l*4; + dst = calloc(n+4, 4); + if (dst != 0) { + char* cur_code = nl_langinfo(CODESET); + iconv_t xiconv = iconv_open("ISO_8859-1//TRANSLIT", cur_code); + if (xiconv != (iconv_t)-1) { + char* i_ptr = (char*)src; + char* o_ptr = dst; + size_t srcln = l*w; + size_t avail = n; + iconv(xiconv, &i_ptr, &srcln, &o_ptr, &avail); + iconv_close(xiconv); + } + } + } + return dst; +} + + +static +char* toUtf16( char* src ) +{ + size_t w = currCharCodeSize(); + char* dst = 0; + if (src != 0) { + size_t const l = strlenMultiByte(src, w); + size_t const n = (l+1)*4; + dst = calloc(n+4, 4); + if (dst != 0) { + char* cur_code = nl_langinfo(CODESET); + iconv_t xiconv = iconv_open("UTF-16LE//TRANSLIT", cur_code); + dst[0] = 0xff; + dst[1] = 0xfe; + if (xiconv != (iconv_t)-1) { + char* i_ptr = (char*)src; + char* o_ptr = &dst[2]; + size_t srcln = l*w; + size_t avail = n; + iconv(xiconv, &i_ptr, &srcln, &o_ptr, &avail); + iconv_close(xiconv); + } + } + } + return dst; +} +#endif + +#if defined( _WIN32 ) && !defined(__MINGW32__) +#define ID3TAGS_EXTENDED + +char* toLatin1(char const* s) +{ + return utf8ToLatin1(s); +} + +unsigned short* toUtf16(char const* s) +{ + return utf8ToUtf16(s); +} +#endif + +static int evaluateArgument(char const* token, char const* arg, char* _EndPtr) +{ + if (arg != 0 && arg != _EndPtr) + return 1; + error_printf("WARNING: argument missing for '%s'\n", token); + return 0; +} + +static int getDoubleValue(char const* token, char const* arg, double* ptr) +{ + char *_EndPtr=0; + double d = strtod(arg, &_EndPtr); + if (ptr != 0) { + *ptr = d; + } + return evaluateArgument(token, arg, _EndPtr); +} + +static int getIntValue(char const* token, char const* arg, int* ptr) +{ + char *_EndPtr=0; + long d = strtol(arg, &_EndPtr, 10); + if (ptr != 0) { + *ptr = d; + } + return evaluateArgument(token, arg, _EndPtr); +} + +#ifdef ID3TAGS_EXTENDED +static int +set_id3v2tag(lame_global_flags* gfp, int type, unsigned short const* str) +{ + switch (type) + { + case 'a': return id3tag_set_textinfo_utf16(gfp, "TPE1", str); + case 't': return id3tag_set_textinfo_utf16(gfp, "TIT2", str); + case 'l': return id3tag_set_textinfo_utf16(gfp, "TALB", str); + case 'g': return id3tag_set_textinfo_utf16(gfp, "TCON", str); + case 'c': return id3tag_set_comment_utf16(gfp, 0, 0, str); + case 'n': return id3tag_set_textinfo_utf16(gfp, "TRCK", str); + case 'y': return id3tag_set_textinfo_utf16(gfp, "TYER", str); + case 'v': return id3tag_set_fieldvalue_utf16(gfp, str); + } + return 0; +} +#endif + +static int +set_id3tag(lame_global_flags* gfp, int type, char const* str) +{ + switch (type) + { + case 'a': return id3tag_set_artist(gfp, str), 0; + case 't': return id3tag_set_title(gfp, str), 0; + case 'l': return id3tag_set_album(gfp, str), 0; + case 'g': return id3tag_set_genre(gfp, str); + case 'c': return id3tag_set_comment(gfp, str), 0; + case 'n': return id3tag_set_track(gfp, str); + case 'y': return id3tag_set_year(gfp, str), 0; + case 'v': return id3tag_set_fieldvalue(gfp, str); + } + return 0; +} + +static int +id3_tag(lame_global_flags* gfp, int type, TextEncoding enc, char* str) +{ + void* x = 0; + int result; + if (enc == TENC_UTF16 && type != 'v' ) { + id3_tag(gfp, type, TENC_LATIN1, str); /* for id3v1 */ + } + switch (enc) + { + default: +#ifdef ID3TAGS_EXTENDED + case TENC_LATIN1: x = toLatin1(str); break; + case TENC_UTF16: x = toUtf16(str); break; +#else + case TENC_RAW: x = strdup(str); break; +#endif + } + switch (enc) + { + default: +#ifdef ID3TAGS_EXTENDED + case TENC_LATIN1: result = set_id3tag(gfp, type, x); break; + case TENC_UTF16: result = set_id3v2tag(gfp, type, x); break; +#else + case TENC_RAW: result = set_id3tag(gfp, type, x); break; +#endif + } + free(x); + return result; +} + + + + +/************************************************************************ +* +* license +* +* PURPOSE: Writes version and license to the file specified by fp +* +************************************************************************/ + +static int +lame_version_print(FILE * const fp) +{ + const char *b = get_lame_os_bitness(); + const char *v = get_lame_version(); + const char *u = get_lame_url(); + const size_t lenb = strlen(b); + const size_t lenv = strlen(v); + const size_t lenu = strlen(u); + const size_t lw = 80; /* line width of terminal in characters */ + const size_t sw = 16; /* static width of text */ + + if (lw >= lenb + lenv + lenu + sw || lw < lenu + 2) + /* text fits in 80 chars per line, or line even too small for url */ + if (lenb > 0) + fprintf(fp, "LAME %s version %s (%s)\n\n", b, v, u); + else + fprintf(fp, "LAME version %s (%s)\n\n", v, u); + else { + int const n_white_spaces = (int)((lenu+2) > lw ? 0 : lw-2-lenu); + /* text too long, wrap url into next line, right aligned */ + if (lenb > 0) + fprintf(fp, "LAME %s version %s\n%*s(%s)\n\n", b, v, n_white_spaces, "", u); + else + fprintf(fp, "LAME version %s\n%*s(%s)\n\n", v, n_white_spaces, "", u); + } + if (lame_alpha_version_enabled) + fprintf(fp, "warning: alpha versions should be used for testing only\n\n"); + + + return 0; +} + +static int +print_license(FILE * const fp) +{ /* print version & license */ + lame_version_print(fp); + fprintf(fp, + "Copyright (c) 1999-2011 by The LAME Project\n" + "Copyright (c) 1999,2000,2001 by Mark Taylor\n" + "Copyright (c) 1998 by Michael Cheng\n" + "Copyright (c) 1995,1996,1997 by Michael Hipp: mpglib\n" "\n"); + fprintf(fp, + "This library is free software; you can redistribute it and/or\n" + "modify it under the terms of the GNU Library General Public\n" + "License as published by the Free Software Foundation; either\n" + "version 2 of the License, or (at your option) any later version.\n" + "\n"); + fprintf(fp, + "This library is distributed in the hope that it will be useful,\n" + "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" + "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n" + "Library General Public License for more details.\n" + "\n"); + fprintf(fp, + "You should have received a copy of the GNU Library General Public\n" + "License along with this program. If not, see\n" + "<http://www.gnu.org/licenses/>.\n"); + return 0; +} + + +/************************************************************************ +* +* usage +* +* PURPOSE: Writes command line syntax to the file specified by fp +* +************************************************************************/ + +int +usage(FILE * const fp, const char *ProgramName) +{ /* print general syntax */ + lame_version_print(fp); + fprintf(fp, + "usage: %s [options] <infile> [outfile]\n" + "\n" + " <infile> and/or <outfile> can be \"-\", which means stdin/stdout.\n" + "\n" + "Try:\n" + " \"%s --help\" for general usage information\n" + " or:\n" + " \"%s --preset help\" for information on suggested predefined settings\n" + " or:\n" + " \"%s --longhelp\"\n" + " or \"%s -?\" for a complete options list\n\n", + ProgramName, ProgramName, ProgramName, ProgramName, ProgramName); + return 0; +} + + +/************************************************************************ +* +* usage +* +* PURPOSE: Writes command line syntax to the file specified by fp +* but only the most important ones, to fit on a vt100 terminal +* +************************************************************************/ + +int +short_help(const lame_global_flags * gfp, FILE * const fp, const char *ProgramName) +{ /* print short syntax help */ + lame_version_print(fp); + fprintf(fp, + "usage: %s [options] <infile> [outfile]\n" + "\n" + " <infile> and/or <outfile> can be \"-\", which means stdin/stdout.\n" + "\n" "RECOMMENDED:\n" " lame -V2 input.wav output.mp3\n" "\n", ProgramName); + fprintf(fp, + "OPTIONS:\n" + " -b bitrate set the bitrate, default 128 kbps\n" + " -h higher quality, but a little slower.\n" + " -f fast mode (lower quality)\n" + " -V n quality setting for VBR. default n=%i\n" + " 0=high quality,bigger files. 9.999=smaller files\n", + lame_get_VBR_q(gfp)); + fprintf(fp, + " --preset type type must be \"medium\", \"standard\", \"extreme\", \"insane\",\n" + " or a value for an average desired bitrate and depending\n" + " on the value specified, appropriate quality settings will\n" + " be used.\n" + " \"--preset help\" gives more info on these\n" "\n"); + fprintf(fp, +#if defined(WIN32) + " --priority type sets the process priority\n" + " 0,1 = Low priority\n" + " 2 = normal priority\n" + " 3,4 = High priority\n" "\n" +#endif +#if defined(__OS2__) + " --priority type sets the process priority\n" + " 0 = Low priority\n" + " 1 = Medium priority\n" + " 2 = Regular priority\n" + " 3 = High priority\n" + " 4 = Maximum priority\n" "\n" +#endif + " --help id3 ID3 tagging related options\n" "\n" + DEV_HELP( + " --help dev developer options\n" "\n" + ) + " --longhelp full list of options\n" "\n" + " --license print License information\n\n" + ); + + return 0; +} + +/************************************************************************ +* +* usage +* +* PURPOSE: Writes command line syntax to the file specified by fp +* +************************************************************************/ + +static void +wait_for(FILE * const fp, int lessmode) +{ + if (lessmode) { + fflush(fp); + getchar(); + } + else { + fprintf(fp, "\n"); + } + fprintf(fp, "\n"); +} + +static void +help_id3tag(FILE * const fp) +{ + fprintf(fp, + " ID3 tag options:\n" + " --tt <title> audio/song title (max 30 chars for version 1 tag)\n" + " --ta <artist> audio/song artist (max 30 chars for version 1 tag)\n" + " --tl <album> audio/song album (max 30 chars for version 1 tag)\n" + " --ty <year> audio/song year of issue (1 to 9999)\n" + " --tc <comment> user-defined text (max 30 chars for v1 tag, 28 for v1.1)\n"); + fprintf(fp, + " --tn <track[/total]> audio/song track number and (optionally) the total\n" + " number of tracks on the original recording. (track\n" + " and total each 1 to 255. just the track number\n" + " creates v1.1 tag, providing a total forces v2.0).\n"); + fprintf(fp, + " --tg <genre> audio/song genre (name or number in list)\n" + " --ti <file> audio/song albumArt (jpeg/png/gif file, v2.3 tag)\n" + " --tv <id=value> user-defined frame specified by id and value (v2.3 tag)\n" + " syntax: --tv \"TXXX=description=content\"\n" + ); + fprintf(fp, + " --add-id3v2 force addition of version 2 tag\n" + " --id3v1-only add only a version 1 tag\n" + " --id3v2-only add only a version 2 tag\n" +#ifdef ID3TAGS_EXTENDED + " --id3v2-utf16 add following options in unicode text encoding\n" + " --id3v2-latin1 add following options in latin-1 text encoding\n" +#endif + " --space-id3v1 pad version 1 tag with spaces instead of nulls\n" + " --pad-id3v2 same as '--pad-id3v2-size 128'\n" + " --pad-id3v2-size <value> adds version 2 tag, pad with extra <value> bytes\n" + " --genre-list print alphabetically sorted ID3 genre list and exit\n" + " --ignore-tag-errors ignore errors in values passed for tags\n" "\n" + ); + fprintf(fp, + " Note: A version 2 tag will NOT be added unless one of the input fields\n" + " won't fit in a version 1 tag (e.g. the title string is longer than 30\n" + " characters), or the '--add-id3v2' or '--id3v2-only' options are used,\n" + " or output is redirected to stdout.\n" + ); +} + +static void +help_developer_switches(FILE * const fp) +{ + if ( !internal_opts_enabled ) { + fprintf(fp, + " Note: Almost all of the following switches aren't available in this build!\n\n" + ); + } + fprintf(fp, + " ATH related:\n" + " --noath turns ATH down to a flat noise floor\n" + " --athshort ignore GPSYCHO for short blocks, use ATH only\n" + " --athonly ignore GPSYCHO completely, use ATH only\n" + " --athtype n selects between different ATH types [0-4]\n" + " --athlower x lowers ATH by x dB\n" + ); + fprintf(fp, + " --athaa-type n ATH auto adjust: 0 'no' else 'loudness based'\n" +/** OBSOLETE " --athaa-loudapprox n n=1 total energy or n=2 equal loudness curve\n"*/ + " --athaa-sensitivity x activation offset in -/+ dB for ATH auto-adjustment\n" + "\n"); + fprintf(fp, + " PSY related:\n" + " --short use short blocks when appropriate\n" + " --noshort do not use short blocks\n" + " --allshort use only short blocks\n" + ); + fprintf(fp, + "(1) --temporal-masking x x=0 disables, x=1 enables temporal masking effect\n" + " --nssafejoint M/S switching criterion\n" + " --nsmsfix <arg> M/S switching tuning [effective 0-3.5]\n" + "(2) --interch x adjust inter-channel masking ratio\n" + " --ns-bass x adjust masking for sfbs 0 - 6 (long) 0 - 5 (short)\n" + " --ns-alto x adjust masking for sfbs 7 - 13 (long) 6 - 10 (short)\n" + " --ns-treble x adjust masking for sfbs 14 - 21 (long) 11 - 12 (short)\n" + ); + fprintf(fp, + " --ns-sfb21 x change ns-treble by x dB for sfb21\n" + " --shortthreshold x,y short block switching threshold,\n" + " x for L/R/M channel, y for S channel\n" + " -Z [n] always do calculate short block maskings\n"); + fprintf(fp, + " Noise Shaping related:\n" + "(1) --substep n use pseudo substep noise shaping method types 0-2\n" + "(1) -X n[,m] selects between different noise measurements\n" + " n for long block, m for short. if m is omitted, m = n\n" + " 1: CBR, ABR and VBR-old encoding modes only\n" + " 2: ignored\n" + ); +} + +int +long_help(const lame_global_flags * gfp, FILE * const fp, const char *ProgramName, int lessmode) +{ /* print long syntax help */ + lame_version_print(fp); + fprintf(fp, + "usage: %s [options] <infile> [outfile]\n" + "\n" + " <infile> and/or <outfile> can be \"-\", which means stdin/stdout.\n" + "\n" "RECOMMENDED:\n" " lame -V2 input.wav output.mp3\n" "\n", ProgramName); + fprintf(fp, + "OPTIONS:\n" + " Input options:\n" + " --scale <arg> scale input (multiply PCM data) by <arg>\n" + " --scale-l <arg> scale channel 0 (left) input (multiply PCM data) by <arg>\n" + " --scale-r <arg> scale channel 1 (right) input (multiply PCM data) by <arg>\n" + " --swap-channel swap L/R channels\n" + " --ignorelength ignore file length in WAV header\n" + " --gain <arg> apply Gain adjustment in decibels, range -20.0 to +12.0\n" + ); +#if (defined HAVE_MPGLIB || defined AMIGA_MPEGA) + fprintf(fp, + " --mp1input input file is a MPEG Layer I file\n" + " --mp2input input file is a MPEG Layer II file\n" + " --mp3input input file is a MPEG Layer III file\n" + ); +#endif + fprintf(fp, + " --nogap <file1> <file2> <...>\n" + " gapless encoding for a set of contiguous files\n" + " --nogapout <dir>\n" + " output dir for gapless encoding (must precede --nogap)\n" + " --nogaptags allow the use of VBR tags in gapless encoding\n" + " --out-dir <dir> output dir, must exist\n" + ); + fprintf(fp, + "\n" + " Input options for RAW PCM:\n" + " -r input is raw pcm\n" + " -s sfreq sampling frequency of input file (kHz) - default 44.1 kHz\n" + " --signed input is signed (default)\n" + " --unsigned input is unsigned\n" + " --bitwidth w input bit width is w (default 16)\n" + " -x force byte-swapping of input\n" + " --little-endian input is little-endian (default)\n" + " --big-endian input is big-endian\n" + " -a downmix from stereo to mono file for mono encoding\n" + ); + + wait_for(fp, lessmode); + fprintf(fp, + " Operational options:\n" + " -m <mode> (j)oint, (s)imple, (f)orce, (d)ual-mono, (m)ono (l)eft (r)ight\n" + " default is (j)\n" + " joint = Uses the best possible of MS and LR stereo\n" + " simple = force LR stereo on all frames\n" + " force = force MS stereo on all frames.\n" + ); + fprintf(fp, + " --preset type type must be \"medium\", \"standard\", \"extreme\", \"insane\",\n" + " or a value for an average desired bitrate and depending\n" + " on the value specified, appropriate quality settings will\n" + " be used.\n" + " \"--preset help\" gives more info on these\n" + " --comp <arg> choose bitrate to achieve a compression ratio of <arg>\n"); + fprintf(fp, " --replaygain-fast compute RG fast but slightly inaccurately (default)\n" +#ifdef DECODE_ON_THE_FLY + " --replaygain-accurate compute RG more accurately and find the peak sample\n" +#endif + " --noreplaygain disable ReplayGain analysis\n" +#ifdef DECODE_ON_THE_FLY + " --clipdetect enable --replaygain-accurate and print a message whether\n" + " clipping occurs and how far the waveform is from full scale\n" +#endif + ); + fprintf(fp, + " --flush flush output stream as soon as possible\n" + " --freeformat produce a free format bitstream\n" + " --decode input=mp3 file, output=wav\n" + " -t disable writing wav header when using --decode\n"); + + wait_for(fp, lessmode); + fprintf(fp, + " Verbosity:\n" + " --disptime <arg>print progress report every arg seconds\n" + " -S don't print progress report, VBR histograms\n" + " --nohist disable VBR histogram display\n" + " --quiet don't print anything on screen\n" + " --silent don't print anything on screen, but fatal errors\n" + " --brief print more useful information\n" + " --verbose print a lot of useful information\n" "\n"); + fprintf(fp, + " Noise shaping & psycho acoustic algorithms:\n" + " -q <arg> <arg> = 0...9. Default -q 3 \n" + " -q 0: Highest quality, very slow \n" + " -q 9: Poor quality, but fast \n" + " -h Same as -q 2. \n" + " -f Same as -q 7. Fast, ok quality\n"); + + wait_for(fp, lessmode); + fprintf(fp, + " CBR (constant bitrate, the default) options:\n" + " -b <bitrate> set the bitrate in kbps, default 128 kbps\n" + " --cbr enforce use of constant bitrate\n" + "\n" + " ABR options:\n" + " --abr <bitrate> specify average bitrate desired (instead of quality)\n" "\n"); + fprintf(fp, + " VBR options:\n" + " -V n quality setting for VBR. default n=%i\n" + " 0=high quality,bigger files. 9=smaller files\n" + " -v the same as -V 4\n" + " --vbr-old use old variable bitrate (VBR) routine\n" + " --vbr-new use new variable bitrate (VBR) routine (default)\n" + " -Y lets LAME ignore noise in sfb21, like in CBR\n" + " (Default for V3 to V9.999)\n" + , + lame_get_VBR_q(gfp)); + fprintf(fp, + " -b <bitrate> specify minimum allowed bitrate, default 32 kbps\n" + " -B <bitrate> specify maximum allowed bitrate, default 320 kbps\n" + " -F strictly enforce the -b option, for use with players that\n" + " do not support low bitrate mp3\n" + " -t disable writing LAME Tag\n" + " -T enable and force writing LAME Tag\n"); + + wait_for(fp, lessmode); + DEV_HELP( + help_developer_switches(fp); + wait_for(fp, lessmode); + ) + + fprintf(fp, + " MP3 header/stream options:\n" + " -e <emp> de-emphasis n/5/c (obsolete)\n" + " -c mark as copyright\n" + " -o mark as non-original\n" + " -p error protection. adds 16 bit checksum to every frame\n" + " (the checksum is computed correctly)\n" + " --nores disable the bit reservoir\n" + " --strictly-enforce-ISO comply as much as possible to ISO MPEG spec\n"); + fprintf(fp, + " --buffer-constraint <constraint> available values for constraint:\n" + " default, strict, maximum\n" + "\n" + ); + fprintf(fp, + " Filter options:\n" + " --lowpass <freq> frequency(kHz), lowpass filter cutoff above freq\n" + " --lowpass-width <freq> frequency(kHz) - default 15%% of lowpass freq\n" + " --highpass <freq> frequency(kHz), highpass filter cutoff below freq\n" + " --highpass-width <freq> frequency(kHz) - default 15%% of highpass freq\n"); + fprintf(fp, + " --resample <sfreq> sampling frequency of output file(kHz)- default=automatic\n"); + + wait_for(fp, lessmode); + help_id3tag(fp); + fprintf(fp, +#if defined(WIN32) + "\n\nMS-Windows-specific options:\n" + " --priority <type> sets the process priority:\n" + " 0,1 = Low priority (IDLE_PRIORITY_CLASS)\n" + " 2 = normal priority (NORMAL_PRIORITY_CLASS, default)\n" + " 3,4 = High priority (HIGH_PRIORITY_CLASS))\n" + " Note: Calling '--priority' without a parameter will select priority 0.\n" +#endif +#if defined(__OS2__) + "\n\nOS/2-specific options:\n" + " --priority <type> sets the process priority:\n" + " 0 = Low priority (IDLE, delta = 0)\n" + " 1 = Medium priority (IDLE, delta = +31)\n" + " 2 = Regular priority (REGULAR, delta = -31)\n" + " 3 = High priority (REGULAR, delta = 0)\n" + " 4 = Maximum priority (REGULAR, delta = +31)\n" + " Note: Calling '--priority' without a parameter will select priority 0.\n" +#endif + "\nMisc:\n --license print License information\n\n" + ); + +#if defined(HAVE_NASM) + wait_for(fp, lessmode); + fprintf(fp, + " Platform specific:\n" + " --noasm <instructions> disable assembly optimizations for mmx/3dnow/sse\n"); + wait_for(fp, lessmode); +#endif + + display_bitrates(fp); + + return 0; +} + +static void +display_bitrate(FILE * const fp, const char *const version, const int d, const int indx) +{ + int i; + int nBitrates = 14; + if (d == 4) + nBitrates = 8; + + + fprintf(fp, + "\nMPEG-%-3s layer III sample frequencies (kHz): %2d %2d %g\n" + "bitrates (kbps):", version, 32 / d, 48 / d, 44.1 / d); + for (i = 1; i <= nBitrates; i++) + fprintf(fp, " %2i", lame_get_bitrate(indx, i)); + fprintf(fp, "\n"); +} + +int +display_bitrates(FILE * const fp) +{ + display_bitrate(fp, "1", 1, 1); + display_bitrate(fp, "2", 2, 0); + display_bitrate(fp, "2.5", 4, 0); + fprintf(fp, "\n"); + fflush(fp); + return 0; +} + + +/* note: for presets it would be better to externalize them in a file. + suggestion: lame --preset <file-name> ... + or: lame --preset my-setting ... and my-setting is defined in lame.ini + */ + +/* +Note from GB on 08/25/2002: +I am merging --presets and --alt-presets. Old presets are now aliases for +corresponding abr values from old alt-presets. This way we now have a +unified preset system, and I hope than more people will use the new tuned +presets instead of the old unmaintained ones. +*/ + + + +/************************************************************************ +* +* usage +* +* PURPOSE: Writes presetting info to #stdout# +* +************************************************************************/ + + +static void +presets_longinfo_dm(FILE * msgfp) +{ + fprintf(msgfp, + "\n" + "The --preset switches are aliases over LAME settings.\n" + "\n" "\n"); + fprintf(msgfp, + "To activate these presets:\n" + "\n" " For VBR modes (generally highest quality):\n" "\n"); + fprintf(msgfp, + " --preset medium This preset should provide near transparency to most\n" + " people on most music.\n" + "\n" + " --preset standard This preset should generally be transparent to most\n" + " people on most music and is already quite high\n" + " in quality.\n" "\n"); + fprintf(msgfp, + " --preset extreme If you have extremely good hearing and similar\n" + " equipment, this preset will generally provide\n" + " slightly higher quality than the \"standard\" mode.\n" "\n"); + fprintf(msgfp, + " For CBR 320kbps (highest quality possible from the --preset switches):\n" + "\n" + " --preset insane This preset will usually be overkill for most people\n" + " and most situations, but if you must have the\n" + " absolute highest quality with no regard to filesize,\n" + " this is the way to go.\n" "\n"); + fprintf(msgfp, + " For ABR modes (high quality per given bitrate but not as high as VBR):\n" + "\n" + " --preset <kbps> Using this preset will usually give you good quality\n" + " at a specified bitrate. Depending on the bitrate\n" + " entered, this preset will determine the optimal\n" + " settings for that particular situation. For example:\n" + " \"--preset 185\" activates this preset and uses 185\n" + " as an average kbps.\n" "\n"); + fprintf(msgfp, + " \"cbr\" - If you use the ABR mode (read above) with a significant\n" + " bitrate such as 80, 96, 112, 128, 160, 192, 224, 256, 320,\n" + " you can use the \"cbr\" option to force CBR mode encoding\n" + " instead of the standard abr mode. ABR does provide higher\n" + " quality but CBR may be useful in situations such as when\n" + " streaming an mp3 over the internet may be important.\n" "\n"); + fprintf(msgfp, + " For example:\n" + "\n" + " --preset standard <input file> <output file>\n" + " or --preset cbr 192 <input file> <output file>\n" + " or --preset 172 <input file> <output file>\n" + " or --preset extreme <input file> <output file>\n" "\n" "\n"); + fprintf(msgfp, + "A few aliases are also available for ABR mode:\n" + "phone => 16kbps/mono phon+/lw/mw-eu/sw => 24kbps/mono\n" + "mw-us => 40kbps/mono voice => 56kbps/mono\n" + "fm/radio/tape => 112kbps hifi => 160kbps\n" + "cd => 192kbps studio => 256kbps\n"); +} + + +static int +presets_set(lame_t gfp, int fast, int cbr, const char *preset_name, const char *ProgramName) +{ + int mono = 0; + + if ((strcmp(preset_name, "help") == 0) && (fast < 1) + && (cbr < 1)) { + lame_version_print(stdout); + presets_longinfo_dm(stdout); + return -1; + } + + /*aliases for compatibility with old presets */ + + if (strcmp(preset_name, "phone") == 0) { + preset_name = "16"; + mono = 1; + } + if ((strcmp(preset_name, "phon+") == 0) || + (strcmp(preset_name, "lw") == 0) || + (strcmp(preset_name, "mw-eu") == 0) || (strcmp(preset_name, "sw") == 0)) { + preset_name = "24"; + mono = 1; + } + if (strcmp(preset_name, "mw-us") == 0) { + preset_name = "40"; + mono = 1; + } + if (strcmp(preset_name, "voice") == 0) { + preset_name = "56"; + mono = 1; + } + if (strcmp(preset_name, "fm") == 0) { + preset_name = "112"; + } + if ((strcmp(preset_name, "radio") == 0) || (strcmp(preset_name, "tape") == 0)) { + preset_name = "112"; + } + if (strcmp(preset_name, "hifi") == 0) { + preset_name = "160"; + } + if (strcmp(preset_name, "cd") == 0) { + preset_name = "192"; + } + if (strcmp(preset_name, "studio") == 0) { + preset_name = "256"; + } + + if (strcmp(preset_name, "medium") == 0) { + lame_set_VBR_q(gfp, 4); + lame_set_VBR(gfp, vbr_default); + return 0; + } + + if (strcmp(preset_name, "standard") == 0) { + lame_set_VBR_q(gfp, 2); + lame_set_VBR(gfp, vbr_default); + return 0; + } + + else if (strcmp(preset_name, "extreme") == 0) { + lame_set_VBR_q(gfp, 0); + lame_set_VBR(gfp, vbr_default); + return 0; + } + + else if ((strcmp(preset_name, "insane") == 0) && (fast < 1)) { + + lame_set_preset(gfp, INSANE); + + return 0; + } + + /* Generic ABR Preset */ + if (((atoi(preset_name)) > 0) && (fast < 1)) { + if ((atoi(preset_name)) >= 8 && (atoi(preset_name)) <= 320) { + lame_set_preset(gfp, atoi(preset_name)); + + if (cbr == 1) + lame_set_VBR(gfp, vbr_off); + + if (mono == 1) { + lame_set_mode(gfp, MONO); + } + + return 0; + + } + else { + lame_version_print(Console_IO.Error_fp); + error_printf("Error: The bitrate specified is out of the valid range for this preset\n" + "\n" + "When using this mode you must enter a value between \"32\" and \"320\"\n" + "\n" "For further information try: \"%s --preset help\"\n", ProgramName); + return -1; + } + } + + lame_version_print(Console_IO.Error_fp); + error_printf("Error: You did not enter a valid profile and/or options with --preset\n" + "\n" + "Available profiles are:\n" + "\n" + " medium\n" + " standard\n" + " extreme\n" + " insane\n" + " <cbr> (ABR Mode) - The ABR Mode is implied. To use it,\n" + " simply specify a bitrate. For example:\n" + " \"--preset 185\" activates this\n" + " preset and uses 185 as an average kbps.\n" "\n"); + error_printf(" Some examples:\n" + "\n" + " or \"%s --preset standard <input file> <output file>\"\n" + " or \"%s --preset cbr 192 <input file> <output file>\"\n" + " or \"%s --preset 172 <input file> <output file>\"\n" + " or \"%s --preset extreme <input file> <output file>\"\n" + "\n" + "For further information try: \"%s --preset help\"\n", ProgramName, ProgramName, + ProgramName, ProgramName, ProgramName); + return -1; +} + +static void +genre_list_handler(int num, const char *name, void *cookie) +{ + (void) cookie; + console_printf("%3d %s\n", num, name); +} + + +/************************************************************************ +* +* parse_args +* +* PURPOSE: Sets encoding parameters to the specifications of the +* command line. Default settings are used for parameters +* not specified in the command line. +* +* If the input file is in WAVE or AIFF format, the sampling frequency is read +* from the AIFF header. +* +* The input and output filenames are read into #inpath# and #outpath#. +* +************************************************************************/ + +/* would use real "strcasecmp" but it isn't portable */ +static int +local_strcasecmp(const char *s1, const char *s2) +{ + unsigned char c1; + unsigned char c2; + + do { + c1 = (unsigned char) tolower(*s1); + c2 = (unsigned char) tolower(*s2); + if (!c1) { + break; + } + ++s1; + ++s2; + } while (c1 == c2); + return c1 - c2; +} + +static int +local_strncasecmp(const char *s1, const char *s2, int n) +{ + unsigned char c1 = 0; + unsigned char c2 = 0; + int cnt = 0; + + do { + if (cnt == n) { + break; + } + c1 = (unsigned char) tolower(*s1); + c2 = (unsigned char) tolower(*s2); + if (!c1) { + break; + } + ++s1; + ++s2; + ++cnt; + } while (c1 == c2); + return c1 - c2; +} + + + +/* LAME is a simple frontend which just uses the file extension */ +/* to determine the file type. Trying to analyze the file */ +/* contents is well beyond the scope of LAME and should not be added. */ +static int +filename_to_type(const char *FileName) +{ + size_t len = strlen(FileName); + + if (len < 4) + return sf_unknown; + + FileName += len - 4; + if (0 == local_strcasecmp(FileName, ".mpg")) + return sf_mp123; + if (0 == local_strcasecmp(FileName, ".mp1")) + return sf_mp123; + if (0 == local_strcasecmp(FileName, ".mp2")) + return sf_mp123; + if (0 == local_strcasecmp(FileName, ".mp3")) + return sf_mp123; + if (0 == local_strcasecmp(FileName, ".wav")) + return sf_wave; + if (0 == local_strcasecmp(FileName, ".aif")) + return sf_aiff; + if (0 == local_strcasecmp(FileName, ".raw")) + return sf_raw; + if (0 == local_strcasecmp(FileName, ".ogg")) + return sf_ogg; + return sf_unknown; +} + +static int +resample_rate(double freq) +{ + if (freq >= 1.e3) + freq *= 1.e-3; + + switch ((int) freq) { + case 8: + return 8000; + case 11: + return 11025; + case 12: + return 12000; + case 16: + return 16000; + case 22: + return 22050; + case 24: + return 24000; + case 32: + return 32000; + case 44: + return 44100; + case 48: + return 48000; + default: + error_printf("Illegal resample frequency: %.3f kHz\n", freq); + return 0; + } +} + +#ifdef _WIN32 +#define SLASH '\\' +#define COLON ':' +#elif __OS2__ +#define SLASH '\\' +#else +#define SLASH '/' +#endif + +static +size_t scanPath(char const* s, char const** a, char const** b) +{ + char const* s1 = s; + char const* s2 = s; + if (s != 0) { + for (; *s; ++s) { + switch (*s) { + case SLASH: +#ifdef _WIN32 + case COLON: +#endif + s2 = s; + break; + } + } +#ifdef _WIN32 + if (*s2 == COLON) { + ++s2; + } +#endif + } + if (a) { + *a = s1; + } + if (b) { + *b = s2; + } + return s2-s1; +} + +static +size_t scanBasename(char const* s, char const** a, char const** b) +{ + char const* s1 = s; + char const* s2 = s; + if (s != 0) { + for (; *s; ++s) { + switch (*s) { + case SLASH: +#ifdef _WIN32 + case COLON: +#endif + s1 = s2 = s; + break; + case '.': + s2 = s; + break; + } + } + if (s2 == s1) { + s2 = s; + } + if (*s1 == SLASH +#ifdef _WIN32 + || *s1 == COLON +#endif + ) { + ++s1; + } + } + if (a != 0) { + *a = s1; + } + if (b != 0) { + *b = s2; + } + return s2-s1; +} + +static +int isCommonSuffix(char const* s_ext) +{ + char const* suffixes[] = + { ".WAV", ".RAW", ".MP1", ".MP2" + , ".MP3", ".MPG", ".MPA", ".CDA" + , ".OGG", ".AIF", ".AIFF", ".AU" + , ".SND", ".FLAC", ".WV", ".OFR" + , ".TAK", ".MP4", ".M4A", ".PCM" + , ".W64" + }; + size_t i; + for (i = 0; i < dimension_of(suffixes); ++i) { + if (local_strcasecmp(s_ext, suffixes[i]) == 0) { + return 1; + } + } + return 0; +} + + +int generateOutPath(char const* inPath, char const* outDir, char const* s_ext, char* outPath) +{ + size_t const max_path = PATH_MAX; +#if 1 + size_t i = 0; + int out_dir_used = 0; + + if (outDir != 0 && outDir[0] != 0) { + out_dir_used = 1; + while (*outDir) { + outPath[i++] = *outDir++; + if (i >= max_path) { + goto err_generateOutPath; + } + } + if (i > 0 && outPath[i-1] != SLASH) { + outPath[i++] = SLASH; + if (i >= max_path) { + goto err_generateOutPath; + } + } + outPath[i] = 0; + } + else { + char const* pa; + char const* pb; + size_t j, n = scanPath(inPath, &pa, &pb); + if (i+n >= max_path) { + goto err_generateOutPath; + } + for (j = 0; j < n; ++j) { + outPath[i++] = pa[j]; + } + if (n > 0) { + outPath[i++] = SLASH; + if (i >= max_path) { + goto err_generateOutPath; + } + } + outPath[i] = 0; + } + { + int replace_suffix = 0; + char const* na; + char const* nb; + size_t j, n = scanBasename(inPath, &na, &nb); + if (i+n >= max_path) { + goto err_generateOutPath; + } + for (j = 0; j < n; ++j) { + outPath[i++] = na[j]; + } + outPath[i] = 0; + if (isCommonSuffix(nb) == 1) { + replace_suffix = 1; + if (out_dir_used == 0) { + if (local_strcasecmp(nb, s_ext) == 0) { + replace_suffix = 0; + } + } + } + if (replace_suffix == 0) { + while (*nb) { + outPath[i++] = *nb++; + if (i >= max_path) { + goto err_generateOutPath; + } + } + outPath[i] = 0; + } + } + if (i+5 >= max_path) { + goto err_generateOutPath; + } + while (*s_ext) { + outPath[i++] = *s_ext++; + } + outPath[i] = 0; + return 0; +err_generateOutPath: + error_printf( "error: output file name too long\n" ); + return 1; +#else + strncpy(outPath, inPath, PATH_MAX + 1 - 4); + strncat(outPath, s_ext, 4); + return 0; +#endif +} + + +static int +set_id3_albumart(lame_t gfp, char const* file_name) +{ + int ret = -1; + FILE *fpi = 0; + char *albumart = 0; + + if (file_name == 0) { + return 0; + } + fpi = lame_fopen(file_name, "rb"); + if (!fpi) { + ret = 1; + } + else { + size_t size; + + fseek(fpi, 0, SEEK_END); + size = ftell(fpi); + fseek(fpi, 0, SEEK_SET); + albumart = (char *)malloc(size); + if (!albumart) { + ret = 2; + } + else { + if (fread(albumart, 1, size, fpi) != size) { + ret = 3; + } + else { + ret = id3tag_set_albumart(gfp, albumart, size) ? 4 : 0; + } + free(albumart); + } + fclose(fpi); + } + switch (ret) { + case 1: error_printf("Could not find: '%s'.\n", file_name); break; + case 2: error_printf("Insufficient memory for reading the albumart.\n"); break; + case 3: error_printf("Read error: '%s'.\n", file_name); break; + case 4: error_printf("Unsupported image: '%s'.\nSpecify JPEG/PNG/GIF image\n", file_name); break; + default: break; + } + return ret; +} + + +enum ID3TAG_MODE +{ ID3TAG_MODE_DEFAULT +, ID3TAG_MODE_V1_ONLY +, ID3TAG_MODE_V2_ONLY +}; + +static int dev_only_with_arg(char const* str, char const* token, char const* nextArg, int* argIgnored, int* argUsed) +{ + if (0 != local_strcasecmp(token,str)) return 0; + *argUsed = 1; + if (internal_opts_enabled) return 1; + *argIgnored = 1; + error_printf("WARNING: ignoring developer-only switch --%s %s\n", token, nextArg); + return 0; +} + +static int dev_only_without_arg(char const* str, char const* token, int* argIgnored) +{ + if (0 != local_strcasecmp(token,str)) return 0; + if (internal_opts_enabled) return 1; + *argIgnored = 1; + error_printf("WARNING: ignoring developer-only switch --%s\n", token); + return 0; +} + +/* Ugly, NOT final version */ + +#define T_IF(str) if ( 0 == local_strcasecmp (token,str) ) { +#define T_ELIF(str) } else if ( 0 == local_strcasecmp (token,str) ) { +#define T_ELIF2(str1,str2) } else if ( 0 == local_strcasecmp (token,str1) || 0 == local_strcasecmp (token,str2) ) { +#define T_ELSE } else { +#define T_END } + +#define T_ELIF_INTERNAL(str) \ + } else if (dev_only_without_arg(str,token,&argIgnored)) { + +#define T_ELIF_INTERNAL_WITH_ARG(str) \ + } else if (dev_only_with_arg(str,token,nextArg,&argIgnored,&argUsed)) { + + +static int +parse_args_(lame_global_flags * gfp, int argc, char **argv, + char *const inPath, char *const outPath, char **nogap_inPath, int *num_nogap) +{ + char outDir[PATH_MAX+1] = ""; + int input_file = 0; /* set to 1 if we parse an input file name */ + int i; + int autoconvert = 0; + int nogap = 0; + int nogap_tags = 0; /* set to 1 to use VBR tags in NOGAP mode */ + const char *ProgramName = argv[0]; + int count_nogap = 0; + int noreplaygain = 0; /* is RG explicitly disabled by the user */ + int id3tag_mode = ID3TAG_MODE_DEFAULT; + int ignore_tag_errors = 0; /* Ignore errors in values passed for tags */ +#ifdef ID3TAGS_EXTENDED + enum TextEncoding id3_tenc = TENC_UTF16; +#else + enum TextEncoding id3_tenc = TENC_LATIN1; +#endif + +#ifdef HAVE_ICONV + setlocale(LC_CTYPE, ""); +#endif + inPath[0] = '\0'; + outPath[0] = '\0'; + /* turn on display options. user settings may turn them off below */ + global_ui_config.silent = 0; /* default */ + global_ui_config.brhist = 1; + global_decoder.mp3_delay = 0; + global_decoder.mp3_delay_set = 0; + global_decoder.disable_wav_header = 0; + global_ui_config.print_clipping_info = 0; + id3tag_init(gfp); + + /* process args */ + for (i = 0; ++i < argc;) { + char c; + char *token; + char *arg; + char *nextArg; + int argUsed; + int argIgnored=0; + + token = argv[i]; + if (*token++ == '-') { + argUsed = 0; + nextArg = i + 1 < argc ? argv[i + 1] : ""; + + if (!*token) { /* The user wants to use stdin and/or stdout. */ + input_file = 1; + if (inPath[0] == '\0') + strncpy(inPath, argv[i], PATH_MAX + 1); + else if (outPath[0] == '\0') + strncpy(outPath, argv[i], PATH_MAX + 1); + } + if (*token == '-') { /* GNU style */ + double double_value = 0; + int int_value = 0; + token++; + + T_IF("resample") + argUsed = getDoubleValue(token, nextArg, &double_value); + if (argUsed) + (void) lame_set_out_samplerate(gfp, resample_rate(double_value)); + + T_ELIF("vbr-old") + lame_set_VBR(gfp, vbr_rh); + + T_ELIF("vbr-new") + lame_set_VBR(gfp, vbr_mt); + + T_ELIF("vbr-mtrh") + lame_set_VBR(gfp, vbr_mtrh); + + T_ELIF("cbr") + lame_set_VBR(gfp, vbr_off); + + T_ELIF("abr") + /* values larger than 8000 are bps (like Fraunhofer), so it's strange to get 320000 bps MP3 when specifying 8000 bps MP3 */ + argUsed = getIntValue(token, nextArg, &int_value); + if (argUsed) { + if (int_value >= 8000) { + int_value = (int_value + 500) / 1000; + } + if (int_value > 320) { + int_value = 320; + } + if (int_value < 8) { + int_value = 8; + } + lame_set_VBR(gfp, vbr_abr); + lame_set_VBR_mean_bitrate_kbps(gfp, int_value); + } + + T_ELIF("r3mix") + lame_set_preset(gfp, R3MIX); + + T_ELIF("bitwidth") + argUsed = getIntValue(token, nextArg, &int_value); + if (argUsed) + global_raw_pcm.in_bitwidth = int_value; + + T_ELIF("signed") + global_raw_pcm.in_signed = 1; + + T_ELIF("unsigned") + global_raw_pcm.in_signed = 0; + + T_ELIF("little-endian") + global_raw_pcm.in_endian = ByteOrderLittleEndian; + + T_ELIF("big-endian") + global_raw_pcm.in_endian = ByteOrderBigEndian; + + T_ELIF("mp1input") + global_reader.input_format = sf_mp1; + + T_ELIF("mp2input") + global_reader.input_format = sf_mp2; + + T_ELIF("mp3input") + global_reader.input_format = sf_mp3; + + T_ELIF("ogginput") + error_printf("sorry, vorbis support in LAME is deprecated.\n"); + return -1; + + T_ELIF("decode") + (void) lame_set_decode_only(gfp, 1); + + T_ELIF("flush") + global_writer.flush_write = 1; + + T_ELIF("decode-mp3delay") + argUsed = getIntValue(token, nextArg, &int_value); + if (argUsed) { + global_decoder.mp3_delay = int_value; + global_decoder.mp3_delay_set = 1; + } + + T_ELIF("nores") + lame_set_disable_reservoir(gfp, 1); + + T_ELIF("strictly-enforce-ISO") + lame_set_strict_ISO(gfp, MDB_STRICT_ISO); + + T_ELIF("buffer-constraint") + argUsed = 1; + if (strcmp(nextArg, "default") == 0) + (void) lame_set_strict_ISO(gfp, MDB_DEFAULT); + else if (strcmp(nextArg, "strict") == 0) + (void) lame_set_strict_ISO(gfp, MDB_STRICT_ISO); + else if (strcmp(nextArg, "maximum") == 0) + (void) lame_set_strict_ISO(gfp, MDB_MAXIMUM); + else { + error_printf("unknown buffer constraint '%s'\n", nextArg); + return -1; + } + + T_ELIF("scale") + argUsed = getDoubleValue(token, nextArg, &double_value); + if (argUsed) + (void) lame_set_scale(gfp, (float) double_value); + + T_ELIF("scale-l") + argUsed = getDoubleValue(token, nextArg, &double_value); + if (argUsed) + (void) lame_set_scale_left(gfp, (float) double_value); + + T_ELIF("scale-r") + argUsed = getDoubleValue(token, nextArg, &double_value); + if (argUsed) + (void) lame_set_scale_right(gfp, (float) double_value); + + T_ELIF("gain") + argUsed = getDoubleValue(token, nextArg, &double_value); + if (argUsed) { + double gain = double_value; + gain = gain > -20.f ? gain : -20.f; + gain = gain < 12.f ? gain : 12.f; + gain = pow(10.f, gain*0.05); + (void) lame_set_scale(gfp, (float) gain); + } + + T_ELIF("noasm") + argUsed = 1; + if (!strcmp(nextArg, "mmx")) + (void) lame_set_asm_optimizations(gfp, MMX, 0); + if (!strcmp(nextArg, "3dnow")) + (void) lame_set_asm_optimizations(gfp, AMD_3DNOW, 0); + if (!strcmp(nextArg, "sse")) + (void) lame_set_asm_optimizations(gfp, SSE, 0); + + T_ELIF("freeformat") + lame_set_free_format(gfp, 1); + + T_ELIF("replaygain-fast") + lame_set_findReplayGain(gfp, 1); + +#ifdef DECODE_ON_THE_FLY + T_ELIF("replaygain-accurate") + lame_set_decode_on_the_fly(gfp, 1); + lame_set_findReplayGain(gfp, 1); +#endif + + T_ELIF("noreplaygain") + noreplaygain = 1; + lame_set_findReplayGain(gfp, 0); + + +#ifdef DECODE_ON_THE_FLY + T_ELIF("clipdetect") + global_ui_config.print_clipping_info = 1; + lame_set_decode_on_the_fly(gfp, 1); +#endif + + T_ELIF("nohist") + global_ui_config.brhist = 0; + +#if defined(__OS2__) || defined(WIN32) + T_ELIF("priority") + argUsed = getIntValue(token, nextArg, &int_value); + if (argUsed) + setProcessPriority(int_value); +#endif + + /* options for ID3 tag */ +#ifdef ID3TAGS_EXTENDED + T_ELIF2("id3v2-utf16","id3v2-ucs2") /* id3v2-ucs2 for compatibility only */ + id3_tenc = TENC_UTF16; + id3tag_add_v2(gfp); + + T_ELIF("id3v2-latin1") + id3_tenc = TENC_LATIN1; + id3tag_add_v2(gfp); +#endif + + T_ELIF("tt") + argUsed = 1; + id3_tag(gfp, 't', id3_tenc, nextArg); + + T_ELIF("ta") + argUsed = 1; + id3_tag(gfp, 'a', id3_tenc, nextArg); + + T_ELIF("tl") + argUsed = 1; + id3_tag(gfp, 'l', id3_tenc, nextArg); + + T_ELIF("ty") + argUsed = 1; + id3_tag(gfp, 'y', id3_tenc, nextArg); + + T_ELIF("tc") + argUsed = 1; + id3_tag(gfp, 'c', id3_tenc, nextArg); + + T_ELIF("tn") + int ret = id3_tag(gfp, 'n', id3_tenc, nextArg); + argUsed = 1; + if (ret != 0) { + if (0 == ignore_tag_errors) { + if (id3tag_mode == ID3TAG_MODE_V1_ONLY) { + if (global_ui_config.silent < 9) { + error_printf("The track number has to be between 1 and 255 for ID3v1.\n"); + } + return -1; + } + else if (id3tag_mode == ID3TAG_MODE_V2_ONLY) { + /* track will be stored as-is in ID3v2 case, so no problem here */ + } + else { + if (global_ui_config.silent < 9) { + error_printf("The track number has to be between 1 and 255 for ID3v1, ignored for ID3v1.\n"); + } + } + } + } + + T_ELIF("tg") + int ret = 0; + argUsed = 1; + if (nextArg != 0 && strlen(nextArg) > 0) { + ret = id3_tag(gfp, 'g', id3_tenc, nextArg); + } + if (ret != 0) { + if (0 == ignore_tag_errors) { + if (ret == -1) { + error_printf("Unknown ID3v1 genre number: '%s'.\n", nextArg); + return -1; + } + else if (ret == -2) { + if (id3tag_mode == ID3TAG_MODE_V1_ONLY) { + error_printf("Unknown ID3v1 genre: '%s'.\n", nextArg); + return -1; + } + else if (id3tag_mode == ID3TAG_MODE_V2_ONLY) { + /* genre will be stored as-is in ID3v2 case, so no problem here */ + } + else { + if (global_ui_config.silent < 9) { + error_printf("Unknown ID3v1 genre: '%s'. Setting ID3v1 genre to 'Other'\n", nextArg); + } + } + } + else { + if (global_ui_config.silent < 10) + error_printf("Internal error.\n"); + return -1; + } + } + } + + T_ELIF("tv") + argUsed = 1; + if (id3_tag(gfp, 'v', id3_tenc, nextArg)) { + if (global_ui_config.silent < 9) { + error_printf("Invalid field value: '%s'. Ignored\n", nextArg); + } + } + + T_ELIF("ti") + argUsed = 1; + if (set_id3_albumart(gfp, nextArg) != 0) { + if (! ignore_tag_errors) { + return -1; + } + } + + T_ELIF("ignore-tag-errors") + ignore_tag_errors = 1; + + T_ELIF("add-id3v2") + id3tag_add_v2(gfp); + + T_ELIF("id3v1-only") + id3tag_v1_only(gfp); + id3tag_mode = ID3TAG_MODE_V1_ONLY; + + T_ELIF("id3v2-only") + id3tag_v2_only(gfp); + id3tag_mode = ID3TAG_MODE_V2_ONLY; + + T_ELIF("space-id3v1") + id3tag_space_v1(gfp); + + T_ELIF("pad-id3v2") + id3tag_pad_v2(gfp); + + T_ELIF("pad-id3v2-size") + argUsed = getIntValue(token, nextArg, &int_value); + if (argUsed) { + int_value = int_value <= 128000 ? int_value : 128000; + int_value = int_value >= 0 ? int_value : 0; + id3tag_set_pad(gfp, int_value); + } + + T_ELIF("genre-list") + id3tag_genre_list(genre_list_handler, NULL); + return -2; + + + T_ELIF("lowpass") + argUsed = getDoubleValue(token, nextArg, &double_value); + if (argUsed) { + if (double_value < 0) { + lame_set_lowpassfreq(gfp, -1); + } + else { + /* useful are 0.001 kHz...50 kHz, 50 Hz...50000 Hz */ + if (double_value < 0.001 || double_value > 50000.) { + error_printf("Must specify lowpass with --lowpass freq, freq >= 0.001 kHz\n"); + return -1; + } + lame_set_lowpassfreq(gfp, (int) (double_value * (double_value < 50. ? 1.e3 : 1.e0) + 0.5)); + } + } + + T_ELIF("lowpass-width") + argUsed = getDoubleValue(token, nextArg, &double_value); + if (argUsed) { + /* useful are 0.001 kHz...16 kHz, 16 Hz...50000 Hz */ + if (double_value < 0.001 || double_value > 50000.) { + error_printf + ("Must specify lowpass width with --lowpass-width freq, freq >= 0.001 kHz\n"); + return -1; + } + lame_set_lowpasswidth(gfp, (int) (double_value * (double_value < 16. ? 1.e3 : 1.e0) + 0.5)); + } + + T_ELIF("highpass") + argUsed = getDoubleValue(token, nextArg, &double_value); + if (argUsed) { + if (double_value < 0.0) { + lame_set_highpassfreq(gfp, -1); + } + else { + /* useful are 0.001 kHz...16 kHz, 16 Hz...50000 Hz */ + if (double_value < 0.001 || double_value > 50000.) { + error_printf("Must specify highpass with --highpass freq, freq >= 0.001 kHz\n"); + return -1; + } + lame_set_highpassfreq(gfp, (int) (double_value * (double_value < 16. ? 1.e3 : 1.e0) + 0.5)); + } + } + + T_ELIF("highpass-width") + argUsed = getDoubleValue(token, nextArg, &double_value); + if (argUsed) { + /* useful are 0.001 kHz...16 kHz, 16 Hz...50000 Hz */ + if (double_value < 0.001 || double_value > 50000.) { + error_printf + ("Must specify highpass width with --highpass-width freq, freq >= 0.001 kHz\n"); + return -1; + } + lame_set_highpasswidth(gfp, (int) double_value); + } + + T_ELIF("comp") + argUsed = getDoubleValue(token, nextArg, &double_value); + if (argUsed) { + if (double_value < 1.0) { + error_printf("Must specify compression ratio >= 1.0\n"); + return -1; + } + else { + lame_set_compression_ratio(gfp, (float) double_value); + } + } + + /* some more GNU-ish options could be added + * brief => few messages on screen (name, status report) + * o/output file => specifies output filename + * O => stdout + * i/input file => specifies input filename + * I => stdin + */ + T_ELIF("quiet") + global_ui_config.silent = 10; /* on a scale from 1 to 10 be very silent */ + + T_ELIF("silent") + global_ui_config.silent = 9; + + T_ELIF("brief") + global_ui_config.silent = -5; /* print few info on screen */ + + T_ELIF("verbose") + global_ui_config.silent = -10; /* print a lot on screen */ + + T_ELIF2("version", "license") + print_license(stdout); + return -2; + + T_ELIF2("help", "usage") + if (0 == local_strncasecmp(nextArg, "id3", 3)) { + help_id3tag(stdout); + } + else if (0 == local_strncasecmp(nextArg, "dev", 3)) { + help_developer_switches(stdout); + } + else { + short_help(gfp, stdout, ProgramName); + } + return -2; + + T_ELIF("longhelp") + long_help(gfp, stdout, ProgramName, 0 /* lessmode=NO */ ); + return -2; + + T_ELIF("?") +#ifdef __unix__ + FILE *fp = popen("less -Mqc", "w"); + long_help(gfp, fp, ProgramName, 0 /* lessmode=NO */ ); + pclose(fp); +#else + long_help(gfp, stdout, ProgramName, 1 /* lessmode=YES */ ); +#endif + return -2; + + T_ELIF2("preset", "alt-preset") + argUsed = 1; + { + int fast = 0, cbr = 0; + + while ((strcmp(nextArg, "fast") == 0) || (strcmp(nextArg, "cbr") == 0)) { + + if ((strcmp(nextArg, "fast") == 0) && (fast < 1)) + fast = 1; + if ((strcmp(nextArg, "cbr") == 0) && (cbr < 1)) + cbr = 1; + + argUsed++; + nextArg = i + argUsed < argc ? argv[i + argUsed] : ""; + } + + if (presets_set(gfp, fast, cbr, nextArg, ProgramName) < 0) + return -1; + } + + T_ELIF("disptime") + argUsed = getDoubleValue(token, nextArg, &double_value); + if (argUsed) + global_ui_config.update_interval = (float) double_value; + + T_ELIF("nogaptags") + nogap_tags = 1; + + T_ELIF("nogapout") + int const arg_n = strnlen(nextArg, PATH_MAX); + if (arg_n >= PATH_MAX) { + error_printf("%s: %s argument length (%d) exceeds limit (%d)\n", ProgramName, token, arg_n, PATH_MAX); + return -1; + } + strncpy(outPath, nextArg, PATH_MAX); + outPath[PATH_MAX] = '\0'; + argUsed = 1; + + T_ELIF("out-dir") + int const arg_n = strnlen(nextArg, PATH_MAX); + if (arg_n >= PATH_MAX) { + error_printf("%s: %s argument length (%d) exceeds limit (%d)\n", ProgramName, token, arg_n, PATH_MAX); + return -1; + } + strncpy(outDir, nextArg, PATH_MAX); + outDir[PATH_MAX] = '\0'; + argUsed = 1; + + T_ELIF("nogap") + nogap = 1; + + T_ELIF("swap-channel") + global_reader.swap_channel = 1; + + T_ELIF("ignorelength") + global_reader.ignorewavlength = 1; + + T_ELIF ("athaa-sensitivity") + argUsed = getDoubleValue(token, nextArg, &double_value); + if (argUsed) + lame_set_athaa_sensitivity(gfp, (float) double_value); + + /* ---------------- lots of dead switches ---------------- */ + + T_ELIF_INTERNAL("noshort") + (void) lame_set_no_short_blocks(gfp, 1); + + T_ELIF_INTERNAL("short") + (void) lame_set_no_short_blocks(gfp, 0); + + T_ELIF_INTERNAL("allshort") + (void) lame_set_force_short_blocks(gfp, 1); + + T_ELIF_INTERNAL("notemp") + (void) lame_set_useTemporal(gfp, 0); + + T_ELIF_INTERNAL_WITH_ARG("interch") + argUsed = getDoubleValue(token, nextArg, &double_value); + if (argUsed) + (void) lame_set_interChRatio(gfp, (float) double_value); + + T_ELIF_INTERNAL_WITH_ARG("temporal-masking") + argUsed = getIntValue(token, nextArg, &int_value); + if (argUsed) + (void) lame_set_useTemporal(gfp, int_value ? 1 : 0); + + T_ELIF_INTERNAL("nspsytune") + ; + + T_ELIF_INTERNAL("nssafejoint") + lame_set_exp_nspsytune(gfp, lame_get_exp_nspsytune(gfp) | 2); + + T_ELIF_INTERNAL_WITH_ARG("nsmsfix") + argUsed = getDoubleValue(token, nextArg, &double_value); + if (argUsed) + (void) lame_set_msfix(gfp, double_value); + + T_ELIF_INTERNAL_WITH_ARG("ns-bass") + argUsed = getDoubleValue(token, nextArg, &double_value); + if (argUsed) { + int k = (int) (double_value * 4); + if (k < -32) + k = -32; + if (k > 31) + k = 31; + if (k < 0) + k += 64; + lame_set_exp_nspsytune(gfp, lame_get_exp_nspsytune(gfp) | (k << 2)); + } + + T_ELIF_INTERNAL_WITH_ARG("ns-alto") + argUsed = getDoubleValue(token, nextArg, &double_value); + if (argUsed) { + int k = (int) (double_value * 4); + if (k < -32) + k = -32; + if (k > 31) + k = 31; + if (k < 0) + k += 64; + lame_set_exp_nspsytune(gfp, lame_get_exp_nspsytune(gfp) | (k << 8)); + } + + T_ELIF_INTERNAL_WITH_ARG("ns-treble") + argUsed = getDoubleValue(token, nextArg, &double_value); + if (argUsed) { + int k = (int) (double_value * 4); + if (k < -32) + k = -32; + if (k > 31) + k = 31; + if (k < 0) + k += 64; + lame_set_exp_nspsytune(gfp, lame_get_exp_nspsytune(gfp) | (k << 14)); + } + + T_ELIF_INTERNAL_WITH_ARG("ns-sfb21") + /* to be compatible with Naoki's original code, + * ns-sfb21 specifies how to change ns-treble for sfb21 */ + argUsed = getDoubleValue(token, nextArg, &double_value); + if (argUsed) { + int k = (int) (double_value * 4); + if (k < -32) + k = -32; + if (k > 31) + k = 31; + if (k < 0) + k += 64; + lame_set_exp_nspsytune(gfp, lame_get_exp_nspsytune(gfp) | (k << 20)); + } + + T_ELIF_INTERNAL_WITH_ARG("tune") /*without helptext */ + argUsed = getDoubleValue(token, nextArg, &double_value); + if (argUsed) + lame_set_tune(gfp, (float) double_value); + + T_ELIF_INTERNAL_WITH_ARG("shortthreshold") + { + float x, y; + int n = sscanf(nextArg, "%f,%f", &x, &y); + if (n == 1) { + y = x; + } + (void) lame_set_short_threshold(gfp, x, y); + } + T_ELIF_INTERNAL_WITH_ARG("maskingadjust") /*without helptext */ + argUsed = getDoubleValue(token, nextArg, &double_value); + if (argUsed) + (void) lame_set_maskingadjust(gfp, (float) double_value); + + T_ELIF_INTERNAL_WITH_ARG("maskingadjustshort") /*without helptext */ + argUsed = getDoubleValue(token, nextArg, &double_value); + if (argUsed) + (void) lame_set_maskingadjust_short(gfp, (float) double_value); + + T_ELIF_INTERNAL_WITH_ARG("athcurve") /*without helptext */ + argUsed = getDoubleValue(token, nextArg, &double_value); + if (argUsed) + (void) lame_set_ATHcurve(gfp, (float) double_value); + + T_ELIF_INTERNAL("no-preset-tune") /*without helptext */ + (void) lame_set_preset_notune(gfp, 0); + + T_ELIF_INTERNAL_WITH_ARG("substep") + argUsed = getIntValue(token, nextArg, &int_value); + if (argUsed) + (void) lame_set_substep(gfp, int_value); + + T_ELIF_INTERNAL_WITH_ARG("sbgain") /*without helptext */ + argUsed = getIntValue(token, nextArg, &int_value); + if (argUsed) + (void) lame_set_subblock_gain(gfp, int_value); + + T_ELIF_INTERNAL("sfscale") /*without helptext */ + (void) lame_set_sfscale(gfp, 1); + + T_ELIF_INTERNAL("noath") + (void) lame_set_noATH(gfp, 1); + + T_ELIF_INTERNAL("athonly") + (void) lame_set_ATHonly(gfp, 1); + + T_ELIF_INTERNAL("athshort") + (void) lame_set_ATHshort(gfp, 1); + + T_ELIF_INTERNAL_WITH_ARG("athlower") + argUsed = getDoubleValue(token, nextArg, &double_value); + if (argUsed) + (void) lame_set_ATHlower(gfp, (float) double_value); + + T_ELIF_INTERNAL_WITH_ARG("athtype") + argUsed = getIntValue(token, nextArg, &int_value); + if (argUsed) + (void) lame_set_ATHtype(gfp, int_value); + + T_ELIF_INTERNAL_WITH_ARG("athaa-type") /* switch for developing, no DOCU */ + /* once was 1:Gaby, 2:Robert, 3:Jon, else:off */ + argUsed = getIntValue(token, nextArg, &int_value); + if (argUsed) + (void) lame_set_athaa_type(gfp, int_value); /* now: 0:off else:Jon */ + + T_ELIF_INTERNAL_WITH_ARG("debug-file") /* switch for developing, no DOCU */ + /* file name to print debug info into */ + set_debug_file(nextArg); + + T_ELSE { + if (!argIgnored) { + error_printf("%s: unrecognized option --%s\n", ProgramName, token); + return -1; + } + argIgnored = 0; + } + T_END i += argUsed; + + } + else { + while ((c = *token++) != '\0') { + double double_value = 0; + int int_value = 0; + arg = *token ? token : nextArg; + switch (c) { + case 'm': + argUsed = 1; + + switch (*arg) { + case 's': + (void) lame_set_mode(gfp, STEREO); + break; + case 'd': + (void) lame_set_mode(gfp, DUAL_CHANNEL); + break; + case 'f': + lame_set_force_ms(gfp, 1); + (void) lame_set_mode(gfp, JOINT_STEREO); + break; + case 'j': + lame_set_force_ms(gfp, 0); + (void) lame_set_mode(gfp, JOINT_STEREO); + break; + case 'm': + (void) lame_set_mode(gfp, MONO); + break; + case 'l': + (void) lame_set_mode(gfp, MONO); + (void) lame_set_scale_left(gfp, 2); + (void) lame_set_scale_right(gfp, 0); + break; + case 'r': + (void) lame_set_mode(gfp, MONO); + (void) lame_set_scale_left(gfp, 0); + (void) lame_set_scale_right(gfp, 2); + break; + case 'a': /* same as 'j' ??? */ + lame_set_force_ms(gfp, 0); + (void) lame_set_mode(gfp, JOINT_STEREO); + break; + default: + error_printf("%s: -m mode must be s/d/f/j/m/l/r not %s\n", ProgramName, + arg); + return -1; + } + break; + + case 'V': + argUsed = getDoubleValue("V", arg, &double_value); + if (argUsed) { + /* to change VBR default look in lame.h */ + if (lame_get_VBR(gfp) == vbr_off) + lame_set_VBR(gfp, vbr_default); + lame_set_VBR_quality(gfp, (float) double_value); + } + break; + case 'v': + /* to change VBR default look in lame.h */ + if (lame_get_VBR(gfp) == vbr_off) + lame_set_VBR(gfp, vbr_default); + break; + + case 'q': + argUsed = getIntValue("q", arg, &int_value); + if (argUsed) + (void) lame_set_quality(gfp, int_value); + break; + case 'f': + (void) lame_set_quality(gfp, 7); + break; + case 'h': + (void) lame_set_quality(gfp, 2); + break; + + case 's': + argUsed = getDoubleValue("s", arg, &double_value); + if (argUsed) { + double_value = (int) (double_value * (double_value <= 192 ? 1.e3 : 1.e0) + 0.5); + global_reader.input_samplerate = (int)double_value; + (void) lame_set_in_samplerate(gfp, (int)double_value); + } + break; + case 'b': + argUsed = getIntValue("b", arg, &int_value); + if (argUsed) { + lame_set_brate(gfp, int_value); + lame_set_VBR_min_bitrate_kbps(gfp, lame_get_brate(gfp)); + } + break; + case 'B': + argUsed = getIntValue("B", arg, &int_value); + if (argUsed) { + lame_set_VBR_max_bitrate_kbps(gfp, int_value); + } + break; + case 'F': + lame_set_VBR_hard_min(gfp, 1); + break; + case 't': /* dont write VBR tag */ + (void) lame_set_bWriteVbrTag(gfp, 0); + global_decoder.disable_wav_header = 1; + break; + case 'T': /* do write VBR tag */ + (void) lame_set_bWriteVbrTag(gfp, 1); + nogap_tags = 1; + global_decoder.disable_wav_header = 0; + break; + case 'r': /* force raw pcm input file */ +#if defined(LIBSNDFILE) + error_printf + ("WARNING: libsndfile may ignore -r and perform fseek's on the input.\n" + "Compile without libsndfile if this is a problem.\n"); +#endif + global_reader.input_format = sf_raw; + break; + case 'x': /* force byte swapping */ + global_reader.swapbytes = 1; + break; + case 'p': /* (jo) error_protection: add crc16 information to stream */ + lame_set_error_protection(gfp, 1); + break; + case 'a': /* autoconvert input file from stereo to mono - for mono mp3 encoding */ + autoconvert = 1; + (void) lame_set_mode(gfp, MONO); + break; + case 'd': /*(void) lame_set_allow_diff_short( gfp, 1 ); */ + case 'k': /*lame_set_lowpassfreq(gfp, -1); + lame_set_highpassfreq(gfp, -1); */ + error_printf("WARNING: -%c is obsolete.\n", c); + break; + case 'S': + global_ui_config.silent = 5; + break; + case 'X': + /* experimental switch -X: + the differnt types of quant compare are tough + to communicate to endusers, so they shouldn't + bother to toy around with them + */ + { + int x, y; + int n = sscanf(arg, "%d,%d", &x, &y); + if (n == 1) { + y = x; + } + argUsed = 1; + if (internal_opts_enabled) { + lame_set_quant_comp(gfp, x); + lame_set_quant_comp_short(gfp, y); + } + } + break; + case 'Y': + lame_set_experimentalY(gfp, 1); + break; + case 'Z': + /* experimental switch -Z: + */ + { + int n = 1; + argUsed = sscanf(arg, "%d", &n); + /*if (internal_opts_enabled)*/ + { + lame_set_experimentalZ(gfp, n); + } + } + break; + case 'e': + argUsed = 1; + + switch (*arg) { + case 'n': + lame_set_emphasis(gfp, 0); + break; + case '5': + lame_set_emphasis(gfp, 1); + break; + case 'c': + lame_set_emphasis(gfp, 3); + break; + default: + error_printf("%s: -e emp must be n/5/c not %s\n", ProgramName, arg); + return -1; + } + break; + case 'c': + lame_set_copyright(gfp, 1); + break; + case 'o': + lame_set_original(gfp, 0); + break; + + case '?': + long_help(gfp, stdout, ProgramName, 0 /* LESSMODE=NO */ ); + return -1; + + default: + error_printf("%s: unrecognized option -%c\n", ProgramName, c); + return -1; + } + if (argUsed) { + if (arg == token) + token = ""; /* no more from token */ + else + ++i; /* skip arg we used */ + arg = ""; + argUsed = 0; + } + } + } + } + else { + if (nogap) { + if ((num_nogap != NULL) && (count_nogap < *num_nogap)) { + strncpy(nogap_inPath[count_nogap++], argv[i], PATH_MAX + 1); + input_file = 1; + } + else { + /* sorry, calling program did not allocate enough space */ + error_printf + ("Error: 'nogap option'. Calling program does not allow nogap option, or\n" + "you have exceeded maximum number of input files for the nogap option\n"); + *num_nogap = -1; + return -1; + } + } + else { + /* normal options: inputfile [outputfile], and + either one can be a '-' for stdin/stdout */ + if (inPath[0] == '\0') { + strncpy(inPath, argv[i], PATH_MAX + 1); + input_file = 1; + } + else { + if (outPath[0] == '\0') + strncpy(outPath, argv[i], PATH_MAX + 1); + else { + error_printf("%s: excess arg %s\n", ProgramName, argv[i]); + return -1; + } + } + } + } + } /* loop over args */ + + if (!input_file) { + usage(Console_IO.Console_fp, ProgramName); + return -1; + } + + if (lame_get_decode_only(gfp) && count_nogap > 0) { + error_printf("combination of nogap and decode not supported!\n"); + return -1; + } + + if (inPath[0] == '-') { + if (global_ui_config.silent == 0) { /* user didn't overrule default behaviour */ + global_ui_config.silent = 1; + } + } +#ifdef WIN32 + else + dosToLongFileName(inPath); +#endif + + if (outPath[0] == '\0') { /* no explicit output dir or file */ + if (count_nogap > 0) { /* in case of nogap encode */ + strncpy(outPath, outDir, PATH_MAX); + outPath[PATH_MAX] = '\0'; /* whatever someone set via --out-dir <path> argument */ + } + else if (inPath[0] == '-') { + /* if input is stdin, default output is stdout */ + strcpy(outPath, "-"); + } + else { + char const* s_ext = lame_get_decode_only(gfp) ? ".wav" : ".mp3"; + if (generateOutPath(inPath, outDir, s_ext, outPath) != 0) { + return -1; + } + } + } + + /* RG is enabled by default */ + if (!noreplaygain) + lame_set_findReplayGain(gfp, 1); + + /* disable VBR tags with nogap unless the VBR tags are forced */ + if (nogap && lame_get_bWriteVbrTag(gfp) && nogap_tags == 0) { + console_printf("Note: Disabling VBR Xing/Info tag since it interferes with --nogap\n"); + lame_set_bWriteVbrTag(gfp, 0); + } + + /* some file options not allowed with stdout */ + if (outPath[0] == '-') { + (void) lame_set_bWriteVbrTag(gfp, 0); /* turn off VBR tag */ + } + + /* if user did not explicitly specify input is mp3, check file name */ + if (global_reader.input_format == sf_unknown) + global_reader.input_format = filename_to_type(inPath); + +#if !(defined HAVE_MPGLIB || defined AMIGA_MPEGA) + if (is_mpeg_file_format(global_reader.input_format)) { + error_printf("Error: libmp3lame not compiled with mpg123 *decoding* support \n"); + return -1; + } +#endif + + /* default guess for number of channels */ + if (autoconvert) + (void) lame_set_num_channels(gfp, 2); + else if (MONO == lame_get_mode(gfp)) + (void) lame_set_num_channels(gfp, 1); + else + (void) lame_set_num_channels(gfp, 2); + + if (lame_get_free_format(gfp)) { + if (lame_get_brate(gfp) < 8 || lame_get_brate(gfp) > 640) { + error_printf("For free format, specify a bitrate between 8 and 640 kbps\n"); + error_printf("with the -b <bitrate> option\n"); + return -1; + } + } + if (num_nogap != NULL) + *num_nogap = count_nogap; + return 0; +} + +static int +string_to_argv(char* str, char** argv, int N) +{ + int argc = 0; + if (str == 0) return argc; + argv[argc++] = "lhama"; + for (;;) { + int quoted = 0; + while (isspace(*str)) { /* skip blanks */ + ++str; + } + if (*str == '\"') { /* is quoted argument ? */ + quoted = 1; + ++str; + } + if (*str == '\0') { /* end of string reached */ + break; + } + /* found beginning of some argument */ + if (argc < N) { + argv[argc++] = str; + } + /* look out for end of argument, either end of string, blank or quote */ + for(; *str != '\0'; ++str) { + if (quoted) { + if (*str == '\"') { /* end of quotation reached */ + *str++ = '\0'; + break; + } + } + else { + if (isspace(*str)) { /* parameter separator reached */ + *str++ = '\0'; + break; + } + } + } + } + return argc; +} + +static int +merge_argv(int argc, char** argv, int str_argc, char** str_argv, int N) +{ + int i; + if (argc > 0) { + str_argv[0] = argv[0]; + if (str_argc < 1) str_argc = 1; + } + for (i = 1; i < argc; ++i) { + int j = str_argc + i - 1; + if (j < N) { + str_argv[j] = argv[i]; + } + } + return argc + str_argc - 1; +} + +#ifdef DEBUG +static void +dump_argv(int argc, char** argv) +{ + int i; + for (i = 0; i < argc; ++i) { + printf("%d: \"%s\"\n",i,argv[i]); + } +} +#endif + + +int parse_args(lame_t gfp, int argc, char **argv, char *const inPath, char *const outPath, char **nogap_inPath, int *num_nogap) +{ + char *str_argv[512], *str; + int str_argc, ret; + str = lame_getenv("LAMEOPT"); + str_argc = string_to_argv(str, str_argv, dimension_of(str_argv)); + str_argc = merge_argv(argc, argv, str_argc, str_argv, dimension_of(str_argv)); +#ifdef DEBUG + dump_argv(str_argc, str_argv); +#endif + ret = parse_args_(gfp, str_argc, str_argv, inPath, outPath, nogap_inPath, num_nogap); + free(str); + return ret; +} + +/* end of parse.c */ diff --git a/frontend/parse.h b/frontend/parse.h new file mode 100644 index 0000000..0961ea6 --- /dev/null +++ b/frontend/parse.h @@ -0,0 +1,26 @@ +#ifndef PARSE_H_INCLUDED +#define PARSE_H_INCLUDED + +#if defined(__cplusplus) +extern "C" { +#endif + +int usage(FILE * const fp, const char *ProgramName); +int short_help(const lame_global_flags * gfp, FILE * const fp, const char *ProgramName); +int long_help(const lame_global_flags * gfp, FILE * const fp, const char *ProgramName, + int lessmode); +int display_bitrates(FILE * const fp); + +int parse_args(lame_global_flags * gfp, int argc, char **argv, char *const inPath, + char *const outPath, char **nogap_inPath, int *max_nogap); + +void parse_close(); + +int generateOutPath(char const* inPath, char const* outDir, char const* suffix, char* outPath); + +#if defined(__cplusplus) +} +#endif + +#endif +/* end of parse.h */ diff --git a/frontend/rtp.c b/frontend/rtp.c new file mode 100644 index 0000000..39718c8 --- /dev/null +++ b/frontend/rtp.c @@ -0,0 +1,366 @@ +/* + * rtp socket communication functions + * + * initially contributed by Felix von Leitner + * + * Copyright (c) 2000 Mark Taylor + * 2010 Robert Hegemann + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* $Id: rtp.c,v 1.24 2011/05/07 16:05:17 rbrito Exp $ */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#ifdef HAVE_STDINT_H +# include <stdint.h> +#endif + +struct rtpbits { + int sequence:16; /* sequence number: random */ + int pt:7; /* payload type: 14 for MPEG audio */ + int m:1; /* marker: 0 */ + int cc:4; /* number of CSRC identifiers: 0 */ + int x:1; /* number of extension headers: 0 */ + int p:1; /* is there padding appended: 0 */ + int v:2; /* version: 2 */ +}; + +struct rtpheader { /* in network byte order */ + struct rtpbits b; + int timestamp; /* start: random */ + int ssrc; /* random */ + int iAudioHeader; /* =0?! */ +}; + + +#if !defined( _WIN32 ) && !defined(__MINGW32__) + +#ifdef STDC_HEADERS +# include <stdio.h> +# include <stdarg.h> +# include <stdlib.h> +# include <string.h> +#else +# ifndef HAVE_MEMCPY +# define memcpy(d, s, n) bcopy ((s), (d), (n)) +# define memmove(d, s, n) bcopy ((s), (d), (n)) +# endif +#endif + +#ifdef HAVE_UNISTD_H +# include <unistd.h> +#endif + +#include <sys/types.h> +#include <sys/socket.h> +#ifdef __int8_t_defined +#undef uint8_t +#undef uint16_t +#undef uint32_t +#undef uint64_t +#endif +#include <netinet/in.h> +#include <arpa/inet.h> + +#ifdef WITH_DMALLOC +#include <dmalloc.h> +#endif + +#include "rtp.h" +#include "console.h" + +typedef int SOCKET; + +struct rtpheader RTPheader; +SOCKET rtpsocket; + + +/* create a sender socket. */ +int +rtp_socket(char const *address, unsigned int port, unsigned int TTL) +{ + int iRet, iLoop = 1; + struct sockaddr_in sin; + unsigned char cTtl = TTL; + char cLoop = 0; + unsigned int tempaddr; + + int iSocket = socket(AF_INET, SOCK_DGRAM, 0); + if (iSocket < 0) { + error_printf("socket() failed.\n"); + return 1; + } + + memset(&sin, 0, sizeof(sin)); + tempaddr = inet_addr(address); + sin.sin_family = AF_INET; + sin.sin_port = htons(port); + sin.sin_addr.s_addr = tempaddr; + + iRet = setsockopt(iSocket, SOL_SOCKET, SO_REUSEADDR, &iLoop, sizeof(int)); + if (iRet < 0) { + error_printf("setsockopt SO_REUSEADDR failed\n"); + return 1; + } + + if ((ntohl(tempaddr) >> 28) == 0xe) { + /* only set multicast parameters for multicast destination IPs */ + iRet = setsockopt(iSocket, IPPROTO_IP, IP_MULTICAST_TTL, &cTtl, sizeof(char)); + if (iRet < 0) { + error_printf("setsockopt IP_MULTICAST_TTL failed. multicast in kernel?\n"); + return 1; + } + + cLoop = 1; /* !? */ + iRet = setsockopt(iSocket, IPPROTO_IP, IP_MULTICAST_LOOP, &cLoop, sizeof(char)); + if (iRet < 0) { + error_printf("setsockopt IP_MULTICAST_LOOP failed. multicast in kernel?\n"); + return 1; + } + } + iRet = connect(iSocket, (struct sockaddr *) &sin, sizeof(struct sockaddr_in)); + if (iRet < 0) { + error_printf("connect IP_MULTICAST_LOOP failed. multicast in kernel?\n"); + return 1; + } + + rtpsocket = iSocket; + + return 0; +} + + +static void +rtp_initialization_extra(void) +{ +} + +static void +rtp_close_extra(void) +{ +} + +#else + +#include <Winsock2.h> +#ifndef IP_MULTICAST_TTL +#define IP_MULTICAST_TTL 3 +#endif +#include <stdio.h> +#include <stdarg.h> + +#include "rtp.h" +#include "console.h" + + +struct rtpheader RTPheader; +SOCKET rtpsocket; + +static char * +last_error_message(int err_code) +{ + char *msg; + void *p_msg_buf; + FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, + (void *) 0, + (DWORD) err_code, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR) & p_msg_buf, 0, NULL); + msg = strdup(p_msg_buf); + LocalFree(p_msg_buf); + return msg; +} + +static int +print_socket_error(int error) +{ + char *err_txt = last_error_message(error); + error_printf("error %d\n%s\n", error, err_txt); + free(err_txt); + return error; +} + +static int +on_socket_error(SOCKET s) +{ + int error = WSAGetLastError(); + print_socket_error(error); + if (s != INVALID_SOCKET) { + closesocket(s); + } + return error; +} + +/* create a sender socket. */ +int +rtp_socket(char const *address, unsigned int port, unsigned int TTL) +{ + char const True = 1; + char const *c = ""; + int error; + UINT ip; + PHOSTENT host; + SOCKET s; + SOCKADDR_IN source, dest; + + source.sin_family = AF_INET; + source.sin_addr.s_addr = htonl(INADDR_ANY); + source.sin_port = htons(0); + + dest.sin_family = AF_INET; + dest.sin_addr.s_addr = inet_addr(address); + + if (!strcmp(address, "255.255.255.255")) { + } + else if (dest.sin_addr.s_addr == INADDR_NONE) { + host = gethostbyname(address); + + if (host) { + dest.sin_addr = *(PIN_ADDR) host->h_addr; + } + else { + error_printf("Unknown host %s\r\n", address); + return 1; + } + } + + dest.sin_port = htons((u_short) port); + + ip = ntohl(dest.sin_addr.s_addr); + + if (IN_CLASSA(ip)) + c = "class A"; + if (IN_CLASSB(ip)) + c = "class B"; + if (IN_CLASSC(ip)) + c = "class C"; + if (IN_CLASSD(ip)) + c = "class D"; + if (ip == INADDR_LOOPBACK) + c = "loopback"; + if (ip == INADDR_BROADCAST) + c = "broadcast"; + + s = socket(AF_INET, SOCK_DGRAM, PF_UNSPEC); + if (s == INVALID_SOCKET) { + error_printf("socket () "); + return on_socket_error(s); + } + error = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &True, sizeof(True)); + error = bind(s, (struct sockaddr *) &source, sizeof(source)); + if (error == SOCKET_ERROR) { + error_printf("bind () "); + return on_socket_error(s); + } + if (ip == INADDR_BROADCAST) { + error_printf("broadcast %s:%u %s\r\n", inet_ntoa(dest.sin_addr), ntohs(dest.sin_port), c); + error = setsockopt(s, SOL_SOCKET, SO_BROADCAST, &True, sizeof(True)); + if (error == SOCKET_ERROR) { + error_printf("setsockopt (%u, SOL_SOCKET, SO_BROADCAST, ...) ", s); + return on_socket_error(s); + } + } + if (IN_CLASSD(ip)) { + error_printf("multicast %s:%u %s\r\n", inet_ntoa(dest.sin_addr), ntohs(dest.sin_port), c); + error = setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, (const char *) &TTL, sizeof(TTL)); + if (error == SOCKET_ERROR) { + error_printf("setsockopt (%u, IPPROTO_IP, IP_MULTICAST_TTL, ...) ", s); + return on_socket_error(s); + } + } + error = connect(s, (PSOCKADDR) & dest, sizeof(SOCKADDR_IN)); + if (error == SOCKET_ERROR) { + error_printf("connect: "); + return on_socket_error(s); + } + rtpsocket = s; + return 0; +} + +static void +rtp_initialization_extra(void) +{ + WSADATA wsaData; + int rc = WSAStartup(MAKEWORD(2, 2), &wsaData); + if (rc != 0) { + print_socket_error(rc); + } +} + +static void +rtp_close_extra(void) +{ + WSACleanup(); +} + +#endif + + +static int +rtp_send(unsigned char const *data, int len) +{ + SOCKET s = rtpsocket; + struct rtpheader *foo = &RTPheader; + char *buffer = malloc(len + sizeof(struct rtpheader)); + int *cast = (int *) foo; + int *outcast = (int *) buffer; + int count, size; + + outcast[0] = htonl(cast[0]); + outcast[1] = htonl(cast[1]); + outcast[2] = htonl(cast[2]); + outcast[3] = htonl(cast[3]); + memmove(buffer + sizeof(struct rtpheader), data, len); + size = len + sizeof(*foo); + count = send(s, buffer, size, 0); + free(buffer); + + return count != size; +} + +void +rtp_output(unsigned char const *mp3buffer, int mp3size) +{ + rtp_send(mp3buffer, mp3size); + RTPheader.timestamp += 5; + RTPheader.b.sequence++; +} + +void +rtp_initialization(void) +{ + struct rtpheader *foo = &RTPheader; + foo->b.v = 2; + foo->b.p = 0; + foo->b.x = 0; + foo->b.cc = 0; + foo->b.m = 0; + foo->b.pt = 14; /* MPEG Audio */ + foo->b.sequence = rand() & 65535; + foo->timestamp = rand(); + foo->ssrc = rand(); + foo->iAudioHeader = 0; + rtp_initialization_extra(); +} + +void +rtp_deinitialization(void) +{ + rtp_close_extra(); +} diff --git a/frontend/rtp.h b/frontend/rtp.h new file mode 100644 index 0000000..9100feb --- /dev/null +++ b/frontend/rtp.h @@ -0,0 +1,44 @@ +/* + * rtp socket communication include file + * + * initially contributed by Felix von Leitner + * + * Copyright (c) 2000 Mark Taylor + * 2010 Robert Hegemann + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef LAME_RTP_H +#define LAME_RTP_H + +#if defined(__cplusplus) +extern "C" { +#endif + + struct RtpStruct; + typedef struct RtpStruct *RtpHandle; + + void rtp_initialization(void); + void rtp_deinitialization(void); + int rtp_socket( /*RtpHandle rtp, */ char const *Address, unsigned int port, + unsigned int TTL); + void rtp_output( /*RtpHandle rtp, */ unsigned char const *mp3buffer, int mp3size); + +#if defined(__cplusplus) +} +#endif +#endif diff --git a/frontend/timestatus.c b/frontend/timestatus.c new file mode 100644 index 0000000..14935da --- /dev/null +++ b/frontend/timestatus.c @@ -0,0 +1,438 @@ +/* + * time status related function source file + * + * Copyright (c) 1999 Mark Taylor + * 2010 Robert Hegemann + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* $Id: timestatus.c,v 1.61 2013/03/20 20:38:43 robert Exp $ */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + + +#if 1 +# define SPEED_CHAR "x" /* character x */ +# define SPEED_MULT 1. +#else +# define SPEED_CHAR "%%" +# define SPEED_MULT 100. +#endif + +#include <assert.h> +#include <time.h> +#include <string.h> +#include <stdlib.h> + +#include "lame.h" +#include "main.h" +#include "lametime.h" +#include "timestatus.h" +#include "brhist.h" +#include "console.h" + +#ifdef WITH_DMALLOC +#include <dmalloc.h> +#endif + +typedef struct time_status_struct { + double last_time; /* result of last call to clock */ + double elapsed_time; /* total time */ + double estimated_time; /* estimated total duration time [s] */ + double speed_index; /* speed relative to realtime coding [100%] */ +} timestatus_t; + +static struct EncoderProgress { + timestatus_t real_time; + timestatus_t proc_time; + double last_time; + int last_frame_num; + int time_status_init; +} global_encoder_progress; + + +/* + * Calculates from the input (see below) the following values: + * - total estimated time + * - a speed index + */ + +static void +ts_calc_times(timestatus_t * const tstime, /* tstime->elapsed_time: elapsed time */ + const int sample_freq, /* sample frequency [Hz/kHz] */ + const int frameNum, /* Number of the current Frame */ + const int totalframes, /* total umber of Frames */ + const int framesize) +{ /* Size of a frame [bps/kbps] */ + assert(sample_freq >= 8000 && sample_freq <= 48000); + + if (frameNum > 0 && tstime->elapsed_time > 0) { + tstime->estimated_time = tstime->elapsed_time * totalframes / frameNum; + tstime->speed_index = framesize * frameNum / (sample_freq * tstime->elapsed_time); + } + else { + tstime->estimated_time = 0.; + tstime->speed_index = 0.; + } +} + +/* Decomposes a given number of seconds into a easy to read hh:mm:ss format + * padded with an additional character + */ + +static void +ts_time_decompose(const double x, const char padded_char) +{ + const unsigned long time_in_sec = (unsigned long)x; + const unsigned long hour = time_in_sec / 3600; + const unsigned int min = time_in_sec / 60 % 60; + const unsigned int sec = time_in_sec % 60; + + if (hour == 0) + console_printf(" %2u:%02u%c", min, sec, padded_char); + else if (hour < 100) + console_printf("%2lu:%02u:%02u%c", hour, min, sec, padded_char); + else + console_printf("%6lu h%c", hour, padded_char); +} + +static void +timestatus(const lame_global_flags * const gfp) +{ + timestatus_t* real_time = &global_encoder_progress.real_time; + timestatus_t* proc_time = &global_encoder_progress.proc_time; + int percent; + double tmx, delta; + int samp_rate = lame_get_out_samplerate(gfp) + , frameNum = lame_get_frameNum(gfp) + , totalframes = lame_get_totalframes(gfp) + , framesize = lame_get_framesize(gfp) + ; + + if (totalframes < frameNum) { + totalframes = frameNum; + } + if (global_encoder_progress.time_status_init == 0) { + real_time->last_time = GetRealTime(); + proc_time->last_time = GetCPUTime(); + real_time->elapsed_time = 0; + proc_time->elapsed_time = 0; + } + + /* we need rollover protection for GetCPUTime, and maybe GetRealTime(): */ + tmx = GetRealTime(); + delta = tmx - real_time->last_time; + if (delta < 0) + delta = 0; /* ignore, clock has rolled over */ + real_time->elapsed_time += delta; + real_time->last_time = tmx; + + + tmx = GetCPUTime(); + delta = tmx - proc_time->last_time; + if (delta < 0) + delta = 0; /* ignore, clock has rolled over */ + proc_time->elapsed_time += delta; + proc_time->last_time = tmx; + + if (global_encoder_progress.time_status_init == 0) { + console_printf("\r" + " Frame | CPU time/estim | REAL time/estim | play/CPU | ETA \n" + " 0/ ( 0%%)| 0:00/ : | 0:00/ : | " + SPEED_CHAR "| : \r" + /* , Console_IO.str_clreoln, Console_IO.str_clreoln */ ); + global_encoder_progress.time_status_init = 1; + return; + } + + ts_calc_times(real_time, samp_rate, frameNum, totalframes, framesize); + ts_calc_times(proc_time, samp_rate, frameNum, totalframes, framesize); + + if (frameNum < totalframes) { + percent = (int) (100. * frameNum / totalframes + 0.5); + } + else { + percent = 100; + } + + console_printf("\r%6i/%-6i", frameNum, totalframes); + console_printf(percent < 100 ? " (%2d%%)|" : "(%3.3d%%)|", percent); + ts_time_decompose(proc_time->elapsed_time, '/'); + ts_time_decompose(proc_time->estimated_time, '|'); + ts_time_decompose(real_time->elapsed_time, '/'); + ts_time_decompose(real_time->estimated_time, '|'); + console_printf(proc_time->speed_index <= 1. ? + "%9.4f" SPEED_CHAR "|" : "%#9.5g" SPEED_CHAR "|", + SPEED_MULT * proc_time->speed_index); + ts_time_decompose((real_time->estimated_time - real_time->elapsed_time), ' '); +} + +static void +timestatus_finish(void) +{ + console_printf("\n"); +} + + +static void +brhist_init_package(lame_global_flags const* gf) +{ + if (global_ui_config.brhist) { + if (brhist_init(gf, lame_get_VBR_min_bitrate_kbps(gf), lame_get_VBR_max_bitrate_kbps(gf))) { + /* fail to initialize */ + global_ui_config.brhist = 0; + } + } + else { + brhist_init(gf, 128, 128); /* Dirty hack */ + } +} + + +void +encoder_progress_begin( lame_global_flags const* gf + , char const* inPath + , char const* outPath + ) +{ + brhist_init_package(gf); + global_encoder_progress.time_status_init = 0; + global_encoder_progress.last_time = 0; + global_encoder_progress.last_frame_num = 0; + if (global_ui_config.silent < 9) { + char* i_file = 0; + char* o_file = 0; +#if defined( _WIN32 ) && !defined(__MINGW32__) + inPath = i_file = utf8ToConsole8Bit(inPath); + outPath = o_file = utf8ToConsole8Bit(outPath); +#endif + lame_print_config(gf); /* print useful information about options being used */ + + console_printf("Encoding %s%s to %s\n", + strcmp(inPath, "-") ? inPath : "<stdin>", + strlen(inPath) + strlen(outPath) < 66 ? "" : "\n ", + strcmp(outPath, "-") ? outPath : "<stdout>"); + + free(i_file); + free(o_file); + + console_printf("Encoding as %g kHz ", 1.e-3 * lame_get_out_samplerate(gf)); + + { + static const char *mode_names[2][4] = { + {"stereo", "j-stereo", "dual-ch", "single-ch"}, + {"stereo", "force-ms", "dual-ch", "single-ch"} + }; + switch (lame_get_VBR(gf)) { + case vbr_rh: + console_printf("%s MPEG-%u%s Layer III VBR(q=%g) qval=%i\n", + mode_names[lame_get_force_ms(gf)][lame_get_mode(gf)], + 2 - lame_get_version(gf), + lame_get_out_samplerate(gf) < 16000 ? ".5" : "", + lame_get_VBR_quality(gf), + lame_get_quality(gf)); + break; + case vbr_mt: + case vbr_mtrh: + console_printf("%s MPEG-%u%s Layer III VBR(q=%g)\n", + mode_names[lame_get_force_ms(gf)][lame_get_mode(gf)], + 2 - lame_get_version(gf), + lame_get_out_samplerate(gf) < 16000 ? ".5" : "", + lame_get_VBR_quality(gf)); + break; + case vbr_abr: + console_printf("%s MPEG-%u%s Layer III (%gx) average %d kbps qval=%i\n", + mode_names[lame_get_force_ms(gf)][lame_get_mode(gf)], + 2 - lame_get_version(gf), + lame_get_out_samplerate(gf) < 16000 ? ".5" : "", + 0.1 * (int) (10. * lame_get_compression_ratio(gf) + 0.5), + lame_get_VBR_mean_bitrate_kbps(gf), + lame_get_quality(gf)); + break; + default: + console_printf("%s MPEG-%u%s Layer III (%gx) %3d kbps qval=%i\n", + mode_names[lame_get_force_ms(gf)][lame_get_mode(gf)], + 2 - lame_get_version(gf), + lame_get_out_samplerate(gf) < 16000 ? ".5" : "", + 0.1 * (int) (10. * lame_get_compression_ratio(gf) + 0.5), + lame_get_brate(gf), + lame_get_quality(gf)); + break; + } + } + + if (global_ui_config.silent <= -10) { + lame_print_internals(gf); + } + } +} + +void +encoder_progress( lame_global_flags const* gf ) +{ + if (global_ui_config.silent <= 0) { + int const frames = lame_get_frameNum(gf); + int const frames_diff = frames - global_encoder_progress.last_frame_num; + if (global_ui_config.update_interval <= 0) { /* most likely --disptime x not used */ + if (frames_diff < 100 && frames_diff != 0) { /* true, most of the time */ + return; + } + global_encoder_progress.last_frame_num = (frames/100)*100; + } + else { + if (frames != 0 && frames != 9) { + double const act = GetRealTime(); + double const dif = act - global_encoder_progress.last_time; + if (dif >= 0 && dif < global_ui_config.update_interval) { + return; + } + } + global_encoder_progress.last_time = GetRealTime(); /* from now! disp_time seconds */ + } + if (global_ui_config.brhist) { + brhist_jump_back(); + } + timestatus(gf); + if (global_ui_config.brhist) { + brhist_disp(gf); + } + console_flush(); + } +} + +void +encoder_progress_end( lame_global_flags const* gf ) +{ + if (global_ui_config.silent <= 0) { + if (global_ui_config.brhist) { + brhist_jump_back(); + } + timestatus(gf); + if (global_ui_config.brhist) { + brhist_disp(gf); + } + timestatus_finish(); + } +} + + +/* these functions are used in get_audio.c */ +static struct DecoderProgress { + int last_mode_ext; + int frames_total; + int frame_ctr; + int framesize; + unsigned long samples; +} global_decoder_progress; + +static +unsigned long calcEndPadding(unsigned long samples, int pcm_samples_per_frame) +{ + unsigned long end_padding; + samples += 576; + end_padding = pcm_samples_per_frame - (samples % pcm_samples_per_frame); + if (end_padding < 576) + end_padding += pcm_samples_per_frame; + return end_padding; +} + +static +unsigned long calcNumBlocks(unsigned long samples, int pcm_samples_per_frame) +{ + unsigned long end_padding; + samples += 576; + end_padding = pcm_samples_per_frame - (samples % pcm_samples_per_frame); + if (end_padding < 576) + end_padding += pcm_samples_per_frame; + return (samples + end_padding) / pcm_samples_per_frame; +} + +DecoderProgress +decoder_progress_init(unsigned long n, int framesize) +{ + DecoderProgress dp = &global_decoder_progress; + dp->last_mode_ext =0; + dp->frames_total = 0; + dp->frame_ctr = 0; + dp->framesize = framesize; + dp->samples = 0; + if (n != (0ul-1ul)) { + if (framesize == 576 || framesize == 1152) { + dp->frames_total = calcNumBlocks(n, framesize); + dp->samples = 576 + calcEndPadding(n, framesize); + } + else if (framesize > 0) { + dp->frames_total = n / framesize; + } + else { + dp->frames_total = n; + } + } + return dp; +} + +static void +addSamples(DecoderProgress dp, int iread) +{ + dp->samples += iread; + dp->frame_ctr += dp->samples / dp->framesize; + dp->samples %= dp->framesize; + if (dp->frames_total < dp->frame_ctr) { + dp->frames_total = dp->frame_ctr; + } +} + +void +decoder_progress(DecoderProgress dp, const mp3data_struct * mp3data, int iread) +{ + addSamples(dp, iread); + + console_printf("\rFrame#%6i/%-6i %3i kbps", + dp->frame_ctr, dp->frames_total, mp3data->bitrate); + + /* Programmed with a single frame hold delay */ + /* Attention: static data */ + + /* MP2 Playback is still buggy. */ + /* "'00' subbands 4-31 in intensity_stereo, bound==4" */ + /* is this really intensity_stereo or is it MS stereo? */ + + if (mp3data->mode == JOINT_STEREO) { + int curr = mp3data->mode_ext; + int last = dp->last_mode_ext; + console_printf(" %s %c", + curr & 2 ? last & 2 ? " MS " : "LMSR" : last & 2 ? "LMSR" : "L R", + curr & 1 ? last & 1 ? 'I' : 'i' : last & 1 ? 'i' : ' '); + dp->last_mode_ext = curr; + } + else { + console_printf(" "); + dp->last_mode_ext = 0; + } +/* console_printf ("%s", Console_IO.str_clreoln ); */ + console_printf(" \b\b\b\b\b\b\b\b"); + console_flush(); +} + +void +decoder_progress_finish(DecoderProgress dp) +{ + (void) dp; + console_printf("\n"); +} diff --git a/frontend/timestatus.h b/frontend/timestatus.h new file mode 100644 index 0000000..f5d343b --- /dev/null +++ b/frontend/timestatus.h @@ -0,0 +1,46 @@ +/* + * time status related function include file + * + * Copyright (c) 1999 Mark Taylor + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef LAME_TIMESTATUS_H +#define LAME_TIMESTATUS_H + +#if defined(__cplusplus) +extern "C" { +#endif + +void encoder_progress_begin( lame_global_flags const* gfp + , char const* inpath + , char const* outpath ); +void encoder_progress( lame_global_flags const* gfp ); +void encoder_progress_end(lame_global_flags const* gfp); + +struct DecoderProgress; +typedef struct DecoderProgress* DecoderProgress; + +DecoderProgress decoder_progress_init(unsigned long n, int framesize); +void decoder_progress(DecoderProgress dp, const mp3data_struct *, int iread); +void decoder_progress_finish(DecoderProgress dp); + +#if defined(__cplusplus) +} +#endif + +#endif /* LAME_TIMESTATUS_H */ diff --git a/include/Makefile.am b/include/Makefile.am new file mode 100644 index 0000000..e630495 --- /dev/null +++ b/include/Makefile.am @@ -0,0 +1,8 @@ +## $Id: Makefile.am,v 1.4 2010/03/14 17:23:35 robert Exp $ + +include $(top_srcdir)/Makefile.am.global + +pkginclude_HEADERS = lame.h + +EXTRA_DIST = lame.def libmp3lame.sym + diff --git a/include/Makefile.in b/include/Makefile.in new file mode 100644 index 0000000..91bd5b8 --- /dev/null +++ b/include/Makefile.in @@ -0,0 +1,593 @@ +# Makefile.in generated by automake 1.15.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2017 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# global section for every Makefile.am + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = include +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(pkginclude_HEADERS) \ + $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(pkgincludedir)" +HEADERS = $(pkginclude_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.global +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_DEFS = @CONFIG_DEFS@ +CONFIG_MATH_LIB = @CONFIG_MATH_LIB@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CPUCCODE = @CPUCCODE@ +CPUTYPE = @CPUTYPE@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FRONTEND_CFLAGS = @FRONTEND_CFLAGS@ +FRONTEND_LDADD = @FRONTEND_LDADD@ +FRONTEND_LDFLAGS = @FRONTEND_LDFLAGS@ +GREP = @GREP@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_CONFIG = @GTK_CONFIG@ +GTK_LIBS = @GTK_LIBS@ +INCLUDES = @INCLUDES@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDADD = @LDADD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_MAJOR_VERSION = @LIB_MAJOR_VERSION@ +LIB_MINOR_VERSION = @LIB_MINOR_VERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEDEP = @MAKEDEP@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NASM = @NASM@ +NASM_FORMAT = @NASM_FORMAT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM_F = @RM_F@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_FRONTEND = @WITH_FRONTEND@ +WITH_MP3RTP = @WITH_MP3RTP@ +WITH_MP3X = @WITH_MP3X@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = 1.15 foreign +pkginclude_HEADERS = lame.h +EXTRA_DIST = lame.def libmp3lame.sym +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.global $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign include/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/Makefile.am.global $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-pkgincludeHEADERS: $(pkginclude_HEADERS) + @$(NORMAL_INSTALL) + @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ + done + +uninstall-pkgincludeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(pkgincludedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pkgincludeHEADERS + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pkgincludeHEADERS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool cscopelist-am ctags ctags-am distclean \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-pkgincludeHEADERS install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am tags tags-am uninstall uninstall-am \ + uninstall-pkgincludeHEADERS + +.PRECIOUS: Makefile + + +# end global section + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/include/lame.def b/include/lame.def new file mode 100644 index 0000000..def5287 --- /dev/null +++ b/include/lame.def @@ -0,0 +1,301 @@ +LIBRARY libmp3lame.DLL +EXPORTS + +lame_init @1 + +lame_set_num_samples @2 +lame_get_num_samples @3 + +lame_set_in_samplerate @4 +lame_get_in_samplerate @5 + +lame_set_num_channels @6 +lame_get_num_channels @7 + +lame_set_scale @8 +lame_get_scale @9 + +lame_set_scale_left @10 +lame_get_scale_left @11 + +lame_set_scale_right @12 +lame_get_scale_right @13 + +lame_set_out_samplerate @14 +lame_get_out_samplerate @15 + +lame_set_analysis @16 +lame_get_analysis @17 + +lame_set_bWriteVbrTag @18 +lame_get_bWriteVbrTag @19 + +lame_set_decode_only @20 +lame_get_decode_only @21 + +lame_set_quality @22 +lame_get_quality @23 + +lame_set_mode @24 +lame_get_mode @25 + +lame_set_force_ms @26 +lame_get_force_ms @27 + +lame_set_free_format @28 +lame_get_free_format @29 + + +lame_set_findReplayGain @30 +lame_get_findReplayGain @31 + +lame_set_decode_on_the_fly @32 +lame_get_decode_on_the_fly @33 + +lame_set_nogap_total @34 +lame_get_nogap_total @35 + +lame_set_nogap_currentindex @36 +lame_get_nogap_currentindex @37 + + +lame_set_errorf @38 +lame_set_debugf @39 +lame_set_msgf @40 + +lame_set_brate @41 +lame_get_brate @42 + +lame_set_compression_ratio @43 +lame_get_compression_ratio @44 + +lame_set_preset @45 + +lame_set_asm_optimizations @46 + + +lame_set_copyright @47 +lame_get_copyright @48 + +lame_set_original @49 +lame_get_original @50 + +lame_set_error_protection @51 +lame_get_error_protection @52 + +lame_set_padding_type @53 +lame_get_padding_type @54 + +lame_set_extension @55 +lame_get_extension @56 + +lame_set_strict_ISO @57 +lame_get_strict_ISO @58 + +lame_set_disable_reservoir @59 +lame_get_disable_reservoir @60 + +lame_set_quant_comp @61 +lame_get_quant_comp @62 +lame_set_quant_comp_short @63 +lame_get_quant_comp_short @64 + +lame_set_experimentalX @65 +lame_get_experimentalX @66 + +lame_set_experimentalY @67 +lame_get_experimentalY @68 + +lame_set_experimentalZ @69 +lame_get_experimentalZ @70 + +lame_set_exp_nspsytune @71 +lame_get_exp_nspsytune @72 + +lame_set_msfix @73 +lame_get_msfix @74 + +lame_set_VBR @75 +lame_get_VBR @76 + +lame_set_VBR_q @77 +lame_get_VBR_q @78 + +lame_set_VBR_mean_bitrate_kbps @79 +lame_get_VBR_mean_bitrate_kbps @80 + +lame_set_VBR_min_bitrate_kbps @81 +lame_get_VBR_min_bitrate_kbps @82 + +lame_set_VBR_max_bitrate_kbps @83 +lame_get_VBR_max_bitrate_kbps @84 + +lame_set_VBR_hard_min @85 +lame_get_VBR_hard_min @86 + +lame_set_preset_expopts @87 + +lame_set_lowpassfreq @88 +lame_get_lowpassfreq @89 + +lame_set_lowpasswidth @90 +lame_get_lowpasswidth @91 + +lame_set_highpassfreq @92 +lame_get_highpassfreq @93 + +lame_set_highpasswidth @94 +lame_get_highpasswidth @95 + +lame_set_ATHonly @96 +lame_get_ATHonly @97 + +lame_set_ATHshort @98 +lame_get_ATHshort @99 + +lame_set_noATH @100 +lame_get_noATH @101 + +lame_set_ATHtype @102 +lame_get_ATHtype @103 + +lame_set_ATHlower @104 +lame_get_ATHlower @105 + +lame_set_athaa_type @106 +lame_get_athaa_type @107 + +lame_set_athaa_loudapprox @108 +lame_get_athaa_loudapprox @109 + +lame_set_athaa_sensitivity @110 +lame_get_athaa_sensitivity @111 + +lame_set_cwlimit @112 +lame_get_cwlimit @113 + +lame_set_useTemporal @114 +lame_get_useTemporal @115 + +lame_set_interChRatio @116 +lame_get_interChRatio @117 + +lame_set_no_short_blocks @118 +lame_get_no_short_blocks @119 +lame_set_force_short_blocks @120 +lame_get_force_short_blocks @121 +lame_set_allow_diff_short @122 +lame_get_allow_diff_short @123 + +lame_set_emphasis @124 +lame_get_emphasis @125 + +lame_get_version @126 +lame_get_encoder_delay @127 +lame_get_encoder_padding @128 +lame_get_framesize @129 + +lame_get_mf_samples_to_encode @130 +lame_get_size_mp3buffer @131 +lame_get_frameNum @132 +lame_get_totalframes @133 + +lame_get_RadioGain @134 +lame_get_AudiophileGain @135 +lame_get_PeakSample @136 +lame_get_noclipGainChange @137 +lame_get_noclipScale @138 + +lame_init_params @139 + +get_lame_version @140 +get_lame_short_version @141 +get_lame_very_short_version @142 +get_psy_version @143 +get_lame_url @144 + +get_lame_version_numerical @145 + +lame_print_config @146 +lame_print_internals @147 + +lame_encode_buffer @148 +lame_encode_buffer_interleaved @149 +lame_encode_buffer_float @150 +lame_encode_buffer_long @151 +lame_encode_buffer_long2 @152 +lame_encode_buffer_int @153 +lame_encode_flush @154 +lame_encode_flush_nogap @155 + +lame_init_bitstream @156 + +lame_bitrate_hist @157 +lame_bitrate_kbps @158 +lame_stereo_mode_hist @159 +lame_bitrate_stereo_mode_hist @160 +lame_block_type_hist @161 +lame_bitrate_block_type_hist @162 +lame_mp3_tags_fid @163 +lame_close @164 +lame_get_lametag_frame @165 +get_lame_os_bitness @166 +lame_set_VBR_quality @167 +lame_get_VBR_quality @168 + +lame_encode_buffer_ieee_float @169 +lame_encode_buffer_interleaved_ieee_float @170 +lame_encode_buffer_ieee_double @171 +lame_encode_buffer_interleaved_ieee_double @172 +lame_encode_buffer_interleaved_int @173 + +lame_get_bitrate @502 +lame_get_samplerate @503 +lame_get_maximum_number_of_samples @504 + +lame_decode_init @1000 +lame_decode @1001 +lame_decode_headers @1002 +lame_decode1 @1003 +lame_decode1_headers @1004 +lame_decode1_headersB @1005 +lame_decode_exit @1006 + +hip_decode_init @1100 +hip_decode_exit @1101 +hip_decode @1102 +hip_decode_headers @1103 +hip_decode1 @1104 +hip_decode1_headers @1105 +hip_decode1_headersB @1106 +hip_set_debugf @1107 +hip_set_errorf @1108 +hip_set_msgf @1109 + +id3tag_genre_list @2000 +id3tag_init @2001 +id3tag_add_v2 @2002 +id3tag_v1_only @2003 +id3tag_v2_only @2004 +id3tag_space_v1 @2005 +id3tag_pad_v2 @2006 +id3tag_set_title @2007 +id3tag_set_artist @2008 +id3tag_set_album @2009 +id3tag_set_year @2010 +id3tag_set_comment @2011 +id3tag_set_track @2012 +id3tag_set_genre @2013 +id3tag_set_fieldvalue @2014 +id3tag_set_albumart @2015 +lame_get_id3v1_tag @2016 +lame_get_id3v2_tag @2017 +lame_set_write_id3tag_automatic @2018 +lame_get_write_id3tag_automatic @2019 +id3tag_set_pad @2020 +id3tag_set_comment_ucs2 @2021 +id3tag_set_textinfo_ucs2 @2022 +id3tag_set_fieldvalue_ucs2 @2023 +id3tag_set_comment_utf16 @2024 +id3tag_set_textinfo_utf16 @2025 +id3tag_set_fieldvalue_utf16 @2026 diff --git a/include/lame.h b/include/lame.h new file mode 100644 index 0000000..5196690 --- /dev/null +++ b/include/lame.h @@ -0,0 +1,1342 @@ +/* + * Interface to MP3 LAME encoding engine + * + * Copyright (c) 1999 Mark Taylor + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* $Id: lame.h,v 1.192 2017/08/31 14:14:46 robert Exp $ */ + +#ifndef LAME_LAME_H +#define LAME_LAME_H + +/* for size_t typedef */ +#include <stddef.h> +/* for va_list typedef */ +#include <stdarg.h> +/* for FILE typedef, TODO: remove when removing lame_mp3_tags_fid */ +#include <stdio.h> + +#if defined(__cplusplus) +extern "C" { +#endif + +typedef void (*lame_report_function)(const char *format, va_list ap); + +#if defined(WIN32) || defined(_WIN32) +#undef CDECL +#define CDECL __cdecl +#else +#define CDECL +#endif + +#define DEPRECATED_OR_OBSOLETE_CODE_REMOVED 1 + +typedef enum vbr_mode_e { + vbr_off=0, + vbr_mt, /* obsolete, same as vbr_mtrh */ + vbr_rh, + vbr_abr, + vbr_mtrh, + vbr_max_indicator, /* Don't use this! It's used for sanity checks. */ + vbr_default=vbr_mtrh /* change this to change the default VBR mode of LAME */ +} vbr_mode; + + +/* MPEG modes */ +typedef enum MPEG_mode_e { + STEREO = 0, + JOINT_STEREO, + DUAL_CHANNEL, /* LAME doesn't supports this! */ + MONO, + NOT_SET, + MAX_INDICATOR /* Don't use this! It's used for sanity checks. */ +} MPEG_mode; + +/* Padding types */ +typedef enum Padding_type_e { + PAD_NO = 0, + PAD_ALL, + PAD_ADJUST, + PAD_MAX_INDICATOR /* Don't use this! It's used for sanity checks. */ +} Padding_type; + + + +/*presets*/ +typedef enum preset_mode_e { + /*values from 8 to 320 should be reserved for abr bitrates*/ + /*for abr I'd suggest to directly use the targeted bitrate as a value*/ + ABR_8 = 8, + ABR_320 = 320, + + V9 = 410, /*Vx to match Lame and VBR_xx to match FhG*/ + VBR_10 = 410, + V8 = 420, + VBR_20 = 420, + V7 = 430, + VBR_30 = 430, + V6 = 440, + VBR_40 = 440, + V5 = 450, + VBR_50 = 450, + V4 = 460, + VBR_60 = 460, + V3 = 470, + VBR_70 = 470, + V2 = 480, + VBR_80 = 480, + V1 = 490, + VBR_90 = 490, + V0 = 500, + VBR_100 = 500, + + + + /*still there for compatibility*/ + R3MIX = 1000, + STANDARD = 1001, + EXTREME = 1002, + INSANE = 1003, + STANDARD_FAST = 1004, + EXTREME_FAST = 1005, + MEDIUM = 1006, + MEDIUM_FAST = 1007 +} preset_mode; + + +/*asm optimizations*/ +typedef enum asm_optimizations_e { + MMX = 1, + AMD_3DNOW = 2, + SSE = 3 +} asm_optimizations; + + +/* psychoacoustic model */ +typedef enum Psy_model_e { + PSY_GPSYCHO = 1, + PSY_NSPSYTUNE = 2 +} Psy_model; + + +/* buffer considerations */ +typedef enum buffer_constraint_e { + MDB_DEFAULT=0, + MDB_STRICT_ISO=1, + MDB_MAXIMUM=2 +} buffer_constraint; + + +struct lame_global_struct; +typedef struct lame_global_struct lame_global_flags; +typedef lame_global_flags *lame_t; + + + + +/*********************************************************************** + * + * The LAME API + * These functions should be called, in this order, for each + * MP3 file to be encoded. See the file "API" for more documentation + * + ***********************************************************************/ + + +/* + * REQUIRED: + * initialize the encoder. sets default for all encoder parameters, + * returns NULL if some malloc()'s failed + * otherwise returns pointer to structure needed for all future + * API calls. + */ +lame_global_flags * CDECL lame_init(void); +#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED +#else +/* obsolete version */ +int CDECL lame_init_old(lame_global_flags *); +#endif + +/* + * OPTIONAL: + * set as needed to override defaults + */ + +/******************************************************************** + * input stream description + ***********************************************************************/ +/* number of samples. default = 2^32-1 */ +int CDECL lame_set_num_samples(lame_global_flags *, unsigned long); +unsigned long CDECL lame_get_num_samples(const lame_global_flags *); + +/* input sample rate in Hz. default = 44100hz */ +int CDECL lame_set_in_samplerate(lame_global_flags *, int); +int CDECL lame_get_in_samplerate(const lame_global_flags *); + +/* number of channels in input stream. default=2 */ +int CDECL lame_set_num_channels(lame_global_flags *, int); +int CDECL lame_get_num_channels(const lame_global_flags *); + +/* + scale the input by this amount before encoding. default=1 + (not used by decoding routines) +*/ +int CDECL lame_set_scale(lame_global_flags *, float); +float CDECL lame_get_scale(const lame_global_flags *); + +/* + scale the channel 0 (left) input by this amount before encoding. default=1 + (not used by decoding routines) +*/ +int CDECL lame_set_scale_left(lame_global_flags *, float); +float CDECL lame_get_scale_left(const lame_global_flags *); + +/* + scale the channel 1 (right) input by this amount before encoding. default=1 + (not used by decoding routines) +*/ +int CDECL lame_set_scale_right(lame_global_flags *, float); +float CDECL lame_get_scale_right(const lame_global_flags *); + +/* + output sample rate in Hz. default = 0, which means LAME picks best value + based on the amount of compression. MPEG only allows: + MPEG1 32, 44.1, 48khz + MPEG2 16, 22.05, 24 + MPEG2.5 8, 11.025, 12 + (not used by decoding routines) +*/ +int CDECL lame_set_out_samplerate(lame_global_flags *, int); +int CDECL lame_get_out_samplerate(const lame_global_flags *); + + +/******************************************************************** + * general control parameters + ***********************************************************************/ +/* 1=cause LAME to collect data for an MP3 frame analyzer. default=0 */ +int CDECL lame_set_analysis(lame_global_flags *, int); +int CDECL lame_get_analysis(const lame_global_flags *); + +/* + 1 = write a Xing VBR header frame. + default = 1 + this variable must have been added by a Hungarian notation Windows programmer :-) +*/ +int CDECL lame_set_bWriteVbrTag(lame_global_flags *, int); +int CDECL lame_get_bWriteVbrTag(const lame_global_flags *); + +/* 1=decode only. use lame/mpglib to convert mp3/ogg to wav. default=0 */ +int CDECL lame_set_decode_only(lame_global_flags *, int); +int CDECL lame_get_decode_only(const lame_global_flags *); + +#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED +#else +/* 1=encode a Vorbis .ogg file. default=0 */ +/* DEPRECATED */ +int CDECL lame_set_ogg(lame_global_flags *, int); +int CDECL lame_get_ogg(const lame_global_flags *); +#endif + +/* + internal algorithm selection. True quality is determined by the bitrate + but this variable will effect quality by selecting expensive or cheap algorithms. + quality=0..9. 0=best (very slow). 9=worst. + recommended: 2 near-best quality, not too slow + 5 good quality, fast + 7 ok quality, really fast +*/ +int CDECL lame_set_quality(lame_global_flags *, int); +int CDECL lame_get_quality(const lame_global_flags *); + +/* + mode = 0,1,2,3 = stereo, jstereo, dual channel (not supported), mono + default: lame picks based on compression ration and input channels +*/ +int CDECL lame_set_mode(lame_global_flags *, MPEG_mode); +MPEG_mode CDECL lame_get_mode(const lame_global_flags *); + +#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED +#else +/* + mode_automs. Use a M/S mode with a switching threshold based on + compression ratio + DEPRECATED +*/ +int CDECL lame_set_mode_automs(lame_global_flags *, int); +int CDECL lame_get_mode_automs(const lame_global_flags *); +#endif + +/* + force_ms. Force M/S for all frames. For testing only. + default = 0 (disabled) +*/ +int CDECL lame_set_force_ms(lame_global_flags *, int); +int CDECL lame_get_force_ms(const lame_global_flags *); + +/* use free_format? default = 0 (disabled) */ +int CDECL lame_set_free_format(lame_global_flags *, int); +int CDECL lame_get_free_format(const lame_global_flags *); + +/* perform ReplayGain analysis? default = 0 (disabled) */ +int CDECL lame_set_findReplayGain(lame_global_flags *, int); +int CDECL lame_get_findReplayGain(const lame_global_flags *); + +/* decode on the fly. Search for the peak sample. If the ReplayGain + * analysis is enabled then perform the analysis on the decoded data + * stream. default = 0 (disabled) + * NOTE: if this option is set the build-in decoder should not be used */ +int CDECL lame_set_decode_on_the_fly(lame_global_flags *, int); +int CDECL lame_get_decode_on_the_fly(const lame_global_flags *); + +#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED +#else +/* DEPRECATED: now does the same as lame_set_findReplayGain() + default = 0 (disabled) */ +int CDECL lame_set_ReplayGain_input(lame_global_flags *, int); +int CDECL lame_get_ReplayGain_input(const lame_global_flags *); + +/* DEPRECATED: now does the same as + lame_set_decode_on_the_fly() && lame_set_findReplayGain() + default = 0 (disabled) */ +int CDECL lame_set_ReplayGain_decode(lame_global_flags *, int); +int CDECL lame_get_ReplayGain_decode(const lame_global_flags *); + +/* DEPRECATED: now does the same as lame_set_decode_on_the_fly() + default = 0 (disabled) */ +int CDECL lame_set_findPeakSample(lame_global_flags *, int); +int CDECL lame_get_findPeakSample(const lame_global_flags *); +#endif + +/* counters for gapless encoding */ +int CDECL lame_set_nogap_total(lame_global_flags*, int); +int CDECL lame_get_nogap_total(const lame_global_flags*); + +int CDECL lame_set_nogap_currentindex(lame_global_flags* , int); +int CDECL lame_get_nogap_currentindex(const lame_global_flags*); + + +/* + * OPTIONAL: + * Set printf like error/debug/message reporting functions. + * The second argument has to be a pointer to a function which looks like + * void my_debugf(const char *format, va_list ap) + * { + * (void) vfprintf(stdout, format, ap); + * } + * If you use NULL as the value of the pointer in the set function, the + * lame buildin function will be used (prints to stderr). + * To quiet any output you have to replace the body of the example function + * with just "return;" and use it in the set function. + */ +int CDECL lame_set_errorf(lame_global_flags *, lame_report_function); +int CDECL lame_set_debugf(lame_global_flags *, lame_report_function); +int CDECL lame_set_msgf (lame_global_flags *, lame_report_function); + + + +/* set one of brate compression ratio. default is compression ratio of 11. */ +int CDECL lame_set_brate(lame_global_flags *, int); +int CDECL lame_get_brate(const lame_global_flags *); +int CDECL lame_set_compression_ratio(lame_global_flags *, float); +float CDECL lame_get_compression_ratio(const lame_global_flags *); + + +int CDECL lame_set_preset( lame_global_flags* gfp, int ); +int CDECL lame_set_asm_optimizations( lame_global_flags* gfp, int, int ); + + + +/******************************************************************** + * frame params + ***********************************************************************/ +/* mark as copyright. default=0 */ +int CDECL lame_set_copyright(lame_global_flags *, int); +int CDECL lame_get_copyright(const lame_global_flags *); + +/* mark as original. default=1 */ +int CDECL lame_set_original(lame_global_flags *, int); +int CDECL lame_get_original(const lame_global_flags *); + +/* error_protection. Use 2 bytes from each frame for CRC checksum. default=0 */ +int CDECL lame_set_error_protection(lame_global_flags *, int); +int CDECL lame_get_error_protection(const lame_global_flags *); + +#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED +#else +/* padding_type. 0=pad no frames 1=pad all frames 2=adjust padding(default) */ +int CDECL lame_set_padding_type(lame_global_flags *, Padding_type); +Padding_type CDECL lame_get_padding_type(const lame_global_flags *); +#endif + +/* MP3 'private extension' bit Meaningless. default=0 */ +int CDECL lame_set_extension(lame_global_flags *, int); +int CDECL lame_get_extension(const lame_global_flags *); + +/* enforce strict ISO compliance. default=0 */ +int CDECL lame_set_strict_ISO(lame_global_flags *, int); +int CDECL lame_get_strict_ISO(const lame_global_flags *); + + +/******************************************************************** + * quantization/noise shaping + ***********************************************************************/ + +/* disable the bit reservoir. For testing only. default=0 */ +int CDECL lame_set_disable_reservoir(lame_global_flags *, int); +int CDECL lame_get_disable_reservoir(const lame_global_flags *); + +/* select a different "best quantization" function. default=0 */ +int CDECL lame_set_quant_comp(lame_global_flags *, int); +int CDECL lame_get_quant_comp(const lame_global_flags *); +int CDECL lame_set_quant_comp_short(lame_global_flags *, int); +int CDECL lame_get_quant_comp_short(const lame_global_flags *); + +int CDECL lame_set_experimentalX(lame_global_flags *, int); /* compatibility*/ +int CDECL lame_get_experimentalX(const lame_global_flags *); + +/* another experimental option. for testing only */ +int CDECL lame_set_experimentalY(lame_global_flags *, int); +int CDECL lame_get_experimentalY(const lame_global_flags *); + +/* another experimental option. for testing only */ +int CDECL lame_set_experimentalZ(lame_global_flags *, int); +int CDECL lame_get_experimentalZ(const lame_global_flags *); + +/* Naoki's psycho acoustic model. default=0 */ +int CDECL lame_set_exp_nspsytune(lame_global_flags *, int); +int CDECL lame_get_exp_nspsytune(const lame_global_flags *); + +void CDECL lame_set_msfix(lame_global_flags *, double); +float CDECL lame_get_msfix(const lame_global_flags *); + + +/******************************************************************** + * VBR control + ***********************************************************************/ +/* Types of VBR. default = vbr_off = CBR */ +int CDECL lame_set_VBR(lame_global_flags *, vbr_mode); +vbr_mode CDECL lame_get_VBR(const lame_global_flags *); + +/* VBR quality level. 0=highest 9=lowest */ +int CDECL lame_set_VBR_q(lame_global_flags *, int); +int CDECL lame_get_VBR_q(const lame_global_flags *); + +/* VBR quality level. 0=highest 9=lowest, Range [0,...,10[ */ +int CDECL lame_set_VBR_quality(lame_global_flags *, float); +float CDECL lame_get_VBR_quality(const lame_global_flags *); + +/* Ignored except for VBR=vbr_abr (ABR mode) */ +int CDECL lame_set_VBR_mean_bitrate_kbps(lame_global_flags *, int); +int CDECL lame_get_VBR_mean_bitrate_kbps(const lame_global_flags *); + +int CDECL lame_set_VBR_min_bitrate_kbps(lame_global_flags *, int); +int CDECL lame_get_VBR_min_bitrate_kbps(const lame_global_flags *); + +int CDECL lame_set_VBR_max_bitrate_kbps(lame_global_flags *, int); +int CDECL lame_get_VBR_max_bitrate_kbps(const lame_global_flags *); + +/* + 1=strictly enforce VBR_min_bitrate. Normally it will be violated for + analog silence +*/ +int CDECL lame_set_VBR_hard_min(lame_global_flags *, int); +int CDECL lame_get_VBR_hard_min(const lame_global_flags *); + +/* for preset */ +#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED +#else +int CDECL lame_set_preset_expopts(lame_global_flags *, int); +#endif + +/******************************************************************** + * Filtering control + ***********************************************************************/ +/* freq in Hz to apply lowpass. Default = 0 = lame chooses. -1 = disabled */ +int CDECL lame_set_lowpassfreq(lame_global_flags *, int); +int CDECL lame_get_lowpassfreq(const lame_global_flags *); +/* width of transition band, in Hz. Default = one polyphase filter band */ +int CDECL lame_set_lowpasswidth(lame_global_flags *, int); +int CDECL lame_get_lowpasswidth(const lame_global_flags *); + +/* freq in Hz to apply highpass. Default = 0 = lame chooses. -1 = disabled */ +int CDECL lame_set_highpassfreq(lame_global_flags *, int); +int CDECL lame_get_highpassfreq(const lame_global_flags *); +/* width of transition band, in Hz. Default = one polyphase filter band */ +int CDECL lame_set_highpasswidth(lame_global_flags *, int); +int CDECL lame_get_highpasswidth(const lame_global_flags *); + + +/******************************************************************** + * psycho acoustics and other arguments which you should not change + * unless you know what you are doing + ***********************************************************************/ + +/* only use ATH for masking */ +int CDECL lame_set_ATHonly(lame_global_flags *, int); +int CDECL lame_get_ATHonly(const lame_global_flags *); + +/* only use ATH for short blocks */ +int CDECL lame_set_ATHshort(lame_global_flags *, int); +int CDECL lame_get_ATHshort(const lame_global_flags *); + +/* disable ATH */ +int CDECL lame_set_noATH(lame_global_flags *, int); +int CDECL lame_get_noATH(const lame_global_flags *); + +/* select ATH formula */ +int CDECL lame_set_ATHtype(lame_global_flags *, int); +int CDECL lame_get_ATHtype(const lame_global_flags *); + +/* lower ATH by this many db */ +int CDECL lame_set_ATHlower(lame_global_flags *, float); +float CDECL lame_get_ATHlower(const lame_global_flags *); + +/* select ATH adaptive adjustment type */ +int CDECL lame_set_athaa_type( lame_global_flags *, int); +int CDECL lame_get_athaa_type( const lame_global_flags *); + +#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED +#else +/* select the loudness approximation used by the ATH adaptive auto-leveling */ +int CDECL lame_set_athaa_loudapprox( lame_global_flags *, int); +int CDECL lame_get_athaa_loudapprox( const lame_global_flags *); +#endif + +/* adjust (in dB) the point below which adaptive ATH level adjustment occurs */ +int CDECL lame_set_athaa_sensitivity( lame_global_flags *, float); +float CDECL lame_get_athaa_sensitivity( const lame_global_flags* ); + +#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED +#else +/* OBSOLETE: predictability limit (ISO tonality formula) */ +int CDECL lame_set_cwlimit(lame_global_flags *, int); +int CDECL lame_get_cwlimit(const lame_global_flags *); +#endif + +/* + allow blocktypes to differ between channels? + default: 0 for jstereo, 1 for stereo +*/ +int CDECL lame_set_allow_diff_short(lame_global_flags *, int); +int CDECL lame_get_allow_diff_short(const lame_global_flags *); + +/* use temporal masking effect (default = 1) */ +int CDECL lame_set_useTemporal(lame_global_flags *, int); +int CDECL lame_get_useTemporal(const lame_global_flags *); + +/* use temporal masking effect (default = 1) */ +int CDECL lame_set_interChRatio(lame_global_flags *, float); +float CDECL lame_get_interChRatio(const lame_global_flags *); + +/* disable short blocks */ +int CDECL lame_set_no_short_blocks(lame_global_flags *, int); +int CDECL lame_get_no_short_blocks(const lame_global_flags *); + +/* force short blocks */ +int CDECL lame_set_force_short_blocks(lame_global_flags *, int); +int CDECL lame_get_force_short_blocks(const lame_global_flags *); + +/* Input PCM is emphased PCM (for instance from one of the rarely + emphased CDs), it is STRONGLY not recommended to use this, because + psycho does not take it into account, and last but not least many decoders + ignore these bits */ +int CDECL lame_set_emphasis(lame_global_flags *, int); +int CDECL lame_get_emphasis(const lame_global_flags *); + + + +/************************************************************************/ +/* internal variables, cannot be set... */ +/* provided because they may be of use to calling application */ +/************************************************************************/ +/* version 0=MPEG-2 1=MPEG-1 (2=MPEG-2.5) */ +int CDECL lame_get_version(const lame_global_flags *); + +/* encoder delay */ +int CDECL lame_get_encoder_delay(const lame_global_flags *); + +/* + padding appended to the input to make sure decoder can fully decode + all input. Note that this value can only be calculated during the + call to lame_encoder_flush(). Before lame_encoder_flush() has + been called, the value of encoder_padding = 0. +*/ +int CDECL lame_get_encoder_padding(const lame_global_flags *); + +/* size of MPEG frame */ +int CDECL lame_get_framesize(const lame_global_flags *); + +/* number of PCM samples buffered, but not yet encoded to mp3 data. */ +int CDECL lame_get_mf_samples_to_encode( const lame_global_flags* gfp ); + +/* + size (bytes) of mp3 data buffered, but not yet encoded. + this is the number of bytes which would be output by a call to + lame_encode_flush_nogap. NOTE: lame_encode_flush() will return + more bytes than this because it will encode the reamining buffered + PCM samples before flushing the mp3 buffers. +*/ +int CDECL lame_get_size_mp3buffer( const lame_global_flags* gfp ); + +/* number of frames encoded so far */ +int CDECL lame_get_frameNum(const lame_global_flags *); + +/* + lame's estimate of the total number of frames to be encoded + only valid if calling program set num_samples +*/ +int CDECL lame_get_totalframes(const lame_global_flags *); + +/* RadioGain value. Multiplied by 10 and rounded to the nearest. */ +int CDECL lame_get_RadioGain(const lame_global_flags *); + +/* AudiophileGain value. Multipled by 10 and rounded to the nearest. */ +int CDECL lame_get_AudiophileGain(const lame_global_flags *); + +/* the peak sample */ +float CDECL lame_get_PeakSample(const lame_global_flags *); + +/* Gain change required for preventing clipping. The value is correct only if + peak sample searching was enabled. If negative then the waveform + already does not clip. The value is multiplied by 10 and rounded up. */ +int CDECL lame_get_noclipGainChange(const lame_global_flags *); + +/* user-specified scale factor required for preventing clipping. Value is + correct only if peak sample searching was enabled and no user-specified + scaling was performed. If negative then either the waveform already does + not clip or the value cannot be determined */ +float CDECL lame_get_noclipScale(const lame_global_flags *); + +/* returns the limit of PCM samples, which one can pass in an encode call + under the constrain of a provided buffer of size buffer_size */ +int CDECL lame_get_maximum_number_of_samples(lame_t gfp, size_t buffer_size); + + + + +/* + * REQUIRED: + * sets more internal configuration based on data provided above. + * returns -1 if something failed. + */ +int CDECL lame_init_params(lame_global_flags *); + + +/* + * OPTIONAL: + * get the version number, in a string. of the form: + * "3.63 (beta)" or just "3.63". + */ +const char* CDECL get_lame_version ( void ); +const char* CDECL get_lame_short_version ( void ); +const char* CDECL get_lame_very_short_version ( void ); +const char* CDECL get_psy_version ( void ); +const char* CDECL get_lame_url ( void ); +const char* CDECL get_lame_os_bitness ( void ); + +/* + * OPTIONAL: + * get the version numbers in numerical form. + */ +typedef struct { + /* generic LAME version */ + int major; + int minor; + int alpha; /* 0 if not an alpha version */ + int beta; /* 0 if not a beta version */ + + /* version of the psy model */ + int psy_major; + int psy_minor; + int psy_alpha; /* 0 if not an alpha version */ + int psy_beta; /* 0 if not a beta version */ + + /* compile time features */ + const char *features; /* Don't make assumptions about the contents! */ +} lame_version_t; +void CDECL get_lame_version_numerical(lame_version_t *); + + +/* + * OPTIONAL: + * print internal lame configuration to message handler + */ +void CDECL lame_print_config(const lame_global_flags* gfp); + +void CDECL lame_print_internals( const lame_global_flags *gfp); + + +/* + * input pcm data, output (maybe) mp3 frames. + * This routine handles all buffering, resampling and filtering for you. + * + * return code number of bytes output in mp3buf. Can be 0 + * -1: mp3buf was too small + * -2: malloc() problem + * -3: lame_init_params() not called + * -4: psycho acoustic problems + * + * The required mp3buf_size can be computed from num_samples, + * samplerate and encoding rate, but here is a worst case estimate: + * + * mp3buf_size in bytes = 1.25*num_samples + 7200 + * + * I think a tighter bound could be: (mt, March 2000) + * MPEG1: + * num_samples*(bitrate/8)/samplerate + 4*1152*(bitrate/8)/samplerate + 512 + * MPEG2: + * num_samples*(bitrate/8)/samplerate + 4*576*(bitrate/8)/samplerate + 256 + * + * but test first if you use that! + * + * set mp3buf_size = 0 and LAME will not check if mp3buf_size is + * large enough. + * + * NOTE: + * if gfp->num_channels=2, but gfp->mode = 3 (mono), the L & R channels + * will be averaged into the L channel before encoding only the L channel + * This will overwrite the data in buffer_l[] and buffer_r[]. + * +*/ +int CDECL lame_encode_buffer ( + lame_global_flags* gfp, /* global context handle */ + const short int buffer_l [], /* PCM data for left channel */ + const short int buffer_r [], /* PCM data for right channel */ + const int nsamples, /* number of samples per channel */ + unsigned char* mp3buf, /* pointer to encoded MP3 stream */ + const int mp3buf_size ); /* number of valid octets in this + stream */ + +/* + * as above, but input has L & R channel data interleaved. + * NOTE: + * num_samples = number of samples in the L (or R) + * channel, not the total number of samples in pcm[] + */ +int CDECL lame_encode_buffer_interleaved( + lame_global_flags* gfp, /* global context handlei */ + short int pcm[], /* PCM data for left and right + channel, interleaved */ + int num_samples, /* number of samples per channel, + _not_ number of samples in + pcm[] */ + unsigned char* mp3buf, /* pointer to encoded MP3 stream */ + int mp3buf_size ); /* number of valid octets in this + stream */ + + +/* as lame_encode_buffer, but for 'float's. + * !! NOTE: !! data must still be scaled to be in the same range as + * short int, +/- 32768 + */ +int CDECL lame_encode_buffer_float( + lame_global_flags* gfp, /* global context handle */ + const float pcm_l [], /* PCM data for left channel */ + const float pcm_r [], /* PCM data for right channel */ + const int nsamples, /* number of samples per channel */ + unsigned char* mp3buf, /* pointer to encoded MP3 stream */ + const int mp3buf_size ); /* number of valid octets in this + stream */ + +/* as lame_encode_buffer, but for 'float's. + * !! NOTE: !! data must be scaled to +/- 1 full scale + */ +int CDECL lame_encode_buffer_ieee_float( + lame_t gfp, + const float pcm_l [], /* PCM data for left channel */ + const float pcm_r [], /* PCM data for right channel */ + const int nsamples, + unsigned char * mp3buf, + const int mp3buf_size); +int CDECL lame_encode_buffer_interleaved_ieee_float( + lame_t gfp, + const float pcm[], /* PCM data for left and right + channel, interleaved */ + const int nsamples, + unsigned char * mp3buf, + const int mp3buf_size); + +/* as lame_encode_buffer, but for 'double's. + * !! NOTE: !! data must be scaled to +/- 1 full scale + */ +int CDECL lame_encode_buffer_ieee_double( + lame_t gfp, + const double pcm_l [], /* PCM data for left channel */ + const double pcm_r [], /* PCM data for right channel */ + const int nsamples, + unsigned char * mp3buf, + const int mp3buf_size); +int CDECL lame_encode_buffer_interleaved_ieee_double( + lame_t gfp, + const double pcm[], /* PCM data for left and right + channel, interleaved */ + const int nsamples, + unsigned char * mp3buf, + const int mp3buf_size); + +/* as lame_encode_buffer, but for long's + * !! NOTE: !! data must still be scaled to be in the same range as + * short int, +/- 32768 + * + * This scaling was a mistake (doesn't allow one to exploit full + * precision of type 'long'. Use lame_encode_buffer_long2() instead. + * + */ +int CDECL lame_encode_buffer_long( + lame_global_flags* gfp, /* global context handle */ + const long buffer_l [], /* PCM data for left channel */ + const long buffer_r [], /* PCM data for right channel */ + const int nsamples, /* number of samples per channel */ + unsigned char* mp3buf, /* pointer to encoded MP3 stream */ + const int mp3buf_size ); /* number of valid octets in this + stream */ + +/* Same as lame_encode_buffer_long(), but with correct scaling. + * !! NOTE: !! data must still be scaled to be in the same range as + * type 'long'. Data should be in the range: +/- 2^(8*size(long)-1) + * + */ +int CDECL lame_encode_buffer_long2( + lame_global_flags* gfp, /* global context handle */ + const long buffer_l [], /* PCM data for left channel */ + const long buffer_r [], /* PCM data for right channel */ + const int nsamples, /* number of samples per channel */ + unsigned char* mp3buf, /* pointer to encoded MP3 stream */ + const int mp3buf_size ); /* number of valid octets in this + stream */ + +/* as lame_encode_buffer, but for int's + * !! NOTE: !! input should be scaled to the maximum range of 'int' + * If int is 4 bytes, then the values should range from + * +/- 2147483648. + * + * This routine does not (and cannot, without loosing precision) use + * the same scaling as the rest of the lame_encode_buffer() routines. + * + */ +int CDECL lame_encode_buffer_int( + lame_global_flags* gfp, /* global context handle */ + const int buffer_l [], /* PCM data for left channel */ + const int buffer_r [], /* PCM data for right channel */ + const int nsamples, /* number of samples per channel */ + unsigned char* mp3buf, /* pointer to encoded MP3 stream */ + const int mp3buf_size ); /* number of valid octets in this + stream */ + +/* + * as above, but for interleaved data. + * !! NOTE: !! data must still be scaled to be in the same range as + * type 'int32_t'. Data should be in the range: +/- 2^(8*size(int32_t)-1) + * NOTE: + * num_samples = number of samples in the L (or R) + * channel, not the total number of samples in pcm[] + */ +int +lame_encode_buffer_interleaved_int( + lame_t gfp, + const int pcm [], /* PCM data for left and right + channel, interleaved */ + const int nsamples, /* number of samples per channel, + _not_ number of samples in + pcm[] */ + unsigned char* mp3buf, /* pointer to encoded MP3 stream */ + const int mp3buf_size ); /* number of valid octets in this + stream */ + + + +/* + * REQUIRED: + * lame_encode_flush will flush the intenal PCM buffers, padding with + * 0's to make sure the final frame is complete, and then flush + * the internal MP3 buffers, and thus may return a + * final few mp3 frames. 'mp3buf' should be at least 7200 bytes long + * to hold all possible emitted data. + * + * will also write id3v1 tags (if any) into the bitstream + * + * return code = number of bytes output to mp3buf. Can be 0 + */ +int CDECL lame_encode_flush( + lame_global_flags * gfp, /* global context handle */ + unsigned char* mp3buf, /* pointer to encoded MP3 stream */ + int size); /* number of valid octets in this stream */ + +/* + * OPTIONAL: + * lame_encode_flush_nogap will flush the internal mp3 buffers and pad + * the last frame with ancillary data so it is a complete mp3 frame. + * + * 'mp3buf' should be at least 7200 bytes long + * to hold all possible emitted data. + * + * After a call to this routine, the outputed mp3 data is complete, but + * you may continue to encode new PCM samples and write future mp3 data + * to a different file. The two mp3 files will play back with no gaps + * if they are concatenated together. + * + * This routine will NOT write id3v1 tags into the bitstream. + * + * return code = number of bytes output to mp3buf. Can be 0 + */ +int CDECL lame_encode_flush_nogap( + lame_global_flags * gfp, /* global context handle */ + unsigned char* mp3buf, /* pointer to encoded MP3 stream */ + int size); /* number of valid octets in this stream */ + +/* + * OPTIONAL: + * Normally, this is called by lame_init_params(). It writes id3v2 and + * Xing headers into the front of the bitstream, and sets frame counters + * and bitrate histogram data to 0. You can also call this after + * lame_encode_flush_nogap(). + */ +int CDECL lame_init_bitstream( + lame_global_flags * gfp); /* global context handle */ + + + +/* + * OPTIONAL: some simple statistics + * a bitrate histogram to visualize the distribution of used frame sizes + * a stereo mode histogram to visualize the distribution of used stereo + * modes, useful in joint-stereo mode only + * 0: LR left-right encoded + * 1: LR-I left-right and intensity encoded (currently not supported) + * 2: MS mid-side encoded + * 3: MS-I mid-side and intensity encoded (currently not supported) + * + * attention: don't call them after lame_encode_finish + * suggested: lame_encode_flush -> lame_*_hist -> lame_close + */ + +void CDECL lame_bitrate_hist( + const lame_global_flags * gfp, + int bitrate_count[14] ); +void CDECL lame_bitrate_kbps( + const lame_global_flags * gfp, + int bitrate_kbps [14] ); +void CDECL lame_stereo_mode_hist( + const lame_global_flags * gfp, + int stereo_mode_count[4] ); + +void CDECL lame_bitrate_stereo_mode_hist ( + const lame_global_flags * gfp, + int bitrate_stmode_count[14][4] ); + +void CDECL lame_block_type_hist ( + const lame_global_flags * gfp, + int btype_count[6] ); + +void CDECL lame_bitrate_block_type_hist ( + const lame_global_flags * gfp, + int bitrate_btype_count[14][6] ); + +#if (DEPRECATED_OR_OBSOLETE_CODE_REMOVED && 0) +#else +/* + * OPTIONAL: + * lame_mp3_tags_fid will rewrite a Xing VBR tag to the mp3 file with file + * pointer fid. These calls perform forward and backwards seeks, so make + * sure fid is a real file. Make sure lame_encode_flush has been called, + * and all mp3 data has been written to the file before calling this + * function. + * NOTE: + * if VBR tags are turned off by the user, or turned off by LAME because + * the output is not a regular file, this call does nothing + * NOTE: + * LAME wants to read from the file to skip an optional ID3v2 tag, so + * make sure you opened the file for writing and reading. + * NOTE: + * You can call lame_get_lametag_frame instead, if you want to insert + * the lametag yourself. +*/ +void CDECL lame_mp3_tags_fid(lame_global_flags *, FILE* fid); +#endif + +/* + * OPTIONAL: + * lame_get_lametag_frame copies the final LAME-tag into 'buffer'. + * The function returns the number of bytes copied into buffer, or + * the required buffer size, if the provided buffer is too small. + * Function failed, if the return value is larger than 'size'! + * Make sure lame_encode flush has been called before calling this function. + * NOTE: + * if VBR tags are turned off by the user, or turned off by LAME, + * this call does nothing and returns 0. + * NOTE: + * LAME inserted an empty frame in the beginning of mp3 audio data, + * which you have to replace by the final LAME-tag frame after encoding. + * In case there is no ID3v2 tag, usually this frame will be the very first + * data in your mp3 file. If you put some other leading data into your + * file, you'll have to do some bookkeeping about where to write this buffer. + */ +size_t CDECL lame_get_lametag_frame( + const lame_global_flags *, unsigned char* buffer, size_t size); + +/* + * REQUIRED: + * final call to free all remaining buffers + */ +int CDECL lame_close (lame_global_flags *); + +#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED +#else +/* + * OBSOLETE: + * lame_encode_finish combines lame_encode_flush() and lame_close() in + * one call. However, once this call is made, the statistics routines + * will no longer work because the data will have been cleared, and + * lame_mp3_tags_fid() cannot be called to add data to the VBR header + */ +int CDECL lame_encode_finish( + lame_global_flags* gfp, + unsigned char* mp3buf, + int size ); +#endif + + + + + + +/********************************************************************* + * + * decoding + * + * a simple interface to mpglib, part of mpg123, is also included if + * libmp3lame is compiled with HAVE_MPGLIB + * + *********************************************************************/ + +struct hip_global_struct; +typedef struct hip_global_struct hip_global_flags; +typedef hip_global_flags *hip_t; + + +typedef struct { + int header_parsed; /* 1 if header was parsed and following data was + computed */ + int stereo; /* number of channels */ + int samplerate; /* sample rate */ + int bitrate; /* bitrate */ + int mode; /* mp3 frame type */ + int mode_ext; /* mp3 frame type */ + int framesize; /* number of samples per mp3 frame */ + + /* this data is only computed if mpglib detects a Xing VBR header */ + unsigned long nsamp; /* number of samples in mp3 file. */ + int totalframes; /* total number of frames in mp3 file */ + + /* this data is not currently computed by the mpglib routines */ + int framenum; /* frames decoded counter */ +} mp3data_struct; + +/* required call to initialize decoder */ +hip_t CDECL hip_decode_init(void); + +/* cleanup call to exit decoder */ +int CDECL hip_decode_exit(hip_t gfp); + +/* HIP reporting functions */ +void CDECL hip_set_errorf(hip_t gfp, lame_report_function f); +void CDECL hip_set_debugf(hip_t gfp, lame_report_function f); +void CDECL hip_set_msgf (hip_t gfp, lame_report_function f); + +/********************************************************************* + * input 1 mp3 frame, output (maybe) pcm data. + * + * nout = hip_decode(hip, mp3buf,len,pcm_l,pcm_r); + * + * input: + * len : number of bytes of mp3 data in mp3buf + * mp3buf[len] : mp3 data to be decoded + * + * output: + * nout: -1 : decoding error + * 0 : need more data before we can complete the decode + * >0 : returned 'nout' samples worth of data in pcm_l,pcm_r + * pcm_l[nout] : left channel data + * pcm_r[nout] : right channel data + * + *********************************************************************/ +int CDECL hip_decode( hip_t gfp + , unsigned char * mp3buf + , size_t len + , short pcm_l[] + , short pcm_r[] + ); + +/* same as hip_decode, and also returns mp3 header data */ +int CDECL hip_decode_headers( hip_t gfp + , unsigned char* mp3buf + , size_t len + , short pcm_l[] + , short pcm_r[] + , mp3data_struct* mp3data + ); + +/* same as hip_decode, but returns at most one frame */ +int CDECL hip_decode1( hip_t gfp + , unsigned char* mp3buf + , size_t len + , short pcm_l[] + , short pcm_r[] + ); + +/* same as hip_decode1, but returns at most one frame and mp3 header data */ +int CDECL hip_decode1_headers( hip_t gfp + , unsigned char* mp3buf + , size_t len + , short pcm_l[] + , short pcm_r[] + , mp3data_struct* mp3data + ); + +/* same as hip_decode1_headers, but also returns enc_delay and enc_padding + from VBR Info tag, (-1 if no info tag was found) */ +int CDECL hip_decode1_headersB( hip_t gfp + , unsigned char* mp3buf + , size_t len + , short pcm_l[] + , short pcm_r[] + , mp3data_struct* mp3data + , int *enc_delay + , int *enc_padding + ); + + + +/* OBSOLETE: + * lame_decode... functions are there to keep old code working + * but it is strongly recommended to replace calls by hip_decode... + * function calls, see above. + */ +#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED +#else +int CDECL lame_decode_init(void); +int CDECL lame_decode( + unsigned char * mp3buf, + int len, + short pcm_l[], + short pcm_r[] ); +int CDECL lame_decode_headers( + unsigned char* mp3buf, + int len, + short pcm_l[], + short pcm_r[], + mp3data_struct* mp3data ); +int CDECL lame_decode1( + unsigned char* mp3buf, + int len, + short pcm_l[], + short pcm_r[] ); +int CDECL lame_decode1_headers( + unsigned char* mp3buf, + int len, + short pcm_l[], + short pcm_r[], + mp3data_struct* mp3data ); +int CDECL lame_decode1_headersB( + unsigned char* mp3buf, + int len, + short pcm_l[], + short pcm_r[], + mp3data_struct* mp3data, + int *enc_delay, + int *enc_padding ); +int CDECL lame_decode_exit(void); + +#endif /* obsolete lame_decode API calls */ + + +/********************************************************************* + * + * id3tag stuff + * + *********************************************************************/ + +/* + * id3tag.h -- Interface to write ID3 version 1 and 2 tags. + * + * Copyright (C) 2000 Don Melton. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. + */ + +/* utility to obtain alphabetically sorted list of genre names with numbers */ +void CDECL id3tag_genre_list( + void (*handler)(int, const char *, void *), + void* cookie); + +void CDECL id3tag_init (lame_t gfp); + +/* force addition of version 2 tag */ +void CDECL id3tag_add_v2 (lame_t gfp); + +/* add only a version 1 tag */ +void CDECL id3tag_v1_only (lame_t gfp); + +/* add only a version 2 tag */ +void CDECL id3tag_v2_only (lame_t gfp); + +/* pad version 1 tag with spaces instead of nulls */ +void CDECL id3tag_space_v1 (lame_t gfp); + +/* pad version 2 tag with extra 128 bytes */ +void CDECL id3tag_pad_v2 (lame_t gfp); + +/* pad version 2 tag with extra n bytes */ +void CDECL id3tag_set_pad (lame_t gfp, size_t n); + +void CDECL id3tag_set_title(lame_t gfp, const char* title); +void CDECL id3tag_set_artist(lame_t gfp, const char* artist); +void CDECL id3tag_set_album(lame_t gfp, const char* album); +void CDECL id3tag_set_year(lame_t gfp, const char* year); +void CDECL id3tag_set_comment(lame_t gfp, const char* comment); + +/* return -1 result if track number is out of ID3v1 range + and ignored for ID3v1 */ +int CDECL id3tag_set_track(lame_t gfp, const char* track); + +/* return non-zero result if genre name or number is invalid + result 0: OK + result -1: genre number out of range + result -2: no valid ID3v1 genre name, mapped to ID3v1 'Other' + but taken as-is for ID3v2 genre tag */ +int CDECL id3tag_set_genre(lame_t gfp, const char* genre); + +/* return non-zero result if field name is invalid */ +int CDECL id3tag_set_fieldvalue(lame_t gfp, const char* fieldvalue); + +/* return non-zero result if image type is invalid */ +int CDECL id3tag_set_albumart(lame_t gfp, const char* image, size_t size); + +/* lame_get_id3v1_tag copies ID3v1 tag into buffer. + * Function returns number of bytes copied into buffer, or number + * of bytes rquired if buffer 'size' is too small. + * Function fails, if returned value is larger than 'size'. + * NOTE: + * This functions does nothing, if user/LAME disabled ID3v1 tag. + */ +size_t CDECL lame_get_id3v1_tag(lame_t gfp, unsigned char* buffer, size_t size); + +/* lame_get_id3v2_tag copies ID3v2 tag into buffer. + * Function returns number of bytes copied into buffer, or number + * of bytes rquired if buffer 'size' is too small. + * Function fails, if returned value is larger than 'size'. + * NOTE: + * This functions does nothing, if user/LAME disabled ID3v2 tag. + */ +size_t CDECL lame_get_id3v2_tag(lame_t gfp, unsigned char* buffer, size_t size); + +/* normaly lame_init_param writes ID3v2 tags into the audio stream + * Call lame_set_write_id3tag_automatic(gfp, 0) before lame_init_param + * to turn off this behaviour and get ID3v2 tag with above function + * write it yourself into your file. + */ +void CDECL lame_set_write_id3tag_automatic(lame_global_flags * gfp, int); +int CDECL lame_get_write_id3tag_automatic(lame_global_flags const* gfp); + +/* experimental */ +int CDECL id3tag_set_textinfo_latin1(lame_t gfp, char const *id, char const *text); + +/* experimental */ +int CDECL id3tag_set_comment_latin1(lame_t gfp, char const *lang, char const *desc, char const *text); + +#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED +#else +/* experimental */ +int CDECL id3tag_set_textinfo_ucs2(lame_t gfp, char const *id, unsigned short const *text); + +/* experimental */ +int CDECL id3tag_set_comment_ucs2(lame_t gfp, char const *lang, + unsigned short const *desc, unsigned short const *text); + +/* experimental */ +int CDECL id3tag_set_fieldvalue_ucs2(lame_t gfp, const unsigned short *fieldvalue); +#endif + +/* experimental */ +int CDECL id3tag_set_fieldvalue_utf16(lame_t gfp, const unsigned short *fieldvalue); + +/* experimental */ +int CDECL id3tag_set_textinfo_utf16(lame_t gfp, char const *id, unsigned short const *text); + +/* experimental */ +int CDECL id3tag_set_comment_utf16(lame_t gfp, char const *lang, unsigned short const *desc, unsigned short const *text); + + +/*********************************************************************** +* +* list of valid bitrates [kbps] & sample frequencies [Hz]. +* first index: 0: MPEG-2 values (sample frequencies 16...24 kHz) +* 1: MPEG-1 values (sample frequencies 32...48 kHz) +* 2: MPEG-2.5 values (sample frequencies 8...12 kHz) +***********************************************************************/ + +extern const int bitrate_table [3][16]; +extern const int samplerate_table [3][ 4]; + +/* access functions for use in DLL, global vars are not exported */ +int CDECL lame_get_bitrate(int mpeg_version, int table_index); +int CDECL lame_get_samplerate(int mpeg_version, int table_index); + + +/* maximum size of albumart image (128KB), which affects LAME_MAXMP3BUFFER + as well since lame_encode_buffer() also returns ID3v2 tag data */ +#define LAME_MAXALBUMART (128 * 1024) + +/* maximum size of mp3buffer needed if you encode at most 1152 samples for + each call to lame_encode_buffer. see lame_encode_buffer() below + (LAME_MAXMP3BUFFER is now obsolete) */ +#define LAME_MAXMP3BUFFER (16384 + LAME_MAXALBUMART) + + +typedef enum { + LAME_OKAY = 0, + LAME_NOERROR = 0, + LAME_GENERICERROR = -1, + LAME_NOMEM = -10, + LAME_BADBITRATE = -11, + LAME_BADSAMPFREQ = -12, + LAME_INTERNALERROR = -13, + + FRONTEND_READERROR = -80, + FRONTEND_WRITEERROR = -81, + FRONTEND_FILETOOLARGE = -82 + +} lame_errorcodes_t; + +#if defined(__cplusplus) +} +#endif +#endif /* LAME_LAME_H */ + diff --git a/include/libmp3lame.sym b/include/libmp3lame.sym new file mode 100644 index 0000000..ff7d318 --- /dev/null +++ b/include/libmp3lame.sym @@ -0,0 +1,234 @@ +lame_init +lame_init_old +lame_set_num_samples +lame_get_num_samples +lame_set_in_samplerate +lame_get_in_samplerate +lame_set_num_channels +lame_get_num_channels +lame_set_scale +lame_get_scale +lame_set_scale_left +lame_get_scale_left +lame_set_scale_right +lame_get_scale_right +lame_set_out_samplerate +lame_get_out_samplerate +lame_set_analysis +lame_get_analysis +lame_set_bWriteVbrTag +lame_get_bWriteVbrTag +lame_set_decode_only +lame_get_decode_only +lame_set_ogg +lame_get_ogg +lame_set_quality +lame_get_quality +lame_set_mode +lame_get_mode +lame_set_mode_automs +lame_get_mode_automs +lame_set_force_ms +lame_get_force_ms +lame_set_free_format +lame_get_free_format +lame_set_findReplayGain +lame_get_findReplayGain +lame_set_decode_on_the_fly +lame_get_decode_on_the_fly +lame_set_ReplayGain_input +lame_get_ReplayGain_input +lame_set_ReplayGain_decode +lame_get_ReplayGain_decode +lame_set_findPeakSample +lame_get_findPeakSample +lame_set_nogap_total +lame_get_nogap_total +lame_set_nogap_currentindex +lame_get_nogap_currentindex +lame_set_errorf +lame_set_debugf +lame_set_msgf +lame_set_brate +lame_get_brate +lame_set_compression_ratio +lame_get_compression_ratio +lame_set_preset +lame_set_asm_optimizations +lame_set_copyright +lame_get_copyright +lame_set_original +lame_get_original +lame_set_error_protection +lame_get_error_protection +lame_set_padding_type +lame_get_padding_type +lame_set_extension +lame_get_extension +lame_set_strict_ISO +lame_get_strict_ISO +lame_set_disable_reservoir +lame_get_disable_reservoir +lame_set_quant_comp +lame_get_quant_comp +lame_set_quant_comp_short +lame_get_quant_comp_short +lame_set_experimentalX +lame_get_experimentalX +lame_set_experimentalY +lame_get_experimentalY +lame_set_experimentalZ +lame_get_experimentalZ +lame_set_exp_nspsytune +lame_get_exp_nspsytune +lame_set_msfix +lame_get_msfix +lame_set_VBR +lame_get_VBR +lame_set_VBR_q +lame_get_VBR_q +lame_set_VBR_quality +lame_get_VBR_quality +lame_set_VBR_mean_bitrate_kbps +lame_get_VBR_mean_bitrate_kbps +lame_set_VBR_min_bitrate_kbps +lame_get_VBR_min_bitrate_kbps +lame_set_VBR_max_bitrate_kbps +lame_get_VBR_max_bitrate_kbps +lame_set_VBR_hard_min +lame_get_VBR_hard_min +lame_set_preset_expopts +lame_set_lowpassfreq +lame_get_lowpassfreq +lame_set_lowpasswidth +lame_get_lowpasswidth +lame_set_highpassfreq +lame_get_highpassfreq +lame_set_highpasswidth +lame_get_highpasswidth +lame_set_ATHonly +lame_get_ATHonly +lame_set_ATHshort +lame_get_ATHshort +lame_set_noATH +lame_get_noATH +lame_set_ATHtype +lame_get_ATHtype +lame_set_ATHlower +lame_get_ATHlower +lame_set_athaa_type +lame_get_athaa_type +lame_set_athaa_loudapprox +lame_get_athaa_loudapprox +lame_set_athaa_sensitivity +lame_get_athaa_sensitivity +lame_set_cwlimit +lame_get_cwlimit +lame_set_allow_diff_short +lame_get_allow_diff_short +lame_set_useTemporal +lame_get_useTemporal +lame_set_interChRatio +lame_get_interChRatio +lame_set_no_short_blocks +lame_get_no_short_blocks +lame_set_force_short_blocks +lame_get_force_short_blocks +lame_set_emphasis +lame_get_emphasis +lame_get_version +lame_get_encoder_delay +lame_get_encoder_padding +lame_get_framesize +lame_get_mf_samples_to_encode +lame_get_size_mp3buffer +lame_get_frameNum +lame_get_totalframes +lame_get_RadioGain +lame_get_AudiophileGain +lame_get_PeakSample +lame_get_noclipGainChange +lame_get_noclipScale +lame_init_params +get_lame_version +get_lame_short_version +get_lame_very_short_version +get_psy_version +get_lame_url +get_lame_os_bitness +get_lame_version_numerical +lame_print_config +lame_print_internals +lame_encode_buffer +lame_encode_buffer_interleaved +lame_encode_buffer_interleaved_int +lame_encode_buffer_float +lame_encode_buffer_ieee_float +lame_encode_buffer_interleaved_ieee_float +lame_encode_buffer_ieee_double +lame_encode_buffer_interleaved_ieee_double +lame_encode_buffer_long +lame_encode_buffer_long2 +lame_encode_buffer_int +lame_encode_flush +lame_encode_flush_nogap +lame_init_bitstream +lame_bitrate_hist +lame_bitrate_kbps +lame_stereo_mode_hist +lame_bitrate_stereo_mode_hist +lame_block_type_hist +lame_bitrate_block_type_hist +lame_mp3_tags_fid +lame_get_lametag_frame +lame_close +lame_encode_finish +hip_decode_init +hip_decode_exit +hip_set_errorf +hip_set_debugf +hip_set_msgf +hip_decode +hip_decode_headers +hip_decode1 +hip_decode1_headers +hip_decode1_headersB +lame_decode_init +lame_decode +lame_decode_headers +lame_decode1 +lame_decode1_headers +lame_decode1_headersB +lame_decode_exit +id3tag_genre_list +id3tag_init +id3tag_add_v2 +id3tag_v1_only +id3tag_v2_only +id3tag_space_v1 +id3tag_pad_v2 +id3tag_set_pad +id3tag_set_title +id3tag_set_artist +id3tag_set_album +id3tag_set_year +id3tag_set_comment +id3tag_set_track +id3tag_set_genre +id3tag_set_fieldvalue +id3tag_set_albumart +lame_get_id3v1_tag +lame_get_id3v2_tag +lame_set_write_id3tag_automatic +lame_get_write_id3tag_automatic +id3tag_set_textinfo_latin1 +id3tag_set_comment_latin1 +id3tag_set_textinfo_ucs2 +id3tag_set_comment_ucs2 +id3tag_set_fieldvalue_ucs2 +id3tag_set_fieldvalue_utf16 +id3tag_set_textinfo_utf16 +id3tag_set_comment_utf16 +lame_get_bitrate +lame_get_samplerate +lame_get_maximum_number_of_samples diff --git a/install-sh b/install-sh new file mode 100755 index 0000000..0360b79 --- /dev/null +++ b/install-sh @@ -0,0 +1,501 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2016-01-11.22; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# 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 +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# 'make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +tab=' ' +nl=' +' +IFS=" $tab$nl" + +# Set DOITPROG to "echo" to test this script. + +doit=${DOITPROG-} +doit_exec=${doit:-exec} + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +is_target_a_directory=possibly + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) + is_target_a_directory=always + dst_arg=$2 + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; + + -T) is_target_a_directory=never;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +# We allow the use of options -d and -T together, by making -d +# take the precedence; this is for compatibility with GNU install. + +if test -n "$dir_arg"; then + if test -n "$dst_arg"; then + echo "$0: target directory not allowed when installing a directory." >&2 + exit 1 + fi +fi + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call 'install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + if test $# -gt 1 || test "$is_target_a_directory" = always; then + if test ! -d "$dst_arg"; then + echo "$0: $dst_arg: Is not a directory." >&2 + exit 1 + fi + fi +fi + +if test -z "$dir_arg"; then + do_exit='(exit $ret); exit $ret' + trap "ret=129; $do_exit" 1 + trap "ret=130; $do_exit" 2 + trap "ret=141; $do_exit" 13 + trap "ret=143; $do_exit" 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names problematic for 'test' and other utilities. + case $src in + -* | [=\(\)!]) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + dst=$dst_arg + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test "$is_target_a_directory" = never; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + dstdir=`dirname "$dst"` + test -d "$dstdir" + dstdir_status=$? + fi + fi + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + [-=\(\)!]*) prefix='./';; + *) prefix='';; + esac + + oIFS=$IFS + IFS=/ + set -f + set fnord $dstdir + shift + set +f + IFS=$oIFS + + prefixes= + + for d + do + test X"$d" = X && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + set +f && + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/lame.bat b/lame.bat new file mode 100755 index 0000000..8b31774 --- /dev/null +++ b/lame.bat @@ -0,0 +1,41 @@ +@echo off +rem --------------------------------------------- +rem PURPOSE: +rem - put this Batch-Command on your Desktop, +rem so you can drag and drop wave files on it +rem and LAME will encode them to mp3 format. +rem - put this Batch-Command in a place mentioned +rem in your PATH environment, start the DOS-BOX +rem and change to a directory where your wave +rem files are located. the following line will +rem encode all your wave files to mp3 +rem "lame.bat *.wav" +rem --------------------------------------------- +rem C2000 Robert Hegemann +rem --------------------------------------------- +rem please set LAME and LAMEOPTS +rem LAME - where the executeable is +rem OPTS - options you like LAME to use + + set LAME=lame.exe + set OPTS=--preset cd + +rem --------------------------------------------- + + set thecmd=%LAME% %OPTS% + lfnfor on +:processArgs + if "%1"=="" goto endmark + for %%f in (%1) do %thecmd% "%%f" + if errorlevel 1 goto errormark + shift + goto processArgs +:errormark + echo. + echo. + echo ERROR processing %1 + echo. +:endmark +rem +rem finished +rem diff --git a/lame.spec b/lame.spec new file mode 100644 index 0000000..27cafbb --- /dev/null +++ b/lame.spec @@ -0,0 +1,188 @@ +%define name lame +%define ver 3.100 +%define rel 1 +%define prefix %{_usr} +%define docdir %{_defaultdocdir} + +Summary : LAME Ain't an MP3 Encoder... but it's the best. +Summary(fr) : LAME n'est pas un encodeur MP3 ;-> +Name: %{name} +Version: %{ver} +Release: %{rel} +License: LGPL +Vendor: The LAME Project +Packager: Yosi Markovich <yosim@bigfoot.com> +URL: http://www.mp3dev.org +Group: Applications/Multimedia +Source: %{name}-%{version}.tar.gz +BuildRoot: %{_tmppath}/%{name}-root +Requires: ncurses >= 5.0 +BuildRequires: gcc => 3.0.1, /usr/bin/find, ncurses-devel +%ifarch %{ix86} x86_64 +BuildRequires: nasm +%endif +Provides: mp3encoder + +%description +LAME is an educational tool to be used for learning about MP3 encoding. The +goal of the LAME project is to use the open source model to improve the +psycho acoustics, noise shaping and speed of MP3. + +%description -l fr +LAME est un outil d'enseignement pour l'apprentissage de l'encodage MP3. +Le but du projet LAME est d'utiliser un mod�le "open source" afin +d'am�liorer la qualit� et la vitesse du MP3. + + + +%package devel +Summary: Shared and static libraries for LAME. +Group: Development/Libraries +Requires: %{name} = %{version} + +%description devel +LAME is an educational tool to be used for learning about MP3 encoding. +This package contains both the shared and the static libraries from the +LAME project. + +You will also need to install the main lame package in order to install +these libraries. + +%prep +%setup + +%build + +# Vorbis makes the build fail for now. . . +rm -f config.cache + +%configure \ +%ifarch %{ix86} x86_64 + --enable-nasm \ +%endif + --enable-decoder \ + --without-vorbis \ + --enable-analyzer=no \ + --enable-brhist \ + --disable-debug +%{__make} %{?_smp_mflags} test CFLAGS="%{optflags}" + +%install +%{__rm} -rf %{buildroot} +%makeinstall + +### Some apps still expect to find <lame.h> +%{__ln_s} -f lame/lame.h %{buildroot}%{_includedir}/lame.h + + +find doc/html -name "Makefile*" | xargs rm -f +### make install really shouldn't install these +%{__rm} -rf %{buildroot}%{_docdir}/lame/ + + +%post +/sbin/ldconfig 2>/dev/null + +%postun +/sbin/ldconfig 2>/dev/null + +%clean +%{__rm} -rf %{buildroot} + +%files +%defattr (-,root,root) +%doc COPYING ChangeLog README TODO USAGE doc/html +%doc doc/html +%{_bindir}/lame +%{_libdir}/libmp3lame.so.* +%{_mandir}/man1/lame.1* + +%files devel +%defattr (-, root, root) +%doc API HACKING STYLEGUIDE +%{_libdir}/libmp3lame.a +%{_libdir}/libmp3lame.la +%{_libdir}/libmp3lame.so +%{_includedir}/* + +%changelog + +* Sun May 14 2006 Kyle VanderBeek <kylev@kylev.com> +- Remove requirements for specific gcc versions, since modern ones "just work". +- Remove out-dated hyper-optimizations (some of which weren't valid compiler + flags anymore). +- Update to current RPM techniques and macros (inspired by freshrpms.net spec). + +* Sat May 11 2002 Yosi Markovich <yosim@bigfoot.com> +- Fixes to the spec file that include: +- Making sure the compiler is gcc version 3.0.1. Lame compiled with a version + greater than 3.0.1 is broken. +- Optimization flags for i686 will use i686 for march and mcpu, and not + athlon. +- Fix the dates in this Changelog section. +- Various small fixes merged from Matthias Saou. +- Thanks Fred Maciel <fred-m@crl.hitachi.co.jp> for his useful comments. + +- +* Tue Jan 22 2002 Mark Taylor <mt@mp3dev.org> +- replaced lame.spec.in with Yosi's version. Merged some stuff from + the prevous lame.spec.in file, and appended changelog below. + +* Tue Jan 22 2002 Yosi Markovich <yosim@bigfoot.com> +- Rewrote lame.spec.in to create a correct and nice spec file. + imho, this spec file is not good for anyone who wants to build + daily cvs snapshots. Closes bug #495975 + +* Tue Dec 11 2001 Yosi Markovich <yosim@bigfoot.com> +- Shamelessly stole Matthias Saou's excellent spec file to create daily + CVS snapshots of Lame. Other than that, nothing is new. + +* Tue Oct 23 2001 Matthias Saou <matthias.saou@est.une.marmotte.net> +- Fixed the %pre and %post that should have been %post and %postun, silly me! +- Removed -malign-double (it's evil, Yosi told me and I tested, brrr ;-)). +- Now build with gcc3, VBR encoding gets a hell of a boost, impressive! + I recommend you now use "lame --r3mix", it's the best. +- Tried to re-enable vorbis, but it's a no-go. + +* Thu Jul 26 2001 Matthias Saou <matthias.saou@est.une.marmotte.net> +- Build with kgcc to have VBR working. + +* Wed Jul 25 2001 Matthias Saou <matthias.saou@est.une.marmotte.net> +- Update to 3.89beta : Must be built with a non-patched version of nasm + to work! + +* Mon May 7 2001 Matthias Saou <matthias.saou@est.une.marmotte.net> +- Rebuilt for Red Hat 7.1. +- Disabled the vorbis support since it fails to build with it. +- Added a big optimisation section, thanks to Yosi Markovich + <senna@camelot.com> for this and other pointers. + +* Sun Feb 11 2001 Matthias Saou <matthias.saou@est.une.marmotte.net> +- Split the package, there is now a -devel + +* Thu Nov 26 2000 Matthias Saou <matthias.saou@est.une.marmotte.net> +- Initial RPM release for RedHat 7.0 from scratch + +* Wed Nov 21 2000 Eric Lassauge <lassauge@mail.dotcom.fr> +- Updated and corrected RPM to 3.89beta. +- Added french translations + +* Sat Aug 04 2000 Markus Linnala �maage@cs.tut.fi� +- Build and include docs and libs correctly +- Build extra programs + +* Tue Aug 01 2000 Stuart Young �cefiar1@optushome.com.au� +- Updated RPM to 3.85beta. +- Modified spec file (merged George and Keitaro's specs) +- Added reasonable info to the specs to reflect the maintainer +- Renamed lame.spec (plain spec is bad, mmkay?). + +* Fri Jun 30 2000 Keitaro Yosimura �ramsy@linux.or.jp� +- Updated RPM to 3.84alpha. +- Better attempt at an RPM, independant of 3.83 release. +- (This is all surmise as there was no changelog). + +* Thu May 30 2000 Georges Seguin �crow@planete.net� +- First RPM build around 3.83beta + + diff --git a/lame.spec.in b/lame.spec.in new file mode 100644 index 0000000..5a21562 --- /dev/null +++ b/lame.spec.in @@ -0,0 +1,188 @@ +%define name @PACKAGE@ +%define ver @VERSION@ +%define rel 1 +%define prefix %{_usr} +%define docdir %{_defaultdocdir} + +Summary : LAME Ain't an MP3 Encoder... but it's the best. +Summary(fr) : LAME n'est pas un encodeur MP3 ;-> +Name: %{name} +Version: %{ver} +Release: %{rel} +License: LGPL +Vendor: The LAME Project +Packager: Yosi Markovich <yosim@bigfoot.com> +URL: http://www.mp3dev.org +Group: Applications/Multimedia +Source: %{name}-%{version}.tar.gz +BuildRoot: %{_tmppath}/%{name}-root +Requires: ncurses >= 5.0 +BuildRequires: gcc => 3.0.1, /usr/bin/find, ncurses-devel +%ifarch %{ix86} x86_64 +BuildRequires: nasm +%endif +Provides: mp3encoder + +%description +LAME is an educational tool to be used for learning about MP3 encoding. The +goal of the LAME project is to use the open source model to improve the +psycho acoustics, noise shaping and speed of MP3. + +%description -l fr +LAME est un outil d'enseignement pour l'apprentissage de l'encodage MP3. +Le but du projet LAME est d'utiliser un mod�le "open source" afin +d'am�liorer la qualit� et la vitesse du MP3. + + + +%package devel +Summary: Shared and static libraries for LAME. +Group: Development/Libraries +Requires: %{name} = %{version} + +%description devel +LAME is an educational tool to be used for learning about MP3 encoding. +This package contains both the shared and the static libraries from the +LAME project. + +You will also need to install the main lame package in order to install +these libraries. + +%prep +%setup + +%build + +# Vorbis makes the build fail for now. . . +rm -f config.cache + +%configure \ +%ifarch %{ix86} x86_64 + --enable-nasm \ +%endif + --enable-decoder \ + --without-vorbis \ + --enable-analyzer=no \ + --enable-brhist \ + --disable-debug +%{__make} %{?_smp_mflags} test CFLAGS="%{optflags}" + +%install +%{__rm} -rf %{buildroot} +%makeinstall + +### Some apps still expect to find <lame.h> +%{__ln_s} -f lame/lame.h %{buildroot}%{_includedir}/lame.h + + +find doc/html -name "Makefile*" | xargs rm -f +### make install really shouldn't install these +%{__rm} -rf %{buildroot}%{_docdir}/lame/ + + +%post +/sbin/ldconfig 2>/dev/null + +%postun +/sbin/ldconfig 2>/dev/null + +%clean +%{__rm} -rf %{buildroot} + +%files +%defattr (-,root,root) +%doc COPYING ChangeLog README TODO USAGE doc/html +%doc doc/html +%{_bindir}/lame +%{_libdir}/libmp3lame.so.* +%{_mandir}/man1/lame.1* + +%files devel +%defattr (-, root, root) +%doc API HACKING STYLEGUIDE +%{_libdir}/libmp3lame.a +%{_libdir}/libmp3lame.la +%{_libdir}/libmp3lame.so +%{_includedir}/* + +%changelog + +* Sun May 14 2006 Kyle VanderBeek <kylev@kylev.com> +- Remove requirements for specific gcc versions, since modern ones "just work". +- Remove out-dated hyper-optimizations (some of which weren't valid compiler + flags anymore). +- Update to current RPM techniques and macros (inspired by freshrpms.net spec). + +* Sat May 11 2002 Yosi Markovich <yosim@bigfoot.com> +- Fixes to the spec file that include: +- Making sure the compiler is gcc version 3.0.1. Lame compiled with a version + greater than 3.0.1 is broken. +- Optimization flags for i686 will use i686 for march and mcpu, and not + athlon. +- Fix the dates in this Changelog section. +- Various small fixes merged from Matthias Saou. +- Thanks Fred Maciel <fred-m@crl.hitachi.co.jp> for his useful comments. + +- +* Tue Jan 22 2002 Mark Taylor <mt@mp3dev.org> +- replaced lame.spec.in with Yosi's version. Merged some stuff from + the prevous lame.spec.in file, and appended changelog below. + +* Tue Jan 22 2002 Yosi Markovich <yosim@bigfoot.com> +- Rewrote lame.spec.in to create a correct and nice spec file. + imho, this spec file is not good for anyone who wants to build + daily cvs snapshots. Closes bug #495975 + +* Tue Dec 11 2001 Yosi Markovich <yosim@bigfoot.com> +- Shamelessly stole Matthias Saou's excellent spec file to create daily + CVS snapshots of Lame. Other than that, nothing is new. + +* Tue Oct 23 2001 Matthias Saou <matthias.saou@est.une.marmotte.net> +- Fixed the %pre and %post that should have been %post and %postun, silly me! +- Removed -malign-double (it's evil, Yosi told me and I tested, brrr ;-)). +- Now build with gcc3, VBR encoding gets a hell of a boost, impressive! + I recommend you now use "lame --r3mix", it's the best. +- Tried to re-enable vorbis, but it's a no-go. + +* Thu Jul 26 2001 Matthias Saou <matthias.saou@est.une.marmotte.net> +- Build with kgcc to have VBR working. + +* Wed Jul 25 2001 Matthias Saou <matthias.saou@est.une.marmotte.net> +- Update to 3.89beta : Must be built with a non-patched version of nasm + to work! + +* Mon May 7 2001 Matthias Saou <matthias.saou@est.une.marmotte.net> +- Rebuilt for Red Hat 7.1. +- Disabled the vorbis support since it fails to build with it. +- Added a big optimisation section, thanks to Yosi Markovich + <senna@camelot.com> for this and other pointers. + +* Sun Feb 11 2001 Matthias Saou <matthias.saou@est.une.marmotte.net> +- Split the package, there is now a -devel + +* Thu Nov 26 2000 Matthias Saou <matthias.saou@est.une.marmotte.net> +- Initial RPM release for RedHat 7.0 from scratch + +* Wed Nov 21 2000 Eric Lassauge <lassauge@mail.dotcom.fr> +- Updated and corrected RPM to 3.89beta. +- Added french translations + +* Sat Aug 04 2000 Markus Linnala �maage@cs.tut.fi� +- Build and include docs and libs correctly +- Build extra programs + +* Tue Aug 01 2000 Stuart Young �cefiar1@optushome.com.au� +- Updated RPM to 3.85beta. +- Modified spec file (merged George and Keitaro's specs) +- Added reasonable info to the specs to reflect the maintainer +- Renamed lame.spec (plain spec is bad, mmkay?). + +* Fri Jun 30 2000 Keitaro Yosimura �ramsy@linux.or.jp� +- Updated RPM to 3.84alpha. +- Better attempt at an RPM, independant of 3.83 release. +- (This is all surmise as there was no changelog). + +* Thu May 30 2000 Georges Seguin �crow@planete.net� +- First RPM build around 3.83beta + + diff --git a/libmp3lame/Makefile.am b/libmp3lame/Makefile.am new file mode 100644 index 0000000..50cef75 --- /dev/null +++ b/libmp3lame/Makefile.am @@ -0,0 +1,102 @@ +## $Id: Makefile.am,v 1.41 2016/01/29 21:06:26 aleidinger Exp $ + +include $(top_srcdir)/Makefile.am.global + +SUBDIRS = i386 vector + +lib_LTLIBRARIES = libmp3lame.la + +if HAVE_NASM +cpu_ldadd = $(top_builddir)/libmp3lame/@CPUTYPE@/liblameasmroutines.la +endif +if WITH_VECTOR +vector_ldadd = $(top_builddir)/libmp3lame/vector/liblamevectorroutines.la +endif + +if LIB_WITH_DECODER +decoder_ldadd = $(top_builddir)/mpglib/libmpgdecoder.la +else +decoder_ldadd = +endif + +libmp3lame_la_LIBADD = $(cpu_ldadd) $(vector_ldadd) $(decoder_ldadd) \ + $(CONFIG_MATH_LIB) +libmp3lame_la_LDFLAGS = -version-info @LIB_MAJOR_VERSION@:@LIB_MINOR_VERSION@ \ + -export-symbols $(top_srcdir)/include/libmp3lame.sym \ + -no-undefined + +INCLUDES = @INCLUDES@ -I$(top_srcdir)/mpglib -I$(top_builddir) + +DEFS = @DEFS@ @CONFIG_DEFS@ + +EXTRA_DIST = \ + lame.rc \ + vbrquantize.h \ + logoe.ico + +libmp3lame_la_SOURCES = \ + VbrTag.c \ + bitstream.c \ + encoder.c \ + fft.c \ + gain_analysis.c \ + id3tag.c \ + lame.c \ + newmdct.c \ + presets.c \ + psymodel.c \ + quantize.c \ + quantize_pvt.c \ + reservoir.c \ + set_get.c \ + tables.c \ + takehiro.c \ + util.c \ + vbrquantize.c \ + version.c \ + mpglib_interface.c + +noinst_HEADERS= \ + VbrTag.h \ + bitstream.h \ + encoder.h \ + fft.h \ + gain_analysis.h \ + id3tag.h \ + l3side.h \ + lame-analysis.h \ + lame_global_flags.h \ + lameerror.h \ + machine.h \ + newmdct.h \ + psymodel.h \ + quantize.h \ + quantize_pvt.h \ + reservoir.h \ + set_get.h \ + tables.h \ + util.h \ + vbrquantize.h \ + version.h + +CLEANFILES = lclint.txt + +LCLINTFLAGS= \ + +posixlib \ + +showsummary \ + +showalluses \ + +whichlib \ + +forcehints \ + -fixedformalarray \ + +matchanyintegral \ + -Dlint + +lclint.txt: ${libmp3lame_la_SOURCES} ${noinst_HEADERS} + @lclint ${LCLINTFLAGS} ${INCLUDES} ${DEFS} ${libmp3lame_la_SOURCES} 2>&1 >lclint.txt || true + +lclint: lclint.txt + more lclint.txt + +#$(OBJECTS): libtool +#libtool: $(LIBTOOL_DEPS) +# $(SHELL) $(top_builddir)/config.status --recheck diff --git a/libmp3lame/Makefile.in b/libmp3lame/Makefile.in new file mode 100644 index 0000000..5437b38 --- /dev/null +++ b/libmp3lame/Makefile.in @@ -0,0 +1,904 @@ +# Makefile.in generated by automake 1.15.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2017 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# global section for every Makefile.am + + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = libmp3lame +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ + $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(libdir)" +LTLIBRARIES = $(lib_LTLIBRARIES) +@LIB_WITH_DECODER_TRUE@am__DEPENDENCIES_1 = $(top_builddir)/mpglib/libmpgdecoder.la +am__DEPENDENCIES_2 = +libmp3lame_la_DEPENDENCIES = $(cpu_ldadd) $(vector_ldadd) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) +am_libmp3lame_la_OBJECTS = VbrTag.lo bitstream.lo encoder.lo fft.lo \ + gain_analysis.lo id3tag.lo lame.lo newmdct.lo presets.lo \ + psymodel.lo quantize.lo quantize_pvt.lo reservoir.lo \ + set_get.lo tables.lo takehiro.lo util.lo vbrquantize.lo \ + version.lo mpglib_interface.lo +libmp3lame_la_OBJECTS = $(am_libmp3lame_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libmp3lame_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libmp3lame_la_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libmp3lame_la_SOURCES) +DIST_SOURCES = $(libmp3lame_la_SOURCES) +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +HEADERS = $(noinst_HEADERS) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + distdir +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.global $(top_srcdir)/depcomp depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_DEFS = @CONFIG_DEFS@ +CONFIG_MATH_LIB = @CONFIG_MATH_LIB@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CPUCCODE = @CPUCCODE@ +CPUTYPE = @CPUTYPE@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ @CONFIG_DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FRONTEND_CFLAGS = @FRONTEND_CFLAGS@ +FRONTEND_LDADD = @FRONTEND_LDADD@ +FRONTEND_LDFLAGS = @FRONTEND_LDFLAGS@ +GREP = @GREP@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_CONFIG = @GTK_CONFIG@ +GTK_LIBS = @GTK_LIBS@ +INCLUDES = @INCLUDES@ -I$(top_srcdir)/mpglib -I$(top_builddir) +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDADD = @LDADD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_MAJOR_VERSION = @LIB_MAJOR_VERSION@ +LIB_MINOR_VERSION = @LIB_MINOR_VERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEDEP = @MAKEDEP@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NASM = @NASM@ +NASM_FORMAT = @NASM_FORMAT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM_F = @RM_F@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_FRONTEND = @WITH_FRONTEND@ +WITH_MP3RTP = @WITH_MP3RTP@ +WITH_MP3X = @WITH_MP3X@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = 1.15 foreign +SUBDIRS = i386 vector +lib_LTLIBRARIES = libmp3lame.la +@HAVE_NASM_TRUE@cpu_ldadd = $(top_builddir)/libmp3lame/@CPUTYPE@/liblameasmroutines.la +@WITH_VECTOR_TRUE@vector_ldadd = $(top_builddir)/libmp3lame/vector/liblamevectorroutines.la +@LIB_WITH_DECODER_FALSE@decoder_ldadd = +@LIB_WITH_DECODER_TRUE@decoder_ldadd = $(top_builddir)/mpglib/libmpgdecoder.la +libmp3lame_la_LIBADD = $(cpu_ldadd) $(vector_ldadd) $(decoder_ldadd) \ + $(CONFIG_MATH_LIB) + +libmp3lame_la_LDFLAGS = -version-info @LIB_MAJOR_VERSION@:@LIB_MINOR_VERSION@ \ + -export-symbols $(top_srcdir)/include/libmp3lame.sym \ + -no-undefined + +EXTRA_DIST = \ + lame.rc \ + vbrquantize.h \ + logoe.ico + +libmp3lame_la_SOURCES = \ + VbrTag.c \ + bitstream.c \ + encoder.c \ + fft.c \ + gain_analysis.c \ + id3tag.c \ + lame.c \ + newmdct.c \ + presets.c \ + psymodel.c \ + quantize.c \ + quantize_pvt.c \ + reservoir.c \ + set_get.c \ + tables.c \ + takehiro.c \ + util.c \ + vbrquantize.c \ + version.c \ + mpglib_interface.c + +noinst_HEADERS = \ + VbrTag.h \ + bitstream.h \ + encoder.h \ + fft.h \ + gain_analysis.h \ + id3tag.h \ + l3side.h \ + lame-analysis.h \ + lame_global_flags.h \ + lameerror.h \ + machine.h \ + newmdct.h \ + psymodel.h \ + quantize.h \ + quantize_pvt.h \ + reservoir.h \ + set_get.h \ + tables.h \ + util.h \ + vbrquantize.h \ + version.h + +CLEANFILES = lclint.txt +LCLINTFLAGS = \ + +posixlib \ + +showsummary \ + +showalluses \ + +whichlib \ + +forcehints \ + -fixedformalarray \ + +matchanyintegral \ + -Dlint + +all: all-recursive + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.global $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign libmp3lame/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign libmp3lame/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/Makefile.am.global $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libmp3lame.la: $(libmp3lame_la_OBJECTS) $(libmp3lame_la_DEPENDENCIES) $(EXTRA_libmp3lame_la_DEPENDENCIES) + $(AM_V_CCLD)$(libmp3lame_la_LINK) -rpath $(libdir) $(libmp3lame_la_OBJECTS) $(libmp3lame_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/VbrTag.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bitstream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/encoder.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fft.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gain_analysis.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/id3tag.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lame.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpglib_interface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/newmdct.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/presets.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/psymodel.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quantize.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quantize_pvt.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reservoir.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/set_get.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tables.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/takehiro.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vbrquantize.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(libdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + mostlyclean-am + +distclean: distclean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: install-libLTLIBRARIES + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-libLTLIBRARIES + +.MAKE: $(am__recursive_targets) install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ + check-am clean clean-generic clean-libLTLIBRARIES \ + clean-libtool cscopelist-am ctags ctags-am distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am \ + install-libLTLIBRARIES install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am uninstall-libLTLIBRARIES + +.PRECIOUS: Makefile + + +# end global section + +lclint.txt: ${libmp3lame_la_SOURCES} ${noinst_HEADERS} + @lclint ${LCLINTFLAGS} ${INCLUDES} ${DEFS} ${libmp3lame_la_SOURCES} 2>&1 >lclint.txt || true + +lclint: lclint.txt + more lclint.txt + +#$(OBJECTS): libtool +#libtool: $(LIBTOOL_DEPS) +# $(SHELL) $(top_builddir)/config.status --recheck + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/libmp3lame/VbrTag.c b/libmp3lame/VbrTag.c new file mode 100644 index 0000000..5800a44 --- /dev/null +++ b/libmp3lame/VbrTag.c @@ -0,0 +1,1082 @@ +/* + * Xing VBR tagging for LAME. + * + * Copyright (c) 1999 A.L. Faber + * Copyright (c) 2001 Jonathan Dee + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* $Id: VbrTag.c,v 1.106 2017/08/06 18:15:47 robert Exp $ */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include "lame.h" +#include "machine.h" +#include "encoder.h" +#include "util.h" +#include "bitstream.h" +#include "VbrTag.h" +#include "lame_global_flags.h" +#include "tables.h" + +#ifdef __sun__ +/* woraround for SunOS 4.x, it has SEEK_* defined here */ +#include <unistd.h> +#endif + + +#ifdef _DEBUG +/* #define DEBUG_VBRTAG */ +#endif + +/* + * 4 bytes for Header Tag + * 4 bytes for Header Flags + * 100 bytes for entry (NUMTOCENTRIES) + * 4 bytes for FRAME SIZE + * 4 bytes for STREAM_SIZE + * 4 bytes for VBR SCALE. a VBR quality indicator: 0=best 100=worst + * 20 bytes for LAME tag. for example, "LAME3.12 (beta 6)" + * ___________ + * 140 bytes +*/ +#define VBRHEADERSIZE (NUMTOCENTRIES+4+4+4+4+4) + +#define LAMEHEADERSIZE (VBRHEADERSIZE + 9 + 1 + 1 + 8 + 1 + 1 + 3 + 1 + 1 + 2 + 4 + 2 + 2) + +/* the size of the Xing header (MPEG1 and MPEG2) in kbps */ +#define XING_BITRATE1 128 +#define XING_BITRATE2 64 +#define XING_BITRATE25 32 + +extern const char* get_lame_tag_encoder_short_version(void); + +static const char VBRTag0[] = { "Xing" }; +static const char VBRTag1[] = { "Info" }; + + + + +/* Lookup table for fast CRC computation + * See 'CRC_update_lookup' + * Uses the polynomial x^16+x^15+x^2+1 */ + +static const unsigned int crc16_lookup[256] = { + 0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241, + 0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440, + 0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40, + 0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841, + 0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40, + 0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41, + 0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641, + 0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040, + 0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240, + 0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441, + 0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41, + 0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840, + 0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41, + 0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40, + 0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640, + 0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041, + 0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240, + 0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441, + 0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41, + 0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840, + 0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41, + 0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40, + 0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640, + 0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041, + 0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241, + 0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440, + 0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40, + 0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841, + 0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40, + 0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41, + 0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641, + 0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040 +}; + + + + + +/*********************************************************************** + * Robert Hegemann 2001-01-17 + ***********************************************************************/ + +static void +addVbr(VBR_seek_info_t * v, int bitrate) +{ + int i; + + v->nVbrNumFrames++; + v->sum += bitrate; + v->seen++; + + if (v->seen < v->want) { + return; + } + + if (v->pos < v->size) { + v->bag[v->pos] = v->sum; + v->pos++; + v->seen = 0; + } + if (v->pos == v->size) { + for (i = 1; i < v->size; i += 2) { + v->bag[i / 2] = v->bag[i]; + } + v->want *= 2; + v->pos /= 2; + } +} + +static void +Xing_seek_table(VBR_seek_info_t const* v, unsigned char *t) +{ + int i, indx; + int seek_point; + + if (v->pos <= 0) + return; + + for (i = 1; i < NUMTOCENTRIES; ++i) { + float j = i / (float) NUMTOCENTRIES, act, sum; + indx = (int) (floor(j * v->pos)); + if (indx > v->pos - 1) + indx = v->pos - 1; + act = v->bag[indx]; + sum = v->sum; + seek_point = (int) (256. * act / sum); + if (seek_point > 255) + seek_point = 255; + t[i] = seek_point; + } +} + +#ifdef DEBUG_VBR_SEEKING_TABLE +static void +print_seeking(unsigned char *t) +{ + int i; + + printf("seeking table "); + for (i = 0; i < NUMTOCENTRIES; ++i) { + printf(" %d ", t[i]); + } + printf("\n"); +} +#endif + + +/**************************************************************************** + * AddVbrFrame: Add VBR entry, used to fill the VBR the TOC entries + * Paramters: + * nStreamPos: how many bytes did we write to the bitstream so far + * (in Bytes NOT Bits) + **************************************************************************** +*/ +void +AddVbrFrame(lame_internal_flags * gfc) +{ + int kbps = bitrate_table[gfc->cfg.version][gfc->ov_enc.bitrate_index]; + assert(gfc->VBR_seek_table.bag); + addVbr(&gfc->VBR_seek_table, kbps); +} + + +/*-------------------------------------------------------------*/ +static int +ExtractI4(const unsigned char *buf) +{ + int x; + /* big endian extract */ + x = buf[0]; + x <<= 8; + x |= buf[1]; + x <<= 8; + x |= buf[2]; + x <<= 8; + x |= buf[3]; + return x; +} + +static void +CreateI4(unsigned char *buf, uint32_t nValue) +{ + /* big endian create */ + buf[0] = (nValue >> 24) & 0xff; + buf[1] = (nValue >> 16) & 0xff; + buf[2] = (nValue >> 8) & 0xff; + buf[3] = (nValue) & 0xff; +} + + + +static void +CreateI2(unsigned char *buf, int nValue) +{ + /* big endian create */ + buf[0] = (nValue >> 8) & 0xff; + buf[1] = (nValue) & 0xff; +} + +/* check for magic strings*/ +static int +IsVbrTag(const unsigned char *buf) +{ + int isTag0, isTag1; + + isTag0 = ((buf[0] == VBRTag0[0]) && (buf[1] == VBRTag0[1]) && (buf[2] == VBRTag0[2]) + && (buf[3] == VBRTag0[3])); + isTag1 = ((buf[0] == VBRTag1[0]) && (buf[1] == VBRTag1[1]) && (buf[2] == VBRTag1[2]) + && (buf[3] == VBRTag1[3])); + + return (isTag0 || isTag1); +} + +#define SHIFT_IN_BITS_VALUE(x,n,v) ( x = (x << (n)) | ( (v) & ~(-1 << (n)) ) ) + +static void +setLameTagFrameHeader(lame_internal_flags const *gfc, unsigned char *buffer) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + EncResult_t const *const eov = &gfc->ov_enc; + char abyte, bbyte; + + SHIFT_IN_BITS_VALUE(buffer[0], 8u, 0xffu); + + SHIFT_IN_BITS_VALUE(buffer[1], 3u, 7); + SHIFT_IN_BITS_VALUE(buffer[1], 1u, (cfg->samplerate_out < 16000) ? 0 : 1); + SHIFT_IN_BITS_VALUE(buffer[1], 1u, cfg->version); + SHIFT_IN_BITS_VALUE(buffer[1], 2u, 4 - 3); + SHIFT_IN_BITS_VALUE(buffer[1], 1u, (!cfg->error_protection) ? 1 : 0); + + SHIFT_IN_BITS_VALUE(buffer[2], 4u, eov->bitrate_index); + SHIFT_IN_BITS_VALUE(buffer[2], 2u, cfg->samplerate_index); + SHIFT_IN_BITS_VALUE(buffer[2], 1u, 0); + SHIFT_IN_BITS_VALUE(buffer[2], 1u, cfg->extension); + + SHIFT_IN_BITS_VALUE(buffer[3], 2u, cfg->mode); + SHIFT_IN_BITS_VALUE(buffer[3], 2u, eov->mode_ext); + SHIFT_IN_BITS_VALUE(buffer[3], 1u, cfg->copyright); + SHIFT_IN_BITS_VALUE(buffer[3], 1u, cfg->original); + SHIFT_IN_BITS_VALUE(buffer[3], 2u, cfg->emphasis); + + /* the default VBR header. 48 kbps layer III, no padding, no crc */ + /* but sampling freq, mode andy copyright/copy protection taken */ + /* from first valid frame */ + buffer[0] = (uint8_t) 0xff; + abyte = (buffer[1] & (unsigned char) 0xf1); + { + int bitrate; + if (1 == cfg->version) { + bitrate = XING_BITRATE1; + } + else { + if (cfg->samplerate_out < 16000) + bitrate = XING_BITRATE25; + else + bitrate = XING_BITRATE2; + } + + if (cfg->vbr == vbr_off) + bitrate = cfg->avg_bitrate; + + if (cfg->free_format) + bbyte = 0x00; + else + bbyte = 16 * BitrateIndex(bitrate, cfg->version, cfg->samplerate_out); + } + + /* Use as much of the info from the real frames in the + * Xing header: samplerate, channels, crc, etc... + */ + if (cfg->version == 1) { + /* MPEG1 */ + buffer[1] = abyte | (char) 0x0a; /* was 0x0b; */ + abyte = buffer[2] & (char) 0x0d; /* AF keep also private bit */ + buffer[2] = (char) bbyte | abyte; /* 64kbs MPEG1 frame */ + } + else { + /* MPEG2 */ + buffer[1] = abyte | (char) 0x02; /* was 0x03; */ + abyte = buffer[2] & (char) 0x0d; /* AF keep also private bit */ + buffer[2] = (char) bbyte | abyte; /* 64kbs MPEG2 frame */ + } +} + +#if 0 +static int CheckVbrTag(unsigned char *buf); + +/*-------------------------------------------------------------*/ +/* Same as GetVbrTag below, but only checks for the Xing tag. + requires buf to contain only 40 bytes */ +/*-------------------------------------------------------------*/ +int +CheckVbrTag(unsigned char *buf) +{ + int h_id, h_mode; + + /* get selected MPEG header data */ + h_id = (buf[1] >> 3) & 1; + h_mode = (buf[3] >> 6) & 3; + + /* determine offset of header */ + if (h_id) { + /* mpeg1 */ + if (h_mode != 3) + buf += (32 + 4); + else + buf += (17 + 4); + } + else { + /* mpeg2 */ + if (h_mode != 3) + buf += (17 + 4); + else + buf += (9 + 4); + } + + return IsVbrTag(buf); +} +#endif + +int +GetVbrTag(VBRTAGDATA * pTagData, const unsigned char *buf) +{ + int i, head_flags; + int h_bitrate, h_id, h_mode, h_sr_index, h_layer; + int enc_delay, enc_padding; + + /* get Vbr header data */ + pTagData->flags = 0; + + /* get selected MPEG header data */ + h_layer = (buf[1] >> 1) & 3; + if ( h_layer != 0x01 ) { + /* the following code assumes Layer-3, so give up here */ + return 0; + } + h_id = (buf[1] >> 3) & 1; + h_sr_index = (buf[2] >> 2) & 3; + h_mode = (buf[3] >> 6) & 3; + h_bitrate = ((buf[2] >> 4) & 0xf); + h_bitrate = bitrate_table[h_id][h_bitrate]; + + /* check for FFE syncword */ + if ((buf[1] >> 4) == 0xE) + pTagData->samprate = samplerate_table[2][h_sr_index]; + else + pTagData->samprate = samplerate_table[h_id][h_sr_index]; + /* if( h_id == 0 ) */ + /* pTagData->samprate >>= 1; */ + + + + /* determine offset of header */ + if (h_id) { + /* mpeg1 */ + if (h_mode != 3) + buf += (32 + 4); + else + buf += (17 + 4); + } + else { + /* mpeg2 */ + if (h_mode != 3) + buf += (17 + 4); + else + buf += (9 + 4); + } + + if (!IsVbrTag(buf)) + return 0; + + buf += 4; + + pTagData->h_id = h_id; + + head_flags = pTagData->flags = ExtractI4(buf); + buf += 4; /* get flags */ + + if (head_flags & FRAMES_FLAG) { + pTagData->frames = ExtractI4(buf); + buf += 4; + } + + if (head_flags & BYTES_FLAG) { + pTagData->bytes = ExtractI4(buf); + buf += 4; + } + + if (head_flags & TOC_FLAG) { + if (pTagData->toc != NULL) { + for (i = 0; i < NUMTOCENTRIES; i++) + pTagData->toc[i] = buf[i]; + } + buf += NUMTOCENTRIES; + } + + pTagData->vbr_scale = -1; + + if (head_flags & VBR_SCALE_FLAG) { + pTagData->vbr_scale = ExtractI4(buf); + buf += 4; + } + + pTagData->headersize = ((h_id + 1) * 72000 * h_bitrate) / pTagData->samprate; + + buf += 21; + enc_delay = buf[0] << 4; + enc_delay += buf[1] >> 4; + enc_padding = (buf[1] & 0x0F) << 8; + enc_padding += buf[2]; + /* check for reasonable values (this may be an old Xing header, */ + /* not a INFO tag) */ + if (enc_delay < 0 || enc_delay > 3000) + enc_delay = -1; + if (enc_padding < 0 || enc_padding > 3000) + enc_padding = -1; + + pTagData->enc_delay = enc_delay; + pTagData->enc_padding = enc_padding; + +#ifdef DEBUG_VBRTAG + fprintf(stderr, "\n\n********************* VBR TAG INFO *****************\n"); + fprintf(stderr, "tag :%s\n", VBRTag); + fprintf(stderr, "head_flags :%d\n", head_flags); + fprintf(stderr, "bytes :%d\n", pTagData->bytes); + fprintf(stderr, "frames :%d\n", pTagData->frames); + fprintf(stderr, "VBR Scale :%d\n", pTagData->vbr_scale); + fprintf(stderr, "enc_delay = %i \n", enc_delay); + fprintf(stderr, "enc_padding= %i \n", enc_padding); + fprintf(stderr, "toc:\n"); + if (pTagData->toc != NULL) { + for (i = 0; i < NUMTOCENTRIES; i++) { + if ((i % 10) == 0) + fprintf(stderr, "\n"); + fprintf(stderr, " %3d", (int) (pTagData->toc[i])); + } + } + fprintf(stderr, "\n***************** END OF VBR TAG INFO ***************\n"); +#endif + return 1; /* success */ +} + + +/**************************************************************************** + * InitVbrTag: Initializes the header, and write empty frame to stream + * Paramters: + * fpStream: pointer to output file stream + * nMode : Channel Mode: 0=STEREO 1=JS 2=DS 3=MONO + **************************************************************************** +*/ +int +InitVbrTag(lame_global_flags * gfp) +{ + lame_internal_flags *gfc = gfp->internal_flags; + SessionConfig_t const *const cfg = &gfc->cfg; + int kbps_header; + +#define MAXFRAMESIZE 2880 /* or 0xB40, the max freeformat 640 32kHz framesize */ + + /* + * Xing VBR pretends to be a 48kbs layer III frame. (at 44.1kHz). + * (at 48kHz they use 56kbs since 48kbs frame not big enough for + * table of contents) + * let's always embed Xing header inside a 64kbs layer III frame. + * this gives us enough room for a LAME version string too. + * size determined by sampling frequency (MPEG1) + * 32kHz: 216 bytes@48kbs 288bytes@ 64kbs + * 44.1kHz: 156 bytes 208bytes@64kbs (+1 if padding = 1) + * 48kHz: 144 bytes 192 + * + * MPEG 2 values are the same since the framesize and samplerate + * are each reduced by a factor of 2. + */ + + + if (1 == cfg->version) { + kbps_header = XING_BITRATE1; + } + else { + if (cfg->samplerate_out < 16000) + kbps_header = XING_BITRATE25; + else + kbps_header = XING_BITRATE2; + } + + if (cfg->vbr == vbr_off) + kbps_header = cfg->avg_bitrate; + + /** make sure LAME Header fits into Frame + */ + { + int total_frame_size = ((cfg->version + 1) * 72000 * kbps_header) / cfg->samplerate_out; + int header_size = (cfg->sideinfo_len + LAMEHEADERSIZE); + gfc->VBR_seek_table.TotalFrameSize = total_frame_size; + if (total_frame_size < header_size || total_frame_size > MAXFRAMESIZE) { + /* disable tag, it wont fit */ + gfc->cfg.write_lame_tag = 0; + return 0; + } + } + + gfc->VBR_seek_table.nVbrNumFrames = 0; + gfc->VBR_seek_table.nBytesWritten = 0; + gfc->VBR_seek_table.sum = 0; + + gfc->VBR_seek_table.seen = 0; + gfc->VBR_seek_table.want = 1; + gfc->VBR_seek_table.pos = 0; + + if (gfc->VBR_seek_table.bag == NULL) { + gfc->VBR_seek_table.bag = lame_calloc(int, 400); + if (gfc->VBR_seek_table.bag != NULL) { + gfc->VBR_seek_table.size = 400; + } + else { + gfc->VBR_seek_table.size = 0; + ERRORF(gfc, "Error: can't allocate VbrFrames buffer\n"); + gfc->cfg.write_lame_tag = 0; + return -1; + } + } + + /* write dummy VBR tag of all 0's into bitstream */ + { + uint8_t buffer[MAXFRAMESIZE]; + size_t i, n; + + memset(buffer, 0, sizeof(buffer)); + setLameTagFrameHeader(gfc, buffer); + n = gfc->VBR_seek_table.TotalFrameSize; + for (i = 0; i < n; ++i) { + add_dummy_byte(gfc, buffer[i], 1); + } + } + /* Success */ + return 0; +} + + + +/* fast CRC-16 computation - uses table crc16_lookup 8*/ +static uint16_t +CRC_update_lookup(uint16_t value, uint16_t crc) +{ + uint16_t tmp; + tmp = crc ^ value; + crc = (crc >> 8) ^ crc16_lookup[tmp & 0xff]; + return crc; +} + +void +UpdateMusicCRC(uint16_t * crc, unsigned char const *buffer, int size) +{ + int i; + for (i = 0; i < size; ++i) + *crc = CRC_update_lookup(buffer[i], *crc); +} + + + + + +/**************************************************************************** + * Jonathan Dee 2001/08/31 + * + * PutLameVBR: Write LAME info: mini version + info on various switches used + * Paramters: + * pbtStreamBuffer : pointer to output buffer + * id3v2size : size of id3v2 tag in bytes + * crc : computation of crc-16 of Lame Tag so far (starting at frame sync) + * + **************************************************************************** +*/ +static int +PutLameVBR(lame_global_flags const *gfp, size_t nMusicLength, uint8_t * pbtStreamBuffer, uint16_t crc) +{ + lame_internal_flags const *gfc = gfp->internal_flags; + SessionConfig_t const *const cfg = &gfc->cfg; + + int nBytesWritten = 0; + int i; + + int enc_delay = gfc->ov_enc.encoder_delay; /* encoder delay */ + int enc_padding = gfc->ov_enc.encoder_padding; /* encoder padding */ + + /*recall: cfg->vbr_q is for example set by the switch -V */ + /* gfp->quality by -q, -h, -f, etc */ + + int nQuality = (100 - 10 * gfp->VBR_q - gfp->quality); + + + /* + NOTE: + Even though the specification for the LAME VBR tag + did explicitly mention other encoders than LAME, + many SW/HW decoder seem to be able to make use of + this tag only, if the encoder version starts with LAME. + To be compatible with such decoders, ANY encoder will + be forced to write a fake LAME version string! + As a result, the encoder version info becomes worthless. + */ + const char *szVersion = get_lame_tag_encoder_short_version(); + uint8_t nVBR; + uint8_t nRevision = 0x00; + uint8_t nRevMethod; + uint8_t vbr_type_translator[] = { 1, 5, 3, 2, 4, 0, 3 }; /*numbering different in vbr_mode vs. Lame tag */ + + uint8_t nLowpass = + (((cfg->lowpassfreq / 100.0) + .5) > 255 ? 255 : (cfg->lowpassfreq / 100.0) + .5); + + uint32_t nPeakSignalAmplitude = 0; + + uint16_t nRadioReplayGain = 0; + uint16_t nAudiophileReplayGain = 0; + + uint8_t nNoiseShaping = cfg->noise_shaping; + uint8_t nStereoMode = 0; + int bNonOptimal = 0; + uint8_t nSourceFreq = 0; + uint8_t nMisc = 0; + uint16_t nMusicCRC = 0; + + /*psy model type: Gpsycho or NsPsytune */ + unsigned char bExpNPsyTune = 1; /* only NsPsytune */ + unsigned char bSafeJoint = (cfg->use_safe_joint_stereo) != 0; + + unsigned char bNoGapMore = 0; + unsigned char bNoGapPrevious = 0; + + int nNoGapCount = gfp->nogap_total; + int nNoGapCurr = gfp->nogap_current; + + + uint8_t nAthType = cfg->ATHtype; /*4 bits. */ + + uint8_t nFlags = 0; + + /* if ABR, {store bitrate <=255} else { store "-b"} */ + int nABRBitrate; + switch (cfg->vbr) { + case vbr_abr:{ + nABRBitrate = cfg->vbr_avg_bitrate_kbps; + break; + } + case vbr_off:{ + nABRBitrate = cfg->avg_bitrate; + break; + } + default:{ /*vbr modes */ + nABRBitrate = bitrate_table[cfg->version][cfg->vbr_min_bitrate_index];; + } + } + + + /*revision and vbr method */ + if (cfg->vbr < sizeof(vbr_type_translator)) + nVBR = vbr_type_translator[cfg->vbr]; + else + nVBR = 0x00; /*unknown. */ + + nRevMethod = 0x10 * nRevision + nVBR; + + + /* ReplayGain */ + if (cfg->findReplayGain) { + int RadioGain = gfc->ov_rpg.RadioGain; + if (RadioGain > 0x1FE) + RadioGain = 0x1FE; + if (RadioGain < -0x1FE) + RadioGain = -0x1FE; + + nRadioReplayGain = 0x2000; /* set name code */ + nRadioReplayGain |= 0xC00; /* set originator code to `determined automatically' */ + + if (RadioGain >= 0) + nRadioReplayGain |= RadioGain; /* set gain adjustment */ + else { + nRadioReplayGain |= 0x200; /* set the sign bit */ + nRadioReplayGain |= -RadioGain; /* set gain adjustment */ + } + } + + /* peak sample */ + if (cfg->findPeakSample) + nPeakSignalAmplitude = + abs((int) ((((FLOAT) gfc->ov_rpg.PeakSample) / 32767.0) * pow(2, 23) + .5)); + + /*nogap */ + if (nNoGapCount != -1) { + if (nNoGapCurr > 0) + bNoGapPrevious = 1; + + if (nNoGapCurr < nNoGapCount - 1) + bNoGapMore = 1; + } + + /*flags */ + + nFlags = nAthType + (bExpNPsyTune << 4) + + (bSafeJoint << 5) + + (bNoGapMore << 6) + + (bNoGapPrevious << 7); + + + if (nQuality < 0) + nQuality = 0; + + /*stereo mode field... a bit ugly. */ + + switch (cfg->mode) { + case MONO: + nStereoMode = 0; + break; + case STEREO: + nStereoMode = 1; + break; + case DUAL_CHANNEL: + nStereoMode = 2; + break; + case JOINT_STEREO: + if (cfg->force_ms) + nStereoMode = 4; + else + nStereoMode = 3; + break; + case NOT_SET: + /* FALLTHROUGH */ + default: + nStereoMode = 7; + break; + } + + /*Intensity stereo : nStereoMode = 6. IS is not implemented */ + + if (cfg->samplerate_in <= 32000) + nSourceFreq = 0x00; + else if (cfg->samplerate_in == 48000) + nSourceFreq = 0x02; + else if (cfg->samplerate_in > 48000) + nSourceFreq = 0x03; + else + nSourceFreq = 0x01; /*default is 44100Hz. */ + + + /*Check if the user overrided the default LAME behaviour with some nasty options */ + + if (cfg->short_blocks == short_block_forced || cfg->short_blocks == short_block_dispensed || ((cfg->lowpassfreq == -1) && (cfg->highpassfreq == -1)) || /* "-k" */ + (cfg->disable_reservoir && cfg->avg_bitrate < 320) || + cfg->noATH || cfg->ATHonly || (nAthType == 0) || cfg->samplerate_in <= 32000) + bNonOptimal = 1; + + nMisc = nNoiseShaping + (nStereoMode << 2) + + (bNonOptimal << 5) + + (nSourceFreq << 6); + + + nMusicCRC = gfc->nMusicCRC; + + + /*Write all this information into the stream */ + CreateI4(&pbtStreamBuffer[nBytesWritten], nQuality); + nBytesWritten += 4; + + strncpy((char *) &pbtStreamBuffer[nBytesWritten], szVersion, 9); + nBytesWritten += 9; + + pbtStreamBuffer[nBytesWritten] = nRevMethod; + nBytesWritten++; + + pbtStreamBuffer[nBytesWritten] = nLowpass; + nBytesWritten++; + + CreateI4(&pbtStreamBuffer[nBytesWritten], nPeakSignalAmplitude); + nBytesWritten += 4; + + CreateI2(&pbtStreamBuffer[nBytesWritten], nRadioReplayGain); + nBytesWritten += 2; + + CreateI2(&pbtStreamBuffer[nBytesWritten], nAudiophileReplayGain); + nBytesWritten += 2; + + pbtStreamBuffer[nBytesWritten] = nFlags; + nBytesWritten++; + + if (nABRBitrate >= 255) + pbtStreamBuffer[nBytesWritten] = 0xFF; + else + pbtStreamBuffer[nBytesWritten] = nABRBitrate; + nBytesWritten++; + + pbtStreamBuffer[nBytesWritten] = enc_delay >> 4; /* works for win32, does it for unix? */ + pbtStreamBuffer[nBytesWritten + 1] = (enc_delay << 4) + (enc_padding >> 8); + pbtStreamBuffer[nBytesWritten + 2] = enc_padding; + + nBytesWritten += 3; + + pbtStreamBuffer[nBytesWritten] = nMisc; + nBytesWritten++; + + + pbtStreamBuffer[nBytesWritten++] = 0; /*unused in rev0 */ + + CreateI2(&pbtStreamBuffer[nBytesWritten], cfg->preset); + nBytesWritten += 2; + + CreateI4(&pbtStreamBuffer[nBytesWritten], (int) nMusicLength); + nBytesWritten += 4; + + CreateI2(&pbtStreamBuffer[nBytesWritten], nMusicCRC); + nBytesWritten += 2; + + /*Calculate tag CRC.... must be done here, since it includes + *previous information*/ + + for (i = 0; i < nBytesWritten; i++) + crc = CRC_update_lookup(pbtStreamBuffer[i], crc); + + CreateI2(&pbtStreamBuffer[nBytesWritten], crc); + nBytesWritten += 2; + + return nBytesWritten; +} + +static long +skipId3v2(FILE * fpStream) +{ + size_t nbytes; + long id3v2TagSize; + unsigned char id3v2Header[10]; + + /* seek to the beginning of the stream */ + if (fseek(fpStream, 0, SEEK_SET) != 0) { + return -2; /* not seekable, abort */ + } + /* read 10 bytes in case there's an ID3 version 2 header here */ + nbytes = fread(id3v2Header, 1, sizeof(id3v2Header), fpStream); + if (nbytes != sizeof(id3v2Header)) { + return -3; /* not readable, maybe opened Write-Only */ + } + /* does the stream begin with the ID3 version 2 file identifier? */ + if (!strncmp((char *) id3v2Header, "ID3", 3)) { + /* the tag size (minus the 10-byte header) is encoded into four + * bytes where the most significant bit is clear in each byte */ + id3v2TagSize = (((id3v2Header[6] & 0x7f) << 21) + | ((id3v2Header[7] & 0x7f) << 14) + | ((id3v2Header[8] & 0x7f) << 7) + | (id3v2Header[9] & 0x7f)) + + sizeof id3v2Header; + } + else { + /* no ID3 version 2 tag in this stream */ + id3v2TagSize = 0; + } + return id3v2TagSize; +} + + + +size_t +lame_get_lametag_frame(lame_global_flags const *gfp, unsigned char *buffer, size_t size) +{ + lame_internal_flags *gfc; + SessionConfig_t const *cfg; + unsigned long stream_size; + unsigned int nStreamIndex; + uint8_t btToc[NUMTOCENTRIES]; + + if (gfp == 0) { + return 0; + } + gfc = gfp->internal_flags; + if (gfc == 0) { + return 0; + } + if (!is_lame_internal_flags_valid(gfc)) { + return 0; + } + cfg = &gfc->cfg; + if (cfg->write_lame_tag == 0) { + return 0; + } + if (gfc->VBR_seek_table.pos <= 0) { + return 0; + } + if (size < gfc->VBR_seek_table.TotalFrameSize) { + return gfc->VBR_seek_table.TotalFrameSize; + } + if (buffer == 0) { + return 0; + } + + memset(buffer, 0, gfc->VBR_seek_table.TotalFrameSize); + + /* 4 bytes frame header */ + + setLameTagFrameHeader(gfc, buffer); + + /* Clear all TOC entries */ + memset(btToc, 0, sizeof(btToc)); + + if (cfg->free_format) { + int i; + for (i = 1; i < NUMTOCENTRIES; ++i) + btToc[i] = 255 * i / 100; + } + else { + Xing_seek_table(&gfc->VBR_seek_table, btToc); + } +#ifdef DEBUG_VBR_SEEKING_TABLE + print_seeking(btToc); +#endif + + /* Start writing the tag after the zero frame */ + nStreamIndex = cfg->sideinfo_len; + /* note! Xing header specifies that Xing data goes in the + * ancillary data with NO ERROR PROTECTION. If error protecton + * in enabled, the Xing data still starts at the same offset, + * and now it is in sideinfo data block, and thus will not + * decode correctly by non-Xing tag aware players */ + if (cfg->error_protection) + nStreamIndex -= 2; + + /* Put Vbr tag */ + if (cfg->vbr == vbr_off) { + buffer[nStreamIndex++] = VBRTag1[0]; + buffer[nStreamIndex++] = VBRTag1[1]; + buffer[nStreamIndex++] = VBRTag1[2]; + buffer[nStreamIndex++] = VBRTag1[3]; + + } + else { + buffer[nStreamIndex++] = VBRTag0[0]; + buffer[nStreamIndex++] = VBRTag0[1]; + buffer[nStreamIndex++] = VBRTag0[2]; + buffer[nStreamIndex++] = VBRTag0[3]; + } + + /* Put header flags */ + CreateI4(&buffer[nStreamIndex], FRAMES_FLAG + BYTES_FLAG + TOC_FLAG + VBR_SCALE_FLAG); + nStreamIndex += 4; + + /* Put Total Number of frames */ + CreateI4(&buffer[nStreamIndex], gfc->VBR_seek_table.nVbrNumFrames); + nStreamIndex += 4; + + /* Put total audio stream size, including Xing/LAME Header */ + stream_size = gfc->VBR_seek_table.nBytesWritten + gfc->VBR_seek_table.TotalFrameSize; + CreateI4(&buffer[nStreamIndex], stream_size); + nStreamIndex += 4; + + /* Put TOC */ + memcpy(&buffer[nStreamIndex], btToc, sizeof(btToc)); + nStreamIndex += sizeof(btToc); + + + if (cfg->error_protection) { + /* (jo) error_protection: add crc16 information to header */ + CRC_writeheader(gfc, (char *) buffer); + } + { + /*work out CRC so far: initially crc = 0 */ + uint16_t crc = 0x00; + unsigned int i; + for (i = 0; i < nStreamIndex; i++) + crc = CRC_update_lookup(buffer[i], crc); + /*Put LAME VBR info */ + nStreamIndex += PutLameVBR(gfp, stream_size, buffer + nStreamIndex, crc); + } + +#ifdef DEBUG_VBRTAG + { + VBRTAGDATA TestHeader; + GetVbrTag(&TestHeader, buffer); + } +#endif + + return gfc->VBR_seek_table.TotalFrameSize; +} + +/*********************************************************************** + * + * PutVbrTag: Write final VBR tag to the file + * Paramters: + * lpszFileName: filename of MP3 bit stream + * nVbrScale : encoder quality indicator (0..100) + **************************************************************************** + */ + +int +PutVbrTag(lame_global_flags const *gfp, FILE * fpStream) +{ + lame_internal_flags *gfc = gfp->internal_flags; + + long lFileSize; + long id3v2TagSize; + size_t nbytes; + uint8_t buffer[MAXFRAMESIZE]; + + if (gfc->VBR_seek_table.pos <= 0) + return -1; + + /* Seek to end of file */ + fseek(fpStream, 0, SEEK_END); + + /* Get file size */ + lFileSize = ftell(fpStream); + + /* Abort if file has zero length. Yes, it can happen :) */ + if (lFileSize == 0) + return -1; + + /* + * The VBR tag may NOT be located at the beginning of the stream. + * If an ID3 version 2 tag was added, then it must be skipped to write + * the VBR tag data. + */ + + id3v2TagSize = skipId3v2(fpStream); + + if (id3v2TagSize < 0) { + return id3v2TagSize; + } + + /*Seek to the beginning of the stream */ + fseek(fpStream, id3v2TagSize, SEEK_SET); + + nbytes = lame_get_lametag_frame(gfp, buffer, sizeof(buffer)); + if (nbytes > sizeof(buffer)) { + return -1; + } + + if (nbytes < 1) { + return 0; + } + + /* Put it all to disk again */ + if (fwrite(buffer, nbytes, 1, fpStream) != 1) { + return -1; + } + + return 0; /* success */ +} diff --git a/libmp3lame/VbrTag.h b/libmp3lame/VbrTag.h new file mode 100644 index 0000000..406af36 --- /dev/null +++ b/libmp3lame/VbrTag.h @@ -0,0 +1,79 @@ +/* + * Xing VBR tagging for LAME. + * + * Copyright (c) 1999 A.L. Faber + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef LAME_VRBTAG_H +#define LAME_VRBTAG_H + + +/* ----------------------------------------------------------- + * A Vbr header may be present in the ancillary + * data field of the first frame of an mp3 bitstream + * The Vbr header (optionally) contains + * frames total number of audio frames in the bitstream + * bytes total number of bytes in the bitstream + * toc table of contents + + * toc (table of contents) gives seek points + * for random access + * the ith entry determines the seek point for + * i-percent duration + * seek point in bytes = (toc[i]/256.0) * total_bitstream_bytes + * e.g. half duration seek point = (toc[50]/256.0) * total_bitstream_bytes + */ + + +#define FRAMES_FLAG 0x0001 +#define BYTES_FLAG 0x0002 +#define TOC_FLAG 0x0004 +#define VBR_SCALE_FLAG 0x0008 + +#define NUMTOCENTRIES 100 + +#ifndef lame_internal_flags_defined +#define lame_internal_flags_defined +struct lame_internal_flags; +typedef struct lame_internal_flags lame_internal_flags; +#endif + + +/*structure to receive extracted header */ +/* toc may be NULL*/ +typedef struct { + int h_id; /* from MPEG header, 0=MPEG2, 1=MPEG1 */ + int samprate; /* determined from MPEG header */ + int flags; /* from Vbr header data */ + int frames; /* total bit stream frames from Vbr header data */ + int bytes; /* total bit stream bytes from Vbr header data */ + int vbr_scale; /* encoded vbr scale from Vbr header data */ + unsigned char toc[NUMTOCENTRIES]; /* may be NULL if toc not desired */ + int headersize; /* size of VBR header, in bytes */ + int enc_delay; /* encoder delay */ + int enc_padding; /* encoder paddign added at end of stream */ +} VBRTAGDATA; + +int GetVbrTag(VBRTAGDATA * pTagData, const unsigned char *buf); + +int InitVbrTag(lame_global_flags * gfp); +int PutVbrTag(lame_global_flags const *gfp, FILE * fid); +void AddVbrFrame(lame_internal_flags * gfc); +void UpdateMusicCRC(uint16_t * crc, const unsigned char *buffer, int size); + +#endif diff --git a/libmp3lame/bitstream.c b/libmp3lame/bitstream.c new file mode 100644 index 0000000..aa35915 --- /dev/null +++ b/libmp3lame/bitstream.c @@ -0,0 +1,1111 @@ +/* + * MP3 bitstream Output interface for LAME + * + * Copyright (c) 1999-2000 Mark Taylor + * Copyright (c) 1999-2002 Takehiro Tominaga + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * $Id: bitstream.c,v 1.99 2017/08/31 14:14:46 robert Exp $ + */ + + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdlib.h> +#include <stdio.h> + +#include "lame.h" +#include "machine.h" +#include "encoder.h" +#include "util.h" +#include "tables.h" +#include "quantize_pvt.h" +#include "lame_global_flags.h" +#include "gain_analysis.h" +#include "VbrTag.h" +#include "bitstream.h" +#include "tables.h" + + + +/* unsigned int is at least this large: */ +/* we work with ints, so when doing bit manipulation, we limit + * ourselves to MAX_LENGTH-2 just to be on the safe side */ +#define MAX_LENGTH 32 + + + +#ifdef DEBUG +static int hogege; +#endif + + + +static int +calcFrameLength(SessionConfig_t const *const cfg, int kbps, int pad) +{ + return 8 * ((cfg->version + 1) * 72000 * kbps / cfg->samplerate_out + pad); +} + + +/*********************************************************************** + * compute bitsperframe and mean_bits for a layer III frame + **********************************************************************/ +int +getframebits(const lame_internal_flags * gfc) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + EncResult_t const *const eov = &gfc->ov_enc; + int bit_rate; + + /* get bitrate in kbps [?] */ + if (eov->bitrate_index) + bit_rate = bitrate_table[cfg->version][eov->bitrate_index]; + else + bit_rate = cfg->avg_bitrate; + /*assert(bit_rate <= 550); */ + assert(8 <= bit_rate && bit_rate <= 640); + + /* main encoding routine toggles padding on and off */ + /* one Layer3 Slot consists of 8 bits */ + return calcFrameLength(cfg, bit_rate, eov->padding); +} + +int +get_max_frame_buffer_size_by_constraint(SessionConfig_t const * cfg, int constraint) +{ + int maxmp3buf = 0; + if (cfg->avg_bitrate > 320) { + /* in freeformat the buffer is constant */ + if (constraint == MDB_STRICT_ISO) { + maxmp3buf = calcFrameLength(cfg, cfg->avg_bitrate, 0); + } + else { + /* maximum allowed bits per granule are 7680 */ + maxmp3buf = 7680 * (cfg->version + 1); + } + } + else { + int max_kbps; + if (cfg->samplerate_out < 16000) { + max_kbps = bitrate_table[cfg->version][8]; /* default: allow 64 kbps (MPEG-2.5) */ + } + else { + max_kbps = bitrate_table[cfg->version][14]; + } + switch (constraint) + { + default: + case MDB_DEFAULT: + /* Bouvigne suggests this more lax interpretation of the ISO doc instead of using 8*960. */ + /* All mp3 decoders should have enough buffer to handle this value: size of a 320kbps 32kHz frame */ + maxmp3buf = 8 * 1440; + break; + case MDB_STRICT_ISO: + maxmp3buf = calcFrameLength(cfg, max_kbps, 0); + break; + case MDB_MAXIMUM: + maxmp3buf = 7680 * (cfg->version + 1); + break; + } + } + return maxmp3buf; +} + + +static void +putheader_bits(lame_internal_flags * gfc) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + EncStateVar_t *const esv = &gfc->sv_enc; + Bit_stream_struc *bs = &gfc->bs; +#ifdef DEBUG + hogege += cfg->sideinfo_len * 8; +#endif + memcpy(&bs->buf[bs->buf_byte_idx], esv->header[esv->w_ptr].buf, cfg->sideinfo_len); + bs->buf_byte_idx += cfg->sideinfo_len; + bs->totbit += cfg->sideinfo_len * 8; + esv->w_ptr = (esv->w_ptr + 1) & (MAX_HEADER_BUF - 1); +} + + + + +/*write j bits into the bit stream */ +inline static void +putbits2(lame_internal_flags * gfc, int val, int j) +{ + EncStateVar_t const *const esv = &gfc->sv_enc; + Bit_stream_struc *bs; + bs = &gfc->bs; + + assert(j < MAX_LENGTH - 2); + + while (j > 0) { + int k; + if (bs->buf_bit_idx == 0) { + bs->buf_bit_idx = 8; + bs->buf_byte_idx++; + assert(bs->buf_byte_idx < BUFFER_SIZE); + assert(esv->header[esv->w_ptr].write_timing >= bs->totbit); + if (esv->header[esv->w_ptr].write_timing == bs->totbit) { + putheader_bits(gfc); + } + bs->buf[bs->buf_byte_idx] = 0; + } + + k = Min(j, bs->buf_bit_idx); + j -= k; + + bs->buf_bit_idx -= k; + + assert(j < MAX_LENGTH); /* 32 too large on 32 bit machines */ + assert(bs->buf_bit_idx < MAX_LENGTH); + + bs->buf[bs->buf_byte_idx] |= ((val >> j) << bs->buf_bit_idx); + bs->totbit += k; + } +} + +/*write j bits into the bit stream, ignoring frame headers */ +inline static void +putbits_noheaders(lame_internal_flags * gfc, int val, int j) +{ + Bit_stream_struc *bs; + bs = &gfc->bs; + + assert(j < MAX_LENGTH - 2); + + while (j > 0) { + int k; + if (bs->buf_bit_idx == 0) { + bs->buf_bit_idx = 8; + bs->buf_byte_idx++; + assert(bs->buf_byte_idx < BUFFER_SIZE); + bs->buf[bs->buf_byte_idx] = 0; + } + + k = Min(j, bs->buf_bit_idx); + j -= k; + + bs->buf_bit_idx -= k; + + assert(j < MAX_LENGTH); /* 32 too large on 32 bit machines */ + assert(bs->buf_bit_idx < MAX_LENGTH); + + bs->buf[bs->buf_byte_idx] |= ((val >> j) << bs->buf_bit_idx); + bs->totbit += k; + } +} + + +/* + Some combinations of bitrate, Fs, and stereo make it impossible to stuff + out a frame using just main_data, due to the limited number of bits to + indicate main_data_length. In these situations, we put stuffing bits into + the ancillary data... +*/ + +inline static void +drain_into_ancillary(lame_internal_flags * gfc, int remainingBits) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + EncStateVar_t *const esv = &gfc->sv_enc; + int i; + assert(remainingBits >= 0); + + if (remainingBits >= 8) { + putbits2(gfc, 0x4c, 8); + remainingBits -= 8; + } + if (remainingBits >= 8) { + putbits2(gfc, 0x41, 8); + remainingBits -= 8; + } + if (remainingBits >= 8) { + putbits2(gfc, 0x4d, 8); + remainingBits -= 8; + } + if (remainingBits >= 8) { + putbits2(gfc, 0x45, 8); + remainingBits -= 8; + } + + if (remainingBits >= 32) { + const char *const version = get_lame_short_version(); + if (remainingBits >= 32) + for (i = 0; i < (int) strlen(version) && remainingBits >= 8; ++i) { + remainingBits -= 8; + putbits2(gfc, version[i], 8); + } + } + + for (; remainingBits >= 1; remainingBits -= 1) { + putbits2(gfc, esv->ancillary_flag, 1); + esv->ancillary_flag ^= !cfg->disable_reservoir; + } + + assert(remainingBits == 0); + +} + +/*write N bits into the header */ +inline static void +writeheader(lame_internal_flags * gfc, int val, int j) +{ + EncStateVar_t *const esv = &gfc->sv_enc; + int ptr = esv->header[esv->h_ptr].ptr; + + while (j > 0) { + int const k = Min(j, 8 - (ptr & 7)); + j -= k; + assert(j < MAX_LENGTH); /* >> 32 too large for 32 bit machines */ + esv->header[esv->h_ptr].buf[ptr >> 3] + |= ((val >> j)) << (8 - (ptr & 7) - k); + ptr += k; + } + esv->header[esv->h_ptr].ptr = ptr; +} + + +static int +CRC_update(int value, int crc) +{ + int i; + value <<= 8; + for (i = 0; i < 8; i++) { + value <<= 1; + crc <<= 1; + + if (((crc ^ value) & 0x10000)) + crc ^= CRC16_POLYNOMIAL; + } + return crc; +} + + +void +CRC_writeheader(lame_internal_flags const *gfc, char *header) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + int crc = 0xffff; /* (jo) init crc16 for error_protection */ + int i; + + crc = CRC_update(((unsigned char *) header)[2], crc); + crc = CRC_update(((unsigned char *) header)[3], crc); + for (i = 6; i < cfg->sideinfo_len; i++) { + crc = CRC_update(((unsigned char *) header)[i], crc); + } + + header[4] = crc >> 8; + header[5] = crc & 255; +} + +inline static void +encodeSideInfo2(lame_internal_flags * gfc, int bitsPerFrame) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + EncResult_t const *const eov = &gfc->ov_enc; + EncStateVar_t *const esv = &gfc->sv_enc; + III_side_info_t *l3_side; + int gr, ch; + + l3_side = &gfc->l3_side; + esv->header[esv->h_ptr].ptr = 0; + memset(esv->header[esv->h_ptr].buf, 0, cfg->sideinfo_len); + if (cfg->samplerate_out < 16000) + writeheader(gfc, 0xffe, 12); + else + writeheader(gfc, 0xfff, 12); + writeheader(gfc, (cfg->version), 1); + writeheader(gfc, 4 - 3, 2); + writeheader(gfc, (!cfg->error_protection), 1); + writeheader(gfc, (eov->bitrate_index), 4); + writeheader(gfc, (cfg->samplerate_index), 2); + writeheader(gfc, (eov->padding), 1); + writeheader(gfc, (cfg->extension), 1); + writeheader(gfc, (cfg->mode), 2); + writeheader(gfc, (eov->mode_ext), 2); + writeheader(gfc, (cfg->copyright), 1); + writeheader(gfc, (cfg->original), 1); + writeheader(gfc, (cfg->emphasis), 2); + if (cfg->error_protection) { + writeheader(gfc, 0, 16); /* dummy */ + } + + if (cfg->version == 1) { + /* MPEG1 */ + assert(l3_side->main_data_begin >= 0); + writeheader(gfc, (l3_side->main_data_begin), 9); + + if (cfg->channels_out == 2) + writeheader(gfc, l3_side->private_bits, 3); + else + writeheader(gfc, l3_side->private_bits, 5); + + for (ch = 0; ch < cfg->channels_out; ch++) { + int band; + for (band = 0; band < 4; band++) { + writeheader(gfc, l3_side->scfsi[ch][band], 1); + } + } + + for (gr = 0; gr < 2; gr++) { + for (ch = 0; ch < cfg->channels_out; ch++) { + gr_info *const gi = &l3_side->tt[gr][ch]; + writeheader(gfc, gi->part2_3_length + gi->part2_length, 12); + writeheader(gfc, gi->big_values / 2, 9); + writeheader(gfc, gi->global_gain, 8); + writeheader(gfc, gi->scalefac_compress, 4); + + if (gi->block_type != NORM_TYPE) { + writeheader(gfc, 1, 1); /* window_switching_flag */ + writeheader(gfc, gi->block_type, 2); + writeheader(gfc, gi->mixed_block_flag, 1); + + if (gi->table_select[0] == 14) + gi->table_select[0] = 16; + writeheader(gfc, gi->table_select[0], 5); + if (gi->table_select[1] == 14) + gi->table_select[1] = 16; + writeheader(gfc, gi->table_select[1], 5); + + writeheader(gfc, gi->subblock_gain[0], 3); + writeheader(gfc, gi->subblock_gain[1], 3); + writeheader(gfc, gi->subblock_gain[2], 3); + } + else { + writeheader(gfc, 0, 1); /* window_switching_flag */ + if (gi->table_select[0] == 14) + gi->table_select[0] = 16; + writeheader(gfc, gi->table_select[0], 5); + if (gi->table_select[1] == 14) + gi->table_select[1] = 16; + writeheader(gfc, gi->table_select[1], 5); + if (gi->table_select[2] == 14) + gi->table_select[2] = 16; + writeheader(gfc, gi->table_select[2], 5); + + assert(0 <= gi->region0_count && gi->region0_count < 16); + assert(0 <= gi->region1_count && gi->region1_count < 8); + writeheader(gfc, gi->region0_count, 4); + writeheader(gfc, gi->region1_count, 3); + } + writeheader(gfc, gi->preflag, 1); + writeheader(gfc, gi->scalefac_scale, 1); + writeheader(gfc, gi->count1table_select, 1); + } + } + } + else { + /* MPEG2 */ + assert(l3_side->main_data_begin >= 0); + writeheader(gfc, (l3_side->main_data_begin), 8); + writeheader(gfc, l3_side->private_bits, cfg->channels_out); + + gr = 0; + for (ch = 0; ch < cfg->channels_out; ch++) { + gr_info *const gi = &l3_side->tt[gr][ch]; + writeheader(gfc, gi->part2_3_length + gi->part2_length, 12); + writeheader(gfc, gi->big_values / 2, 9); + writeheader(gfc, gi->global_gain, 8); + writeheader(gfc, gi->scalefac_compress, 9); + + if (gi->block_type != NORM_TYPE) { + writeheader(gfc, 1, 1); /* window_switching_flag */ + writeheader(gfc, gi->block_type, 2); + writeheader(gfc, gi->mixed_block_flag, 1); + + if (gi->table_select[0] == 14) + gi->table_select[0] = 16; + writeheader(gfc, gi->table_select[0], 5); + if (gi->table_select[1] == 14) + gi->table_select[1] = 16; + writeheader(gfc, gi->table_select[1], 5); + + writeheader(gfc, gi->subblock_gain[0], 3); + writeheader(gfc, gi->subblock_gain[1], 3); + writeheader(gfc, gi->subblock_gain[2], 3); + } + else { + writeheader(gfc, 0, 1); /* window_switching_flag */ + if (gi->table_select[0] == 14) + gi->table_select[0] = 16; + writeheader(gfc, gi->table_select[0], 5); + if (gi->table_select[1] == 14) + gi->table_select[1] = 16; + writeheader(gfc, gi->table_select[1], 5); + if (gi->table_select[2] == 14) + gi->table_select[2] = 16; + writeheader(gfc, gi->table_select[2], 5); + + assert(0 <= gi->region0_count && gi->region0_count < 16); + assert(0 <= gi->region1_count && gi->region1_count < 8); + writeheader(gfc, gi->region0_count, 4); + writeheader(gfc, gi->region1_count, 3); + } + + writeheader(gfc, gi->scalefac_scale, 1); + writeheader(gfc, gi->count1table_select, 1); + } + } + + if (cfg->error_protection) { + /* (jo) error_protection: add crc16 information to header */ + CRC_writeheader(gfc, esv->header[esv->h_ptr].buf); + } + + { + int const old = esv->h_ptr; + assert(esv->header[old].ptr == cfg->sideinfo_len * 8); + + esv->h_ptr = (old + 1) & (MAX_HEADER_BUF - 1); + esv->header[esv->h_ptr].write_timing = esv->header[old].write_timing + bitsPerFrame; + + if (esv->h_ptr == esv->w_ptr) { + /* yikes! we are out of header buffer space */ + ERRORF(gfc, "Error: MAX_HEADER_BUF too small in bitstream.c \n"); + } + + } +} + + +inline static int +huffman_coder_count1(lame_internal_flags * gfc, gr_info const *gi) +{ + /* Write count1 area */ + struct huffcodetab const *const h = &ht[gi->count1table_select + 32]; + int i, bits = 0; +#ifdef DEBUG + int gegebo = gfc->bs.totbit; +#endif + + int const *ix = &gi->l3_enc[gi->big_values]; + FLOAT const *xr = &gi->xr[gi->big_values]; + assert(gi->count1table_select < 2); + + for (i = (gi->count1 - gi->big_values) / 4; i > 0; --i) { + int huffbits = 0; + int p = 0, v; + + v = ix[0]; + if (v) { + p += 8; + if (xr[0] < 0.0f) + huffbits++; + assert(v <= 1); + } + + v = ix[1]; + if (v) { + p += 4; + huffbits *= 2; + if (xr[1] < 0.0f) + huffbits++; + assert(v <= 1); + } + + v = ix[2]; + if (v) { + p += 2; + huffbits *= 2; + if (xr[2] < 0.0f) + huffbits++; + assert(v <= 1); + } + + v = ix[3]; + if (v) { + p++; + huffbits *= 2; + if (xr[3] < 0.0f) + huffbits++; + assert(v <= 1); + } + + ix += 4; + xr += 4; + putbits2(gfc, huffbits + h->table[p], h->hlen[p]); + bits += h->hlen[p]; + } +#ifdef DEBUG + DEBUGF(gfc, "count1: real: %ld counted:%d (bigv %d count1len %d)\n", + gfc->bs.totbit - gegebo, gi->count1bits, gi->big_values, gi->count1); +#endif + return bits; +} + + + +/* + Implements the pseudocode of page 98 of the IS + */ +inline static int +Huffmancode(lame_internal_flags * const gfc, const unsigned int tableindex, + int start, int end, gr_info const *gi) +{ + struct huffcodetab const *const h = &ht[tableindex]; + unsigned int const linbits = h->xlen; + int i, bits = 0; + + assert(tableindex < 32u); + if (!tableindex) + return bits; + + for (i = start; i < end; i += 2) { + int16_t cbits = 0; + uint16_t xbits = 0; + unsigned int xlen = h->xlen; + unsigned int ext = 0; + unsigned int x1 = gi->l3_enc[i]; + unsigned int x2 = gi->l3_enc[i + 1]; + + assert(gi->l3_enc[i] >= 0); + assert(gi->l3_enc[i+1] >= 0); + + if (x1 != 0u) { + if (gi->xr[i] < 0.0f) + ext++; + cbits--; + } + + if (tableindex > 15u) { + /* use ESC-words */ + if (x1 >= 15u) { + uint16_t const linbits_x1 = x1 - 15u; + assert(linbits_x1 <= h->linmax); + ext |= linbits_x1 << 1u; + xbits = linbits; + x1 = 15u; + } + + if (x2 >= 15u) { + uint16_t const linbits_x2 = x2 - 15u; + assert(linbits_x2 <= h->linmax); + ext <<= linbits; + ext |= linbits_x2; + xbits += linbits; + x2 = 15u; + } + xlen = 16; + } + + if (x2 != 0u) { + ext <<= 1; + if (gi->xr[i + 1] < 0.0f) + ext++; + cbits--; + } + + assert((x1 | x2) < 16u); + + x1 = x1 * xlen + x2; + xbits -= cbits; + cbits += h->hlen[x1]; + + assert(cbits <= MAX_LENGTH); + assert(xbits <= MAX_LENGTH); + + putbits2(gfc, h->table[x1], cbits); + putbits2(gfc, (int)ext, xbits); + bits += cbits + xbits; + } + return bits; +} + +/* + Note the discussion of huffmancodebits() on pages 28 + and 29 of the IS, as well as the definitions of the side + information on pages 26 and 27. + */ +static int +ShortHuffmancodebits(lame_internal_flags * gfc, gr_info const *gi) +{ + int bits; + int region1Start; + + region1Start = 3 * gfc->scalefac_band.s[3]; + if (region1Start > gi->big_values) + region1Start = gi->big_values; + + /* short blocks do not have a region2 */ + bits = Huffmancode(gfc, gi->table_select[0], 0, region1Start, gi); + bits += Huffmancode(gfc, gi->table_select[1], region1Start, gi->big_values, gi); + return bits; +} + +static int +LongHuffmancodebits(lame_internal_flags * gfc, gr_info const *gi) +{ + unsigned int i; + int bigvalues, bits; + int region1Start, region2Start; + + bigvalues = gi->big_values; + assert(0 <= bigvalues && bigvalues <= 576); + + assert(gi->region0_count >= -1); + assert(gi->region1_count >= -1); + i = gi->region0_count + 1; + assert((size_t) i < dimension_of(gfc->scalefac_band.l)); + region1Start = gfc->scalefac_band.l[i]; + i += gi->region1_count + 1; + assert((size_t) i < dimension_of(gfc->scalefac_band.l)); + region2Start = gfc->scalefac_band.l[i]; + + if (region1Start > bigvalues) + region1Start = bigvalues; + + if (region2Start > bigvalues) + region2Start = bigvalues; + + bits = Huffmancode(gfc, gi->table_select[0], 0, region1Start, gi); + bits += Huffmancode(gfc, gi->table_select[1], region1Start, region2Start, gi); + bits += Huffmancode(gfc, gi->table_select[2], region2Start, bigvalues, gi); + return bits; +} + +inline static int +writeMainData(lame_internal_flags * const gfc) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + III_side_info_t const *const l3_side = &gfc->l3_side; + int gr, ch, sfb, data_bits, tot_bits = 0; + + if (cfg->version == 1) { + /* MPEG 1 */ + for (gr = 0; gr < 2; gr++) { + for (ch = 0; ch < cfg->channels_out; ch++) { + gr_info const *const gi = &l3_side->tt[gr][ch]; + int const slen1 = slen1_tab[gi->scalefac_compress]; + int const slen2 = slen2_tab[gi->scalefac_compress]; + data_bits = 0; +#ifdef DEBUG + hogege = gfc->bs.totbit; +#endif + for (sfb = 0; sfb < gi->sfbdivide; sfb++) { + if (gi->scalefac[sfb] == -1) + continue; /* scfsi is used */ + putbits2(gfc, gi->scalefac[sfb], slen1); + data_bits += slen1; + } + for (; sfb < gi->sfbmax; sfb++) { + if (gi->scalefac[sfb] == -1) + continue; /* scfsi is used */ + putbits2(gfc, gi->scalefac[sfb], slen2); + data_bits += slen2; + } + assert(data_bits == gi->part2_length); + + if (gi->block_type == SHORT_TYPE) { + data_bits += ShortHuffmancodebits(gfc, gi); + } + else { + data_bits += LongHuffmancodebits(gfc, gi); + } + data_bits += huffman_coder_count1(gfc, gi); +#ifdef DEBUG + DEBUGF(gfc, "<%ld> ", gfc->bs.totbit - hogege); +#endif + /* does bitcount in quantize.c agree with actual bit count? */ + assert(data_bits == gi->part2_3_length + gi->part2_length); + tot_bits += data_bits; + } /* for ch */ + } /* for gr */ + } + else { + /* MPEG 2 */ + gr = 0; + for (ch = 0; ch < cfg->channels_out; ch++) { + gr_info const *const gi = &l3_side->tt[gr][ch]; + int i, sfb_partition, scale_bits = 0; + assert(gi->sfb_partition_table); + data_bits = 0; +#ifdef DEBUG + hogege = gfc->bs.totbit; +#endif + sfb = 0; + sfb_partition = 0; + + if (gi->block_type == SHORT_TYPE) { + for (; sfb_partition < 4; sfb_partition++) { + int const sfbs = gi->sfb_partition_table[sfb_partition] / 3; + int const slen = gi->slen[sfb_partition]; + for (i = 0; i < sfbs; i++, sfb++) { + putbits2(gfc, Max(gi->scalefac[sfb * 3 + 0], 0), slen); + putbits2(gfc, Max(gi->scalefac[sfb * 3 + 1], 0), slen); + putbits2(gfc, Max(gi->scalefac[sfb * 3 + 2], 0), slen); + scale_bits += 3 * slen; + } + } + data_bits += ShortHuffmancodebits(gfc, gi); + } + else { + for (; sfb_partition < 4; sfb_partition++) { + int const sfbs = gi->sfb_partition_table[sfb_partition]; + int const slen = gi->slen[sfb_partition]; + for (i = 0; i < sfbs; i++, sfb++) { + putbits2(gfc, Max(gi->scalefac[sfb], 0), slen); + scale_bits += slen; + } + } + data_bits += LongHuffmancodebits(gfc, gi); + } + data_bits += huffman_coder_count1(gfc, gi); +#ifdef DEBUG + DEBUGF(gfc, "<%ld> ", gfc->bs.totbit - hogege); +#endif + /* does bitcount in quantize.c agree with actual bit count? */ + assert(data_bits == gi->part2_3_length); + assert(scale_bits == gi->part2_length); + tot_bits += scale_bits + data_bits; + } /* for ch */ + } /* for gf */ + return tot_bits; +} /* main_data */ + + + +/* compute the number of bits required to flush all mp3 frames + currently in the buffer. This should be the same as the + reservoir size. Only call this routine between frames - i.e. + only after all headers and data have been added to the buffer + by format_bitstream(). + + Also compute total_bits_output = + size of mp3 buffer (including frame headers which may not + have yet been send to the mp3 buffer) + + number of bits needed to flush all mp3 frames. + + total_bytes_output is the size of the mp3 output buffer if + lame_encode_flush_nogap() was called right now. + + */ +int +compute_flushbits(const lame_internal_flags * gfc, int *total_bytes_output) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + EncStateVar_t const *const esv = &gfc->sv_enc; + int flushbits, remaining_headers; + int bitsPerFrame; + int last_ptr, first_ptr; + first_ptr = esv->w_ptr; /* first header to add to bitstream */ + last_ptr = esv->h_ptr - 1; /* last header to add to bitstream */ + if (last_ptr == -1) + last_ptr = MAX_HEADER_BUF - 1; + + /* add this many bits to bitstream so we can flush all headers */ + flushbits = esv->header[last_ptr].write_timing - gfc->bs.totbit; + *total_bytes_output = flushbits; + + if (flushbits >= 0) { + /* if flushbits >= 0, some headers have not yet been written */ + /* reduce flushbits by the size of the headers */ + remaining_headers = 1 + last_ptr - first_ptr; + if (last_ptr < first_ptr) + remaining_headers = 1 + last_ptr - first_ptr + MAX_HEADER_BUF; + flushbits -= remaining_headers * 8 * cfg->sideinfo_len; + } + + + /* finally, add some bits so that the last frame is complete + * these bits are not necessary to decode the last frame, but + * some decoders will ignore last frame if these bits are missing + */ + bitsPerFrame = getframebits(gfc); + flushbits += bitsPerFrame; + *total_bytes_output += bitsPerFrame; + /* round up: */ + if (*total_bytes_output % 8) + *total_bytes_output = 1 + (*total_bytes_output / 8); + else + *total_bytes_output = (*total_bytes_output / 8); + *total_bytes_output += gfc->bs.buf_byte_idx + 1; + + + if (flushbits < 0) { +#if 0 + /* if flushbits < 0, this would mean that the buffer looks like: + * (data...) last_header (data...) (extra data that should not be here...) + */ + DEBUGF(gfc, "last header write_timing = %i \n", esv->header[last_ptr].write_timing); + DEBUGF(gfc, "first header write_timing = %i \n", esv->header[first_ptr].write_timing); + DEBUGF(gfc, "bs.totbit: %i \n", gfc->bs.totbit); + DEBUGF(gfc, "first_ptr, last_ptr %i %i \n", first_ptr, last_ptr); + DEBUGF(gfc, "remaining_headers = %i \n", remaining_headers); + DEBUGF(gfc, "bitsperframe: %i \n", bitsPerFrame); + DEBUGF(gfc, "sidelen: %i \n", cfg->sideinfo_len); +#endif + ERRORF(gfc, "strange error flushing buffer ... \n"); + } + return flushbits; +} + + +void +flush_bitstream(lame_internal_flags * gfc) +{ + EncStateVar_t *const esv = &gfc->sv_enc; + III_side_info_t *l3_side; + int nbytes; + int flushbits; + int last_ptr = esv->h_ptr - 1; /* last header to add to bitstream */ + if (last_ptr == -1) + last_ptr = MAX_HEADER_BUF - 1; + l3_side = &gfc->l3_side; + + + if ((flushbits = compute_flushbits(gfc, &nbytes)) < 0) + return; + drain_into_ancillary(gfc, flushbits); + + /* check that the 100% of the last frame has been written to bitstream */ + assert(esv->header[last_ptr].write_timing + getframebits(gfc) + == gfc->bs.totbit); + + /* we have padded out all frames with ancillary data, which is the + same as filling the bitreservoir with ancillary data, so : */ + esv->ResvSize = 0; + l3_side->main_data_begin = 0; +} + + + + +void +add_dummy_byte(lame_internal_flags * gfc, unsigned char val, unsigned int n) +{ + EncStateVar_t *const esv = &gfc->sv_enc; + int i; + + while (n-- > 0u) { + putbits_noheaders(gfc, val, 8); + + for (i = 0; i < MAX_HEADER_BUF; ++i) + esv->header[i].write_timing += 8; + } +} + + +/* + format_bitstream() + + This is called after a frame of audio has been quantized and coded. + It will write the encoded audio to the bitstream. Note that + from a layer3 encoder's perspective the bit stream is primarily + a series of main_data() blocks, with header and side information + inserted at the proper locations to maintain framing. (See Figure A.7 + in the IS). + */ +int +format_bitstream(lame_internal_flags * gfc) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + EncStateVar_t *const esv = &gfc->sv_enc; + int bits, nbytes; + III_side_info_t *l3_side; + int bitsPerFrame; + l3_side = &gfc->l3_side; + + bitsPerFrame = getframebits(gfc); + drain_into_ancillary(gfc, l3_side->resvDrain_pre); + + encodeSideInfo2(gfc, bitsPerFrame); + bits = 8 * cfg->sideinfo_len; + bits += writeMainData(gfc); + drain_into_ancillary(gfc, l3_side->resvDrain_post); + bits += l3_side->resvDrain_post; + + l3_side->main_data_begin += (bitsPerFrame - bits) / 8; + + /* compare number of bits needed to clear all buffered mp3 frames + * with what we think the resvsize is: */ + if (compute_flushbits(gfc, &nbytes) != esv->ResvSize) { + ERRORF(gfc, "Internal buffer inconsistency. flushbits <> ResvSize"); + } + + + /* compare main_data_begin for the next frame with what we + * think the resvsize is: */ + if ((l3_side->main_data_begin * 8) != esv->ResvSize) { + ERRORF(gfc, "bit reservoir error: \n" + "l3_side->main_data_begin: %i \n" + "Resvoir size: %i \n" + "resv drain (post) %i \n" + "resv drain (pre) %i \n" + "header and sideinfo: %i \n" + "data bits: %i \n" + "total bits: %i (remainder: %i) \n" + "bitsperframe: %i \n", + 8 * l3_side->main_data_begin, + esv->ResvSize, + l3_side->resvDrain_post, + l3_side->resvDrain_pre, + 8 * cfg->sideinfo_len, + bits - l3_side->resvDrain_post - 8 * cfg->sideinfo_len, + bits, bits % 8, bitsPerFrame); + + ERRORF(gfc, "This is a fatal error. It has several possible causes:"); + ERRORF(gfc, "90%% LAME compiled with buggy version of gcc using advanced optimizations"); + ERRORF(gfc, " 9%% Your system is overclocked"); + ERRORF(gfc, " 1%% bug in LAME encoding library"); + + esv->ResvSize = l3_side->main_data_begin * 8; + }; + assert(gfc->bs.totbit % 8 == 0); + + if (gfc->bs.totbit > 1000000000) { + /* to avoid totbit overflow, (at 8h encoding at 128kbs) lets reset bit counter */ + int i; + for (i = 0; i < MAX_HEADER_BUF; ++i) + esv->header[i].write_timing -= gfc->bs.totbit; + gfc->bs.totbit = 0; + } + + + return 0; +} + + +static int +do_gain_analysis(lame_internal_flags * gfc, unsigned char* buffer, int minimum) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + RpgStateVar_t const *const rsv = &gfc->sv_rpg; + RpgResult_t *const rov = &gfc->ov_rpg; +#ifdef DECODE_ON_THE_FLY + if (cfg->decode_on_the_fly) { /* decode the frame */ + sample_t pcm_buf[2][1152]; + int mp3_in = minimum; + int samples_out = -1; + + /* re-synthesis to pcm. Repeat until we get a samples_out=0 */ + while (samples_out != 0) { + + samples_out = hip_decode1_unclipped(gfc->hip, buffer, mp3_in, pcm_buf[0], pcm_buf[1]); + /* samples_out = 0: need more data to decode + * samples_out = -1: error. Lets assume 0 pcm output + * samples_out = number of samples output */ + + /* set the lenght of the mp3 input buffer to zero, so that in the + * next iteration of the loop we will be querying mpglib about + * buffered data */ + mp3_in = 0; + + if (samples_out == -1) { + /* error decoding. Not fatal, but might screw up + * the ReplayGain tag. What should we do? Ignore for now */ + samples_out = 0; + } + if (samples_out > 0) { + /* process the PCM data */ + + /* this should not be possible, and indicates we have + * overflown the pcm_buf buffer */ + assert(samples_out <= 1152); + + if (cfg->findPeakSample) { + int i; + /* FIXME: is this correct? maybe Max(fabs(pcm),PeakSample) */ + for (i = 0; i < samples_out; i++) { + if (pcm_buf[0][i] > rov->PeakSample) + rov->PeakSample = pcm_buf[0][i]; + else if (-pcm_buf[0][i] > rov->PeakSample) + rov->PeakSample = -pcm_buf[0][i]; + } + if (cfg->channels_out > 1) + for (i = 0; i < samples_out; i++) { + if (pcm_buf[1][i] > rov->PeakSample) + rov->PeakSample = pcm_buf[1][i]; + else if (-pcm_buf[1][i] > rov->PeakSample) + rov->PeakSample = -pcm_buf[1][i]; + } + } + + if (cfg->findReplayGain) + if (AnalyzeSamples + (rsv->rgdata, pcm_buf[0], pcm_buf[1], samples_out, + cfg->channels_out) == GAIN_ANALYSIS_ERROR) + return -6; + + } /* if (samples_out>0) */ + } /* while (samples_out!=0) */ + } /* if (gfc->decode_on_the_fly) */ +#endif + return minimum; +} + +static int +do_copy_buffer(lame_internal_flags * gfc, unsigned char *buffer, int size) +{ + Bit_stream_struc *const bs = &gfc->bs; + int const minimum = bs->buf_byte_idx + 1; + if (minimum <= 0) + return 0; + if (minimum > size) + return -1; /* buffer is too small */ + memcpy(buffer, bs->buf, minimum); + bs->buf_byte_idx = -1; + bs->buf_bit_idx = 0; + return minimum; +} + +/* copy data out of the internal MP3 bit buffer into a user supplied + unsigned char buffer. + + mp3data=0 indicates data in buffer is an id3tags and VBR tags + mp3data=1 data is real mp3 frame data. + + +*/ +int +copy_buffer(lame_internal_flags * gfc, unsigned char *buffer, int size, int mp3data) +{ + int const minimum = do_copy_buffer(gfc, buffer, size); + if (minimum > 0 && mp3data) { + UpdateMusicCRC(&gfc->nMusicCRC, buffer, minimum); + + /** sum number of bytes belonging to the mp3 stream + * this info will be written into the Xing/LAME header for seeking + */ + gfc->VBR_seek_table.nBytesWritten += minimum; + + return do_gain_analysis(gfc, buffer, minimum); + } /* if (mp3data) */ + return minimum; +} + + +void +init_bit_stream_w(lame_internal_flags * gfc) +{ + EncStateVar_t *const esv = &gfc->sv_enc; + + esv->h_ptr = esv->w_ptr = 0; + esv->header[esv->h_ptr].write_timing = 0; + + gfc->bs.buf = lame_calloc(unsigned char, BUFFER_SIZE); + gfc->bs.buf_size = BUFFER_SIZE; + gfc->bs.buf_byte_idx = -1; + gfc->bs.buf_bit_idx = 0; + gfc->bs.totbit = 0; +} + +/* end of bitstream.c */ diff --git a/libmp3lame/bitstream.h b/libmp3lame/bitstream.h new file mode 100644 index 0000000..3ae48d0 --- /dev/null +++ b/libmp3lame/bitstream.h @@ -0,0 +1,40 @@ +/* + * MP3 bitstream Output interface for LAME + * + * Copyright (c) 1999 Takehiro TOMINAGA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef LAME_BITSTREAM_H +#define LAME_BITSTREAM_H + +int getframebits(const lame_internal_flags * gfc); + +int format_bitstream(lame_internal_flags * gfc); + +void flush_bitstream(lame_internal_flags * gfc); +void add_dummy_byte(lame_internal_flags * gfc, unsigned char val, unsigned int n); + +int copy_buffer(lame_internal_flags * gfc, unsigned char *buffer, int buffer_size, + int update_crc); +void init_bit_stream_w(lame_internal_flags * gfc); +void CRC_writeheader(lame_internal_flags const *gfc, char *buffer); +int compute_flushbits(const lame_internal_flags * gfp, int *nbytes); + +int get_max_frame_buffer_size_by_constraint(SessionConfig_t const * cfg, int constraint); + +#endif diff --git a/libmp3lame/depcomp b/libmp3lame/depcomp new file mode 100755 index 0000000..b39f98f --- /dev/null +++ b/libmp3lame/depcomp @@ -0,0 +1,791 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2016-01-11.22; # UTC + +# Copyright (C) 1999-2017 Free Software Foundation, Inc. + +# This program 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 2, or (at your option) +# any later version. + +# This program 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 this program. If not, see <http://www.gnu.org/licenses/>. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by 'PROGRAMS ARGS'. + object Object file output by 'PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputting dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to <bug-automake@gnu.org>. +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +# Get the directory component of the given path, and save it in the +# global variables '$dir'. Note that this directory component will +# be either empty or ending with a '/' character. This is deliberate. +set_dir_from () +{ + case $1 in + */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; + *) dir=;; + esac +} + +# Get the suffix-stripped basename of the given path, and save it the +# global variable '$base'. +set_base_from () +{ + base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` +} + +# If no dependency file was actually created by the compiler invocation, +# we still have to create a dummy depfile, to avoid errors with the +# Makefile "include basename.Plo" scheme. +make_dummy_depfile () +{ + echo "#dummy" > "$depfile" +} + +# Factor out some common post-processing of the generated depfile. +# Requires the auxiliary global variable '$tmpdepfile' to be set. +aix_post_process_depfile () +{ + # If the compiler actually managed to produce a dependency file, + # post-process it. + if test -f "$tmpdepfile"; then + # Each line is of the form 'foo.o: dependency.h'. + # Do two passes, one to just change these to + # $object: dependency.h + # and one to simply output + # dependency.h: + # which is needed to avoid the deleted-header problem. + { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" + sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" + } > "$depfile" + rm -f "$tmpdepfile" + else + make_dummy_depfile + fi +} + +# A tabulation character. +tab=' ' +# A newline character. +nl=' +' +# Character ranges might be problematic outside the C locale. +# These definitions help. +upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ +lower=abcdefghijklmnopqrstuvwxyz +digits=0123456789 +alpha=${upper}${lower} + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Avoid interferences from the environment. +gccflag= dashmflag= + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvisualcpp +fi + +if test "$depmode" = msvc7msys; then + # This is just like msvc7 but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvc7 +fi + +if test "$depmode" = xlc; then + # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. + gccflag=-qmakedep=gcc,-MF + depmode=gcc +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. +## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. +## (see the conditional assignment to $gccflag above). +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). Also, it might not be +## supported by the other compilers which use the 'gcc' depmode. +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The second -e expression handles DOS-style file names with drive + # letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the "deleted header file" problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. +## Some versions of gcc put a space before the ':'. On the theory +## that the space means something, we add a space to the output as +## well. hp depmode also adds that space, but also prefixes the VPATH +## to the object. Take care to not repeat it in the output. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like '#:fec' to the end of the + # dependency line. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ + | tr "$nl" ' ' >> "$depfile" + echo >> "$depfile" + # The second pass generates a dummy entry for each header file. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" + ;; + +xlc) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts '$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + aix_post_process_depfile + ;; + +tcc) + # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 + # FIXME: That version still under development at the moment of writing. + # Make that this statement remains true also for stable, released + # versions. + # It will wrap lines (doesn't matter whether long or short) with a + # trailing '\', as in: + # + # foo.o : \ + # foo.c \ + # foo.h \ + # + # It will put a trailing '\' even on the last line, and will use leading + # spaces rather than leading tabs (at least since its commit 0394caf7 + # "Emit spaces for -MD"). + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. + # We have to change lines of the first kind to '$object: \'. + sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" + # And for each line of the second kind, we have to emit a 'dep.h:' + # dummy dependency, to avoid the deleted-header problem. + sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" + rm -f "$tmpdepfile" + ;; + +## The order of this option in the case statement is important, since the +## shell code in configure will try each of these formats in the order +## listed in this file. A plain '-MD' option would be understood by many +## compilers, so we must ensure this comes after the gcc and icc options. +pgcc) + # Portland's C compiler understands '-MD'. + # Will always output deps to 'file.d' where file is the root name of the + # source file under compilation, even if file resides in a subdirectory. + # The object file name does not affect the name of the '.d' file. + # pgcc 10.2 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using '\' : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + set_dir_from "$object" + # Use the source, not the object, to determine the base name, since + # that's sadly what pgcc will do too. + set_base_from "$source" + tmpdepfile=$base.d + + # For projects that build the same source file twice into different object + # files, the pgcc approach of using the *source* file root name can cause + # problems in parallel builds. Use a locking strategy to avoid stomping on + # the same $tmpdepfile. + lockdir=$base.d-lock + trap " + echo '$0: caught signal, cleaning up...' >&2 + rmdir '$lockdir' + exit 1 + " 1 2 13 15 + numtries=100 + i=$numtries + while test $i -gt 0; do + # mkdir is a portable test-and-set. + if mkdir "$lockdir" 2>/dev/null; then + # This process acquired the lock. + "$@" -MD + stat=$? + # Release the lock. + rmdir "$lockdir" + break + else + # If the lock is being held by a different process, wait + # until the winning process is done or we timeout. + while test -d "$lockdir" && test $i -gt 0; do + sleep 1 + i=`expr $i - 1` + done + fi + i=`expr $i - 1` + done + trap - 1 2 13 15 + if test $i -le 0; then + echo "$0: failed to acquire lock after $numtries attempts" >&2 + echo "$0: check lockdir '$lockdir'" >&2 + exit 1 + fi + + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" + # Add 'dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in 'foo.d' instead, so we check for that too. + # Subdirectories are respected. + set_dir_from "$object" + set_base_from "$object" + + if test "$libtool" = yes; then + # Libtool generates 2 separate objects for the 2 libraries. These + # two compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir$base.o.d # libtool 1.5 + tmpdepfile2=$dir.libs/$base.o.d # Likewise. + tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + # Same post-processing that is required for AIX mode. + aix_post_process_depfile + ;; + +msvc7) + if test "$libtool" = yes; then + showIncludes=-Wc,-showIncludes + else + showIncludes=-showIncludes + fi + "$@" $showIncludes > "$tmpdepfile" + stat=$? + grep -v '^Note: including file: ' "$tmpdepfile" + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The first sed program below extracts the file names and escapes + # backslashes for cygpath. The second sed program outputs the file + # name when reading, but also accumulates all include files in the + # hold buffer in order to output them again at the end. This only + # works with sed implementations that can handle large buffers. + sed < "$tmpdepfile" -n ' +/^Note: including file: *\(.*\)/ { + s//\1/ + s/\\/\\\\/g + p +}' | $cygpath_u | sort -u | sed -n ' +s/ /\\ /g +s/\(.*\)/'"$tab"'\1 \\/p +s/.\(.*\) \\/\1:/ +H +$ { + s/.*/'"$tab"'/ + G + p +}' >> "$depfile" + echo >> "$depfile" # make sure the fragment doesn't end with a backslash + rm -f "$tmpdepfile" + ;; + +msvc7msys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for ':' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. + "$@" $dashmflag | + sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this sed invocation + # correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + # makedepend may prepend the VPATH from the source file name to the object. + # No need to regex-escape $object, excess matching of '.' is harmless. + sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process the last invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed '1,2d' "$tmpdepfile" \ + | tr ' ' "$nl" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E \ + | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + | sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" + echo "$tab" >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/libmp3lame/encoder.c b/libmp3lame/encoder.c new file mode 100644 index 0000000..48f46c7 --- /dev/null +++ b/libmp3lame/encoder.c @@ -0,0 +1,574 @@ +/* + * LAME MP3 encoding engine + * + * Copyright (c) 1999 Mark Taylor + * Copyright (c) 2000-2002 Takehiro Tominaga + * Copyright (c) 2000-2011 Robert Hegemann + * Copyright (c) 2001 Gabriel Bouvigne + * Copyright (c) 2001 John Dahlstrom + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* $Id: encoder.c,v 1.114 2017/08/26 10:54:57 robert Exp $ */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + + +#include "lame.h" +#include "machine.h" +#include "encoder.h" +#include "util.h" +#include "lame_global_flags.h" +#include "newmdct.h" +#include "psymodel.h" +#include "lame-analysis.h" +#include "bitstream.h" +#include "VbrTag.h" +#include "quantize.h" +#include "quantize_pvt.h" + + + +/* + * auto-adjust of ATH, useful for low volume + * Gabriel Bouvigne 3 feb 2001 + * + * modifies some values in + * gfp->internal_flags->ATH + * (gfc->ATH) + */ +static void +adjust_ATH(lame_internal_flags const *const gfc) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + FLOAT gr2_max, max_pow; + + if (gfc->ATH->use_adjust == 0) { + gfc->ATH->adjust_factor = 1.0; /* no adjustment */ + return; + } + + /* jd - 2001 mar 12, 27, jun 30 */ + /* loudness based on equal loudness curve; */ + /* use granule with maximum combined loudness */ + max_pow = gfc->ov_psy.loudness_sq[0][0]; + gr2_max = gfc->ov_psy.loudness_sq[1][0]; + if (cfg->channels_out == 2) { + max_pow += gfc->ov_psy.loudness_sq[0][1]; + gr2_max += gfc->ov_psy.loudness_sq[1][1]; + } + else { + max_pow += max_pow; + gr2_max += gr2_max; + } + if (cfg->mode_gr == 2) { + max_pow = Max(max_pow, gr2_max); + } + max_pow *= 0.5; /* max_pow approaches 1.0 for full band noise */ + + /* jd - 2001 mar 31, jun 30 */ + /* user tuning of ATH adjustment region */ + max_pow *= gfc->ATH->aa_sensitivity_p; + + /* adjust ATH depending on range of maximum value + */ + + /* jd - 2001 feb27, mar12,20, jun30, jul22 */ + /* continuous curves based on approximation */ + /* to GB's original values. */ + /* For an increase in approximate loudness, */ + /* set ATH adjust to adjust_limit immediately */ + /* after a delay of one frame. */ + /* For a loudness decrease, reduce ATH adjust */ + /* towards adjust_limit gradually. */ + /* max_pow is a loudness squared or a power. */ + if (max_pow > 0.03125) { /* ((1 - 0.000625)/ 31.98) from curve below */ + if (gfc->ATH->adjust_factor >= 1.0) { + gfc->ATH->adjust_factor = 1.0; + } + else { + /* preceding frame has lower ATH adjust; */ + /* ascend only to the preceding adjust_limit */ + /* in case there is leading low volume */ + if (gfc->ATH->adjust_factor < gfc->ATH->adjust_limit) { + gfc->ATH->adjust_factor = gfc->ATH->adjust_limit; + } + } + gfc->ATH->adjust_limit = 1.0; + } + else { /* adjustment curve */ + /* about 32 dB maximum adjust (0.000625) */ + FLOAT const adj_lim_new = 31.98 * max_pow + 0.000625; + if (gfc->ATH->adjust_factor >= adj_lim_new) { /* descend gradually */ + gfc->ATH->adjust_factor *= adj_lim_new * 0.075 + 0.925; + if (gfc->ATH->adjust_factor < adj_lim_new) { /* stop descent */ + gfc->ATH->adjust_factor = adj_lim_new; + } + } + else { /* ascend */ + if (gfc->ATH->adjust_limit >= adj_lim_new) { + gfc->ATH->adjust_factor = adj_lim_new; + } + else { /* preceding frame has lower ATH adjust; */ + /* ascend only to the preceding adjust_limit */ + if (gfc->ATH->adjust_factor < gfc->ATH->adjust_limit) { + gfc->ATH->adjust_factor = gfc->ATH->adjust_limit; + } + } + } + gfc->ATH->adjust_limit = adj_lim_new; + } +} + +/*********************************************************************** + * + * some simple statistics + * + * bitrate index 0: free bitrate -> not allowed in VBR mode + * : bitrates, kbps depending on MPEG version + * bitrate index 15: forbidden + * + * mode_ext: + * 0: LR + * 1: LR-i + * 2: MS + * 3: MS-i + * + ***********************************************************************/ + +static void +updateStats(lame_internal_flags * const gfc) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + EncResult_t *eov = &gfc->ov_enc; + int gr, ch; + assert(0 <= eov->bitrate_index && eov->bitrate_index < 16); + assert(0 <= eov->mode_ext && eov->mode_ext < 4); + + /* count bitrate indices */ + eov->bitrate_channelmode_hist[eov->bitrate_index][4]++; + eov->bitrate_channelmode_hist[15][4]++; + + /* count 'em for every mode extension in case of 2 channel encoding */ + if (cfg->channels_out == 2) { + eov->bitrate_channelmode_hist[eov->bitrate_index][eov->mode_ext]++; + eov->bitrate_channelmode_hist[15][eov->mode_ext]++; + } + for (gr = 0; gr < cfg->mode_gr; ++gr) { + for (ch = 0; ch < cfg->channels_out; ++ch) { + int bt = gfc->l3_side.tt[gr][ch].block_type; + if (gfc->l3_side.tt[gr][ch].mixed_block_flag) + bt = 4; + eov->bitrate_blocktype_hist[eov->bitrate_index][bt]++; + eov->bitrate_blocktype_hist[eov->bitrate_index][5]++; + eov->bitrate_blocktype_hist[15][bt]++; + eov->bitrate_blocktype_hist[15][5]++; + } + } +} + + + + +static void +lame_encode_frame_init(lame_internal_flags * gfc, const sample_t *const inbuf[2]) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + + int ch, gr; + + if (gfc->lame_encode_frame_init == 0) { + sample_t primebuff0[286 + 1152 + 576]; + sample_t primebuff1[286 + 1152 + 576]; + int const framesize = 576 * cfg->mode_gr; + /* prime the MDCT/polyphase filterbank with a short block */ + int i, j; + gfc->lame_encode_frame_init = 1; + memset(primebuff0, 0, sizeof(primebuff0)); + memset(primebuff1, 0, sizeof(primebuff1)); + for (i = 0, j = 0; i < 286 + 576 * (1 + cfg->mode_gr); ++i) { + if (i < framesize) { + primebuff0[i] = 0; + if (cfg->channels_out == 2) + primebuff1[i] = 0; + } + else { + primebuff0[i] = inbuf[0][j]; + if (cfg->channels_out == 2) + primebuff1[i] = inbuf[1][j]; + ++j; + } + } + /* polyphase filtering / mdct */ + for (gr = 0; gr < cfg->mode_gr; gr++) { + for (ch = 0; ch < cfg->channels_out; ch++) { + gfc->l3_side.tt[gr][ch].block_type = SHORT_TYPE; + } + } + mdct_sub48(gfc, primebuff0, primebuff1); + + /* check FFT will not use a negative starting offset */ +#if 576 < FFTOFFSET +# error FFTOFFSET greater than 576: FFT uses a negative offset +#endif + /* check if we have enough data for FFT */ + assert(gfc->sv_enc.mf_size >= (BLKSIZE + framesize - FFTOFFSET)); + /* check if we have enough data for polyphase filterbank */ + assert(gfc->sv_enc.mf_size >= (512 + framesize - 32)); + } + +} + + + + + + + +/************************************************************************ +* +* encodeframe() Layer 3 +* +* encode a single frame +* +************************************************************************ +lame_encode_frame() + + + gr 0 gr 1 +inbuf: |--------------|--------------|--------------| + + +Polyphase (18 windows, each shifted 32) +gr 0: +window1 <----512----> +window18 <----512----> + +gr 1: +window1 <----512----> +window18 <----512----> + + + +MDCT output: |--------------|--------------|--------------| + +FFT's <---------1024----------> + <---------1024--------> + + + + inbuf = buffer of PCM data size=MP3 framesize + encoder acts on inbuf[ch][0], but output is delayed by MDCTDELAY + so the MDCT coefficints are from inbuf[ch][-MDCTDELAY] + + psy-model FFT has a 1 granule delay, so we feed it data for the + next granule. + FFT is centered over granule: 224+576+224 + So FFT starts at: 576-224-MDCTDELAY + + MPEG2: FFT ends at: BLKSIZE+576-224-MDCTDELAY (1328) + MPEG1: FFT ends at: BLKSIZE+2*576-224-MDCTDELAY (1904) + + MPEG2: polyphase first window: [0..511] + 18th window: [544..1055] (1056) + MPEG1: 36th window: [1120..1631] (1632) + data needed: 512+framesize-32 + + A close look newmdct.c shows that the polyphase filterbank + only uses data from [0..510] for each window. Perhaps because the window + used by the filterbank is zero for the last point, so Takehiro's + code doesn't bother to compute with it. + + FFT starts at 576-224-MDCTDELAY (304) = 576-FFTOFFSET + +*/ + +typedef FLOAT chgrdata[2][2]; + + +int +lame_encode_mp3_frame( /* Output */ + lame_internal_flags * gfc, /* Context */ + sample_t const *inbuf_l, /* Input */ + sample_t const *inbuf_r, /* Input */ + unsigned char *mp3buf, /* Output */ + int mp3buf_size) +{ /* Output */ + SessionConfig_t const *const cfg = &gfc->cfg; + int mp3count; + III_psy_ratio masking_LR[2][2]; /*LR masking & energy */ + III_psy_ratio masking_MS[2][2]; /*MS masking & energy */ + const III_psy_ratio (*masking)[2]; /*pointer to selected maskings */ + const sample_t *inbuf[2]; + + FLOAT tot_ener[2][4]; + FLOAT ms_ener_ratio[2] = { .5, .5 }; + FLOAT pe[2][2] = { {0., 0.}, {0., 0.} }, pe_MS[2][2] = { { + 0., 0.}, { + 0., 0.}}; + FLOAT (*pe_use)[2]; + + int ch, gr; + + inbuf[0] = inbuf_l; + inbuf[1] = inbuf_r; + + if (gfc->lame_encode_frame_init == 0) { + /*first run? */ + lame_encode_frame_init(gfc, inbuf); + + } + + + /********************** padding *****************************/ + /* padding method as described in + * "MPEG-Layer3 / Bitstream Syntax and Decoding" + * by Martin Sieler, Ralph Sperschneider + * + * note: there is no padding for the very first frame + * + * Robert Hegemann 2000-06-22 + */ + gfc->ov_enc.padding = FALSE; + if ((gfc->sv_enc.slot_lag -= gfc->sv_enc.frac_SpF) < 0) { + gfc->sv_enc.slot_lag += cfg->samplerate_out; + gfc->ov_enc.padding = TRUE; + } + + + + /**************************************** + * Stage 1: psychoacoustic model * + ****************************************/ + + { + /* psychoacoustic model + * psy model has a 1 granule (576) delay that we must compensate for + * (mt 6/99). + */ + int ret; + const sample_t *bufp[2] = {0, 0}; /* address of beginning of left & right granule */ + int blocktype[2]; + + for (gr = 0; gr < cfg->mode_gr; gr++) { + + for (ch = 0; ch < cfg->channels_out; ch++) { + bufp[ch] = &inbuf[ch][576 + gr * 576 - FFTOFFSET]; + } + ret = L3psycho_anal_vbr(gfc, bufp, gr, + masking_LR, masking_MS, + pe[gr], pe_MS[gr], tot_ener[gr], blocktype); + if (ret != 0) + return -4; + + if (cfg->mode == JOINT_STEREO) { + ms_ener_ratio[gr] = tot_ener[gr][2] + tot_ener[gr][3]; + if (ms_ener_ratio[gr] > 0) + ms_ener_ratio[gr] = tot_ener[gr][3] / ms_ener_ratio[gr]; + } + + /* block type flags */ + for (ch = 0; ch < cfg->channels_out; ch++) { + gr_info *const cod_info = &gfc->l3_side.tt[gr][ch]; + cod_info->block_type = blocktype[ch]; + cod_info->mixed_block_flag = 0; + } + } + } + + + /* auto-adjust of ATH, useful for low volume */ + adjust_ATH(gfc); + + + /**************************************** + * Stage 2: MDCT * + ****************************************/ + + /* polyphase filtering / mdct */ + mdct_sub48(gfc, inbuf[0], inbuf[1]); + + + /**************************************** + * Stage 3: MS/LR decision * + ****************************************/ + + /* Here will be selected MS or LR coding of the 2 stereo channels */ + gfc->ov_enc.mode_ext = MPG_MD_LR_LR; + + if (cfg->force_ms) { + gfc->ov_enc.mode_ext = MPG_MD_MS_LR; + } + else if (cfg->mode == JOINT_STEREO) { + /* ms_ratio = is scaled, for historical reasons, to look like + a ratio of side_channel / total. + 0 = signal is 100% mono + .5 = L & R uncorrelated + */ + + /* [0] and [1] are the results for the two granules in MPEG-1, + * in MPEG-2 it's only a faked averaging of the same value + * _prev is the value of the last granule of the previous frame + * _next is the value of the first granule of the next frame + */ + + FLOAT sum_pe_MS = 0; + FLOAT sum_pe_LR = 0; + for (gr = 0; gr < cfg->mode_gr; gr++) { + for (ch = 0; ch < cfg->channels_out; ch++) { + sum_pe_MS += pe_MS[gr][ch]; + sum_pe_LR += pe[gr][ch]; + } + } + + /* based on PE: M/S coding would not use much more bits than L/R */ + if (sum_pe_MS <= 1.00 * sum_pe_LR) { + + gr_info const *const gi0 = &gfc->l3_side.tt[0][0]; + gr_info const *const gi1 = &gfc->l3_side.tt[cfg->mode_gr - 1][0]; + + if (gi0[0].block_type == gi0[1].block_type && gi1[0].block_type == gi1[1].block_type) { + + gfc->ov_enc.mode_ext = MPG_MD_MS_LR; + } + } + } + + /* bit and noise allocation */ + if (gfc->ov_enc.mode_ext == MPG_MD_MS_LR) { + masking = (const III_psy_ratio (*)[2])masking_MS; /* use MS masking */ + pe_use = pe_MS; + } + else { + masking = (const III_psy_ratio (*)[2])masking_LR; /* use LR masking */ + pe_use = pe; + } + + + /* copy data for MP3 frame analyzer */ + if (cfg->analysis && gfc->pinfo != NULL) { + for (gr = 0; gr < cfg->mode_gr; gr++) { + for (ch = 0; ch < cfg->channels_out; ch++) { + gfc->pinfo->ms_ratio[gr] = 0; + gfc->pinfo->ms_ener_ratio[gr] = ms_ener_ratio[gr]; + gfc->pinfo->blocktype[gr][ch] = gfc->l3_side.tt[gr][ch].block_type; + gfc->pinfo->pe[gr][ch] = pe_use[gr][ch]; + memcpy(gfc->pinfo->xr[gr][ch], &gfc->l3_side.tt[gr][ch].xr[0], sizeof(FLOAT) * 576); + /* in psymodel, LR and MS data was stored in pinfo. + switch to MS data: */ + if (gfc->ov_enc.mode_ext == MPG_MD_MS_LR) { + gfc->pinfo->ers[gr][ch] = gfc->pinfo->ers[gr][ch + 2]; + memcpy(gfc->pinfo->energy[gr][ch], gfc->pinfo->energy[gr][ch + 2], + sizeof(gfc->pinfo->energy[gr][ch])); + } + } + } + } + + + /**************************************** + * Stage 4: quantization loop * + ****************************************/ + + if (cfg->vbr == vbr_off || cfg->vbr == vbr_abr) { + static FLOAT const fircoef[9] = { + -0.0207887 * 5, -0.0378413 * 5, -0.0432472 * 5, -0.031183 * 5, + 7.79609e-18 * 5, 0.0467745 * 5, 0.10091 * 5, 0.151365 * 5, + 0.187098 * 5 + }; + + int i; + FLOAT f; + + for (i = 0; i < 18; i++) + gfc->sv_enc.pefirbuf[i] = gfc->sv_enc.pefirbuf[i + 1]; + + f = 0.0; + for (gr = 0; gr < cfg->mode_gr; gr++) + for (ch = 0; ch < cfg->channels_out; ch++) + f += pe_use[gr][ch]; + gfc->sv_enc.pefirbuf[18] = f; + + f = gfc->sv_enc.pefirbuf[9]; + for (i = 0; i < 9; i++) + f += (gfc->sv_enc.pefirbuf[i] + gfc->sv_enc.pefirbuf[18 - i]) * fircoef[i]; + + f = (670 * 5 * cfg->mode_gr * cfg->channels_out) / f; + for (gr = 0; gr < cfg->mode_gr; gr++) { + for (ch = 0; ch < cfg->channels_out; ch++) { + pe_use[gr][ch] *= f; + } + } + } + switch (cfg->vbr) + { + default: + case vbr_off: + CBR_iteration_loop(gfc, (const FLOAT (*)[2])pe_use, ms_ener_ratio, masking); + break; + case vbr_abr: + ABR_iteration_loop(gfc, (const FLOAT (*)[2])pe_use, ms_ener_ratio, masking); + break; + case vbr_rh: + VBR_old_iteration_loop(gfc, (const FLOAT (*)[2])pe_use, ms_ener_ratio, masking); + break; + case vbr_mt: + case vbr_mtrh: + VBR_new_iteration_loop(gfc, (const FLOAT (*)[2])pe_use, ms_ener_ratio, masking); + break; + } + + + /**************************************** + * Stage 5: bitstream formatting * + ****************************************/ + + + /* write the frame to the bitstream */ + (void) format_bitstream(gfc); + + /* copy mp3 bit buffer into array */ + mp3count = copy_buffer(gfc, mp3buf, mp3buf_size, 1); + + + if (cfg->write_lame_tag) { + AddVbrFrame(gfc); + } + + if (cfg->analysis && gfc->pinfo != NULL) { + int framesize = 576 * cfg->mode_gr; + for (ch = 0; ch < cfg->channels_out; ch++) { + int j; + for (j = 0; j < FFTOFFSET; j++) + gfc->pinfo->pcmdata[ch][j] = gfc->pinfo->pcmdata[ch][j + framesize]; + for (j = FFTOFFSET; j < 1600; j++) { + gfc->pinfo->pcmdata[ch][j] = inbuf[ch][j - FFTOFFSET]; + } + } + gfc->sv_qnt.masking_lower = 1.0; + + set_frame_pinfo(gfc, masking); + } + + ++gfc->ov_enc.frame_number; + + updateStats(gfc); + + return mp3count; +} diff --git a/libmp3lame/encoder.h b/libmp3lame/encoder.h new file mode 100644 index 0000000..b06a7c6 --- /dev/null +++ b/libmp3lame/encoder.h @@ -0,0 +1,156 @@ +/* + * encoder.h include file + * + * Copyright (c) 2000 Mark Taylor + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + + +#ifndef LAME_ENCODER_H +#define LAME_ENCODER_H + +/*********************************************************************** +* +* encoder and decoder delays +* +***********************************************************************/ + +/* + * layer III enc->dec delay: 1056 (1057?) (observed) + * layer II enc->dec delay: 480 (481?) (observed) + * + * polyphase 256-16 (dec or enc) = 240 + * mdct 256+32 (9*32) (dec or enc) = 288 + * total: 512+16 + * + * My guess is that delay of polyphase filterbank is actualy 240.5 + * (there are technical reasons for this, see postings in mp3encoder). + * So total Encode+Decode delay = ENCDELAY + 528 + 1 + */ + +/* + * ENCDELAY The encoder delay. + * + * Minimum allowed is MDCTDELAY (see below) + * + * The first 96 samples will be attenuated, so using a value less than 96 + * will result in corrupt data for the first 96-ENCDELAY samples. + * + * suggested: 576 + * set to 1160 to sync with FhG. + */ + +#define ENCDELAY 576 + + + +/* + * make sure there is at least one complete frame after the + * last frame containing real data + * + * Using a value of 288 would be sufficient for a + * a very sophisticated decoder that can decode granule-by-granule instead + * of frame by frame. But lets not assume this, and assume the decoder + * will not decode frame N unless it also has data for frame N+1 + * + */ +/*#define POSTDELAY 288*/ +#define POSTDELAY 1152 + + + +/* + * delay of the MDCT used in mdct.c + * original ISO routines had a delay of 528! + * Takehiro's routines: + */ + +#define MDCTDELAY 48 +#define FFTOFFSET (224+MDCTDELAY) + +/* + * Most decoders, including the one we use, have a delay of 528 samples. + */ + +#define DECDELAY 528 + + +/* number of subbands */ +#define SBLIMIT 32 + +/* parition bands bands */ +#define CBANDS 64 + +/* number of critical bands/scale factor bands where masking is computed*/ +#define SBPSY_l 21 +#define SBPSY_s 12 + +/* total number of scalefactor bands encoded */ +#define SBMAX_l 22 +#define SBMAX_s 13 +#define PSFB21 6 +#define PSFB12 6 + + + +/* FFT sizes */ +#define BLKSIZE 1024 +#define HBLKSIZE (BLKSIZE/2 + 1) +#define BLKSIZE_s 256 +#define HBLKSIZE_s (BLKSIZE_s/2 + 1) + + +/* #define switch_pe 1800 */ +#define NORM_TYPE 0 +#define START_TYPE 1 +#define SHORT_TYPE 2 +#define STOP_TYPE 3 + +/* + * Mode Extention: + * When we are in stereo mode, there are 4 possible methods to store these + * two channels. The stereo modes -m? are using a subset of them. + * + * -ms: MPG_MD_LR_LR + * -mj: MPG_MD_LR_LR and MPG_MD_MS_LR + * -mf: MPG_MD_MS_LR + * -mi: all + */ +#if 0 +#define MPG_MD_LR_LR 0 +#define MPG_MD_LR_I 1 +#define MPG_MD_MS_LR 2 +#define MPG_MD_MS_I 3 +#endif +enum MPEGChannelMode +{ MPG_MD_LR_LR = 0 +, MPG_MD_LR_I = 1 +, MPG_MD_MS_LR = 2 +, MPG_MD_MS_I = 3 +}; + +#ifndef lame_internal_flags_defined +#define lame_internal_flags_defined +struct lame_internal_flags; +typedef struct lame_internal_flags lame_internal_flags; +#endif + +int lame_encode_mp3_frame(lame_internal_flags * gfc, + sample_t const *inbuf_l, + sample_t const *inbuf_r, unsigned char *mp3buf, int mp3buf_size); + +#endif /* LAME_ENCODER_H */ diff --git a/libmp3lame/fft.c b/libmp3lame/fft.c new file mode 100644 index 0000000..4eea1ad --- /dev/null +++ b/libmp3lame/fft.c @@ -0,0 +1,339 @@ +/* +** FFT and FHT routines +** Copyright 1988, 1993; Ron Mayer +** Copyright (c) 1999-2000 Takehiro Tominaga +** +** fht(fz,n); +** Does a hartley transform of "n" points in the array "fz". +** +** NOTE: This routine uses at least 2 patented algorithms, and may be +** under the restrictions of a bunch of different organizations. +** Although I wrote it completely myself; it is kind of a derivative +** of a routine I once authored and released under the GPL, so it +** may fall under the free software foundation's restrictions; +** it was worked on as a Stanford Univ project, so they claim +** some rights to it; it was further optimized at work here, so +** I think this company claims parts of it. The patents are +** held by R. Bracewell (the FHT algorithm) and O. Buneman (the +** trig generator), both at Stanford Univ. +** If it were up to me, I'd say go do whatever you want with it; +** but it would be polite to give credit to the following people +** if you use this anywhere: +** Euler - probable inventor of the fourier transform. +** Gauss - probable inventor of the FFT. +** Hartley - probable inventor of the hartley transform. +** Buneman - for a really cool trig generator +** Mayer(me) - for authoring this particular version and +** including all the optimizations in one package. +** Thanks, +** Ron Mayer; mayer@acuson.com +** and added some optimization by +** Mather - idea of using lookup table +** Takehiro - some dirty hack for speed up +*/ + +/* $Id: fft.c,v 1.39 2017/09/06 15:07:29 robert Exp $ */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include "lame.h" +#include "machine.h" +#include "encoder.h" +#include "util.h" +#include "fft.h" + +#include "vector/lame_intrin.h" + + + +#define TRI_SIZE (5-1) /* 1024 = 4**5 */ + +/* fft.c */ + +static const FLOAT costab[TRI_SIZE * 2] = { + 9.238795325112867e-01, 3.826834323650898e-01, + 9.951847266721969e-01, 9.801714032956060e-02, + 9.996988186962042e-01, 2.454122852291229e-02, + 9.999811752826011e-01, 6.135884649154475e-03 +}; + +static void +fht(FLOAT * fz, int n) +{ + const FLOAT *tri = costab; + int k4; + FLOAT *fi, *gi; + FLOAT const *fn; + + n <<= 1; /* to get BLKSIZE, because of 3DNow! ASM routine */ + fn = fz + n; + k4 = 4; + do { + FLOAT s1, c1; + int i, k1, k2, k3, kx; + kx = k4 >> 1; + k1 = k4; + k2 = k4 << 1; + k3 = k2 + k1; + k4 = k2 << 1; + fi = fz; + gi = fi + kx; + do { + FLOAT f0, f1, f2, f3; + f1 = fi[0] - fi[k1]; + f0 = fi[0] + fi[k1]; + f3 = fi[k2] - fi[k3]; + f2 = fi[k2] + fi[k3]; + fi[k2] = f0 - f2; + fi[0] = f0 + f2; + fi[k3] = f1 - f3; + fi[k1] = f1 + f3; + f1 = gi[0] - gi[k1]; + f0 = gi[0] + gi[k1]; + f3 = SQRT2 * gi[k3]; + f2 = SQRT2 * gi[k2]; + gi[k2] = f0 - f2; + gi[0] = f0 + f2; + gi[k3] = f1 - f3; + gi[k1] = f1 + f3; + gi += k4; + fi += k4; + } while (fi < fn); + c1 = tri[0]; + s1 = tri[1]; + for (i = 1; i < kx; i++) { + FLOAT c2, s2; + c2 = 1 - (2 * s1) * s1; + s2 = (2 * s1) * c1; + fi = fz + i; + gi = fz + k1 - i; + do { + FLOAT a, b, g0, f0, f1, g1, f2, g2, f3, g3; + b = s2 * fi[k1] - c2 * gi[k1]; + a = c2 * fi[k1] + s2 * gi[k1]; + f1 = fi[0] - a; + f0 = fi[0] + a; + g1 = gi[0] - b; + g0 = gi[0] + b; + b = s2 * fi[k3] - c2 * gi[k3]; + a = c2 * fi[k3] + s2 * gi[k3]; + f3 = fi[k2] - a; + f2 = fi[k2] + a; + g3 = gi[k2] - b; + g2 = gi[k2] + b; + b = s1 * f2 - c1 * g3; + a = c1 * f2 + s1 * g3; + fi[k2] = f0 - a; + fi[0] = f0 + a; + gi[k3] = g1 - b; + gi[k1] = g1 + b; + b = c1 * g2 - s1 * f3; + a = s1 * g2 + c1 * f3; + gi[k2] = g0 - a; + gi[0] = g0 + a; + fi[k3] = f1 - b; + fi[k1] = f1 + b; + gi += k4; + fi += k4; + } while (fi < fn); + c2 = c1; + c1 = c2 * tri[0] - s1 * tri[1]; + s1 = c2 * tri[1] + s1 * tri[0]; + } + tri += 2; + } while (k4 < n); +} + + +static const unsigned char rv_tbl[] = { + 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, + 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0, + 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, + 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, + 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, + 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4, + 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, + 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc, + 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, + 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, + 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, + 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa, + 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, + 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6, + 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, + 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe +}; + +#define ch01(index) (buffer[chn][index]) + +#define ml00(f) (window[i ] * f(i)) +#define ml10(f) (window[i + 0x200] * f(i + 0x200)) +#define ml20(f) (window[i + 0x100] * f(i + 0x100)) +#define ml30(f) (window[i + 0x300] * f(i + 0x300)) + +#define ml01(f) (window[i + 0x001] * f(i + 0x001)) +#define ml11(f) (window[i + 0x201] * f(i + 0x201)) +#define ml21(f) (window[i + 0x101] * f(i + 0x101)) +#define ml31(f) (window[i + 0x301] * f(i + 0x301)) + +#define ms00(f) (window_s[i ] * f(i + k)) +#define ms10(f) (window_s[0x7f - i] * f(i + k + 0x80)) +#define ms20(f) (window_s[i + 0x40] * f(i + k + 0x40)) +#define ms30(f) (window_s[0x3f - i] * f(i + k + 0xc0)) + +#define ms01(f) (window_s[i + 0x01] * f(i + k + 0x01)) +#define ms11(f) (window_s[0x7e - i] * f(i + k + 0x81)) +#define ms21(f) (window_s[i + 0x41] * f(i + k + 0x41)) +#define ms31(f) (window_s[0x3e - i] * f(i + k + 0xc1)) + +void +fft_short(lame_internal_flags const *const gfc, + FLOAT x_real[3][BLKSIZE_s], int chn, const sample_t *const buffer[2]) +{ + int i; + int j; + int b; + +#define window_s gfc->cd_psy->window_s +#define window gfc->cd_psy->window + + for (b = 0; b < 3; b++) { + FLOAT *x = &x_real[b][BLKSIZE_s / 2]; + short const k = (576 / 3) * (b + 1); + j = BLKSIZE_s / 8 - 1; + do { + FLOAT f0, f1, f2, f3, w; + + i = rv_tbl[j << 2]; + + f0 = ms00(ch01); + w = ms10(ch01); + f1 = f0 - w; + f0 = f0 + w; + f2 = ms20(ch01); + w = ms30(ch01); + f3 = f2 - w; + f2 = f2 + w; + + x -= 4; + x[0] = f0 + f2; + x[2] = f0 - f2; + x[1] = f1 + f3; + x[3] = f1 - f3; + + f0 = ms01(ch01); + w = ms11(ch01); + f1 = f0 - w; + f0 = f0 + w; + f2 = ms21(ch01); + w = ms31(ch01); + f3 = f2 - w; + f2 = f2 + w; + + x[BLKSIZE_s / 2 + 0] = f0 + f2; + x[BLKSIZE_s / 2 + 2] = f0 - f2; + x[BLKSIZE_s / 2 + 1] = f1 + f3; + x[BLKSIZE_s / 2 + 3] = f1 - f3; + } while (--j >= 0); + +#undef window +#undef window_s + + gfc->fft_fht(x, BLKSIZE_s / 2); + /* BLKSIZE_s/2 because of 3DNow! ASM routine */ + } +} + +void +fft_long(lame_internal_flags const *const gfc, + FLOAT x[BLKSIZE], int chn, const sample_t *const buffer[2]) +{ + int i; + int jj = BLKSIZE / 8 - 1; + x += BLKSIZE / 2; + +#define window_s gfc->cd_psy->window_s +#define window gfc->cd_psy->window + + do { + FLOAT f0, f1, f2, f3, w; + + i = rv_tbl[jj]; + f0 = ml00(ch01); + w = ml10(ch01); + f1 = f0 - w; + f0 = f0 + w; + f2 = ml20(ch01); + w = ml30(ch01); + f3 = f2 - w; + f2 = f2 + w; + + x -= 4; + x[0] = f0 + f2; + x[2] = f0 - f2; + x[1] = f1 + f3; + x[3] = f1 - f3; + + f0 = ml01(ch01); + w = ml11(ch01); + f1 = f0 - w; + f0 = f0 + w; + f2 = ml21(ch01); + w = ml31(ch01); + f3 = f2 - w; + f2 = f2 + w; + + x[BLKSIZE / 2 + 0] = f0 + f2; + x[BLKSIZE / 2 + 2] = f0 - f2; + x[BLKSIZE / 2 + 1] = f1 + f3; + x[BLKSIZE / 2 + 3] = f1 - f3; + } while (--jj >= 0); + +#undef window +#undef window_s + + gfc->fft_fht(x, BLKSIZE / 2); + /* BLKSIZE/2 because of 3DNow! ASM routine */ +} + +#ifdef HAVE_NASM +extern void fht_3DN(FLOAT * fz, int n); +extern void fht_SSE(FLOAT * fz, int n); +#endif + +void +init_fft(lame_internal_flags * const gfc) +{ + int i; + + /* The type of window used here will make no real difference, but */ + /* in the interest of merging nspsytune stuff - switch to blackman window */ + for (i = 0; i < BLKSIZE; i++) + /* blackman window */ + gfc->cd_psy->window[i] = 0.42 - 0.5 * cos(2 * PI * (i + .5) / BLKSIZE) + + 0.08 * cos(4 * PI * (i + .5) / BLKSIZE); + + for (i = 0; i < BLKSIZE_s / 2; i++) + gfc->cd_psy->window_s[i] = 0.5 * (1.0 - cos(2.0 * PI * (i + 0.5) / BLKSIZE_s)); + + gfc->fft_fht = fht; +#ifdef HAVE_NASM + if (gfc->CPU_features.AMD_3DNow) { + gfc->fft_fht = fht_3DN; + } + else if (gfc->CPU_features.SSE) { + gfc->fft_fht = fht_SSE; + } + else { + gfc->fft_fht = fht; + } +#else +#ifdef HAVE_XMMINTRIN_H +#ifdef MIN_ARCH_SSE + gfc->fft_fht = fht_SSE2; +#endif +#endif +#endif +} diff --git a/libmp3lame/fft.h b/libmp3lame/fft.h new file mode 100644 index 0000000..258df88 --- /dev/null +++ b/libmp3lame/fft.h @@ -0,0 +1,35 @@ +/* + * Fast Fourier Transform include file + * + * Copyright (c) 2000 Mark Taylor + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef LAME_FFT_H +#define LAME_FFT_H + +void fft_long(lame_internal_flags const *const gfc, FLOAT x_real[BLKSIZE], + int chn, const sample_t *const data[2]); + +void fft_short(lame_internal_flags const *const gfc, FLOAT x_real[3][BLKSIZE_s], + int chn, const sample_t *const data[2]); + +void init_fft(lame_internal_flags * const gfc); + +#endif + +/* End of fft.h */ diff --git a/libmp3lame/gain_analysis.c b/libmp3lame/gain_analysis.c new file mode 100644 index 0000000..c94db78 --- /dev/null +++ b/libmp3lame/gain_analysis.c @@ -0,0 +1,476 @@ +/* + * ReplayGainAnalysis - analyzes input samples and give the recommended dB change + * Copyright (C) 2001 David Robinson and Glen Sawyer + * Improvements and optimizations added by Frank Klemm, and by Marcel Muller + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * concept and filter values by David Robinson (David@Robinson.org) + * -- blame him if you think the idea is flawed + * original coding by Glen Sawyer (mp3gain@hotmail.com) + * -- blame him if you think this runs too slowly, or the coding is otherwise flawed + * + * lots of code improvements by Frank Klemm ( http://www.uni-jena.de/~pfk/mpp/ ) + * -- credit him for all the _good_ programming ;) + * + * + * For an explanation of the concepts and the basic algorithms involved, go to: + * http://www.replaygain.org/ + */ + +/* + * Here's the deal. Call + * + * InitGainAnalysis ( long samplefreq ); + * + * to initialize everything. Call + * + * AnalyzeSamples ( const Float_t* left_samples, + * const Float_t* right_samples, + * size_t num_samples, + * int num_channels ); + * + * as many times as you want, with as many or as few samples as you want. + * If mono, pass the sample buffer in through left_samples, leave + * right_samples NULL, and make sure num_channels = 1. + * + * GetTitleGain() + * + * will return the recommended dB level change for all samples analyzed + * SINCE THE LAST TIME you called GetTitleGain() OR InitGainAnalysis(). + * + * GetAlbumGain() + * + * will return the recommended dB level change for all samples analyzed + * since InitGainAnalysis() was called and finalized with GetTitleGain(). + * + * Pseudo-code to process an album: + * + * Float_t l_samples [4096]; + * Float_t r_samples [4096]; + * size_t num_samples; + * unsigned int num_songs; + * unsigned int i; + * + * InitGainAnalysis ( 44100 ); + * for ( i = 1; i <= num_songs; i++ ) { + * while ( ( num_samples = getSongSamples ( song[i], left_samples, right_samples ) ) > 0 ) + * AnalyzeSamples ( left_samples, right_samples, num_samples, 2 ); + * fprintf ("Recommended dB change for song %2d: %+6.2f dB\n", i, GetTitleGain() ); + * } + * fprintf ("Recommended dB change for whole album: %+6.2f dB\n", GetAlbumGain() ); + */ + +/* + * So here's the main source of potential code confusion: + * + * The filters applied to the incoming samples are IIR filters, + * meaning they rely on up to <filter order> number of previous samples + * AND up to <filter order> number of previous filtered samples. + * + * I set up the AnalyzeSamples routine to minimize memory usage and interface + * complexity. The speed isn't compromised too much (I don't think), but the + * internal complexity is higher than it should be for such a relatively + * simple routine. + * + * Optimization/clarity suggestions are welcome. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "lame.h" +#include "machine.h" +#include "gain_analysis.h" + +/* for each filter: */ +/* [0] 48 kHz, [1] 44.1 kHz, [2] 32 kHz, [3] 24 kHz, [4] 22050 Hz, [5] 16 kHz, [6] 12 kHz, [7] is 11025 Hz, [8] 8 kHz */ + +#ifdef WIN32 +#pragma warning ( disable : 4305 ) +#endif + + +/*lint -save -e736 loss of precision */ +static const Float_t ABYule[9][multiple_of(4, 2 * YULE_ORDER + 1)] = { + /* 20 18 16 14 12 10 8 6 4 2 0 19 17 15 13 11 9 7 5 3 1 */ + { 0.00288463683916, 0.00012025322027, 0.00306428023191, 0.00594298065125, -0.02074045215285, 0.02161526843274, -0.01655260341619, -0.00009291677959, -0.00123395316851, -0.02160367184185, 0.03857599435200, 0.13919314567432, -0.86984376593551, 2.75465861874613, -5.87257861775999, 9.48293806319790,-12.28759895145294, 13.05504219327545,-11.34170355132042, 7.81501653005538, -3.84664617118067}, + {-0.00187763777362, 0.00674613682247, -0.00240879051584, 0.01624864962975, -0.02596338512915, 0.02245293253339, -0.00834990904936, -0.00851165645469, -0.00848709379851, -0.02911007808948, 0.05418656406430, 0.13149317958808, -0.75104302451432, 2.19611684890774, -4.39470996079559, 6.85401540936998, -8.81498681370155, 9.47693607801280, -8.54751527471874, 6.36317777566148, -3.47845948550071}, + {-0.00881362733839, 0.00651420667831, -0.01390589421898, 0.03174092540049, 0.00222312597743, 0.04781476674921, -0.05588393329856, 0.02163541888798, -0.06247880153653, -0.09331049056315, 0.15457299681924, 0.02347897407020, -0.05032077717131, 0.16378164858596, -0.45953458054983, 1.00595954808547, -1.67148153367602, 2.23697657451713, -2.64577170229825, 2.84868151156327, -2.37898834973084}, + {-0.02950134983287, 0.00205861885564, -0.00000828086748, 0.06276101321749, -0.00584456039913, -0.02364141202522, -0.00915702933434, 0.03282930172664, -0.08587323730772, -0.22613988682123, 0.30296907319327, 0.00302439095741, 0.02005851806501, 0.04500235387352, -0.22138138954925, 0.39120800788284, -0.22638893773906, -0.16276719120440, -0.25656257754070, 1.07977492259970, -1.61273165137247}, + {-0.01760176568150, -0.01635381384540, 0.00832043980773, 0.05724228140351, -0.00589500224440, -0.00469977914380, -0.07834489609479, 0.11921148675203, -0.11828570177555, -0.25572241425570, 0.33642304856132, 0.02977207319925, -0.04237348025746, 0.08333755284107, -0.04067510197014, -0.12453458140019, 0.47854794562326, -0.80774944671438, 0.12205022308084, 0.87350271418188, -1.49858979367799}, + { 0.00541907748707, -0.03193428438915, -0.01863887810927, 0.10478503600251, 0.04097565135648, -0.12398163381748, 0.04078262797139, -0.01419140100551, -0.22784394429749, -0.14351757464547, 0.44915256608450, 0.03222754072173, 0.05784820375801, 0.06747620744683, 0.00613424350682, 0.22199650564824, -0.42029820170918, 0.00213767857124, -0.37256372942400, 0.29661783706366, -0.62820619233671}, + {-0.00588215443421, -0.03788984554840, 0.08647503780351, 0.00647310677246, -0.27562961986224, 0.30931782841830, -0.18901604199609, 0.16744243493672, 0.16242137742230, -0.75464456939302, 0.56619470757641, 0.01807364323573, 0.01639907836189, -0.04784254229033, 0.06739368333110, -0.33032403314006, 0.45054734505008, 0.00819999645858, -0.26806001042947, 0.29156311971249, -1.04800335126349}, + {-0.00749618797172, -0.03721611395801, 0.06920467763959, 0.01628462406333, -0.25344790059353, 0.15558449135573, 0.02377945217615, 0.17520704835522, -0.14289799034253, -0.53174909058578, 0.58100494960553, 0.01818801111503, 0.02442357316099, -0.02505961724053, -0.05246019024463, -0.23313271880868, 0.38952639978999, 0.14728154134330, -0.20256413484477, -0.31863563325245, -0.51035327095184}, + {-0.02217936801134, 0.04788665548180, -0.04060034127000, -0.11202315195388, -0.02459864859345, 0.14590772289388, -0.10214864179676, 0.04267842219415, -0.00275953611929, -0.42163034350696, 0.53648789255105, 0.04704409688120, 0.05477720428674, -0.18823009262115, -0.17556493366449, 0.15113130533216, 0.26408300200955, -0.04678328784242, -0.03424681017675, -0.43193942311114, -0.25049871956020} +}; + +static const Float_t ABButter[9][multiple_of(4, 2 * BUTTER_ORDER + 1)] = { + /* 5 4 3 2 1 */ + {0.98621192462708, 0.97261396931306, -1.97242384925416, -1.97223372919527, 0.98621192462708}, + {0.98500175787242, 0.97022847566350, -1.97000351574484, -1.96977855582618, 0.98500175787242}, + {0.97938932735214, 0.95920349965459, -1.95877865470428, -1.95835380975398, 0.97938932735214}, + {0.97531843204928, 0.95124613669835, -1.95063686409857, -1.95002759149878, 0.97531843204928}, + {0.97316523498161, 0.94705070426118, -1.94633046996323, -1.94561023566527, 0.97316523498161}, + {0.96454515552826, 0.93034775234268, -1.92909031105652, -1.92783286977036, 0.96454515552826}, + {0.96009142950541, 0.92177618768381, -1.92018285901082, -1.91858953033784, 0.96009142950541}, + {0.95856916599601, 0.91885558323625, -1.91713833199203, -1.91542108074780, 0.95856916599601}, + {0.94597685600279, 0.89487434461664, -1.89195371200558, -1.88903307939452, 0.94597685600279} +}; + +/*lint -restore */ + +#ifdef WIN32 +#pragma warning ( default : 4305 ) +#endif + +/* When calling this procedure, make sure that ip[-order] and op[-order] point to real data! */ + +static void +filterYule(const Float_t * input, Float_t * output, size_t nSamples, const Float_t * const kernel) +{ + while (nSamples--) { + Float_t y0 = input[-10] * kernel[ 0]; + Float_t y2 = input[ -9] * kernel[ 1]; + Float_t y4 = input[ -8] * kernel[ 2]; + Float_t y6 = input[ -7] * kernel[ 3]; + Float_t s00 = y0 + y2 + y4 + y6; + Float_t y8 = input[ -6] * kernel[ 4]; + Float_t yA = input[ -5] * kernel[ 5]; + Float_t yC = input[ -4] * kernel[ 6]; + Float_t yE = input[ -3] * kernel[ 7]; + Float_t s01 = y8 + yA + yC + yE; + Float_t yG = input[ -2] * kernel[ 8] + input[ -1] * kernel[ 9]; + Float_t yK = input[ 0] * kernel[10]; + + Float_t s1 = s00 + s01 + yG + yK; + + Float_t x1 = output[-10] * kernel[11] + output[ -9] * kernel[12]; + Float_t x5 = output[ -8] * kernel[13] + output[ -7] * kernel[14]; + Float_t x9 = output[ -6] * kernel[15] + output[ -5] * kernel[16]; + Float_t xD = output[ -4] * kernel[17] + output[ -3] * kernel[18]; + Float_t xH = output[ -2] * kernel[19] + output[ -1] * kernel[20]; + + Float_t s2 = x1 + x5 + x9 + xD + xH; + + output[0] = (Float_t)(s1 - s2); + + ++output; + ++input; + } +} + +static void +filterButter(const Float_t * input, Float_t * output, size_t nSamples, const Float_t * const kernel) +{ + while (nSamples--) { + Float_t s1 = input[-2] * kernel[0] + input[-1] * kernel[2] + input[ 0] * kernel[4]; + Float_t s2 = output[-2] * kernel[1] + output[-1] * kernel[3]; + output[0] = (Float_t)(s1 - s2); + ++output; + ++input; + } +} + + + +static int ResetSampleFrequency(replaygain_t * rgData, long samplefreq); + +/* returns a INIT_GAIN_ANALYSIS_OK if successful, INIT_GAIN_ANALYSIS_ERROR if not */ + +int +ResetSampleFrequency(replaygain_t * rgData, long samplefreq) +{ + /* zero out initial values, only first MAX_ORDER values */ + memset(rgData->linprebuf, 0, MAX_ORDER * sizeof(*rgData->linprebuf)); + memset(rgData->rinprebuf, 0, MAX_ORDER * sizeof(*rgData->rinprebuf)); + memset(rgData->lstepbuf, 0, MAX_ORDER * sizeof(*rgData->lstepbuf)); + memset(rgData->rstepbuf, 0, MAX_ORDER * sizeof(*rgData->rstepbuf)); + memset(rgData->loutbuf, 0, MAX_ORDER * sizeof(*rgData->loutbuf)); + memset(rgData->routbuf, 0, MAX_ORDER * sizeof(*rgData->routbuf)); + + switch ((int) (samplefreq)) { + case 48000: + rgData->freqindex = 0; + break; + case 44100: + rgData->freqindex = 1; + break; + case 32000: + rgData->freqindex = 2; + break; + case 24000: + rgData->freqindex = 3; + break; + case 22050: + rgData->freqindex = 4; + break; + case 16000: + rgData->freqindex = 5; + break; + case 12000: + rgData->freqindex = 6; + break; + case 11025: + rgData->freqindex = 7; + break; + case 8000: + rgData->freqindex = 8; + break; + default: + return INIT_GAIN_ANALYSIS_ERROR; + } + + rgData->sampleWindow = + (samplefreq * RMS_WINDOW_TIME_NUMERATOR + RMS_WINDOW_TIME_DENOMINATOR - + 1) / RMS_WINDOW_TIME_DENOMINATOR; + + rgData->lsum = 0.; + rgData->rsum = 0.; + rgData->totsamp = 0; + + memset(rgData->A, 0, sizeof(rgData->A)); + + return INIT_GAIN_ANALYSIS_OK; +} + +int +InitGainAnalysis(replaygain_t * rgData, long samplefreq) +{ + if (ResetSampleFrequency(rgData, samplefreq) != INIT_GAIN_ANALYSIS_OK) { + return INIT_GAIN_ANALYSIS_ERROR; + } + + rgData->linpre = rgData->linprebuf + MAX_ORDER; + rgData->rinpre = rgData->rinprebuf + MAX_ORDER; + rgData->lstep = rgData->lstepbuf + MAX_ORDER; + rgData->rstep = rgData->rstepbuf + MAX_ORDER; + rgData->lout = rgData->loutbuf + MAX_ORDER; + rgData->rout = rgData->routbuf + MAX_ORDER; + + memset(rgData->B, 0, sizeof(rgData->B)); + + return INIT_GAIN_ANALYSIS_OK; +} + +/* returns GAIN_ANALYSIS_OK if successful, GAIN_ANALYSIS_ERROR if not */ + +int +AnalyzeSamples(replaygain_t * rgData, const Float_t * left_samples, const Float_t * right_samples, + size_t num_samples, int num_channels) +{ + const Float_t *curleft; + const Float_t *curright; + long batchsamples; + long cursamples; + long cursamplepos; + int i; + Float_t sum_l, sum_r; + + if (num_samples == 0) + return GAIN_ANALYSIS_OK; + + cursamplepos = 0; + batchsamples = (long) num_samples; + + switch (num_channels) { + case 1: + right_samples = left_samples; + break; + case 2: + break; + default: + return GAIN_ANALYSIS_ERROR; + } + + if (num_samples < MAX_ORDER) { + memcpy(rgData->linprebuf + MAX_ORDER, left_samples, num_samples * sizeof(Float_t)); + memcpy(rgData->rinprebuf + MAX_ORDER, right_samples, num_samples * sizeof(Float_t)); + } + else { + memcpy(rgData->linprebuf + MAX_ORDER, left_samples, MAX_ORDER * sizeof(Float_t)); + memcpy(rgData->rinprebuf + MAX_ORDER, right_samples, MAX_ORDER * sizeof(Float_t)); + } + + while (batchsamples > 0) { + cursamples = batchsamples > rgData->sampleWindow - rgData->totsamp ? + rgData->sampleWindow - rgData->totsamp : batchsamples; + if (cursamplepos < MAX_ORDER) { + curleft = rgData->linpre + cursamplepos; + curright = rgData->rinpre + cursamplepos; + if (cursamples > MAX_ORDER - cursamplepos) + cursamples = MAX_ORDER - cursamplepos; + } + else { + curleft = left_samples + cursamplepos; + curright = right_samples + cursamplepos; + } + + YULE_FILTER(curleft, rgData->lstep + rgData->totsamp, cursamples, + ABYule[rgData->freqindex]); + YULE_FILTER(curright, rgData->rstep + rgData->totsamp, cursamples, + ABYule[rgData->freqindex]); + + BUTTER_FILTER(rgData->lstep + rgData->totsamp, rgData->lout + rgData->totsamp, cursamples, + ABButter[rgData->freqindex]); + BUTTER_FILTER(rgData->rstep + rgData->totsamp, rgData->rout + rgData->totsamp, cursamples, + ABButter[rgData->freqindex]); + + curleft = rgData->lout + rgData->totsamp; /* Get the squared values */ + curright = rgData->rout + rgData->totsamp; + + sum_l = 0; + sum_r = 0; + i = cursamples & 0x03; + while (i--) { + Float_t const l = *curleft++; + Float_t const r = *curright++; + sum_l += l * l; + sum_r += r * r; + } + i = cursamples / 4; + while (i--) { + Float_t l0 = curleft[0] * curleft[0]; + Float_t l1 = curleft[1] * curleft[1]; + Float_t l2 = curleft[2] * curleft[2]; + Float_t l3 = curleft[3] * curleft[3]; + Float_t sl = l0 + l1 + l2 + l3; + Float_t r0 = curright[0] * curright[0]; + Float_t r1 = curright[1] * curright[1]; + Float_t r2 = curright[2] * curright[2]; + Float_t r3 = curright[3] * curright[3]; + Float_t sr = r0 + r1 + r2 + r3; + sum_l += sl; + curleft += 4; + sum_r += sr; + curright += 4; + } + rgData->lsum += sum_l; + rgData->rsum += sum_r; + + batchsamples -= cursamples; + cursamplepos += cursamples; + rgData->totsamp += cursamples; + if (rgData->totsamp == rgData->sampleWindow) { /* Get the Root Mean Square (RMS) for this set of samples */ + double const val = + STEPS_per_dB * 10. * log10((rgData->lsum + rgData->rsum) / rgData->totsamp * 0.5 + + 1.e-37); + size_t ival = (val <= 0) ? 0 : (size_t) val; + if (ival >= sizeof(rgData->A) / sizeof(*(rgData->A))) + ival = sizeof(rgData->A) / sizeof(*(rgData->A)) - 1; + rgData->A[ival]++; + rgData->lsum = rgData->rsum = 0.; + memmove(rgData->loutbuf, rgData->loutbuf + rgData->totsamp, + MAX_ORDER * sizeof(Float_t)); + memmove(rgData->routbuf, rgData->routbuf + rgData->totsamp, + MAX_ORDER * sizeof(Float_t)); + memmove(rgData->lstepbuf, rgData->lstepbuf + rgData->totsamp, + MAX_ORDER * sizeof(Float_t)); + memmove(rgData->rstepbuf, rgData->rstepbuf + rgData->totsamp, + MAX_ORDER * sizeof(Float_t)); + rgData->totsamp = 0; + } + if (rgData->totsamp > rgData->sampleWindow) /* somehow I really screwed up: Error in programming! Contact author about totsamp > sampleWindow */ + return GAIN_ANALYSIS_ERROR; + } + if (num_samples < MAX_ORDER) { + memmove(rgData->linprebuf, rgData->linprebuf + num_samples, + (MAX_ORDER - num_samples) * sizeof(Float_t)); + memmove(rgData->rinprebuf, rgData->rinprebuf + num_samples, + (MAX_ORDER - num_samples) * sizeof(Float_t)); + memcpy(rgData->linprebuf + MAX_ORDER - num_samples, left_samples, + num_samples * sizeof(Float_t)); + memcpy(rgData->rinprebuf + MAX_ORDER - num_samples, right_samples, + num_samples * sizeof(Float_t)); + } + else { + memcpy(rgData->linprebuf, left_samples + num_samples - MAX_ORDER, + MAX_ORDER * sizeof(Float_t)); + memcpy(rgData->rinprebuf, right_samples + num_samples - MAX_ORDER, + MAX_ORDER * sizeof(Float_t)); + } + + return GAIN_ANALYSIS_OK; +} + + +static Float_t +analyzeResult(uint32_t const *Array, size_t len) +{ + uint32_t elems; + uint32_t upper; + uint32_t sum; + size_t i; + + elems = 0; + for (i = 0; i < len; i++) + elems += Array[i]; + if (elems == 0) + return GAIN_NOT_ENOUGH_SAMPLES; + + upper = (uint32_t) ceil(elems * (1. - RMS_PERCENTILE)); + sum = 0; + for (i = len; i-- > 0;) { + sum += Array[i]; + if (sum >= upper) { + break; + } + } + + return (Float_t) ((Float_t) PINK_REF - (Float_t) i / (Float_t) STEPS_per_dB); +} + + +Float_t +GetTitleGain(replaygain_t * rgData) +{ + Float_t retval; + unsigned int i; + + retval = analyzeResult(rgData->A, sizeof(rgData->A) / sizeof(*(rgData->A))); + + for (i = 0; i < sizeof(rgData->A) / sizeof(*(rgData->A)); i++) { + rgData->B[i] += rgData->A[i]; + rgData->A[i] = 0; + } + + for (i = 0; i < MAX_ORDER; i++) + rgData->linprebuf[i] = rgData->lstepbuf[i] + = rgData->loutbuf[i] + = rgData->rinprebuf[i] + = rgData->rstepbuf[i] + = rgData->routbuf[i] = 0.f; + + rgData->totsamp = 0; + rgData->lsum = rgData->rsum = 0.; + return retval; +} + +#if 0 +static Float_t GetAlbumGain(replaygain_t const* rgData); + +Float_t +GetAlbumGain(replaygain_t const* rgData) +{ + return analyzeResult(rgData->B, sizeof(rgData->B) / sizeof(*(rgData->B))); +} +#endif + +/* end of gain_analysis.c */ diff --git a/libmp3lame/gain_analysis.h b/libmp3lame/gain_analysis.h new file mode 100644 index 0000000..a6b56ab --- /dev/null +++ b/libmp3lame/gain_analysis.h @@ -0,0 +1,109 @@ +/* + * ReplayGainAnalysis - analyzes input samples and give the recommended dB change + * Copyright (C) 2001 David Robinson and Glen Sawyer + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * concept and filter values by David Robinson (David@Robinson.org) + * -- blame him if you think the idea is flawed + * coding by Glen Sawyer (mp3gain@hotmail.com) 735 W 255 N, Orem, UT 84057-4505 USA + * -- blame him if you think this runs too slowly, or the coding is otherwise flawed + * + * For an explanation of the concepts and the basic algorithms involved, go to: + * http://www.replaygain.org/ + */ + +#ifndef GAIN_ANALYSIS_H +#define GAIN_ANALYSIS_H + +#ifdef HAVE_INTTYPES_H +# include <inttypes.h> +#else +# ifdef HAVE_STDINT_H +# include <stdint.h> +# endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + + + typedef sample_t Float_t; /* Type used for filtering */ + + +#define PINK_REF 64.82 /* 298640883795 */ /* calibration value for 89dB */ + + +#define YULE_ORDER 10 +#define BUTTER_ORDER 2 +#define YULE_FILTER filterYule +#define BUTTER_FILTER filterButter +#define RMS_PERCENTILE 0.95 /* percentile which is louder than the proposed level */ +#define MAX_SAMP_FREQ 48000L /* maximum allowed sample frequency [Hz] */ +#define RMS_WINDOW_TIME_NUMERATOR 1L +#define RMS_WINDOW_TIME_DENOMINATOR 20L /* numerator / denominator = time slice size [s] */ +#define STEPS_per_dB 100 /* Table entries per dB */ +#define MAX_dB 120 /* Table entries for 0...MAX_dB (normal max. values are 70...80 dB) */ + + enum { GAIN_NOT_ENOUGH_SAMPLES = -24601, GAIN_ANALYSIS_ERROR = 0, GAIN_ANALYSIS_OK = + 1, INIT_GAIN_ANALYSIS_ERROR = 0, INIT_GAIN_ANALYSIS_OK = 1 + }; + + enum { MAX_ORDER = (BUTTER_ORDER > YULE_ORDER ? BUTTER_ORDER : YULE_ORDER) + , MAX_SAMPLES_PER_WINDOW = ((MAX_SAMP_FREQ * RMS_WINDOW_TIME_NUMERATOR) / RMS_WINDOW_TIME_DENOMINATOR + 1) /* max. Samples per Time slice */ + }; + + struct replaygain_data { + Float_t linprebuf[MAX_ORDER * 2]; + Float_t *linpre; /* left input samples, with pre-buffer */ + Float_t lstepbuf[MAX_SAMPLES_PER_WINDOW + MAX_ORDER]; + Float_t *lstep; /* left "first step" (i.e. post first filter) samples */ + Float_t loutbuf[MAX_SAMPLES_PER_WINDOW + MAX_ORDER]; + Float_t *lout; /* left "out" (i.e. post second filter) samples */ + Float_t rinprebuf[MAX_ORDER * 2]; + Float_t *rinpre; /* right input samples ... */ + Float_t rstepbuf[MAX_SAMPLES_PER_WINDOW + MAX_ORDER]; + Float_t *rstep; + Float_t routbuf[MAX_SAMPLES_PER_WINDOW + MAX_ORDER]; + Float_t *rout; + long sampleWindow; /* number of samples required to reach number of milliseconds required for RMS window */ + long totsamp; + double lsum; + double rsum; + int freqindex; + int first; + uint32_t A[STEPS_per_dB * MAX_dB]; + uint32_t B[STEPS_per_dB * MAX_dB]; + + }; +#ifndef replaygain_data_defined +#define replaygain_data_defined + typedef struct replaygain_data replaygain_t; +#endif + + + + + int InitGainAnalysis(replaygain_t * rgData, long samplefreq); + int AnalyzeSamples(replaygain_t * rgData, const Float_t * left_samples, + const Float_t * right_samples, size_t num_samples, int num_channels); + Float_t GetTitleGain(replaygain_t * rgData); + + +#ifdef __cplusplus +} +#endif +#endif /* GAIN_ANALYSIS_H */ diff --git a/libmp3lame/i386/Makefile.am b/libmp3lame/i386/Makefile.am new file mode 100644 index 0000000..9355e1c --- /dev/null +++ b/libmp3lame/i386/Makefile.am @@ -0,0 +1,73 @@ +## $Id: Makefile.am,v 1.28 2013/06/12 09:16:29 rbrito Exp $ + +AUTOMAKE_OPTIONS = foreign + +DEFS = @DEFS@ @CONFIG_DEFS@ + +ECHO ?= echo + +nasm_sources = \ + choose_table.nas \ + cpu_feat.nas \ + fft3dn.nas \ + fftsse.nas + +if HAVE_NASM +noinst_LTLIBRARIES = liblameasmroutines.la +liblameasmroutines_la_SOURCES = $(nasm_sources) +liblameasmroutines_la_DEPENDENCIES = $(nasm_sources:.nas.lo) +am_liblameasmroutines_la_OBJECTS = \ + choose_table$U.lo \ + cpu_feat$U.lo \ + fft3dn$U.lo \ + fftsse$U.lo +endif + +noinst_HEADERS = nasm.h + +INCLUDES = @INCLUDES@ -I$(top_srcdir)/libmp3lame/@CPUTYPE@ + +SUFFIXES = .nas .lo + +EXTRA_liblameasmroutines_la_SOURCES = $(nasm_sources) + +CLEANFILES = \ + choose_table.o.lst \ + choose_table.lo.lst \ + cpu_feat.o.lst \ + cpu_feat.lo.lst \ + fft3dn.o.lst \ + fft3dn.lo.lst \ + fftsse.o.lst \ + fftsse.lo.lst + +EXTRA_DIST = \ + fft.nas \ + fftfpu.nas \ + ffttbl.nas \ + scalar.nas + +NASM = @NASM@ +NASMFLAGS=@NASM_FORMAT@ -i $(top_srcdir)/libmp3lame/@CPUTYPE@/ + +.nas.o: $< nasm.h + $(NASM) $(NASMFLAGS) $< -o $@ -l $@.lst + +.nas.lo: $< nasm.h + $(ECHO) '# Generated by ltmain.sh - GNU libtool 1.5.22 (1.1220.2.365 2005/12/18 22:14:06)' >$@ + $(ECHO) "pic_object='$*.o'" >>$@ + $(ECHO) "non_pic_object='$*.o'" >>$@ + $(NASM) $(NASMFLAGS) $< -o $*.o -l $@.lst + +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \ + $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ + + +#$(OBJECTS): libtool +#libtool: $(LIBTOOL_DEPS) +# $(SHELL) $(top_builddir)/config.status --recheck diff --git a/libmp3lame/i386/Makefile.in b/libmp3lame/i386/Makefile.in new file mode 100644 index 0000000..70002b0 --- /dev/null +++ b/libmp3lame/i386/Makefile.in @@ -0,0 +1,633 @@ +# Makefile.in generated by automake 1.15.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2017 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = libmp3lame/i386 +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ + $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +liblameasmroutines_la_LIBADD = +am__liblameasmroutines_la_SOURCES_DIST = choose_table.nas cpu_feat.nas \ + fft3dn.nas fftsse.nas +am__objects_1 = choose_table.lo cpu_feat.lo fft3dn.lo fftsse.lo +liblameasmroutines_la_OBJECTS = $(am_liblameasmroutines_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +@HAVE_NASM_TRUE@am_liblameasmroutines_la_rpath = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +SOURCES = $(liblameasmroutines_la_SOURCES) \ + $(EXTRA_liblameasmroutines_la_SOURCES) +DIST_SOURCES = $(am__liblameasmroutines_la_SOURCES_DIST) \ + $(EXTRA_liblameasmroutines_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +HEADERS = $(noinst_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_DEFS = @CONFIG_DEFS@ +CONFIG_MATH_LIB = @CONFIG_MATH_LIB@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CPUCCODE = @CPUCCODE@ +CPUTYPE = @CPUTYPE@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ @CONFIG_DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FRONTEND_CFLAGS = @FRONTEND_CFLAGS@ +FRONTEND_LDADD = @FRONTEND_LDADD@ +FRONTEND_LDFLAGS = @FRONTEND_LDFLAGS@ +GREP = @GREP@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_CONFIG = @GTK_CONFIG@ +GTK_LIBS = @GTK_LIBS@ +INCLUDES = @INCLUDES@ -I$(top_srcdir)/libmp3lame/@CPUTYPE@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDADD = @LDADD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_MAJOR_VERSION = @LIB_MAJOR_VERSION@ +LIB_MINOR_VERSION = @LIB_MINOR_VERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEDEP = @MAKEDEP@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NASM = @NASM@ +NASM_FORMAT = @NASM_FORMAT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM_F = @RM_F@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_FRONTEND = @WITH_FRONTEND@ +WITH_MP3RTP = @WITH_MP3RTP@ +WITH_MP3X = @WITH_MP3X@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = foreign +nasm_sources = \ + choose_table.nas \ + cpu_feat.nas \ + fft3dn.nas \ + fftsse.nas + +@HAVE_NASM_TRUE@noinst_LTLIBRARIES = liblameasmroutines.la +@HAVE_NASM_TRUE@liblameasmroutines_la_SOURCES = $(nasm_sources) +@HAVE_NASM_TRUE@liblameasmroutines_la_DEPENDENCIES = $(nasm_sources:.nas.lo) +@HAVE_NASM_TRUE@am_liblameasmroutines_la_OBJECTS = \ +@HAVE_NASM_TRUE@ choose_table$U.lo \ +@HAVE_NASM_TRUE@ cpu_feat$U.lo \ +@HAVE_NASM_TRUE@ fft3dn$U.lo \ +@HAVE_NASM_TRUE@ fftsse$U.lo + +noinst_HEADERS = nasm.h +SUFFIXES = .nas .lo +EXTRA_liblameasmroutines_la_SOURCES = $(nasm_sources) +CLEANFILES = \ + choose_table.o.lst \ + choose_table.lo.lst \ + cpu_feat.o.lst \ + cpu_feat.lo.lst \ + fft3dn.o.lst \ + fft3dn.lo.lst \ + fftsse.o.lst \ + fftsse.lo.lst + +EXTRA_DIST = \ + fft.nas \ + fftfpu.nas \ + ffttbl.nas \ + scalar.nas + +NASMFLAGS = @NASM_FORMAT@ -i $(top_srcdir)/libmp3lame/@CPUTYPE@/ +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) + +LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \ + $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) + +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ + +all: all-am + +.SUFFIXES: +.SUFFIXES: .nas .lo .o +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign libmp3lame/i386/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign libmp3lame/i386/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +liblameasmroutines.la: $(liblameasmroutines_la_OBJECTS) $(liblameasmroutines_la_DEPENDENCIES) $(EXTRA_liblameasmroutines_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(am_liblameasmroutines_la_rpath) $(liblameasmroutines_la_OBJECTS) $(liblameasmroutines_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +ECHO ?= echo + +.nas.o: $< nasm.h + $(NASM) $(NASMFLAGS) $< -o $@ -l $@.lst + +.nas.lo: $< nasm.h + $(ECHO) '# Generated by ltmain.sh - GNU libtool 1.5.22 (1.1220.2.365 2005/12/18 22:14:06)' >$@ + $(ECHO) "pic_object='$*.o'" >>$@ + $(ECHO) "non_pic_object='$*.o'" >>$@ + $(NASM) $(NASMFLAGS) $< -o $*.o -l $@.lst + +#$(OBJECTS): libtool +#libtool: $(LIBTOOL_DEPS) +# $(SHELL) $(top_builddir)/config.status --recheck + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/libmp3lame/i386/choose_table.nas b/libmp3lame/i386/choose_table.nas new file mode 100644 index 0000000..9217c8e --- /dev/null +++ b/libmp3lame/i386/choose_table.nas @@ -0,0 +1,447 @@ +; new count bit routine +; part of this code is origined from +; new GOGO-no-coda (1999, 2000) +; Copyright (C) 1999 shigeo +; modified by Keiichi SAKAI + +%include "nasm.h" + + globaldef choose_table_MMX + globaldef MMX_masking + + externdef largetbl + externdef t1l + externdef table23 + externdef table56 + + segment_data + align 16 +D14_14_14_14 dd 0x000E000E, 0x000E000E +D15_15_15_15 dd 0xfff0fff0, 0xfff0fff0 +mul_add dd 0x00010010, 0x00010010 +mul_add23 dd 0x00010003, 0x00010003 +mul_add56 dd 0x00010004, 0x00010004 +tableDEF + dd 0x00010003,0x01,0x00050005,0x05,0x00070006,0x07,0x00090008,0x08,0x000a0008, 0x09 + dd 0x000a0009,0x0a,0x000b000a,0x0a,0x000b000a,0x0b,0x000c000a,0x0a,0x000c000b, 0x0b + dd 0x000c000b,0x0c,0x000d000c,0x0c,0x000d000c,0x0d,0x000d000c,0x0d,0x000e000d, 0x0e + dd 0x000b000e,0x0e,0x00040005,0x04,0x00060005,0x06,0x00080007,0x08,0x00090008, 0x09 + dd 0x000a0009,0x0a,0x000b0009,0x0a,0x000b000a,0x0b,0x000b000a,0x0b,0x000c000a, 0x0b + dd 0x000c000b,0x0b,0x000c000b,0x0c,0x000d000c,0x0c,0x000e000c,0x0d,0x000d000c, 0x0e + dd 0x000e000d,0x0e,0x000b000d,0x0e,0x00070006,0x07,0x00080007,0x08,0x00090007, 0x09 + dd 0x000a0008,0x0a,0x000b0009,0x0b,0x000b0009,0x0b,0x000c000a,0x0c,0x000c000a, 0x0c + dd 0x000d000a,0x0b,0x000c000b,0x0c,0x000d000b,0x0c,0x000d000c,0x0d,0x000d000c, 0x0d + dd 0x000e000d,0x0e,0x000e000d,0x0f,0x000c000d,0x0f,0x00090007,0x08,0x00090008, 0x09 + dd 0x000a0008,0x0a,0x000b0009,0x0b,0x000b0009,0x0b,0x000c000a,0x0c,0x000c000a, 0x0c + dd 0x000c000b,0x0c,0x000d000b,0x0c,0x000d000b,0x0d,0x000e000c,0x0d,0x000e000c, 0x0d + dd 0x000e000c,0x0d,0x000f000d,0x0e,0x000f000d,0x0f,0x000d000d,0x0f,0x000a0008, 0x09 + dd 0x000a0008,0x09,0x000b0009,0x0b,0x000b0009,0x0b,0x000c000a,0x0c,0x000c000a, 0x0c + dd 0x000d000b,0x0d,0x000d000b,0x0d,0x000d000b,0x0c,0x000e000b,0x0d,0x000e000c, 0x0d + dd 0x000e000c,0x0e,0x000f000c,0x0e,0x000f000d,0x0f,0x000f000d,0x0f,0x000c000d, 0x10 + dd 0x000a0009,0x0a,0x000a0009,0x0a,0x000b0009,0x0b,0x000b000a,0x0c,0x000c000a, 0x0c + dd 0x000d000a,0x0c,0x000d000b,0x0d,0x000e000b,0x0d,0x000d000b,0x0d,0x000e000b, 0x0d + dd 0x000e000c,0x0e,0x000f000c,0x0d,0x000f000d,0x0f,0x000f000d,0x0f,0x0010000d, 0x10 + dd 0x000d000e,0x10,0x000b000a,0x0a,0x000b0009,0x0b,0x000b000a,0x0c,0x000c000a, 0x0c + dd 0x000d000a,0x0d,0x000d000b,0x0d,0x000d000b,0x0d,0x000d000b,0x0d,0x000e000b, 0x0d + dd 0x000e000c,0x0e,0x000e000c,0x0e,0x000e000c,0x0e,0x000f000d,0x0f,0x000f000d, 0x0f + dd 0x0010000e,0x10,0x000d000e,0x10,0x000b000a,0x0b,0x000b000a,0x0b,0x000c000a, 0x0c + dd 0x000c000b,0x0d,0x000d000b,0x0d,0x000d000b,0x0d,0x000d000b,0x0e,0x000e000c, 0x0e + dd 0x000e000c,0x0e,0x000f000c,0x0e,0x000f000c,0x0f,0x000f000c,0x0f,0x000f000d, 0x0f + dd 0x0011000d,0x10,0x0011000d,0x12,0x000d000e,0x12,0x000b000a,0x0a,0x000c000a, 0x0a + dd 0x000c000a,0x0b,0x000d000b,0x0c,0x000d000b,0x0c,0x000d000b,0x0d,0x000e000b, 0x0d + dd 0x000e000c,0x0e,0x000f000c,0x0e,0x000f000c,0x0e,0x000f000c,0x0e,0x000f000d, 0x0f + dd 0x0010000d,0x0f,0x0010000e,0x10,0x0010000e,0x11,0x000d000e,0x11,0x000c000a, 0x0b + dd 0x000c000a,0x0b,0x000c000b,0x0c,0x000d000b,0x0c,0x000d000b,0x0d,0x000e000b, 0x0d + dd 0x000e000c,0x0d,0x000f000c,0x0f,0x000f000c,0x0e,0x000f000d,0x0f,0x000f000d, 0x0f + dd 0x0010000d,0x10,0x000f000d,0x10,0x0010000e,0x10,0x000f000e,0x12,0x000e000e, 0x11 + dd 0x000c000b,0x0b,0x000d000b,0x0c,0x000c000b,0x0c,0x000d000b,0x0d,0x000e000c, 0x0d + dd 0x000e000c,0x0e,0x000e000c,0x0e,0x000e000c,0x0f,0x000f000c,0x0e,0x0010000d, 0x0f + dd 0x0010000d,0x10,0x0010000d,0x0f,0x0011000d,0x10,0x0011000e,0x11,0x0010000f, 0x12 + dd 0x000d000e,0x13,0x000d000b,0x0c,0x000d000b,0x0c,0x000d000b,0x0c,0x000d000b, 0x0d + dd 0x000e000c,0x0e,0x000e000c,0x0e,0x000f000c,0x0e,0x0010000c,0x0e,0x0010000d, 0x0f + dd 0x0010000d,0x0f,0x0010000d,0x0f,0x0010000d,0x10,0x0010000e,0x11,0x000f000e, 0x11 + dd 0x0010000e,0x11,0x000e000f,0x12,0x000d000c,0x0c,0x000e000c,0x0d,0x000e000b, 0x0d + dd 0x000e000c,0x0e,0x000e000c,0x0e,0x000f000c,0x0f,0x000f000d,0x0e,0x000f000d, 0x0f + dd 0x000f000d,0x10,0x0011000d,0x10,0x0010000d,0x11,0x0010000d,0x11,0x0010000e, 0x11 + dd 0x0010000e,0x12,0x0012000f,0x12,0x000e000f,0x12,0x000f000c,0x0d,0x000e000c, 0x0d + dd 0x000e000c,0x0e,0x000e000c,0x0f,0x000f000c,0x0f,0x000f000d,0x0f,0x0010000d, 0x10 + dd 0x0010000d,0x10,0x0010000d,0x10,0x0012000e,0x10,0x0011000e,0x10,0x0011000e, 0x11 + dd 0x0011000e,0x12,0x0013000e,0x11,0x0011000f,0x12,0x000e000f,0x12,0x000e000d, 0x0e + dd 0x000f000d,0x0e,0x000d000d,0x0e,0x000e000d,0x0f,0x0010000d,0x0f,0x0010000d, 0x0f + dd 0x000f000d,0x11,0x0010000d,0x10,0x0010000e,0x10,0x0011000e,0x13,0x0012000e, 0x11 + dd 0x0011000e,0x11,0x0013000f,0x11,0x0011000f,0x13,0x0010000e,0x12,0x000e000f, 0x12 + dd 0x000b000d,0x0d,0x000b000d,0x0e,0x000b000d,0x0f,0x000c000d,0x10,0x000c000d, 0x10 + dd 0x000d000d,0x10,0x000d000d,0x11,0x000d000e,0x10,0x000e000e,0x11,0x000e000e, 0x11 + dd 0x000e000e,0x12,0x000e000e,0x12,0x000e000f,0x15,0x000e000f,0x14,0x000e000f, 0x15 + dd 0x000c000f,0x12 + +tableABC + dd 0x00020004,0x1,0x00040004,0x4,0x00060006,0x7,0x00080008,0x9,0x00090009,0xa,0x000a000a,0xa + dd 0x0009000a,0xa,0x000a000a,0xb,0x00000000,0x0,0x00020003,0x1,0x00040004,0x4,0x00070006,0x7 + dd 0x00090007,0x9,0x00090009,0x9,0x000a000a,0xa,0x00000000,0x0,0x00040004,0x4,0x00050005,0x6 + dd 0x00060006,0x8,0x00080007,0x9,0x000a0009,0xa,0x000a0009,0xb,0x0009000a,0xa,0x000a000a,0xa + dd 0x00000000,0x0,0x00040004,0x4,0x00040005,0x6,0x00060006,0x8,0x000a0007,0x9,0x000a0008,0x9 + dd 0x000a000a,0xa,0x00000000,0x0,0x00060006,0x7,0x00070006,0x8,0x00080007,0x9,0x00090008,0xa + dd 0x000a0009,0xb,0x000b000a,0xc,0x000a0009,0xb,0x000a000a,0xb,0x00000000,0x0,0x00070005,0x7 + dd 0x00060006,0x7,0x00080007,0x9,0x000a0008,0xa,0x000a0009,0xa,0x000b000a,0xb,0x00000000,0x0 + dd 0x00080007,0x8,0x00080007,0x9,0x00090008,0xa,0x000b0008,0xb,0x000a0009,0xc,0x000c000a,0xc + dd 0x000a000a,0xb,0x000b000a,0xc,0x00000000,0x0,0x00090007,0x8,0x000a0007,0x9,0x000a0008,0xa + dd 0x000b0009,0xb,0x000b0009,0xb,0x000c000a,0xb,0x00000000,0x0,0x00090008,0x9,0x000a0008,0xa + dd 0x000a0009,0xb,0x000b0009,0xc,0x000b000a,0xc,0x000c000a,0xc,0x000b000a,0xc,0x000c000b,0xc + dd 0x00000000,0x0,0x00090008,0x8,0x00090008,0x9,0x000a0009,0xa,0x000b0009,0xb,0x000c000a,0xb + dd 0x000c000b,0xc,0x00000000,0x0,0x00090009,0xa,0x000a0009,0xb,0x000b000a,0xc,0x000c000a,0xc + dd 0x000c000a,0xd,0x000d000b,0xd,0x000c000a,0xc,0x000d000b,0xd,0x00000000,0x0,0x000a0009,0x9 + dd 0x000a0009,0xa,0x000b000a,0xb,0x000b000a,0xc,0x000d000b,0xc,0x000d000b,0xc,0x00000000,0x0 + dd 0x00090009,0x9,0x00090009,0xa,0x00090009,0xb,0x000a000a,0xc,0x000b000a,0xc,0x000c000b,0xc + dd 0x000c000b,0xd,0x000c000c,0xd,0x00000000,0x0,0x00000000,0x0,0x00000000,0x0,0x00000000,0x0 + dd 0x00000000,0x0,0x00000000,0x0,0x00000000,0x0,0x00000000,0x0,0x0009000a,0xa,0x0009000a,0xa + dd 0x000a000a,0xb,0x000b000b,0xc,0x000c000b,0xc,0x000c000b,0xd,0x000c000b,0xd,0x000c000c,0xd + dd 0x00000000,0x0,0x00000000,0x0,0x00000000,0x0,0x00000000,0x0,0x00000000,0x0,0x00000000,0x0 + dd 0x0,0x00000000, 0x0,0x00000000 + +linbits32 + dd 0x00040004,0x10001,0x00040004,0x20002,0x00040004,0x30003,0x00040004,0x40004 + dd 0x00050005,0x60006,0x00060006,0x60006,0x00070007,0x80008,0x00080008,0x80008 + dd 0x00090009,0xa000a,0x000b000b,0xa000a,0x000b000b,0xd000d,0x000d000d,0xd000d + dd 0x000d000d,0xd000d + + +choose_table_H + dw 0x1810, 0x1811, 0x1812, 0x1813, 0x1914, 0x1a14, 0x1b15, 0x1c15 + dw 0x1d16, 0x1e16, 0x1e17, 0x1f17, 0x1f17 + +choose_jump_table_L: + dd table_MMX.L_case_0 - choose_table_MMX + dd table_MMX.L_case_1 - choose_table_MMX + dd table_MMX.L_case_2 - choose_table_MMX + dd table_MMX.L_case_3 - choose_table_MMX + dd table_MMX.L_case_45 - choose_table_MMX + dd table_MMX.L_case_45 - choose_table_MMX + dd table_MMX.L_case_67 - choose_table_MMX + dd table_MMX.L_case_67 - choose_table_MMX + dd table_MMX.L_case_8_15 - choose_table_MMX + dd table_MMX.L_case_8_15 - choose_table_MMX + dd table_MMX.L_case_8_15 - choose_table_MMX + dd table_MMX.L_case_8_15 - choose_table_MMX + dd table_MMX.L_case_8_15 - choose_table_MMX + dd table_MMX.L_case_8_15 - choose_table_MMX + dd table_MMX.L_case_8_15 - choose_table_MMX + dd table_MMX.L_case_8_15 - choose_table_MMX + + segment_code +; +; use MMX +; + +PIC_OFFSETTABLE + + align 16 +; int choose_table(int *ix, int *end, int *s) +choose_table_MMX: + push ebp + call get_pc.bp + add ebp, PIC_BASE() + + mov ecx,[esp+8] ;ecx = begin + mov edx,[esp+12] ;edx = end + sub ecx,edx ;ecx = begin-end(should be minus) + test ecx,8 + pxor mm0,mm0 ;mm0=[0:0] + movq mm1,[edx+ecx] + jz .lp + + add ecx,8 + jz .exit + + align 4 +.lp: + movq mm4,[edx+ecx] + movq mm5,[edx+ecx+8] + add ecx,16 + psubusw mm4,mm0 ; $BK\Ev$O(B dword $B$G$J$$$H$$$1$J$$$N$@$,(B + psubusw mm5,mm1 ; $B$=$s$J%3%^%s%I$O$J$$(B :-p + paddw mm0,mm4 ; $B$,(B, $B$3$3$G07$&CM$NHO0O$O(B 8191+15 $B0J2<$J$N$GLdBj$J$$(B + paddw mm1,mm5 + jnz .lp +.exit: + psubusw mm1,mm0 ; $B$3$l$bK\Ev$O(B dword $B$G$J$$$H$$$1$J$$(B + paddw mm0,mm1 + + movq mm4,mm0 + punpckhdq mm4,mm4 + psubusw mm4,mm0 ; $B$3$l$bK\Ev$O(B dword $B$G$J$$$H$$$1$J$$(B + paddw mm0,mm4 + movd eax,mm0 + + cmp eax,15 + ja .with_ESC + lea ecx,[PIC_EBP_REL(choose_table_MMX)] + add ecx,[PIC_EBP_REL(choose_jump_table_L+eax*4)] + jmp ecx + +.with_ESC1: + emms + mov ecx, [esp+16] ; *s + mov [ecx], eax + or eax,-1 + pop ebp + ret + +.with_ESC: + cmp eax, 8191+15 + ja .with_ESC1 + + sub eax,15 + push ebx + push esi + bsr eax, eax +%assign _P 4*2 + movq mm5, [PIC_EBP_REL(D15_15_15_15)] + movq mm6, [PIC_EBP_REL(D14_14_14_14)] + movq mm3, [PIC_EBP_REL(mul_add)] + + mov ecx, [esp+_P+8] ; = ix +; mov edx, [esp+_P+12] ; = end + sub ecx, edx + + xor esi, esi ; sum = 0 + test ecx, 8 + pxor mm7, mm7 ; linbits_sum, 14$B$r1[$($?$b$N$N?t(B + jz .H_dual_lp1 + + movq mm0, [edx+ecx] + add ecx,8 + packssdw mm0,mm7 + movq mm2, mm0 + paddusw mm0, mm5 ; mm0 = min(ix, 15)+0xfff0 + pcmpgtw mm2, mm6 ; 14$B$h$jBg$-$$$+!)(B + psubw mm7, mm2 ; 14$B$h$jBg$-$$$H$-(B linbits_sum++; + pmaddwd mm0, mm3 ; {0, 0, y, x}*{1, 16, 1, 16} + movd ebx, mm0 + mov esi, [PIC_EBP_REL(largetbl+ebx*4+(16*16+16)*4)] + + jz .H_dual_exit + + align 4 +.H_dual_lp1: + movq mm0, [edx+ecx] + movq mm1, [edx+ecx+8] + packssdw mm0,mm1 + movq mm2, mm0 + paddusw mm0, mm5 ; mm0 = min(ix, 15)+0xfff0 + pcmpgtw mm2, mm6 ; 14$B$h$jBg$-$$$+!)(B + pmaddwd mm0, mm3 ; {y, x, y, x}*{1, 16, 1, 16} + movd ebx, mm0 + punpckhdq mm0,mm0 + add esi, [PIC_EBP_REL(largetbl+ebx*4+(16*16+16)*4)] + movd ebx, mm0 + add esi, [PIC_EBP_REL(largetbl+ebx*4+(16*16+16)*4)] + add ecx, 16 + psubw mm7, mm2 ; 14$B$h$jBg$-$$$H$-(B linbits_sum++; + jnz .H_dual_lp1 + +.H_dual_exit: + pmov mm1,mm7 + punpckhdq mm7,mm7 + paddd mm7,mm1 + punpckldq mm7,mm7 + + pmaddwd mm7, [PIC_EBP_REL(linbits32+eax*8)] ; linbits + mov ax, [PIC_EBP_REL(choose_table_H+eax*2)] + + movd ecx, mm7 + punpckhdq mm7,mm7 + movd edx,mm7 + emms + shl edx, 16 + add ecx, edx + + add ecx, esi + + pop esi + pop ebx + + mov edx, ecx + and ecx, 0xffff ; ecx = sum2 + shr edx, 16 ; edx = sum + + cmp edx, ecx + jle .chooseE_s1 + mov edx, ecx + shr eax, 8 +.chooseE_s1: + mov ecx, [esp+16] ; *s + and eax, 0xff + add [ecx], edx + pop ebp + ret + +table_MMX.L_case_0: + emms + pop ebp + ret + +table_MMX.L_case_1: + emms + mov eax, [esp+16] ; *s + mov ecx, [esp+8] ; *ix + sub ecx, edx + push ebx +.lp: + mov ebx, [edx+ecx] + add ebx, ebx + add ebx, [edx+ecx+4] + movzx ebx, byte [PIC_EBP_REL(ebx+t1l)] + add [eax], ebx + add ecx, 8 + jnz .lp + pop ebx + mov eax, 1 + pop ebp + ret + +table_MMX.L_case_45: + push dword 7 + lea ecx, [PIC_EBP_REL(tableABC+9*8)] + jmp from3 + +table_MMX.L_case_67: + push dword 10 + lea ecx, [PIC_EBP_REL(tableABC)] + jmp from3 + +table_MMX.L_case_8_15: + push dword 13 + lea ecx, [PIC_EBP_REL(tableDEF)] +from3: + mov eax,[esp+12] ;eax = *begin +; mov edx,[esp+16] ;edx = *end + + push ebx + sub eax, edx + + movq mm5,[PIC_EBP_REL(mul_add)] + pxor mm2,mm2 ;mm2 = sum + + test eax, 8 + jz .choose3_lp1 +; odd length + movq mm0,[edx+eax] ;mm0 = ix[0] | ix[1] + add eax,8 + packssdw mm0,mm2 + + pmaddwd mm0,mm5 + movd ebx,mm0 + + movq mm2, [ecx+ebx*8] + + jz .choose3_exit + + align 4 +.choose3_lp1 + movq mm0,[edx+eax] + movq mm1,[edx+eax+8] + add eax,16 + packssdw mm0,mm1 ;mm0 = ix[0]|ix[1]|ix[2]|ix[3] + pmaddwd mm0,mm5 + movd ebx,mm0 + punpckhdq mm0,mm0 + paddd mm2, [ecx+ebx*8] + movd ebx,mm0 + paddd mm2, [ecx+ebx*8] + jnz .choose3_lp1 +.choose3_exit +; xor eax,eax + movd ebx, mm2 + punpckhdq mm2,mm2 + mov ecx, ebx + and ecx, 0xffff ; ecx = sum2 + shr ebx, 16 ; ebx = sum1 + movd edx, mm2 ; edx = sum + + cmp edx, ebx + jle .choose3_s1 + mov edx, ebx + inc eax +.choose3_s1: + emms + pop ebx + cmp edx, ecx + jle .choose3_s2 + mov edx, ecx + mov eax, 2 +.choose3_s2: + pop ecx + add eax, ecx + mov ecx, [esp+16] ; *s + add [ecx], edx + pop ebp + ret + +table_MMX.L_case_2: + push dword 2 + lea ecx,[PIC_EBP_REL(table23)] + pmov mm5,[PIC_EBP_REL(mul_add23)] + jmp from2 +table_MMX.L_case_3: + push dword 5 + lea ecx,[PIC_EBP_REL(table56)] + pmov mm5,[PIC_EBP_REL(mul_add56)] +from2: + mov eax,[esp+12] ;eax = *begin +; mov edx,[esp+16] ;edx = *end + push ebx + push edi + + sub eax, edx + xor edi, edi + test eax, 8 + jz .choose2_lp1 +; odd length + movq mm0,[edx+eax] ;mm0 = ix[0] | ix[1] + pxor mm2,mm2 ;mm2 = sum + packssdw mm0,mm2 + + pmaddwd mm0,mm5 + movd ebx,mm0 + + mov edi, [ecx+ebx*4] + + add eax,8 + jz .choose2_exit + + align 4 +.choose2_lp1 + movq mm0,[edx+eax] + movq mm1,[edx+eax+8] + packssdw mm0,mm1 ;mm0 = ix[0]|ix[1]|ix[2]|ix[3] + pmaddwd mm0,mm5 + movd ebx,mm0 + punpckhdq mm0,mm0 + add edi, [ecx+ebx*4] + movd ebx, mm0 + add edi, [ecx+ebx*4] + add eax,16 + jnc .choose2_lp1 +.choose2_exit + mov ecx, edi + pop edi + pop ebx + pop eax ; table num. + emms + + mov edx, ecx + and ecx, 0xffff ; ecx = sum2 + shr edx, 16 ; edx = sum1 + + cmp edx, ecx + jle .choose2_s1 + mov edx, ecx + inc eax +.choose2_s1: + mov ecx, [esp+16] ; *s + add [ecx], edx + pop ebp + ret + + end diff --git a/libmp3lame/i386/cpu_feat.nas b/libmp3lame/i386/cpu_feat.nas new file mode 100644 index 0000000..b5b09c1 --- /dev/null +++ b/libmp3lame/i386/cpu_feat.nas @@ -0,0 +1,107 @@ +; +; +; assembler routines to detect CPU-features +; +; MMX / 3DNow! / SSE / SSE2 +; +; for the LAME project +; Frank Klemm, Robert Hegemann 2000-10-12 +; + +%include "nasm.h" + + globaldef has_MMX_nasm + globaldef has_3DNow_nasm + globaldef has_SSE_nasm + globaldef has_SSE2_nasm + + segment_code + +testCPUID: + pushfd + pop eax + mov ecx,eax + xor eax,0x200000 + push eax + popfd + pushfd + pop eax + cmp eax,ecx + ret + +;--------------------------------------- +; int has_MMX_nasm (void) +;--------------------------------------- + +has_MMX_nasm: + pushad + call testCPUID + jz return0 ; no CPUID command, so no MMX + + mov eax,0x1 + CPUID + test edx,0x800000 + jz return0 ; no MMX support + jmp return1 ; MMX support + +;--------------------------------------- +; int has_SSE_nasm (void) +;--------------------------------------- + +has_SSE_nasm: + pushad + call testCPUID + jz return0 ; no CPUID command, so no SSE + + mov eax,0x1 + CPUID + test edx,0x02000000 + jz return0 ; no SSE support + jmp return1 ; SSE support + +;--------------------------------------- +; int has_SSE2_nasm (void) +;--------------------------------------- + +has_SSE2_nasm: + pushad + call testCPUID + jz return0 ; no CPUID command, so no SSE2 + + mov eax,0x1 + CPUID + test edx,0x04000000 + jz return0 ; no SSE2 support + jmp return1 ; SSE2 support + +;--------------------------------------- +; int has_3DNow_nasm (void) +;--------------------------------------- + +has_3DNow_nasm: + pushad + call testCPUID + jz return0 ; no CPUID command, so no 3DNow! + + mov eax,0x80000000 + CPUID + cmp eax,0x80000000 + jbe return0 ; no extended MSR(1), so no 3DNow! + + mov eax,0x80000001 + CPUID + test edx,0x80000000 + jz return0 ; no 3DNow! support + ; 3DNow! support +return1: + popad + xor eax,eax + inc eax + ret + +return0: + popad + xor eax,eax + ret + + end diff --git a/libmp3lame/i386/fft.nas b/libmp3lame/i386/fft.nas new file mode 100644 index 0000000..7928b33 --- /dev/null +++ b/libmp3lame/i386/fft.nas @@ -0,0 +1,267 @@ + +; for new GOGO-no-coda (1999/09) +; Copyright (C) 1999 shigeo +; special thanks to Keiichi SAKAI, URURI +%include "nasm.h" + + globaldef fht_3DN + globaldef fht + externdef costab_fft + externdef sintab_fft + externdef gray_index + + segment_data + align 16 +D_MSB1_0 dd 0 ,0x80000000 +D_SQRT2 dd 1.414213562,1.414213562 +t_s0 dd 0 ;[ t_c:t_s] +t_c0 dd 0 +t_c1 dd 0 ;[-t_s:t_c] +t_s1 dd 0 +D_s1c1 dd 0, 0 +D_Mc1s1 dd 0, 0 +D_s2c2 dd 0, 0 +D_Mc2s2 dd 0, 0 +D_0_1 dd 1.0, 0.0 +S_05 DD 0.5 +S_00005 DD 0.0005 +fht dd 0 ;�ؿ��ݥ��� + + segment_code + +;************************************************************************ + +; by shigeo +; 99/08/16 +; 23000clk �ɤ��ä��� +; 18500clk bit reversal from gogo1 by URURI + +;void fht(float *fz, int n); + align 16 +fht_3DN: + push ebx + push esi + push edi + push ebp +%assign _P 4*4 + ;�ޤ��ǽ�Υ롼��... ��fht()�γ��ذ�ư + + mov esi,[esp+_P+4] ;esi=fz + mov ecx,[esp+_P+8] ;ecx=n + + ;�ᥤ��롼�� + movq mm7,[D_MSB1_0] ;mm7=[1<<31:0] + +%assign LOCAL_STACK 16 + sub esp,LOCAL_STACK +%assign _P (_P+LOCAL_STACK) + xor eax,eax + mov [esp],eax ;k=0 +%define k dword [esp] +%define kx dword [esp+4] +%define fn dword [esp+8] + +.lp30: ;k=0; do{ + mov ecx,k + add ecx,2 + mov k,ecx + mov eax,1 + shl eax,cl ;eax=k1 = 1<<k + lea ebx,[eax+eax] ;ebx=k2 = k1*2 + lea ecx,[eax+eax*2] ;ecx=k3 = k2 + k1 = k1*3 + lea edx,[ebx+ebx] ;edx=k4 = k1*4 + mov esi,eax + shr esi,1 ;esi=kx=k1>>1 + mov kx,esi ;��¸(��ǻȤ�) + mov edi,[esp+_P+4] ;edi=fi=fz + lea ebp,[edi+esi*4] ;ebp=gi=fz+kx + mov esi,[esp+_P+8] ;esi=n + lea esi,[edi+esi*4] ;esi=fn=fz+n + movq mm6,[D_SQRT2] ;mm6=[��2:��2] + +.lp31: ;fn=fz+n; do{ FLOAT g0,f0,f1,... + movd mm0,[edi] ;mm0=[0:fi[ 0]] + movd mm1,[edi+eax*4] ;mm1=[0:fi[k1]] + punpckldq mm0,mm0 ;mm0=[fi_0 :fi_0 ] + punpckldq mm1,mm1 ;mm1=[fi_k1:fi_k1] + movd mm2,[edi+ebx*4] + movd mm3,[edi+ecx*4] + punpckldq mm2,mm2 ;mm2=[fi_k2:fi_k2] + punpckldq mm3,mm3 ;mm3=[fi_k3:fi_k3] + pxor mm1,mm7 ;mm1=[-fi_k1:fi_k1] + pxor mm3,mm7 ;mm3=[-fi_k3:fi_k3] + pfadd mm0,mm1 ;mm0=[f1:f0]=[fi_0 -fi_k1 : fi_0 +fi_k1] + pfadd mm2,mm3 ;mm2=[f3:f2]=[fi_k2-fi_k3 : fi_k2+fi_k3] + movq mm3,mm0 ;mm3=[f1:f0] + pfadd mm0,mm2 ;mm0=[f1+f3:f0+f2] + movd [edi],mm0 ;fi[0]=f0+f2 + psrlq mm0,32 ;mm0=[0:f1+f3] + pfsub mm3,mm2 ;mm3=[f1-f3:f0-f2] + movd [edi+eax*4],mm0 ;fi[k1]=f1+f3 + movd [edi+ebx*4],mm3 ;fi[k2]=f0-f2 + psrlq mm3,32 ;mm3=[0:f1-f3] + movd [edi+ecx*4],mm3 ;fi[k3]=f1-f3 + + movd mm0,[ebp] ;mm0=[0:gi_0] + movd mm1,[ebp+eax*4] ;mm1=[0:gi_k1] + punpckldq mm0,mm0 ;mm0=[gi_0 :gi_0 ] + punpckldq mm1,mm1 ;mm1=[gi_k1:gi_k1] + movd mm2,[ebp+ebx*4] ;mm2=[0:gi_k2] + pxor mm1,mm7 ;mm1=[-gi_k1:gi_k1] + punpckldq mm2,[ebp+ecx*4] ;mm2=[gi_k3:gi_k2] + pfadd mm0,mm1 ;mm0=[g1:g0]=[gi_0 -gi_k1:gi_0 +gi_k1] + pfmul mm2,mm6 ;mm2=[g3:g2]=sqrt2 * [gi_k3:gi_k2] + movq mm1,mm0 ;mm1=[g1:g0] + pfadd mm0,mm2 ;mm0=[g1+g3:g0+g2] + movd [ebp],mm0 ;gi[0]=g0+g2 + psrlq mm0,32 ;mm0=[0:g1+g3] + pfsub mm1,mm2 ;mm1=[g1-g3:g0-g2] + movd [ebp+eax*4],mm0 ;gi[k1]=g1+g3 + movd [ebp+ebx*4],mm1 ;gi[k2]=g0-g2 + psrlq mm1,32 ;mm1=[0:g1-g3] + movd [ebp+ecx*4],mm1 ;gi[k3]=g1-g3 + lea edi,[edi+edx*4] ;fi += k4 + lea ebp,[ebp+edx*4] ;gi += k4 + cmp edi,esi + jc near .lp31 ;}while(fi<fn); + +; �����ޤǤ�¿ʬO.K. + + mov fn,esi ;fn=fz+n + ;�����ͤϰ���³���Ȥ� + ;eax=k1,ebx=k2,ecx=k3,edx=k4 + + mov edi,k + lea ebp,[costab_fft+edi*4] + mov ebp,[ebp] ;ebp=t_c + mov [t_c0],ebp + mov [t_c1],ebp ;t_c + lea ebp,[sintab_fft+edi*4] + mov ebp,[ebp] ;ebx=t_s + mov [t_s0],ebp + xor ebp,0x80000000 + mov [t_s1],ebp ;-t_s + + movq mm1,[D_0_1] ;mm1=[0:1] + movq [D_s1c1],mm1 ;mm1=[s1:c1] + mov esi,1 ;esi=i=1 + +.lp32: ; for(i=1;i<kx;i++){ + movq mm0,[D_s1c1] ;mm1=[s1:t]=[s1:c1] + movq mm2,mm0 + pfmul mm0,[t_c1] ;mm0=[-s1*t_s: t*t_c] + pfmul mm2,[t_s0] ;mm2=[ s1*t_c: t*t_s] + pfacc mm0,mm2 ;mm0=[s1:c1]=[ s1*t_c+t*t_s:-s1*t_s+t*t_c] + movq mm2,mm0 ;mm2=[s1:c1] + movq [D_s1c1],mm0 ;��¸ + movq mm6,mm2 + punpckldq mm5,mm6 + punpckhdq mm6,mm5 ;mm6=[ c1:s1] + pxor mm6,mm7 ;mm6=[-c1:s1] + movq [D_Mc1s1],mm6 ;��¸ + pfmul mm2,mm2 ;mm2=[s1*s1:c1*c1] + movq mm3,mm0 ;mm3=[s1:c1] + pxor mm2,mm7 ;mm2=[-s1*s1:c1*c1] + psrlq mm3,32 ;mm3=[ 0:s1] + pfacc mm2,mm2 ;mm2=[c2:c2]=[c1*c1-s1*s1:<] + pfmul mm0,mm3 ;mm0=[ 0:c1*s1] + pfadd mm0,mm0 ;mm0=[0:s2]=[ 0:2*c1*s1] + punpckldq mm2,mm0 ;mm2=[s2:c2] + movq [D_s2c2],mm2 ;��¸ + + punpckldq mm0,mm2 + punpckhdq mm2,mm0 ;mm2=[c2:s2] + pxor mm2,mm7 ;mm2=[-c2:s2] + movq [D_Mc2s2],mm2 ;��¸ + + mov edi,[esp+_P+4] ;edi=fz + lea edi,[edi+esi*4] ;edi=fz+i + + mov ebp,[esp+_P+4] ;ebp=fz + neg esi ;esi=-i + lea ebp,[ebp+eax*4] ;ebp=fz+k1 + lea ebp,[ebp+esi*4] ;ebp=gi=fz+k1-i + neg esi ;esi=i + +.lp33: ; do{ FLOAT a,b,g0,f0,f1,g1,f2,g2,f3,g3; + + movd mm0,[edi+eax*4] ;mm0=[0:fi_k1] + punpckldq mm0,[ebp+eax*4] ;mm0=[gi_k1:fi_k1] + movq mm1,mm0 + pfmul mm0,[D_s2c2] ;mm0=[ s2*gi_k1:c2*fi_k1] + pfmul mm1,[D_Mc2s2] ;mm1=[-c2*gi_k1:s2*fi_k1] + pfacc mm0,mm1 ;mm0=[b:a] + movd mm4,[edi] ;mm4=[0:fi_0] + movq mm3,mm0 ;mm3=[b:a] + punpckldq mm4,[ebp] ;mm4=[gi_0:fi_0] + pfadd mm3,mm4 ;mm3=[g0:f0]=[gi_0+b:fi_0+a] + pfsub mm4,mm0 ;mm4=[g1:f1]=[gi_0-b:fi_0-a] + + movd mm0,[edi+ecx*4] ;mm0=[0:fi_k3] + punpckldq mm0,[ebp+ecx*4] ;mm0=[gi_k3:fi_k3] + movq mm1,mm0 + pfmul mm0,[D_s2c2] ;mm0=[ s2*gi_k3:c2*fi_k3] + pfmul mm1,[D_Mc2s2] ;mm1=[-c2*gi_k3:s2*fi_k3] + pfacc mm0,mm1 ;mm0=[b:a] + movd mm5,[edi+ebx*4] ;mm5=[0:fi_k2] + movq mm6,mm0 ;mm6=[b:a] + punpckldq mm5,[ebp+ebx*4] ;mm5=[gi_k2:fi_k2] + pfadd mm6,mm5 ;mm6=[g2:f2]=[gi_k2+b:fi_k2+a] + pfsub mm5,mm0 ;mm5=[g3:f3]=[gi_k2-b:fi_k2-a] + + punpckldq mm1,mm6 ;mm1=[f2:*] + movq mm0,[D_s1c1] ;mm0=[s1:c1] + punpckhdq mm1,mm5 ;mm1=[g3:f2] + pfmul mm0,mm1 ;mm0=[ s1*g3:c1*f2] + movq mm2,[D_Mc1s1] ;mm2=[-c1:s1] + pfmul mm2,mm1 ;mm2=[-c1*g3:s1*f2] + pfacc mm0,mm2 ;mm0=[b:a] + + punpckldq mm1,mm3 ;mm1=[f0:*] + punpckhdq mm1,mm4 ;mm1=[g1:f0] + movq mm2,mm0 ;mm2=[b:a] + pfadd mm0,mm1 ;mm0=[g1+b:f0+a] + pfsubr mm2,mm1 ;mm2=[g1-b:f0-a] + movd [edi],mm0 ;fi[0]=f0+a + psrlq mm0,32 ;mm0=[0:g1+b] + movd [edi+ebx*4],mm2 ;fi[k2]=f0-a + psrlq mm2,32 ;mm2=[0:g1-b] + movd [ebp+eax*4],mm0 ;gi[k1]=g1+b + movd [ebp+ecx*4],mm2 ;gi[k3]=g1-b + psrlq mm6,32 ;mm6=[0:g2] + movq mm0,[D_s1c1] ;mm0=[s1:c1] + punpckldq mm5,mm6 ;mm5=[g2:f3] + pfmul mm0,mm5 ;mm0=[g2* s1:f3*c1] + pfmul mm5,[D_Mc1s1] ;mm5=[g2*-c1:f3*s1] + pfacc mm0,mm5 ;mm0=[-b:a] + psrlq mm3,32 ;mm3=[0:g0] + movq mm1,mm0 ;mm1=[-b:a] + punpckldq mm3,mm4 ;mm3=[f1:g0] + pfadd mm0,mm3 ;mm0=[f1-b:g0+a] + pfsubr mm1,mm3 ;mm1=[f1+b:g0-a] + movd [ebp],mm0 ;gi[0]=g0+a + psrlq mm0,32 ;mm0=[0:f1-b] + movd [ebp+ebx*4],mm1 ;gi[k2]=g0-a + psrlq mm1,32 ;mm1=[0:f1+b] + movd [edi+ecx*4],mm0 ;fi[k3]=f1-b + movd [edi+eax*4],mm1 ;fi[k1]=f1+b + + lea edi,[edi+edx*4] ;fi += k4 + lea ebp,[ebp+edx*4] ;gi += k4 + cmp edi,fn + jc near .lp33 ;}while(fi<fn) + inc esi + cmp esi,kx + jnz near .lp32 ;} + cmp edx,[esp+_P+8] + jnz near .lp30 ;}while(k4<n) + + +.exit: + add esp,LOCAL_STACK + femms + pop ebp + pop edi + pop esi + pop ebx + ret diff --git a/libmp3lame/i386/fft3dn.nas b/libmp3lame/i386/fft3dn.nas new file mode 100644 index 0000000..71db7db --- /dev/null +++ b/libmp3lame/i386/fft3dn.nas @@ -0,0 +1,488 @@ +; from a new GOGO-no-coda (1999/09) +; Copyright (C) 1999 shigeo +; special thanks to Keiichi SAKAI, URURI +; hacked and back-ported to LAME +; by Takehiro TOMINAGA Nov 2000 + +%include "nasm.h" + + globaldef fht_3DN + + segment_data + align 16 +costab dd 0x80000000, 0 + dd 1.414213562,1.414213562 + dd 9.238795283293805e-01, 9.238795283293805e-01 + dd 3.826834424611044e-01, 3.826834424611044e-01 + dd 9.951847264044178e-01, 9.951847264044178e-01 + dd 9.801714304836734e-02, 9.801714304836734e-02 + dd 9.996988186794428e-01, 9.996988186794428e-01 + dd 2.454122920569705e-02, 2.454122920569705e-02 + dd 9.999811752815535e-01, 9.999811752815535e-01 + dd 6.135884819898878e-03, 6.135884819898878e-03 +D_1_0_0_0 dd 0.0 , 1.0 + + segment_code + +PIC_OFFSETTABLE + + +;void fht_3DN(float *fz, int nn); + +proc fht_3DN + + pushd ebp, ebx, esi, edi + + sub esp, 20 + + call get_pc.bp + add ebp, PIC_BASE() + + mov r0, [esp+40] ;fi + mov r1, [esp+44] ;r1 = nn + lea r3, [PIC_EBP_REL(costab)] ;tri = costab + lea r4, [r0+r1*8] ;r4 = fn = &fz[n] + mov [esp+16], r4 + mov r4, 8 ;kx = k1/2 + + pmov mm7, [r3] + + loopalign 16 +.do1 + lea r3, [r3+16] ;tri += 2; + pmov mm6, [PIC_EBP_REL(costab+8)] + lea r2, [r4+r4*2] ;k3*fsize/2 + mov r5, 4 ;i = 1*fsize + + loopalign 16 +.do2: + lea r1, [r0+r4] ;gi = fi + kx + ;f + pmov mm0, [r0] ;fi0 + pmov mm1, [r0+r4*2] ;fi1 + pmov mm2, [r0+r2*2] ;fi3 + pmov mm3, [r0+r4*4] ;fi2 + + pupldq mm0, mm0 ;fi0 | fi0 + pupldq mm1, mm1 ;fi1 | fi1 + pupldq mm2, mm2 ;fi2 | fi2 + pupldq mm3, mm3 ;fi3 | fi3 + + pxor mm1, mm7 ;fi1 | -fi1 + pxor mm3, mm7 ;fi3 | -fi3 + + pfsub mm0, mm1 ;f1 | f0 + pfsub mm2, mm3 ;f3 | f2 + + pmov mm4, mm0 + pfadd mm0, mm2 ;f1+f3|f0+f2 = fi1 | fi0 + pfsub mm4, mm2 ;f1-f3|f0-f2 = fi3 | fi2 + + pmovd [r0], mm0 ;fi[0] + puphdq mm0, mm0 + pmovd [r0+r4*4], mm4 ;fi[k2] + puphdq mm4, mm4 + + pmovd [r0+r4*2], mm4 ;fi[k1] + pmovd [r0+r2*2], mm0 ;fi[k3] + lea r0, [r0+r4*8] + + ;g + pmov mm0, [r1] ;gi0 + pmov mm1, [r1+r4*2] ;gi1 + pmov mm2, [r1+r4*4] ;gi2 + pmov mm3, [r1+r2*2] ;gi3 + + pupldq mm1, mm1 + pupldq mm0, mm0 ;gi0 | gi0 + pupldq mm2, mm3 ;gi3 | gi2 + + pxor mm1, mm7 ;gi1 | -gi1 + + pfsub mm0, mm1 ;gi0-gi1|gi0+gi1 = g1 | g0 + pfmul mm2, mm6 ;gi3*SQRT2|gi2*SQRT2 = g3 | g2 + + pmov mm4, mm0 + pfadd mm0, mm2 ;g1+g3|g0+g2 = gi1 | gi0 + pfsub mm4, mm2 ;g1-g3|g0-g2 = gi3 | gi2 + + pmovd [r1], mm0 ;gi[0] + puphdq mm0, mm0 + pmovd [r1+r4*4], mm4 ;gi[k2] + puphdq mm4, mm4 + + cmp r0, [esp + 16] + pmovd [r1+r4*2], mm0 ;gi[k1] + pmovd [r1+r2*2], mm4 ;gi[k3] + + jb near .do2 + + pmov mm6, [r3+r5] ; this is not aligned address!! + + loopalign 16 +.for: +; +; mm6 = c1 | s1 +; mm7 = 0x800000000 | 0 +; + pmov mm1, mm6 + mov r0, [esp+40] ; fz + puphdq mm1, mm1 ; c1 | c1 + lea r1, [r0+r4*2] + pfadd mm1, mm1 ; c1+c1 | c1+c1 + pfmul mm1, mm6 ; 2*c1*c1 | 2*c1*s1 + pfsub mm1, [PIC_EBP_REL(D_1_0_0_0)] ; 2*c1*c1-1.0 | 2*c1*s1 = -c2 | s2 + + pmov mm0, mm1 + pxor mm7, mm6 ; c1 | -s1 + + pupldq mm2, mm0 + pupldq mm3, mm6 ; ** | c1 + puphdq mm0, mm2 ; s2 | c2 + puphdq mm6, mm3 ;-s1 | c1 + + pxor mm0, [PIC_EBP_REL(costab)] ; c2 | -s2 + +; mm0 = s2| c2 +; mm1 = -c2| s2 +; mm6 = c1| s1 +; mm7 = s1|-c1 (we use the opposite sign. from GOGO here) + + pmov [esp], mm0 + pmov [esp+8], mm1 + + sub r1, r5 ;r1 = gi + add r0, r5 ;r0 = fi + + loopalign 16 +.do3: + pmov mm2, [r0+r4*2] ; fi[k1] + pmov mm4, [r1+r4*2] ; gi[k1] + pmov mm3, [r0+r2*2] ; fi[k3] + pmov mm5, [r1+r2*2] ; gi[k3] + + pupldq mm2, mm2 ; fi1 | fi1 + pupldq mm4, mm4 ; gi1 | gi1 + pupldq mm3, mm3 ; fi3 | fi3 + pupldq mm5, mm5 ; gi3 | gi3 + + pfmul mm2, mm0 ; s2 * fi1 | c2 * fi1 + pfmul mm4, mm1 ;-c2 * gi1 | s2 * gi1 + pfmul mm3, mm0 ; s2 * fi3 | c2 * fi3 + pfmul mm5, mm1 ;-c2 * gi3 | s2 * gi3 + + pfadd mm2, mm4 ;b | a + pfadd mm3, mm5 ;d | c + + pmov mm0, [r0] + pmov mm4, [r1] + pmov mm1, [r0+r4*4] + pmov mm5, [r1+r4*4] + + pupldq mm0, mm4 ;gi0 | fi0 + pupldq mm1, mm5 ;gi2 | fi2 + + pmov mm4, mm2 + pmov mm5, mm3 + + pfadd mm2, mm0 ;g0 | f0 + pfadd mm3, mm1 ;g2 | f2 + + pfsub mm0, mm4 ;g1 | f1 + pfsub mm1, mm5 ;g3 | f3 + + pmov mm4, mm3 + pmov mm5, mm1 + + pupldq mm4, mm4 ;f2 | f2 + puphdq mm5, mm5 ;g3 | g3 + puphdq mm3, mm3 ;g2 | g2 + pupldq mm1, mm1 ;f3 | f3 + + pfmul mm4, mm6 ;f2 * c1 | f2 * s1 + pfmul mm5, mm7 ;g3 * s1 | g3 *-c1 + pfmul mm3, mm6 ;g2 * c1 | g2 * s1 + pfmul mm1, mm7 ;f3 * s1 | f3 *-c1 + + pfadd mm4, mm5 ;a | b + pfsub mm3, mm1 ;d | c + + pmov mm5, mm2 + pmov mm1, mm0 + + pupldq mm2, mm2 ;f0 | f0 + pupldq mm0, mm0 ;f1 | f1 + + puphdq mm1, mm2 ;f0 | g1 + puphdq mm5, mm0 ;f1 | g0 + + pmov mm2, mm4 + pmov mm0, mm3 + + pfadd mm4, mm1 ;fi0 | gi1 + pfadd mm3, mm5 ;fi1 | gi0 + pfsub mm1, mm2 ;fi2 | gi3 + pfsub mm5, mm0 ;fi3 | gi2 + + pmovd [r1+r4*2], mm4 ;gi[k1] + puphdq mm4, mm4 + pmovd [r1], mm3 ;gi[0] + puphdq mm3, mm3 + pmovd [r1+r2*2], mm1 ;gi[k3] + puphdq mm1, mm1 + pmovd [r1+r4*4], mm5 ;gi[k2] + puphdq mm5, mm5 + + pmovd [r0], mm4 ;fi[0] + pmovd [r0+r4*2], mm3 ;fi[k1] + pmovd [r0+r4*4], mm1 ;fi[k2] + pmovd [r0+r2*2], mm5 ;fi[k3] + + lea r0, [r0+r4*8] + lea r1, [r1+r4*8] + cmp r0, [esp + 16] + pmov mm0, [esp] + pmov mm1, [esp+8] + + jb near .do3 + + add r5, 4 +; mm6 = c1| s1 +; mm7 = s1|-c1 (we use the opposite sign. from GOGO here) + pfmul mm6, [r3] ; c1*a | s1*a + pfmul mm7, [r3+8] ; s1*b |-c1*b + cmp r5, r4 + + pfsub mm6, mm7 ; c1*a-s1*b | s1*a+c1*b + pupldq mm7,mm6 + puphdq mm6,mm7 + pmov mm7, [PIC_EBP_REL(costab)] + jb near .for + + mov r0, [esp+40] ;fi + cmp r4, [esp+40+4] + lea r4, [r4*4] ;kx *= 4 + + jb near .do1 +.exitttt + femms + add esp,20 + popd ebp, ebx, esi, edi +endproc + + +;void fht_E3DN(float *fz, int nn); + +proc fht_E3DN + + pushd ebp, ebx, esi, edi + + sub esp, 20 + + call get_pc.bp + add ebp, PIC_BASE() + + mov r0, [esp+40] ;fi + mov r1, [esp+44] ;r1 = nn + lea r3, [PIC_EBP_REL(costab)] ;tri = costab + lea r4, [r0+r1*8] ;r4 = fn = &fz[n] + mov [esp+16], r4 + mov r4, 8 ;kx = k1/2 + + pmov mm7, [r3] + + loopalign 16 +.do1 + lea r3, [r3+16] ;tri += 2; + pmov mm6, [PIC_EBP_REL(costab+8)] + lea r2, [r4+r4*2] ;k3*fsize/2 + mov r5, 4 ;i = 1*fsize + + loopalign 16 +.do2: + lea r1, [r0+r4] ;gi = fi + kx +;f + pmov mm0, [r0] ; X | fi0 + pmov mm1, [r0+r4*4] ; X | fi2 + pupldq mm0, [r0+r4*2] ;fi1 | fi0 + pupldq mm1, [r0+r2*2] ;fi3 | fi2 + pfpnacc mm0, mm0 ;fi0+fi1 | fi0-fi1 = f0|f1 + pfpnacc mm1, mm1 ;fi2+fi3 | fi2-fi3 = f2|f3 + + pmov mm2, mm0 + pfadd mm0, mm1 ;f0+f2|f1+f3 = fi0 | fi1 + pfsub mm2, mm1 ;f0-f2|f1-f3 = fi2 | fi3 + + pmovd [r0+r4*2], mm0 ;fi[k1] + pmovd [r0+r2*2], mm2 ;fi[k3] + + puphdq mm0, mm0 + puphdq mm2, mm2 + pmovd [r0], mm0 ;fi[0] + pmovd [r0+r4*4], mm2 ;fi[k2] + + lea r0, [r0+r4*8] +;g + pmov mm3, [r1] ; gi0 + pmov mm4, [r1+r2*2] ; gi3 + pupldq mm3, [r1+r4*2] ;gi1|gi0 + pupldq mm4, [r1+r4*4] ;gi2|gi3 + + pfpnacc mm3, mm3 ;gi0+gi1 |gi0-gi1 = f0|f1 + pfmul mm4, mm6 ;gi2*SQRT2|gi3*SQRT2 = f2|f3 + + pmov mm5, mm3 + pfadd mm3, mm4 ;f0+f2|f1+f3 + pfsub mm5, mm4 ;f0-f2|f1-f3 + + cmp r0, [esp + 16] + pmovd [r1+r4*2], mm3 ;gi[k1] + pmovd [r1+r2*2], mm5 ;gi[k3] + puphdq mm3, mm3 + puphdq mm5, mm5 + pmovd [r1], mm3 ;gi[0] + pmovd [r1+r4*4], mm5 ;gi[k2] + + jb near .do2 + + pmov mm6, [r3+r5] ; this is not aligned address!! + + loopalign 16 +.for: +; +; mm6 = c1 | s1 +; mm7 = 0x800000000 | 0 +; + pmov mm5, mm6 + mov r0, [esp+40] ; fz + puphdq mm5, mm5 ; c1 | c1 + lea r1, [r0+r4*2] + pfadd mm5, mm5 ; c1+c1 | c1+c1 + pfmul mm5, mm6 ; 2*c1*c1 | 2*c1*s1 + pfsub mm5, [PIC_EBP_REL(D_1_0_0_0)] ; 2*c1*c1-1.0 | 2*c1*s1 = -c2 | s2 + + pswapd mm4, mm5 ; s2 |-c2 + pxor mm4, mm7 ; s2 | c2 + pxor mm7, mm6 ; c1 |-s1 + pswapd mm6, mm6 ; s1 | c1 + +; mm4 = s2| c2 +; mm5 = -c2| s2 +; mm6 = c1| s1 +; mm7 = s1|-c1 (we use the opposite sign. from GOGO here) + + pmov [esp], mm4 + pmov [esp+8], mm5 + + sub r1, r5 ;r1 = gi + add r0, r5 ;r0 = fi + + loopalign 16 +.do3: + pmov mm0, [r0+r2*2] ; fi[k1] + pmov mm2, [r1+r2*2] ; gi[k1] + pmov mm1, [r0+r4*2] ; fi[k3] + pmov mm3, [r1+r4*2] ; gi[k3] + + pupldq mm0, mm0 + pupldq mm2, mm2 + pupldq mm1, mm1 + pupldq mm3, mm3 + + pfmul mm0, mm4 + pfmul mm2, mm5 + pfmul mm1, mm4 + pfmul mm3, mm5 + + pfadd mm0, mm2 ;d | c + pfadd mm1, mm3 ;b | a + + pmov mm2, [r0+r4*4] ;fi2 + pupldq mm3, [r1+r4*4] ;gi2 | - + pmov mm4, [r0] ;fi0 + pupldq mm5, [r1] ;gi0 | - + + pupldq mm2, mm0 ;c | fi2 + puphdq mm3, mm0 ;d | gi2 + pupldq mm4, mm1 ;a | fi0 + puphdq mm5, mm1 ;b | gi0 + + pfpnacc mm2, mm2 ;f2 | f3 + pfpnacc mm3, mm3 ;g2 | g3 + pfpnacc mm4, mm4 ;f0 | f1 + pfpnacc mm5, mm5 ;g0 | g1 + + pmov mm0, mm2 + pmov mm1, mm3 + pupldq mm2, mm2 ;f3 | f3 + pupldq mm3, mm3 ;g3 | g3 + puphdq mm0, mm0 ;f2 | f2 + puphdq mm1, mm1 ;g2 | g2 + + pswapd mm4, mm4 ;f1 | f0 + pswapd mm5, mm5 ;g1 | g0 + + pfmul mm0, mm7 ;f2 * s1 | f2 *-c1 + pfmul mm3, mm6 ;g3 * c1 | g3 * s1 + pfmul mm1, mm6 ;g2 * c1 | g2 * s1 + pfmul mm2, mm7 ;f3 * s1 | f3 *-c1 + + pfsub mm0, mm3 ; b |-a + pfsub mm1, mm2 ; d | c + + pmov mm2, mm5 + pmov mm3, mm4 + pupldq mm4, mm0 ;-a | f0 + pupldq mm5, mm1 ; c | g0 + puphdq mm2, mm0 ; b | g1 + puphdq mm3, mm1 ; d | f1 + + pfpnacc mm4, mm4 ;fi2 | fi0 + pfpnacc mm5, mm5 ;gi0 | gi2 + pfpnacc mm2, mm2 ;gi1 | gi3 + pfpnacc mm3, mm3 ;fi1 | fi3 + + pmovd [r0], mm4 ;fi[0] + pmovd [r1+r4*4], mm5 ;gi[k2] + pmovd [r1+r2*2], mm2 ;gi[k3] + pmovd [r0+r2*2], mm3 ;fi[k3] + + puphdq mm4, mm4 + puphdq mm5, mm5 + puphdq mm2, mm2 + puphdq mm3, mm3 + pmovd [r0+r4*4], mm4 ;fi[k2] + pmovd [r1], mm5 ;gi[0] + pmovd [r1+r4*2], mm2 ;gi[k1] + pmovd [r0+r4*2], mm3 ;fi[k1] + + lea r0, [r0+r4*8] + lea r1, [r1+r4*8] + cmp r0, [esp + 16] + pmov mm4, [esp] + pmov mm5, [esp+8] + + jb near .do3 + + add r5, 4 +; mm6 = c1| s1 +; mm7 = s1|-c1 (we use the opposite sign. from GOGO here) + pfmul mm6, [r3] ; c1*a | s1*a + pfmul mm7, [r3+8] ; s1*b |-c1*b + cmp r5, r4 + + pfsub mm6, mm7 ; c1*a-s1*b | s1*a+c1*b + pswapd mm6, mm6 ; ??? ; s1*a+c1*b | c1*a-s1*b + pmov mm7, [PIC_EBP_REL(costab)] + jb near .for + + mov r0, [esp+40] ;fi + cmp r4, [esp+40+4] + lea r4, [r4*4] ;kx *= 4 + + jb near .do1 +.exitttt + femms + add esp,20 + popd ebp, ebx, esi, edi +endproc diff --git a/libmp3lame/i386/fftfpu.nas b/libmp3lame/i386/fftfpu.nas new file mode 100644 index 0000000..2ae89bd --- /dev/null +++ b/libmp3lame/i386/fftfpu.nas @@ -0,0 +1,619 @@ +; back port from GOGO-no coda 2.24b by Takehiro TOMINAGA + +; GOGO-no-coda +; Copyright (C) 1999 shigeo +; special thanks to URURI + +%include "nasm.h" + + externdef costab_fft + externdef sintab_fft + + segment_data + align 32 +D_1_41421 dd 1.41421356 +D_1_0 dd 1.0 +D_0_5 dd 0.5 +D_0_25 dd 0.25 +D_0_0005 dd 0.0005 +D_0_0 dd 0.0 + + segment_code + +;void fht(float *fz, int n); +proc fht_FPU + +%$fz arg 4 +%$n arg 4 + +%$k local 4 + +%$f0 local 4 +%$f1 local 4 +%$f2 local 4 +%$f3 local 4 + +%$g0 local 4 +%$g1 local 4 +%$g2 local 4 +%$g3 local 4 + +%$s1 local 4 +%$c1 local 4 +%$s2 local 4 +%$c2 local 4 + +%$t_s local 4 +%$t_c local 4 + alloc + + pushd ebp, ebx, esi, edi + +fht_FPU_1st_part: + +fht_FPU_2nd_part: + +fht_FPU_3rd_part: + +.do_init: + mov r3, 16 ;k1*fsize = 4*fsize = k4 + mov r4, 8 ;kx = k1/2 + mov r2, 48 ;k3*fsize + mov dword [sp(%$k)], 2 ;k = 2 + mov r0, [sp(%$fz)] ;fi + lea r1, [r0+8] ;gi = fi + kx + +.do: +.do2: + ;f + fld dword [r0] + fsub dword [r0+r3] + + fld dword [r0] + fadd dword [r0+r3] + + fld dword [r0+r3*2] + fsub dword [r0+r2] + + fld dword [r0+r3*2] + fadd dword [r0+r2] ;f2 f3 f0 f1 + + fld st2 ;f0 f2 f3 f0 f1 + fadd st0, st1 + fstp dword [r0] ;fi[0] + + fld st3 ;f1 f2 f3 f0 f1 + fadd st0, st2 + fstp dword [r0+r3] ;fi[k1] + + fsubr st0, st2 ;f0-f2 f3 f0 f1 + fstp dword [r0+r3*2] ;fi[k2] + + fsubr st0, st2 ;f1-f3 f0 f1 + fstp dword [r0+r2] ;fi[k3] + fcompp + + ;g + fld dword [r1] + fsub dword [r1+r3] + + fld dword [r1] + fadd dword [r1+r3] + + fld dword [D_1_41421] + fmul dword [r1+r2] + + fld dword [D_1_41421] + fmul dword [r1+r3*2] ;g2 g3 g0 g1 + + fld st2 ;g0 g2 g3 g0 g1 + fadd st0, st1 + fstp dword [r1] ;gi[0] + + fld st3 ;g1 g2 g3 g0 g1 + fadd st0, st2 + fstp dword [r1+r3] ;gi[k1] + + fsubr st0, st2 ;g0-g2 g3 g0 g1 + fstp dword [r1+r3*2] ;gi[k2] + + fsubr st0, st2 ;g1-g3 g0 g1 + fstp dword [r1+r2] ;gi[k3] + fcompp + + lea r0, [r0+r3*4] + lea r1, [r1+r3*4] + cmp r0, r6 + jb .do2 + + + mov r0, [sp(%$k)] + fld dword [costab_fft +r0*4] + fstp dword [sp(%$t_c)] + fld dword [sintab_fft +r0*4] + fstp dword [sp(%$t_s)] + fld dword [D_1_0] + fstp dword [sp(%$c1)] + fld dword [D_0_0] + fstp dword [sp(%$s1)] + +.for_init: + mov r5, 4 ;i = 1*fsize + +.for: + fld dword [sp(%$c1)] + fmul dword [sp(%$t_c)] + fld dword [sp(%$s1)] + fmul dword [sp(%$t_s)] + fsubp st1, st0 ;c1 + + fld dword [sp(%$c1)] + fmul dword [sp(%$t_s)] + fld dword [sp(%$s1)] + fmul dword [sp(%$t_c)] + faddp st1, st0 ;s1 c1 + + fld st1 + fmul st0, st0 ;c1c1 s1 c1 + fld st1 + fmul st0, st0 ;s1s1 c1c1 s1 c1 + fsubp st1, st0 ;c2 s1 c1 + fstp dword [sp(%$c2)] ;s1 c1 + + fld st1 ;c1 s1 c1 + fmul st0, st1 ;c1s1 s1 c1 + fadd st0, st0 ;s2 s1 c1 + fstp dword [sp(%$s2)] ;s1 c1 + + fstp dword [sp(%$s1)] ;c1 + fstp dword [sp(%$c1)] ; + + mov r0, [sp(%$fz)] + add r0, r5 ;r0 = fi + mov r1, [sp(%$fz)] + add r1, r3 + sub r1, r5 ;r1 = gi + +.do3: + fld dword [sp(%$s2)] + fmul dword [r0+r3] + fld dword [sp(%$c2)] + fmul dword [r1+r3] + fsubp st1, st0 ;b = s2*fi[k1] - c2*gi[k1] + + fld dword [sp(%$c2)] + fmul dword [r0+r3] + fld dword [sp(%$s2)] + fmul dword [r1+r3] + faddp st1, st0 ;a = c2*fi[k1] + s2*gi[k1] b + + fld dword [r0] + fsub st0, st1 ;f1 a b + fstp dword [sp(%$f1)] ;a b + + fadd dword [r0] ;f0 b + fstp dword [sp(%$f0)] ;b + + fld dword [r1] + fsub st0, st1 ;g1 b + fstp dword [sp(%$g1)] ;b + + fadd dword [r1] ;g0 + fstp dword [sp(%$g0)] ; + + + fld dword [sp(%$s2)] + fmul dword [r0+r2] + fld dword [sp(%$c2)] + fmul dword [r1+r2] + fsubp st1, st0 ;b = s2*fi[k3] - c2*gi[k3] + + fld dword [sp(%$c2)] + fmul dword [r0+r2] + fld dword [sp(%$s2)] + fmul dword [r1+r2] + faddp st1, st0 ;a = c2*fi[k3] + s2*gi[k3] b + + fld dword [r0+r3*2] + fsub st0, st1 ;f3 a b + fstp dword [sp(%$f3)] ;a b + + fadd dword [r0+r3*2] ;f2 b + fstp dword [sp(%$f2)] ;b + + fld dword [r1+r3*2] + fsub st0, st1 ;g3 b + fstp dword [sp(%$g3)] ;b + + fadd dword [r1+r3*2] ;g2 + fstp dword [sp(%$g2)] ; + + + fld dword [sp(%$s1)] + fmul dword [sp(%$f2)] + fld dword [sp(%$c1)] + fmul dword [sp(%$g3)] + fsubp st1, st0 ;b = s1*f2 - c1*g3 + + fld dword [sp(%$c1)] + fmul dword [sp(%$f2)] + fld dword [sp(%$s1)] + fmul dword [sp(%$g3)] + faddp st1, st0 ;a = c1*f2 + s1*g3 b + + fld dword [sp(%$f0)] + fsub st0, st1 ;fi[k2] a b + fstp dword [r0+r3*2] + + fadd dword [sp(%$f0)] ;fi[0] b + fstp dword [r0] + + fld dword [sp(%$g1)] + fsub st0, st1 ;gi[k3] b + fstp dword [r1+r2] + + fadd dword [sp(%$g1)] ;gi[k1] + fstp dword [r1+r3] + + + fld dword [sp(%$c1)] + fmul dword [sp(%$g2)] + fld dword [sp(%$s1)] + fmul dword [sp(%$f3)] + fsubp st1, st0 ;b = c1*g2 - s1*f3 + + fld dword [sp(%$s1)] + fmul dword [sp(%$g2)] + fld dword [sp(%$c1)] + fmul dword [sp(%$f3)] + faddp st1, st0 ;a = s1*g2 + c1*f3 b + + fld dword [sp(%$g0)] + fsub st0, st1 ;gi[k2] a b + fstp dword [r1+r3*2] + + fadd dword [sp(%$g0)] ;gi[0] b + fstp dword [r1] + + fld dword [sp(%$f1)] + fsub st0, st1 ;fi[k3] b + fstp dword [r0+r2] + + fadd dword [sp(%$f1)] ;fi[k1] + fstp dword [r0+r3] + + + lea r0, [r0+r3*4] + lea r1, [r1+r3*4] + cmp r0, r6 + jb near .do3 + + add r5, 4 + cmp r5, r4 + jb near .for + + cmp r3, [sp(%$n)] + jae .exit + + add dword [sp(%$k)], 2 ;k += 2; + lea r3, [r3*4] ;k1 *= 4 + lea r2, [r2*4] ;k3 *= 4 + lea r4, [r4*4] ;kx *= 4 + mov r0, [sp(%$fz)] ;fi + lea r1, [r0+r4] ;gi = fi + kx + jmp .do + +.exit: + popd ebp, ebx, esi, edi +endproc + +;************************************************************* + +;void fht_FPU_FXCH(float *fz, int n); +proc fht_FPU_FXCH + +%$fz arg 4 +%$n arg 4 + +%$k local 4 + +%$f0 local 4 +%$f1 local 4 +%$f2 local 4 +%$f3 local 4 + +%$g0 local 4 +%$g1 local 4 +%$g2 local 4 +%$g3 local 4 + +%$s1 local 4 +%$c1 local 4 +%$s2 local 4 +%$c2 local 4 + +%$t_s local 4 +%$t_c local 4 + alloc + + pushd ebp, ebx, esi, edi + +fht_FPU_FXCH_1st_part: + +fht_FPU_FXCH_2nd_part: + +fht_FPU_FXCH_3rd_part: + +.do_init: + mov r3, 16 ;k1*fsize = 4*fsize = k4 + mov r4, 8 ;kx = k1/2 + mov r2, 48 ;k3*fsize + mov dword [sp(%$k)], 2 ;k = 2 + mov r0, [sp(%$fz)] ;fi + lea r1, [r0+8] ;gi = fi + kx + +.do: +.do2: + ;f + fld dword [r0] + fsub dword [r0+r3] + fld dword [r0] + fadd dword [r0+r3] + + fld dword [r0+r3*2] + fsub dword [r0+r2] + fld dword [r0+r3*2] + fadd dword [r0+r2] ;f2 f3 f0 f1 + + fld st3 + fld st3 + fxch st5 + fadd st0, st3 + fxch st4 + fadd st0, st2 + fxch st3 + fsubp st1, st0 + fxch st1 + fsubp st4, st0 + fxch st2 + + fstp dword [r0+r3] ;fi[k1] + fstp dword [r0] ;fi[0] + fstp dword [r0+r2] ;fi[k3] + fstp dword [r0+r3*2] ;fi[k2] + + ;g + fld dword [r1] + fsub dword [r1+r3] + fld dword [r1] + fadd dword [r1+r3] + + fld dword [D_1_41421] + fmul dword [r1+r2] + fld dword [D_1_41421] + fmul dword [r1+r3*2] ;g2 g3 g0 g1 + + fld st3 + fld st3 + fxch st5 + fadd st0, st3 + fxch st4 + fadd st0, st2 + fxch st3 + fsubp st1, st0 + fxch st1 + fsubp st4, st0 + fxch st2 + + fstp dword [r1+r3] ;gi[k1] + fstp dword [r1] ;gi[0] + fstp dword [r1+r2] ;gi[k3] + fstp dword [r1+r3*2] ;gi[k2] + + lea r0, [r0+r3*4] + lea r1, [r1+r3*4] + cmp r0, r6 + jb .do2 + + + mov r0, [sp(%$k)] + fld dword [costab_fft +r0*4] + fld dword [sintab_fft +r0*4] + fld dword [D_1_0] + fld dword [D_0_0] + fxch st3 + fstp dword [sp(%$t_c)] + fxch st1 + fstp dword [sp(%$t_s)] + fstp dword [sp(%$c1)] + fstp dword [sp(%$s1)] + +.for_init: + mov r5, 4 ;i = 1*fsize + +.for: + fld dword [sp(%$c1)] + fmul dword [sp(%$t_c)] + fld dword [sp(%$s1)] + fmul dword [sp(%$t_s)] + + fld dword [sp(%$c1)] + fmul dword [sp(%$t_s)] + fld dword [sp(%$s1)] + fmul dword [sp(%$t_c)] + fxch st2 + fsubp st3, st0 ;c1 + faddp st1, st0 ;s1 c1 + + fld st1 + fxch st2 + fmul st0, st0 ;c1c1 s1 c1 + fld st1 + fxch st2 + fmul st0, st0 ;s1s1 c1c1 s1 c1 + + fxch st3 + fst dword [sp(%$c1)] ;c1 + fxch st2 + fst dword [sp(%$s1)] ;s1 c1c1 c1 s1s1 + + fmulp st2, st0 + fsubrp st2, st0 + fadd st0, st0 ;s2 c2 + fxch st1 + fstp dword [sp(%$c2)] + fstp dword [sp(%$s2)] + + mov r0, [sp(%$fz)] + mov r1, [sp(%$fz)] + add r0, r5 ;r0 = fi + add r1, r3 + sub r1, r5 ;r1 = gi + +.do3: + fld dword [sp(%$s2)] + fmul dword [r0+r3] + fld dword [sp(%$c2)] + fmul dword [r1+r3] + + fld dword [sp(%$c2)] + fmul dword [r0+r3] + fld dword [sp(%$s2)] + fmul dword [r1+r3] + fxch st2 + fsubp st3, st0 ;b = s2*fi[k1] - c2*gi[k1] + faddp st1, st0 ;a = c2*fi[k1] + s2*gi[k1] b + + fld dword [r1] + fsub st0, st2 ;g1 a b + fxch st2 + fadd dword [r1] ;g0 a g1 + + fld dword [r0] + fsub st0, st2 ;f1 g0 a g1 + fxch st2 + fadd dword [r0] ;f0 g0 f1 g1 + + fxch st3 + fstp dword [sp(%$g1)] + fstp dword [sp(%$g0)] + fstp dword [sp(%$f1)] + fstp dword [sp(%$f0)] + + + fld dword [sp(%$s2)] + fmul dword [r0+r2] + fld dword [sp(%$c2)] + fmul dword [r1+r2] + + fld dword [sp(%$c2)] + fmul dword [r0+r2] + fld dword [sp(%$s2)] + fmul dword [r1+r2] + fxch st2 + fsubp st3, st0 ;b = s2*fi[k3] - c2*gi[k3] + faddp st1, st0 ;a = c2*fi[k3] + s2*gi[k3] b + + + fld dword [r1+r3*2] + fsub st0, st2 ;g3 a b + fxch st2 + fadd dword [r1+r3*2] ;g2 a g3 + + fld dword [r0+r3*2] + fsub st0, st2 ;f3 g2 a g3 + fxch st2 + fadd dword [r0+r3*2] ;f2 g2 f3 g3 + + fxch st3 + fstp dword [sp(%$g3)] + fstp dword [sp(%$g2)] + fstp dword [sp(%$f3)] + fstp dword [sp(%$f2)] + + + fld dword [sp(%$s1)] + fmul dword [sp(%$f2)] + fld dword [sp(%$c1)] + fmul dword [sp(%$g3)] + + fld dword [sp(%$c1)] + fmul dword [sp(%$f2)] + fld dword [sp(%$s1)] + fmul dword [sp(%$g3)] + fxch st2 + fsubp st3, st0 ;b = s1*f2 - c1*g3 + faddp st1, st0 ;a = c1*f2 + s1*g3 b + + fld dword [sp(%$g1)] + fsub st0, st2 ;gi[k3] a b + fxch st2 + fadd dword [sp(%$g1)] ;gi[k1] a gi[k3] + + fld dword [sp(%$f0)] + fsub st0, st2 ;fi[k2] gi[k1] a gi[k3] + fxch st2 + fadd dword [sp(%$f0)] ;fi[0] gi[k1] fi[k2] gi[k3] + + fxch st3 + fstp dword [r1+r2] + fstp dword [r1+r3] + fstp dword [r0+r3*2] + fstp dword [r0] + + + fld dword [sp(%$c1)] + fmul dword [sp(%$g2)] + fld dword [sp(%$s1)] + fmul dword [sp(%$f3)] + + fld dword [sp(%$s1)] + fmul dword [sp(%$g2)] + fld dword [sp(%$c1)] + fmul dword [sp(%$f3)] + fxch st2 + fsubp st3, st0 ;b = c1*g2 - s1*f3 + faddp st1, st0 ;a = s1*g2 + c1*f3 b + + fld dword [sp(%$f1)] + fsub st0, st2 ;fi[k3] a b + fxch st2 + fadd dword [sp(%$f1)] ;fi[k1] a fi[k3] + + fld dword [sp(%$g0)] + fsub st0, st2 ;gi[k2] fi[k1] a fi[k3] + fxch st2 + fadd dword [sp(%$g0)] ;gi[0] fi[k1] gi[k2] fi[k3] + + fxch st3 + fstp dword [r0+r2] + fstp dword [r0+r3] + fstp dword [r1+r3*2] + fstp dword [r1] + + + lea r0, [r0+r3*4] + lea r1, [r1+r3*4] + cmp r0, r6 + jb near .do3 + + add r5, 4 + cmp r5, r4 + jb near .for + + cmp r3, [sp(%$n)] + jae .exit + + add dword [sp(%$k)], 2 ;k += 2; + lea r3, [r3*4] ;k1 *= 4 + lea r2, [r2*4] ;k3 *= 4 + lea r4, [r4*4] ;kx *= 4 + mov r0, [sp(%$fz)] ;fi + lea r1, [r0+r4] ;gi = fi + kx + jmp .do + +.exit: + popd ebp, ebx, esi, edi +endproc + + end diff --git a/libmp3lame/i386/fftsse.nas b/libmp3lame/i386/fftsse.nas new file mode 100644 index 0000000..616fcc2 --- /dev/null +++ b/libmp3lame/i386/fftsse.nas @@ -0,0 +1,422 @@ +; back port from GOGO-no coda 2.24b by Takehiro TOMINAGA + +; GOGO-no-coda +; Copyright (C) 1999 shigeo +; special thanks to Keiichi SAKAI + +%include "nasm.h" + + globaldef fht_SSE + + segment_data + align 16 +Q_MMPP dd 0x0,0x0,0x80000000,0x80000000 +Q_MPMP dd 0x0,0x80000000,0x0,0x80000000 +D_1100 dd 0.0, 0.0, 1.0, 1.0 +costab_fft: + dd 9.238795325112867e-01 + dd 3.826834323650898e-01 + dd 9.951847266721969e-01 + dd 9.801714032956060e-02 + dd 9.996988186962042e-01 + dd 2.454122852291229e-02 + dd 9.999811752836011e-01 + dd 6.135884649154475e-03 +S_SQRT2 dd 1.414213562 + + segment_code + +PIC_OFFSETTABLE + +;------------------------------------------------------------------------ +; by K. SAKAI +; 99/08/18 PIII 23k[clk] +; 99/08/19 ̿�������촹�� PIII 22k[clk] +; 99/08/20 bit reversal ����夫��ܿ����� PIII 17k[clk] +; 99/08/23 ���� unroll PIII 14k[clk] +; 99/11/12 clean up +; +;void fht_SSE(float *fz, int n); + align 16 +fht_SSE: + push ebx + push esi + push edi + push ebp + +%assign _P 4*5 + + ;2���ܤΥ롼�� + mov eax,[esp+_P+0] ;eax=fz + mov ebp,[esp+_P+4] ;=n + shl ebp,3 + add ebp,eax ; fn = fz + n, ���δؿ���λ�ޤ����� + push ebp + + call get_pc.bp + add ebp, PIC_BASE() + + lea ecx,[PIC_EBP_REL(costab_fft)] + xor eax,eax + mov al,8 ; =k1=1*(sizeof float) // 4, 16, 64, 256,... +.lp2: ; do{ + mov esi,[esp+_P+4] ; esi=fi=fz + lea edx,[eax+eax*2] + mov ebx, esi + +; ��������2���󤷤����ԤǤ��ʤ���ʬ��FPU�Τۤ���®���� + loopalign 16 +.lp20: ; do{ +; f0 = fi[0 ] + fi[k1]; +; f2 = fi[k2] + fi[k3]; +; f1 = fi[0 ] - fi[k1]; +; f3 = fi[k2] - fi[k3]; +; fi[0 ] = f0 + f2; +; fi[k1] = f1 + f3; +; fi[k2] = f0 - f2; +; fi[k3] = f1 - f3; + lea edi,[ebx+eax] ; edi=gi=fi+ki/2 + fld dword [ebx] + fadd dword [ebx+eax*2] + fld dword [ebx+eax*4] + fadd dword [ebx+edx*2] + + fld dword [ebx] + fsub dword [ebx+eax*2] + fld dword [ebx+eax*4] + fsub dword [ebx+edx*2] + + fld st1 + fadd st0,st1 + fstp dword [ebx+eax*2] + fsubp st1,st0 + fstp dword [ebx+edx*2] + + fld st1 + fadd st0,st1 + fstp dword [ebx] + fsubp st1,st0 + fstp dword [ebx+eax*4] + + lea ebx,[ebx + eax*8] ; = fi += (k1 * 4); +; g0 = gi[0 ] + gi[k1]; +; g2 = SQRT2 * gi[k2]; +; g1 = gi[0 ] - gi[k1]; +; g3 = SQRT2 * gi[k3]; +; gi[0 ] = g0 + g2; +; gi[k2] = g0 - g2; +; gi[k1] = g1 + g3; +; gi[k3] = g1 - g3; + fld dword [edi] + fadd dword [edi+eax*2] + fld dword [PIC_EBP_REL(S_SQRT2)] + fmul dword [edi+eax*4] + + fld dword [edi] + fsub dword [edi+eax*2] + fld dword [PIC_EBP_REL(S_SQRT2)] + fmul dword [edi+edx*2] + + fld st1 + fadd st0,st1 + fstp dword [edi+eax*2] + fsubp st1,st0 + fstp dword [edi+edx*2] + + fld st1 + fadd st0,st1 + fstp dword [edi] + fsubp st1,st0 + fstp dword [edi+eax*4] + + cmp ebx,[esp] + jl near .lp20 ; while (fi<fn); + + +; i = 1; //for (i=1;i<kx;i++){ +; c1 = 1.0*t_c - 0.0*t_s; +; s1 = 0.0*t_c + 1.0*t_s; + movlps xmm6,[ecx] ; = { --, --, s1, c1} + movaps xmm7,xmm6 + + shufps xmm6,xmm6,R4(0,1,1,0) ; = {+c1, +s1, +s1, +c1} -> ɬ�� +; c2 = c1*c1 - s1*s1 = 1 - (2*s1)*s1; +; s2 = c1*s1 + s1*c1 = 2*s1*c1; + shufps xmm7,xmm7,R4(1,0,0,1) + movss xmm5,xmm7 ; = { --, --, --, s1} + xorps xmm7,[PIC_EBP_REL(Q_MMPP)] ; = {-s1, -c1, +c1, +s1} -> ɬ�� + + addss xmm5,xmm5 ; = (--, --, --, 2*s1) + add esi,4 ; esi = fi = fz + i + shufps xmm5,xmm5,R4(0,0,0,0) ; = (2*s1, 2*s1, 2*s1, 2*s1) + mulps xmm5,xmm6 ; = (2*s1*c1, 2*s1*s1, 2*s1*s1, 2*s1*c1) + subps xmm5,[PIC_EBP_REL(D_1100)] ; = (--, 2*s1*s1-1, --, 2*s1*c1) = {-- -c2 -- s2} + movaps xmm4,xmm5 + shufps xmm5,xmm5,R4(2,0,2,0) ; = {-c2, s2, -c2, s2} -> ɬ�� + + xorps xmm4,[PIC_EBP_REL(Q_MMPP)] ; = {--, c2, --, s2} + shufps xmm4,xmm4,R4(0,2,0,2) ; = {s2, c2, s2, c2} -> ɬ�� + + loopalign 16 +.lp21: ; do{ +; a = c2*fi[k1] + s2*gi[k1]; +; b = s2*fi[k1] - c2*gi[k1]; +; c = c2*fi[k3] + s2*gi[k3]; +; d = s2*fi[k3] - c2*gi[k3]; +; f0 = fi[0 ] + a; +; g0 = gi[0 ] + b; +; f2 = fi[k1 * 2] + c; +; g2 = gi[k1 * 2] + d; +; f1 = fi[0 ] - a; +; g1 = gi[0 ] - b; +; f3 = fi[k1 * 2] - c; +; g3 = gi[k1 * 2] - d; + lea edi,[esi + eax*2 - 8] ; edi = gi = fz +k1-i + + movss xmm0,[esi + eax*2] ; = fi[k1] + movss xmm2,[esi + edx*2] ; = fi[k3] + shufps xmm0,xmm2,0x00 ; = {fi[k3], fi[k3], fi[k1], fi[k1]} + movss xmm1,[edi + eax*2] ; = fi[k1] + movss xmm3,[edi + edx*2] ; = fi[k3] + shufps xmm1,xmm3,0x00 ; = {gi[k3], gi[k3], gi[k1], gi[k1]} + movss xmm2,[esi] ; = fi[0] + mulps xmm0,xmm4 ; *= {+s2, +c2, +s2, +c2} + movss xmm3,[esi + eax*4] ; = fi[k2] + unpcklps xmm2,xmm3 ; = {--, --, fi[k2], fi[0]} + mulps xmm1,xmm5 ; *= {-c2, +s2, -c2, +s2} + movss xmm3,[edi + eax*4] ; = gi[k2] + addps xmm0,xmm1 ; = {d, c, b, a} + movss xmm1,[edi] ; = gi[0] + unpcklps xmm1,xmm3 ; = {--, --, gi[k2], gi[0]} + unpcklps xmm2,xmm1 ; = {gi[k2], fi[k2], gi[0], fi[0]} + movaps xmm1,xmm2 + addps xmm1,xmm0 ; = {g2, f2, g0, f0} + subps xmm2,xmm0 ; = {g3, f3, g1, f1} + +; a = c1*f2 + s1*g3; +; c = s1*g2 + c1*f3; +; b = s1*f2 - c1*g3; +; d = c1*g2 - s1*f3; +; fi[0 ] = f0 + a; +; gi[0 ] = g0 + c; +; gi[k1] = g1 + b; +; fi[k1] = f1 + d; +; fi[k1 * 2] = f0 - a; +; gi[k1 * 2] = g0 - c; +; gi[k3] = g1 - b; +; fi[k3] = f1 - d; + movaps xmm3,xmm1 + movhlps xmm1,xmm1 ; = {g2, f2, g2, f2} + shufps xmm3,xmm2,0x14 ; = {f1, g1, g0, f0} + mulps xmm1,xmm6 ; *= {+c1, +s1, +s1, +c1} + shufps xmm2,xmm2,0xBB ; = {f3, g3, f3, g3} + mulps xmm2,xmm7 ; *= {-s1, -c1, +c1, +s1} + addps xmm1,xmm2 ; = {d, b, c, a} + movaps xmm2,xmm3 + addps xmm3,xmm1 ; = {fi[k1], gi[k1], gi[0], fi[0]} + subps xmm2,xmm1 ; = {fi[k3], gi[k3], gi[k1*2], fi[k1*2]} + movhlps xmm0,xmm3 + movss [esi],xmm3 + shufps xmm3,xmm3,0x55 + movss [edi+eax*2],xmm0 + shufps xmm0,xmm0,0x55 + movss [edi],xmm3 + movss [esi+eax*2],xmm0 + movhlps xmm0,xmm2 + movss [esi+eax*4],xmm2 + shufps xmm2,xmm2,0x55 + movss [edi+edx*2],xmm0 + shufps xmm0,xmm0,0x55 + movss [edi+eax*4],xmm2 + movss [esi+edx*2],xmm0 + lea esi,[esi + eax*8] ; fi += (k1 * 4); + cmp esi,[esp] + jl near .lp21 ; while (fi<fn); + + +; unroll����do loop��43+4̿�� + +; ������ǤϤʤ�for�롼�פ�i=2�������unrolling���� +; kx= 2, 8, 32, 128 +; k4= 16, 64, 256, 1024 +; 0, 6/2,30/2,126/2 + + xor ebx,ebx + mov bl, 4*2 ; = i = 4 + cmp ebx,eax ; i < k1 + jnl near .F22 +; for (i=2;i<kx;i+=2){ + loopalign 16 +.lp22: +; at here, xmm6 is {c3, s3, s3, c3} +; c1 = c3*t_c - s3*t_s; +; s1 = c3*t_s + s3*t_c; + movlps xmm0,[ecx] + shufps xmm0,xmm0,R4(1,1,0,0) ; = {t_s, t_s, t_c, t_c} + mulps xmm6,xmm0 ; = {c3*ts, s3*ts, s3*tc, c3*tc} + movhlps xmm4,xmm6 ; = {--, --, c3*ts, s3*ts} + xorps xmm4,[PIC_EBP_REL(Q_MPMP)] ; = {--, --, -c3*ts, s3*ts} + subps xmm6,xmm4 ; = {-,-, c3*ts+s3*tc, c3*tc-s3*ts}={-,-,s1,c1} + +; c3 = c1*t_c - s1*t_s; +; s3 = s1*t_c + c1*t_s; + shufps xmm6,xmm6,0x14 ; = {c1, s1, s1, c1} + mulps xmm0,xmm6 ; = {ts*c1 ts*s1 tc*s1 tc*c1} + movhlps xmm3,xmm0 + xorps xmm3,[PIC_EBP_REL(Q_MPMP)] + subps xmm0,xmm3 ; = {--, --, s3, c3} + +; {s2 s4 c4 c2} = {2*s1*c1 2*s3*c3 1-2*s3*s3 1-2*s1*s1} + unpcklps xmm6,xmm0 ; xmm6 = {s3, s1, c3, c1} + movaps xmm7, xmm6 + shufps xmm6,xmm6,R4(2,3,1,0) ; xmm6 = {s1, s3, c3, c1} + addps xmm7, xmm7 ; {s3*2, s1*2, --, --} + mov edi,[esp+_P+4] ; = fz + shufps xmm7, xmm7, R4(2,3,3,2) ; {s1*2, s3*2, s3*2, s1*2} + sub edi,ebx ; edi = fz - i/2 + mulps xmm7, xmm6 ; {s1*s1*2, s3*s3*2, s3*c3*2, s1*c1*2} + lea esi,[edi + ebx*2] ; esi = fi = fz +i/2 + subps xmm7, [PIC_EBP_REL(D_1100)] ; {-c2, -c4, s4, s2} + lea edi,[edi + eax*2-4] ; edi = gi = fz +k1-i/2 + +; fi = fz +i; +; gi = fz +k1-i; +; do{ +.lp220: +; unroll���do loop��51+4̿�� +; a = c2*fi[k1 ] + s2*gi[k1 ]; +; e = c4*fi[k1+1] + s4*gi[k1-1]; +; f = s4*fi[k1+1] - c4*gi[k1-1]; +; b = s2*fi[k1 ] - c2*gi[k1 ]; +; c = c2*fi[k3 ] + s2*gi[k3 ]; +; g = c4*fi[k3+1] + s4*gi[k3-1]; +; h = s4*fi[k3+1] - c4*gi[k3-1]; +; d = s2*fi[k3 ] - c2*gi[k3 ]; + + movaps xmm4,xmm7 ; = {-c2 -c4 s4 s2} + xorps xmm4,[PIC_EBP_REL(Q_MMPP)] ; = { c2 c4 s4 s2} + shufps xmm4,xmm4,0x1B ; = { s2 s4 c4 c2} + movlps xmm0,[esi+eax*2] + movlps xmm1,[edi+eax*2] + movlps xmm2,[esi+edx*2] + movlps xmm3,[edi+edx*2] + shufps xmm0,xmm0,0x14 + shufps xmm1,xmm1,0x41 + shufps xmm2,xmm2,0x14 + shufps xmm3,xmm3,0x41 + mulps xmm0,xmm4 + mulps xmm1,xmm7 + mulps xmm2,xmm4 + mulps xmm3,xmm7 + addps xmm0,xmm1 ; xmm0 = {b, f, e, a} + addps xmm2,xmm3 ; xmm2 = {d, h, g, c} +;17 + +; f0 = fi[0 ] + a; +; f4 = fi[0 +1] + e; +; g4 = gi[0 -1] + f; +; g0 = gi[0 ] + b; +; f1 = fi[0 ] - a; +; f5 = fi[0 +1] - e; +; g5 = gi[0 -1] - f; +; g1 = gi[0 ] - b; +; f2 = fi[k2 ] + c; +; f6 = fi[k2+1] + g; +; g6 = gi[k2-1] + h; +; g2 = gi[k2 ] + d; +; f3 = fi[k2 ] - c; +; f7 = fi[k2+1] - g; +; g7 = gi[k2-1] - h; +; g3 = gi[k2 ] - d; + movlps xmm1,[esi ] + movhps xmm1,[edi ] + movaps xmm4,xmm1 + subps xmm1,xmm0 ; xmm1 = {g1, g5, f5, f1} + movlps xmm3,[esi+eax*4] + movhps xmm3,[edi+eax*4] + movaps xmm5,xmm3 + subps xmm3,xmm2 ; xmm3 = {g3, g7, f7, f3} + addps xmm0,xmm4 ; xmm0 = {g0, g4, f4, f0} + addps xmm2,xmm5 ; xmm2 = {g2, g6, f6, f2} +;10 + +; a = c1*f2 + s1*g3; ��*�� + ��*�� +; e = c3*f6 + s3*g7; +; g = s3*g6 + c3*f7; +; c = s1*g2 + c1*f3; +; d = c1*g2 - s1*f3; ��*�� - ��*�� +; h = c3*g6 - s3*f7; +; f = s3*f6 - c3*g7; +; b = s1*f2 - c1*g3; + + movaps xmm5,xmm6 ; xmm6 = {s1, s3, c3, c1} + shufps xmm5,xmm5,0x1B ; = {c1, c3, s3, s1} + movaps xmm4,xmm2 + mulps xmm4,xmm6 + shufps xmm2,xmm2,0x1B ; xmm2 = {f2, f6, g6, g2} + mulps xmm2,xmm6 + mulps xmm5,xmm3 + mulps xmm3,xmm6 + shufps xmm3,xmm3,0x1B + addps xmm4,xmm3 ; = {c, g, e, a} + subps xmm2,xmm5 ; = {b, f, h, d} +;10 + +; fi[0 ] = f0 + a; +; fi[0 +1] = f4 + e; +; gi[0 -1] = g4 + g; +; gi[0 ] = g0 + c; +; fi[k2 ] = f0 - a; +; fi[k2+1] = f4 - e; +; gi[k2-1] = g4 - g; +; gi[k2 ] = g0 - c; +; fi[k1 ] = f1 + d; +; fi[k1+1] = f5 + h; +; gi[k1-1] = g5 + f; +; gi[k1 ] = g1 + b; +; fi[k3 ] = f1 - d; +; fi[k3+1] = f5 - h; +; gi[k3-1] = g5 - f; +; gi[k3 ] = g1 - b; + movaps xmm3,xmm0 + subps xmm0,xmm4 + movlps [esi+eax*4],xmm0 + movhps [edi+eax*4],xmm0 + addps xmm4,xmm3 + movlps [esi ],xmm4 + movhps [edi ],xmm4 + + movaps xmm5,xmm1 + subps xmm1,xmm2 + movlps [esi+edx*2],xmm1 + movhps [edi+edx*2],xmm1 + addps xmm2,xmm5 + movlps [esi+eax*2],xmm2 + movhps [edi+eax*2],xmm2 +; 14 +; gi += k4; +; fi += k4; + lea edi,[edi + eax*8] ; gi += (k1 * 4); + lea esi,[esi + eax*8] ; fi += (k1 * 4); + cmp esi,[esp] + jl near .lp220 ; while (fi<fn); +; } while (fi<fn); + + add ebx,byte 2*4 ; i+= 4 + cmp ebx,eax ; i < k1 + shufps xmm6,xmm6,R4(1,2,2,1) ; (--,s3,c3,--) => {c3, s3, s3, c3} + jl near .lp22 +; } +.F22: + shl eax,2 + add ecx, byte 8 + cmp eax,[esp+_P+8] ; while ((k1 * 4)<n); + jle near .lp2 + pop ebp + pop ebp + pop edi + pop esi + pop ebx + ret + + end diff --git a/libmp3lame/i386/ffttbl.nas b/libmp3lame/i386/ffttbl.nas new file mode 100644 index 0000000..14dd9ae --- /dev/null +++ b/libmp3lame/i386/ffttbl.nas @@ -0,0 +1,78 @@ + +; for new GOGO-no-coda (1999/09) +; Copyright (C) 1999 shigeo +; special thanks to URURI, Keiichi SAKAI + + +; fft sin,cos,gray�ơ��֥� +; 99/08/21 +; 99/09/01(�����)���ӥå�ȿž�ơ��֥��� +; 99/09/14 ���쥤�����ɥ���ǥå���ɽ�������Х벽 + +%include "nasm.h" + + globaldef costab_fft + globaldef sintab_fft + globaldef gray_index + + segment_data + align 16 + +costab_fft: + dd 0.000000000000 + dd 0.707106781187 + dd 0.923879532511 + dd 0.980785280403 + dd 0.995184726672 + dd 0.998795456205 + dd 0.999698818696 + dd 0.999924701839 + dd 0.999981175283 + dd 0.999995293810 + dd 0.999998823452 + dd 0.999999705863 + dd 0.999999926466 + dd 0.999999981616 + dd 0.999999995404 + dd 0.999999998851 + +sintab_fft: + dd 1.000000000000 + dd 0.707106781187 + dd 0.382683432365 + dd 0.195090322016 + dd 0.098017140330 + dd 0.049067674327 + dd 0.024541228523 + dd 0.012271538286 + dd 0.006135884649 + dd 0.003067956763 + dd 0.001533980186 + dd 0.000766990319 + dd 0.000383495188 + dd 0.000191747597 + dd 0.000095873799 + dd 0.000047936900 + + align 16 +gray_index: + db 2, 3, 2, 4, 2, 3, 2, 5, 2, 3, 2, 4, 2, 3, 2, 6 + db 2, 3, 2, 4, 2, 3, 2, 5, 2, 3, 2, 4, 2, 3, 2, 7 + db 2, 3, 2, 4, 2, 3, 2, 5, 2, 3, 2, 4, 2, 3, 2, 6 + db 2, 3, 2, 4, 2, 3, 2, 5, 2, 3, 2, 4, 2, 3, 2, 8 + db 2, 3, 2, 4, 2, 3, 2, 5, 2, 3, 2, 4, 2, 3, 2, 6 + db 2, 3, 2, 4, 2, 3, 2, 5, 2, 3, 2, 4, 2, 3, 2, 7 + db 2, 3, 2, 4, 2, 3, 2, 5, 2, 3, 2, 4, 2, 3, 2, 6 + db 2, 3, 2, 4, 2, 3, 2, 5, 2, 3, 2, 4, 2, 3, 2, 9 + db 2, 3, 2, 4, 2, 3, 2, 5, 2, 3, 2, 4, 2, 3, 2, 6 + db 2, 3, 2, 4, 2, 3, 2, 5, 2, 3, 2, 4, 2, 3, 2, 7 + db 2, 3, 2, 4, 2, 3, 2, 5, 2, 3, 2, 4, 2, 3, 2, 6 + db 2, 3, 2, 4, 2, 3, 2, 5, 2, 3, 2, 4, 2, 3, 2, 8 + db 2, 3, 2, 4, 2, 3, 2, 5, 2, 3, 2, 4, 2, 3, 2, 6 + db 2, 3, 2, 4, 2, 3, 2, 5, 2, 3, 2, 4, 2, 3, 2, 7 + db 2, 3, 2, 4, 2, 3, 2, 5, 2, 3, 2, 4, 2, 3, 2, 6 + db 2, 3, 2, 4, 2, 3, 2, 5, 2, 3, 2, 4, 2, 3, 2, 10 + + segment_code + + end diff --git a/libmp3lame/i386/nasm.h b/libmp3lame/i386/nasm.h new file mode 100644 index 0000000..720f666 --- /dev/null +++ b/libmp3lame/i386/nasm.h @@ -0,0 +1,268 @@ + +; Copyright (C) 1999 URURI + +; nasm�ѥޥ��� +; 1999/08/21 ��� +; 1999/10/10 ���Ĥ��ɲ� +; 1999/10/27 aout�б� +; 1999/11/07 pushf, popf ��NASM�ΥХ��б� +; 1999/12/02 for BCC ( Thanks to Miquel ) + +; for Windows Visual C++ -> define WIN32 +; Borland or cygwin -> WIN32 and COFF +; for FreeBSD 2.x -> AOUT +; for TownsOS -> __tos__ +; otherwise -> none + +;̾����դ��� + +BITS 32 + +section .note.GNU-stack noalloc noexec nowrite progbits + +%ifdef YASM + %define segment_code segment .text align=16 use32 + %define segment_data segment .data align=16 use32 + %define segment_bss segment .bss align=16 use32 +%elifdef WIN32 + %define segment_code segment .text align=16 class=CODE use32 + %define segment_data segment .data align=16 class=DATA use32 +%ifdef __BORLANDC__ + %define segment_bss segment .data align=16 class=DATA use32 +%else + %define segment_bss segment .bss align=16 class=DATA use32 +%endif +%elifdef AOUT + %define _NAMING + %define segment_code segment .text + %define segment_data segment .data + %define segment_bss segment .bss +%else +%ifidn __OUTPUT_FORMAT__,elf + section .note.GNU-stack progbits noalloc noexec nowrite align=1 +%endif + %define segment_code segment .text align=16 class=CODE use32 + %define segment_data segment .data align=16 class=DATA use32 + %define segment_bss segment .bss align=16 class=DATA use32 +%endif + +%ifdef WIN32 + %define _NAMING +%endif + +%ifdef __tos__ +group CGROUP text +group DGROUP data +%endif + +;ñ�����ư�������� + +%idefine float dword +%idefine fsize 4 +%idefine fsizen(a) (fsize*(a)) + +;��ɷ�� + +%idefine wsize 2 +%idefine wsizen(a) (wsize*(a)) +%idefine dwsize 4 +%idefine dwsizen(a) (dwsize*(a)) + +;REG + +%define r0 eax +%define r1 ebx +%define r2 ecx +%define r3 edx +%define r4 esi +%define r5 edi +%define r6 ebp +%define r7 esp + +;MMX,3DNow!,SSE + +%define pmov movq +%define pmovd movd + +%define pupldq punpckldq +%define puphdq punpckhdq +%define puplwd punpcklwd +%define puphwd punpckhwd + +%define xm0 xmm0 +%define xm1 xmm1 +%define xm2 xmm2 +%define xm3 xmm3 +%define xm4 xmm4 +%define xm5 xmm5 +%define xm6 xmm6 +%define xm7 xmm7 + +;�����åե��Ѥ�4�ʥޥ��� + +%define R4(a,b,c,d) (a*64+b*16+c*4+d) + +;C�饤���ʴʰץޥ��� + +%imacro globaldef 1 + %ifdef _NAMING + %define %1 _%1 + %endif + global %1 +%endmacro + +%imacro externdef 1 + %ifdef _NAMING + %define %1 _%1 + %endif + extern %1 +%endmacro + +%imacro proc 1 + %push proc + %ifdef _NAMING + global _%1 + %else + global %1 + %endif + + align 32 +%1: +_%1: + + %assign %$STACK 0 + %assign %$STACKN 0 + %assign %$ARG 4 +%endmacro + +%imacro endproc 0 + %ifnctx proc + %error expected 'proc' before 'endproc'. + %else + %if %$STACK > 0 + add esp, %$STACK + %endif + + %if %$STACK <> (-%$STACKN) + %error STACKLEVEL mismatch check 'local', 'alloc', 'pushd', 'popd' + %endif + + ret + %pop + %endif +%endmacro + +%idefine sp(a) esp+%$STACK+a + +%imacro arg 1 + %00 equ %$ARG + %assign %$ARG %$ARG+%1 +%endmacro + +%imacro local 1 + %assign %$STACKN %$STACKN-%1 + %00 equ %$STACKN +%endmacro + +%imacro alloc 0 + sub esp, (-%$STACKN)-%$STACK + %assign %$STACK (-%$STACKN) +%endmacro + +%imacro pushd 1-* + %rep %0 + push %1 + %assign %$STACK %$STACK+4 + %rotate 1 + %endrep +%endmacro + +%imacro popd 1-* + %rep %0 + %rotate -1 + pop %1 + %assign %$STACK %$STACK-4 + %endrep +%endmacro + +; bug of NASM-0.98 +%define pushf db 0x66, 0x9C +%define popf db 0x66, 0x9D + +%define ge16(n) ((((n) / 16)*0xFFFFFFFF) & 0xFFFFFFFF) +%define ge15(n) ((((n) / 15)*0xFFFFFFFF) & 0xFFFFFFFF) +%define ge14(n) ((((n) / 14)*0xFFFFFFFF) & 0xFFFFFFFF) +%define ge13(n) ((((n) / 13)*0xFFFFFFFF) & 0xFFFFFFFF) +%define ge12(n) ((((n) / 12)*0xFFFFFFFF) & 0xFFFFFFFF) +%define ge11(n) ((((n) / 11)*0xFFFFFFFF) & 0xFFFFFFFF) +%define ge10(n) ((((n) / 10)*0xFFFFFFFF) & 0xFFFFFFFF) +%define ge9(n) ((((n) / 9)*0xFFFFFFFF) & 0xFFFFFFFF) +%define ge8(n) (ge9(n) | ((((n) / 8)*0xFFFFFFFF) & 0xFFFFFFFF)) +%define ge7(n) (ge9(n) | ((((n) / 7)*0xFFFFFFFF) & 0xFFFFFFFF)) +%define ge6(n) (ge9(n) | ((((n) / 6)*0xFFFFFFFF) & 0xFFFFFFFF)) +%define ge5(n) (ge9(n) | ((((n) / 5)*0xFFFFFFFF) & 0xFFFFFFFF)) +%define ge4(n) (ge5(n) | ((((n) / 4)*0xFFFFFFFF) & 0xFFFFFFFF)) +%define ge3(n) (ge5(n) | ((((n) / 3)*0xFFFFFFFF) & 0xFFFFFFFF)) +%define ge2(n) (ge3(n) | ((((n) / 2)*0xFFFFFFFF) & 0xFFFFFFFF)) +%define ge1(n) (ge2(n) | ((((n) / 1)*0xFFFFFFFF) & 0xFFFFFFFF)) + +; macro to align for begining of loop +; %1 does not align if it LE bytes to next alignment +; 4..16 +; default is 12 + +%imacro loopalignK6 0-1 12 +%%here: + times (($$-%%here) & 15 & ge1(($$-%%here) & 15) & ~ge4(($$-%%here) & 15)) nop + times (1 & ge4(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) jmp short %%skip + times (((($$-%%here) & 15)-2) & ge4(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) nop +%%skip: +%endmacro + +%imacro loopalignK7 0-1 12 +%%here: + times (1 & ge1(($$-%%here) & 15) & ~ge2(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) nop + times (1 & ge2(($$-%%here) & 15) & ~ge3(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 08Bh,0C0h + times (1 & ge3(($$-%%here) & 15) & ~ge4(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 08Dh,004h,020h + times (1 & ge4(($$-%%here) & 15) & ~ge5(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 08Dh,044h,020h,000h + times (1 & ge5(($$-%%here) & 15) & ~ge6(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 08Dh,044h,020h,000h,090h + times (1 & ge6(($$-%%here) & 15) & ~ge7(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 08Dh,080h,0,0,0,0 + times (1 & ge7(($$-%%here) & 15) & ~ge8(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 08Dh,004h,005h,0,0,0,0 + times (1 & ge8(($$-%%here) & 15) & ~ge9(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 08Dh,004h,005h,0,0,0,0,90h + times (1 & ge9(($$-%%here) & 15) & ~ge10(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 0EBh,007h,90h,90h,90h,90h,90h,90h,90h + times (1 & ge10(($$-%%here) & 15) & ~ge11(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 0EBh,008h,90h,90h,90h,90h,90h,90h,90h,90h + times (1 & ge11(($$-%%here) & 15) & ~ge12(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 0EBh,009h,90h,90h,90h,90h,90h,90h,90h,90h,90h + times (1 & ge12(($$-%%here) & 15) & ~ge13(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 0EBh,00Ah,90h,90h,90h,90h,90h,90h,90h,90h,90h,90h + times (1 & ge13(($$-%%here) & 15) & ~ge14(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 0EBh,00Bh,90h,90h,90h,90h,90h,90h,90h,90h,90h,90h,90h + times (1 & ge14(($$-%%here) & 15) & ~ge15(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 0EBh,00Ch,90h,90h,90h,90h,90h,90h,90h,90h,90h,90h,90h,90h + times (1 & ge15(($$-%%here) & 15) & ~ge16(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 0EBh,00Dh,90h,90h,90h,90h,90h,90h,90h,90h,90h,90h,90h,90h,90h +%%skip: +%endmacro + +%imacro loopalign 0-1 12 + loopalignK7 %1 +%endmacro +%define PACK(x,y,z,w) (x*64+y*16+z*4+w) + +%ifidn __OUTPUT_FORMAT__,elf + +%idefine PIC_BASE(A) _GLOBAL_OFFSET_TABLE_ + $$ - $ wrt ..gotpc +%idefine PIC_EBP_REL(A) ebp + A wrt ..gotoff +%macro PIC_OFFSETTABLE 0 +extern _GLOBAL_OFFSET_TABLE_ +get_pc.bp: + mov ebp, [esp] + retn +%endmacro + +%else + +%define PIC_BASE(A) (0) +%define PIC_EBP_REL(A) (A) +%macro PIC_OFFSETTABLE 0 +get_pc.bp: + mov ebp, [esp] + retn +%endmacro + +%endif diff --git a/libmp3lame/i386/scalar.nas b/libmp3lame/i386/scalar.nas new file mode 100644 index 0000000..6d69f42 --- /dev/null +++ b/libmp3lame/i386/scalar.nas @@ -0,0 +1,1022 @@ +; +; (C) Frank Klemm 1995,99,2000 +; Dedicated to the LAME project +; +; + %include "nasm.h" + + segment_code + +; float_t scalar04_float32_i387 ( +; const float32_t* const p, +; const float32_t* const q ); + +proc scalar04_float32_i387 +%$p arg 4 +%$q arg 4 +;;; alloc + + mov eax,[sp(%$p)] + mov edx,[sp(%$q)] + fld dword [eax] + fmul dword [edx] + fld dword [eax + 4] + fmul dword [edx + 4] + faddp st1,st0 + fld dword [eax + 8] + fmul dword [edx + 8] + faddp st1,st0 + fld dword [eax + 12] + fmul dword [edx + 12] + faddp st1,st0 +endproc + + +proc scalar08_float32_i387 +%$p arg 4 +%$q arg 4 +;;; alloc + + mov eax,[sp(%$p)] + mov edx,[sp(%$q)] + fld dword [eax] + fmul dword [edx] + fld dword [eax + 4] + fmul dword [edx + 4] + faddp st1,st0 + fld dword [eax + 8] + fmul dword [edx + 8] + faddp st1,st0 + fld dword [eax + 12] + fmul dword [edx + 12] + faddp st1,st0 + fld dword [eax + 16] + fmul dword [edx + 16] + faddp st1,st0 + fld dword [eax + 20] + fmul dword [edx + 20] + faddp st1,st0 + fld dword [eax + 24] + fmul dword [edx + 24] + faddp st1,st0 + fld dword [eax + 28] + fmul dword [edx + 28] + faddp st1,st0 +endproc + + +proc scalar12_float32_i387 +%$p arg 4 +%$q arg 4 +;;; alloc + + mov eax,[sp(%$p)] + mov edx,[sp(%$q)] + fld dword [eax] + fmul dword [edx] + fld dword [eax + 4] + fmul dword [edx + 4] + faddp st1,st0 + fld dword [eax + 8] + fmul dword [edx + 8] + faddp st1,st0 + fld dword [eax + 12] + fmul dword [edx + 12] + faddp st1,st0 + fld dword [eax + 16] + fmul dword [edx + 16] + faddp st1,st0 + fld dword [eax + 20] + fmul dword [edx + 20] + faddp st1,st0 + fld dword [eax + 24] + fmul dword [edx + 24] + faddp st1,st0 + fld dword [eax + 28] + fmul dword [edx + 28] + faddp st1,st0 + fld dword [eax + 32] + fmul dword [edx + 32] + faddp st1,st0 + fld dword [eax + 36] + fmul dword [edx + 36] + faddp st1,st0 + fld dword [eax + 40] + fmul dword [edx + 40] + faddp st1,st0 + fld dword [eax + 44] + fmul dword [edx + 44] + faddp st1,st0 +endproc + + +proc scalar16_float32_i387 +%$p arg 4 +%$q arg 4 +;;; alloc + + mov eax,[sp(%$p)] + mov edx,[sp(%$q)] + fld dword [eax] + fmul dword [edx] + fld dword [eax + 4] + fmul dword [edx + 4] + faddp st1,st0 + fld dword [eax + 8] + fmul dword [edx + 8] + faddp st1,st0 + fld dword [eax + 12] + fmul dword [edx + 12] + faddp st1,st0 + fld dword [eax + 16] + fmul dword [edx + 16] + faddp st1,st0 + fld dword [eax + 20] + fmul dword [edx + 20] + faddp st1,st0 + fld dword [eax + 24] + fmul dword [edx + 24] + faddp st1,st0 + fld dword [eax + 28] + fmul dword [edx + 28] + faddp st1,st0 + fld dword [eax + 32] + fmul dword [edx + 32] + faddp st1,st0 + fld dword [eax + 36] + fmul dword [edx + 36] + faddp st1,st0 + fld dword [eax + 40] + fmul dword [edx + 40] + faddp st1,st0 + fld dword [eax + 44] + fmul dword [edx + 44] + faddp st1,st0 + fld dword [eax + 48] + fmul dword [edx + 48] + faddp st1,st0 + fld dword [eax + 52] + fmul dword [edx + 52] + faddp st1,st0 + fld dword [eax + 56] + fmul dword [edx + 56] + faddp st1,st0 + fld dword [eax + 60] + fmul dword [edx + 60] + faddp st1,st0 +endproc + + +proc scalar20_float32_i387 +%$p arg 4 +%$q arg 4 +;;; alloc + + mov eax,[sp(%$p)] + mov edx,[sp(%$q)] + fld dword [eax] + fmul dword [edx] + fld dword [eax + 4] + fmul dword [edx + 4] + faddp st1,st0 + fld dword [eax + 8] + fmul dword [edx + 8] + faddp st1,st0 + fld dword [eax + 12] + fmul dword [edx + 12] + faddp st1,st0 + fld dword [eax + 16] + fmul dword [edx + 16] + faddp st1,st0 + fld dword [eax + 20] + fmul dword [edx + 20] + faddp st1,st0 + fld dword [eax + 24] + fmul dword [edx + 24] + faddp st1,st0 + fld dword [eax + 28] + fmul dword [edx + 28] + faddp st1,st0 + fld dword [eax + 32] + fmul dword [edx + 32] + faddp st1,st0 + fld dword [eax + 36] + fmul dword [edx + 36] + faddp st1,st0 + fld dword [eax + 40] + fmul dword [edx + 40] + faddp st1,st0 + fld dword [eax + 44] + fmul dword [edx + 44] + faddp st1,st0 + fld dword [eax + 48] + fmul dword [edx + 48] + faddp st1,st0 + fld dword [eax + 52] + fmul dword [edx + 52] + faddp st1,st0 + fld dword [eax + 56] + fmul dword [edx + 56] + faddp st1,st0 + fld dword [eax + 60] + fmul dword [edx + 60] + faddp st1,st0 + fld dword [eax + 64] + fmul dword [edx + 64] + faddp st1,st0 + fld dword [eax + 68] + fmul dword [edx + 68] + faddp st1,st0 + fld dword [eax + 72] + fmul dword [edx + 72] + faddp st1,st0 + fld dword [eax + 76] + fmul dword [edx + 76] + faddp st1,st0 +endproc + + +proc scalar24_float32_i387 +%$p arg 4 +%$q arg 4 +;;; alloc + + mov eax,[sp(%$p)] + mov edx,[sp(%$q)] + fld dword [eax] + fmul dword [edx] + fld dword [eax + 4] + fmul dword [edx + 4] + faddp st1,st0 + fld dword [eax + 8] + fmul dword [edx + 8] + faddp st1,st0 + fld dword [eax + 12] + fmul dword [edx + 12] + faddp st1,st0 + fld dword [eax + 16] + fmul dword [edx + 16] + faddp st1,st0 + fld dword [eax + 20] + fmul dword [edx + 20] + faddp st1,st0 + fld dword [eax + 24] + fmul dword [edx + 24] + faddp st1,st0 + fld dword [eax + 28] + fmul dword [edx + 28] + faddp st1,st0 + fld dword [eax + 32] + fmul dword [edx + 32] + faddp st1,st0 + fld dword [eax + 36] + fmul dword [edx + 36] + faddp st1,st0 + fld dword [eax + 40] + fmul dword [edx + 40] + faddp st1,st0 + fld dword [eax + 44] + fmul dword [edx + 44] + faddp st1,st0 + fld dword [eax + 48] + fmul dword [edx + 48] + faddp st1,st0 + fld dword [eax + 52] + fmul dword [edx + 52] + faddp st1,st0 + fld dword [eax + 56] + fmul dword [edx + 56] + faddp st1,st0 + fld dword [eax + 60] + fmul dword [edx + 60] + faddp st1,st0 + fld dword [eax + 64] + fmul dword [edx + 64] + faddp st1,st0 + fld dword [eax + 68] + fmul dword [edx + 68] + faddp st1,st0 + fld dword [eax + 72] + fmul dword [edx + 72] + faddp st1,st0 + fld dword [eax + 76] + fmul dword [edx + 76] + faddp st1,st0 + fld dword [eax + 80] + fmul dword [edx + 80] + faddp st1,st0 + fld dword [eax + 84] + fmul dword [edx + 84] + faddp st1,st0 + fld dword [eax + 88] + fmul dword [edx + 88] + faddp st1,st0 + fld dword [eax + 92] + fmul dword [edx + 92] + faddp st1,st0 +endproc + + +proc scalar32_float32_i387 +%$p arg 4 +%$q arg 4 +;;; alloc + + mov eax,[sp(%$p)] + mov edx,[sp(%$q)] + fld dword [eax] + fmul dword [edx] + fld dword [eax + 4] + fmul dword [edx + 4] + faddp st1,st0 + fld dword [eax + 8] + fmul dword [edx + 8] + faddp st1,st0 + fld dword [eax + 12] + fmul dword [edx + 12] + faddp st1,st0 + fld dword [eax + 16] + fmul dword [edx + 16] + faddp st1,st0 + fld dword [eax + 20] + fmul dword [edx + 20] + faddp st1,st0 + fld dword [eax + 24] + fmul dword [edx + 24] + faddp st1,st0 + fld dword [eax + 28] + fmul dword [edx + 28] + faddp st1,st0 + fld dword [eax + 32] + fmul dword [edx + 32] + faddp st1,st0 + fld dword [eax + 36] + fmul dword [edx + 36] + faddp st1,st0 + fld dword [eax + 40] + fmul dword [edx + 40] + faddp st1,st0 + fld dword [eax + 44] + fmul dword [edx + 44] + faddp st1,st0 + fld dword [eax + 48] + fmul dword [edx + 48] + faddp st1,st0 + fld dword [eax + 52] + fmul dword [edx + 52] + faddp st1,st0 + fld dword [eax + 56] + fmul dword [edx + 56] + faddp st1,st0 + fld dword [eax + 60] + fmul dword [edx + 60] + faddp st1,st0 + fld dword [eax + 64] + fmul dword [edx + 64] + faddp st1,st0 + fld dword [eax + 68] + fmul dword [edx + 68] + faddp st1,st0 + fld dword [eax + 72] + fmul dword [edx + 72] + faddp st1,st0 + fld dword [eax + 76] + fmul dword [edx + 76] + faddp st1,st0 + fld dword [eax + 80] + fmul dword [edx + 80] + faddp st1,st0 + fld dword [eax + 84] + fmul dword [edx + 84] + faddp st1,st0 + fld dword [eax + 88] + fmul dword [edx + 88] + faddp st1,st0 + fld dword [eax + 92] + fmul dword [edx + 92] + faddp st1,st0 + fld dword [eax + 96] + fmul dword [edx + 96] + faddp st1,st0 + fld dword [eax +100] + fmul dword [edx +100] + faddp st1,st0 + fld dword [eax +104] + fmul dword [edx +104] + faddp st1,st0 + fld dword [eax +108] + fmul dword [edx +108] + faddp st1,st0 + fld dword [eax +112] + fmul dword [edx +112] + faddp st1,st0 + fld dword [eax +116] + fmul dword [edx +116] + faddp st1,st0 + fld dword [eax +120] + fmul dword [edx +120] + faddp st1,st0 + fld dword [eax +124] + fmul dword [edx +124] + faddp st1,st0 +endproc + + +; float_t scalar4n_float32_i387 ( +; const float32_t* const p, +; const float32_t* const q, +; const size_t len ); + +proc scalar4n_float32_i387 +%$p arg 4 +%$q arg 4 +%$len arg 4 +;;; alloc + + mov eax,[sp(%$p)] + mov edx,[sp(%$q)] + mov ecx,[sp(%$len)] + fld dword [eax] + fmul dword [edx] + fld dword [eax + 4] + fmul dword [edx + 4] + faddp st1,st0 + fld dword [eax + 8] + fmul dword [edx + 8] + faddp st1,st0 + fld dword [eax + 12] + fmul dword [edx + 12] + faddp st1,st0 + dec ecx + jz .ret1 + add eax,byte 16 + add edx,byte 16 +.lbl1 + fld dword [eax] + fmul dword [edx] + faddp st1,st0 + fld dword [eax + 4] + fmul dword [edx + 4] + faddp st1,st0 + fld dword [eax + 8] + fmul dword [edx + 8] + faddp st1,st0 + fld dword [eax + 12] + fmul dword [edx + 12] + faddp st1,st0 + add eax,byte 16 + add edx,byte 16 + dec ecx + jnz .lbl1 +.ret1 +endproc + + +; float_t scalar1n_float32_i387 ( +; const float32_t* const p, +; const float32_t* const q, +; const size_t len ); + +proc scalar1n_float32_i387 +%$p arg 4 +%$q arg 4 +%$len arg 4 +;;; alloc + + mov eax,[sp(%$p)] + mov edx,[sp(%$q)] + mov ecx,[sp(%$len)] + fld0 + shr ecx,1 + jnc .lbl2 + fld dword [eax] + fmul dword [edx] + faddp st1,st0 + add eax,byte 4 + add edx,byte 4 +.lbl2 + shr ecx,1 + jnc .lbl3 + fld dword [eax] + fmul dword [edx] + faddp st1,st0 + fld dword [eax + 4] + fmul dword [edx + 4] + faddp st1,st0 + add eax,byte 8 + add edx,byte 8 + and ecx,ecx +.lbl3 + jz .ret2 +.lbl4 + fld dword [eax] + fmul dword [edx] + faddp st1,st0 + fld dword [eax + 4] + fmul dword [edx + 4] + faddp st1,st0 + fld dword [eax + 8] + fmul dword [edx + 8] + faddp st1,st0 + fld dword [eax + 12] + fmul dword [edx + 12] + faddp st1,st0 + add eax,byte 16 + add edx,byte 16 + dec ecx + jnz .lbl4 +.ret2 +endproc + + +proc scalar04_float32_3DNow +%$p arg 4 +%$q arg 4 + mov eax,[sp(%$p)] + mov edx,[sp(%$q)] + + pmov mm0,qword [eax] + pmov mm1,qword [eax+8] + pfmul mm0,qword [edx] + pfmul mm1,qword [edx+8] + + pfadd mm0,mm1 + pmov qword [sp(%$p)],mm0 + femms + fld dword [sp(%$p)] + fadd dword [sp(%$p)+4] +endproc + + +proc scalar08_float32_3DNow +%$p arg 4 +%$q arg 4 + mov eax,[sp(%$p)] + mov edx,[sp(%$q)] + + pmov mm0,qword [eax] + pmov mm1,qword [eax+8] + pfmul mm0,qword [edx] + pfmul mm1,qword [edx+8] + + pmov mm2,qword [eax+16] + pmov mm3,qword [eax+24] + pfmul mm2,qword [edx+16] + pfmul mm3,qword [edx+24] + pfadd mm0,mm2 + pfadd mm1,mm3 + + pfadd mm0,mm1 + pmov qword [sp(%$p)],mm0 + femms + fld dword [sp(%$p)] + fadd dword [sp(%$p)+4] +endproc + + +proc scalar12_float32_3DNow +%$p arg 4 +%$q arg 4 + mov eax,[sp(%$p)] + mov edx,[sp(%$q)] + + pmov mm0,qword [eax] + pmov mm1,qword [eax+8] + pfmul mm0,qword [edx] + pfmul mm1,qword [edx+8] + + pmov mm2,qword [eax+16] + pmov mm3,qword [eax+24] + pfmul mm2,qword [edx+16] + pfmul mm3,qword [edx+24] + pfadd mm0,mm2 + pfadd mm1,mm3 + + pmov mm2,qword [eax+32] + pmov mm3,qword [eax+40] + pfmul mm2,qword [edx+32] + pfmul mm3,qword [edx+40] + pfadd mm0,mm2 + pfadd mm1,mm3 + + pfadd mm0,mm1 + pmov qword [sp(%$p)],mm0 + femms + fld dword [sp(%$p)] + fadd dword [sp(%$p)+4] +endproc + + +proc scalar16_float32_3DNow +%$p arg 4 +%$q arg 4 + mov eax,[sp(%$p)] + mov edx,[sp(%$q)] + + pmov mm0,qword [eax] + pmov mm1,qword [eax+8] + pfmul mm0,qword [edx] + pfmul mm1,qword [edx+8] + + pmov mm2,qword [eax+16] + pmov mm3,qword [eax+24] + pfmul mm2,qword [edx+16] + pfmul mm3,qword [edx+24] + pfadd mm0,mm2 + pfadd mm1,mm3 + + pmov mm2,qword [eax+32] + pmov mm3,qword [eax+40] + pfmul mm2,qword [edx+32] + pfmul mm3,qword [edx+40] + pfadd mm0,mm2 + pfadd mm1,mm3 + + pmov mm2,qword [eax+48] + pmov mm3,qword [eax+56] + pfmul mm2,qword [edx+48] + pfmul mm3,qword [edx+56] + pfadd mm0,mm2 + pfadd mm1,mm3 + + pfadd mm0,mm1 + pmov qword [sp(%$p)],mm0 + femms + fld dword [sp(%$p)] + fadd dword [sp(%$p)+4] +endproc + + +proc scalar20_float32_3DNow +%$p arg 4 +%$q arg 4 + mov eax,[sp(%$p)] + mov edx,[sp(%$q)] + + pmov mm0,qword [eax] + pmov mm1,qword [eax+8] + pfmul mm0,qword [edx] + pfmul mm1,qword [edx+8] + + pmov mm2,qword [eax+16] + pmov mm3,qword [eax+24] + pfmul mm2,qword [edx+16] + pfmul mm3,qword [edx+24] + pfadd mm0,mm2 + pfadd mm1,mm3 + + pmov mm2,qword [eax+32] + pmov mm3,qword [eax+40] + pfmul mm2,qword [edx+32] + pfmul mm3,qword [edx+40] + pfadd mm0,mm2 + pfadd mm1,mm3 + + pmov mm2,qword [eax+48] + pmov mm3,qword [eax+56] + pfmul mm2,qword [edx+48] + pfmul mm3,qword [edx+56] + pfadd mm0,mm2 + pfadd mm1,mm3 + + pmov mm2,qword [eax+64] + pmov mm3,qword [eax+72] + pfmul mm2,qword [edx+64] + pfmul mm3,qword [edx+72] + pfadd mm0,mm2 + pfadd mm1,mm3 + + pfadd mm0,mm1 + pmov qword [sp(%$p)],mm0 + femms + fld dword [sp(%$p)] + fadd dword [sp(%$p)+4] +endproc + + +proc scalar24_float32_3DNow +%$p arg 4 +%$q arg 4 + mov eax,[sp(%$p)] + mov edx,[sp(%$q)] + + pmov mm0,qword [eax] + pmov mm1,qword [eax+8] + pfmul mm0,qword [edx] + pfmul mm1,qword [edx+8] + + pmov mm2,qword [eax+16] + pmov mm3,qword [eax+24] + pfmul mm2,qword [edx+16] + pfmul mm3,qword [edx+24] + pfadd mm0,mm2 + pfadd mm1,mm3 + + pmov mm2,qword [eax+32] + pmov mm3,qword [eax+40] + pfmul mm2,qword [edx+32] + pfmul mm3,qword [edx+40] + pfadd mm0,mm2 + pfadd mm1,mm3 + + pmov mm2,qword [eax+48] + pmov mm3,qword [eax+56] + pfmul mm2,qword [edx+48] + pfmul mm3,qword [edx+56] + pfadd mm0,mm2 + pfadd mm1,mm3 + + pmov mm2,qword [eax+64] + pmov mm3,qword [eax+72] + pfmul mm2,qword [edx+64] + pfmul mm3,qword [edx+72] + pfadd mm0,mm2 + pfadd mm1,mm3 + + pmov mm2,qword [eax+80] + pmov mm3,qword [eax+88] + pfmul mm2,qword [edx+80] + pfmul mm3,qword [edx+88] + pfadd mm0,mm2 + pfadd mm1,mm3 + + pfadd mm0,mm1 + pmov qword [sp(%$p)],mm0 + femms + fld dword [sp(%$p)] + fadd dword [sp(%$p)+4] +endproc + +proc scalar32_float32_3DNow +%$p arg 4 +%$q arg 4 + mov eax,[sp(%$p)] + mov edx,[sp(%$q)] + + pmov mm0,qword [eax] + pmov mm1,qword [eax+8] + pfmul mm0,qword [edx] + pfmul mm1,qword [edx+8] + + pmov mm2,qword [eax+16] + pmov mm3,qword [eax+24] + pfmul mm2,qword [edx+16] + pfmul mm3,qword [edx+24] + pfadd mm0,mm2 + pfadd mm1,mm3 + + pmov mm2,qword [eax+32] + pmov mm3,qword [eax+40] + pfmul mm2,qword [edx+32] + pfmul mm3,qword [edx+40] + pfadd mm0,mm2 + pfadd mm1,mm3 + + pmov mm2,qword [eax+48] + pmov mm3,qword [eax+56] + pfmul mm2,qword [edx+48] + pfmul mm3,qword [edx+56] + pfadd mm0,mm2 + pfadd mm1,mm3 + + pmov mm2,qword [eax+64] + pmov mm3,qword [eax+72] + pfmul mm2,qword [edx+64] + pfmul mm3,qword [edx+72] + pfadd mm0,mm2 + pfadd mm1,mm3 + + pmov mm2,qword [eax+80] + pmov mm3,qword [eax+88] + pfmul mm2,qword [edx+80] + pfmul mm3,qword [edx+88] + pfadd mm0,mm2 + pfadd mm1,mm3 + + pmov mm2,qword [eax+96] + pmov mm3,qword [eax+104] + pfmul mm2,qword [edx+96] + pfmul mm3,qword [edx+104] + pfadd mm0,mm2 + pfadd mm1,mm3 + + pmov mm2,qword [eax+112] + pmov mm3,qword [eax+120] + pfmul mm2,qword [edx+112] + pfmul mm3,qword [edx+120] + pfadd mm0,mm2 + pfadd mm1,mm3 + + pfadd mm0,mm1 + pmov qword [sp(%$p)],mm0 + femms + fld dword [sp(%$p)] + fadd dword [sp(%$p)+4] +endproc + + +proc scalar4n_float32_3DNow +%$p arg 4 +%$q arg 4 +%$len arg 4 + + mov eax,[sp(%$p)] + mov edx,[sp(%$q)] + mov ecx,[sp(%$len)] + + pmov mm0,qword [eax] + pmov mm1,qword [eax+8] + pfmul mm0,qword [edx] + pfmul mm1,qword [edx+8] + dec ecx + jz .ret4 + + add eax,byte 16 + add edx,byte 16 +.lbl4: + pmov mm2,qword [eax] + pmov mm3,qword [eax+8] + pfmul mm2,qword [edx] + pfmul mm3,qword [edx+8] + add eax,byte 16 + add edx,byte 16 + pfadd mm0,mm2 + pfadd mm1,mm3 + dec ecx + jnz .lbl4 + +.ret4: pfadd mm0,mm1 + pmov qword [sp(%$p)],mm0 + femms + fld dword [sp(%$p)] + fadd dword [sp(%$p)+4] +endproc + + +proc scalar1n_float32_3DNow + jmp scalar24_float32_i387 +endproc + + +proc scalar04_float32_SIMD + jmp scalar04_float32_i387 +endproc + + +proc scalar08_float32_SIMD +%$p arg 4 +%$q arg 4 + mov eax,[sp(%$p)] + mov edx,[sp(%$q)] + + movups xmm0, [eax] + movups xmm1, [eax+16] + mulps xmm0, [edx] + mulps xmm1, [edx+16] + + addps xmm0,xmm1 + sub esp,16 + movups [esp],xmm0 + fld dword [esp+ 0] + fadd dword [esp+ 4] + fadd dword [esp+ 8] + fadd dword [esp+12] + add esp,16 +endproc + + +proc scalar12_float32_SIMD + jmp scalar12_float32_i387 +endproc + + +proc scalar16_float32_SIMD +%$p arg 4 +%$q arg 4 + mov eax,[sp(%$p)] + mov edx,[sp(%$q)] + + movups xmm0, [eax] + movups xmm1, [eax+16] + mulps xmm0, [edx] + mulps xmm1, [edx+16] + + movups xmm2, [eax+32] + movups xmm3, [eax+48] + mulps xmm2, [edx+32] + mulps xmm3, [edx+48] + addps xmm0,xmm2 + addps xmm1,xmm3 + + addps xmm0,xmm1 + sub esp,16 + movups [esp],xmm0 + fld dword [esp+ 0] + fadd dword [esp+ 4] + fadd dword [esp+ 8] + fadd dword [esp+12] + add esp,16 +endproc + + +proc scalar20_float32_SIMD + jmp scalar20_float32_i387 +endproc + + +proc scalar24_float32_SIMD +%$p arg 4 +%$q arg 4 + mov eax,[sp(%$p)] + mov edx,[sp(%$q)] + + movups xmm0, [eax] + movups xmm1, [eax+16] + mulps xmm0, [edx] + mulps xmm1, [edx+16] + + movups xmm2, [eax+32] + movups xmm3, [eax+48] + mulps xmm2, [edx+32] + mulps xmm3, [edx+48] + addps xmm0,xmm2 + addps xmm1,xmm3 + + movups xmm2, [eax+64] + movups xmm3, [eax+80] + mulps xmm2, [edx+64] + mulps xmm3, [edx+80] + addps xmm0,xmm2 + addps xmm1,xmm3 + + addps xmm0,xmm1 + sub esp,16 + movups [esp],xmm0 + fld dword [esp+ 0] + fadd dword [esp+ 4] + fadd dword [esp+ 8] + fadd dword [esp+12] + add esp,16 +endproc + + +proc scalar32_float32_SIMD +%$p arg 4 +%$q arg 4 + mov eax,[sp(%$p)] + mov edx,[sp(%$q)] + + movups xmm0, [eax] + movups xmm1, [eax+16] + mulps xmm0, [edx] + mulps xmm1, [edx+16] + + movups xmm2, [eax+32] + movups xmm3, [eax+48] + mulps xmm2, [edx+32] + mulps xmm3, [edx+48] + addps xmm0,xmm2 + addps xmm1,xmm3 + + movups xmm2, [eax+64] + movups xmm3, [eax+80] + mulps xmm2, [edx+64] + mulps xmm3, [edx+80] + addps xmm0,xmm2 + addps xmm1,xmm3 + + movups xmm2, [eax+96] + movups xmm3, [eax+112] + mulps xmm2, [edx+96] + mulps xmm3, [edx+112] + addps xmm0,xmm2 + addps xmm1,xmm3 + + addps xmm0,xmm1 + + ;sub esp,16 + ;movups [esp],xmm0 + ;fld dword [esp+ 0] + ;fadd dword [esp+ 4] + ;fadd dword [esp+ 8] + ;fadd dword [esp+12] + ;add esp,16 + + movhlps xmm1,xmm0 + addps xmm0,xmm1 + movlps [sp(%$p)],xmm0 + fld dword [sp(%$p)] + fadd dword [sp(%$p)+4] +endproc + + +proc scalar4n_float32_SIMD + jmp scalar4n_float32_i387 +endproc + + +proc scalar1n_float32_SIMD + jmp scalar1n_float32_i387 +endproc + +; end of scalar.nas diff --git a/libmp3lame/id3tag.c b/libmp3lame/id3tag.c new file mode 100644 index 0000000..ac48510 --- /dev/null +++ b/libmp3lame/id3tag.c @@ -0,0 +1,1926 @@ +/* + * id3tag.c -- Write ID3 version 1 and 2 tags. + * + * Copyright (C) 2000 Don Melton + * Copyright (C) 2011-2017 Robert Hegemann + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. + */ + +/* + * HISTORY: This source file is part of LAME (see http://www.mp3dev.org) + * and was originally adapted by Conrad Sanderson <c.sanderson@me.gu.edu.au> + * from mp3info by Ricardo Cerqueira <rmc@rccn.net> to write only ID3 version 1 + * tags. Don Melton <don@blivet.com> COMPLETELY rewrote it to support version + * 2 tags and be more conformant to other standards while remaining flexible. + * + * NOTE: See http://id3.org/ for more information about ID3 tag formats. + */ + +/* $Id: id3tag.c,v 1.80 2017/08/28 15:39:51 robert Exp $ */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#ifdef STDC_HEADERS +# include <stddef.h> +# include <stdlib.h> +# include <string.h> +# include <ctype.h> +#else +# ifndef HAVE_STRCHR +# define strchr index +# define strrchr rindex +# endif +char *strchr(), *strrchr(); +# ifndef HAVE_MEMCPY +# define memcpy(d, s, n) bcopy ((s), (d), (n)) +# endif +#endif + + +#include "lame.h" +#include "machine.h" +#include "encoder.h" +#include "id3tag.h" +#include "lame_global_flags.h" +#include "util.h" +#include "bitstream.h" + + +static const char *const genre_names[] = { + /* + * NOTE: The spelling of these genre names is identical to those found in + * Winamp and mp3info. + */ + "Blues", "Classic Rock", "Country", "Dance", "Disco", "Funk", "Grunge", + "Hip-Hop", "Jazz", "Metal", "New Age", "Oldies", "Other", "Pop", "R&B", + "Rap", "Reggae", "Rock", "Techno", "Industrial", "Alternative", "Ska", + "Death Metal", "Pranks", "Soundtrack", "Euro-Techno", "Ambient", "Trip-Hop", + "Vocal", "Jazz+Funk", "Fusion", "Trance", "Classical", "Instrumental", + "Acid", "House", "Game", "Sound Clip", "Gospel", "Noise", "Alternative Rock", + "Bass", "Soul", "Punk", "Space", "Meditative", "Instrumental Pop", + "Instrumental Rock", "Ethnic", "Gothic", "Darkwave", "Techno-Industrial", + "Electronic", "Pop-Folk", "Eurodance", "Dream", "Southern Rock", "Comedy", + "Cult", "Gangsta", "Top 40", "Christian Rap", "Pop/Funk", "Jungle", + "Native US", "Cabaret", "New Wave", "Psychedelic", "Rave", + "Showtunes", "Trailer", "Lo-Fi", "Tribal", "Acid Punk", "Acid Jazz", + "Polka", "Retro", "Musical", "Rock & Roll", "Hard Rock", "Folk", + "Folk-Rock", "National Folk", "Swing", "Fast Fusion", "Bebob", "Latin", + "Revival", "Celtic", "Bluegrass", "Avantgarde", "Gothic Rock", + "Progressive Rock", "Psychedelic Rock", "Symphonic Rock", "Slow Rock", + "Big Band", "Chorus", "Easy Listening", "Acoustic", "Humour", "Speech", + "Chanson", "Opera", "Chamber Music", "Sonata", "Symphony", "Booty Bass", + "Primus", "Porn Groove", "Satire", "Slow Jam", "Club", "Tango", "Samba", + "Folklore", "Ballad", "Power Ballad", "Rhythmic Soul", "Freestyle", "Duet", + "Punk Rock", "Drum Solo", "A Cappella", "Euro-House", "Dance Hall", + "Goa", "Drum & Bass", "Club-House", "Hardcore", "Terror", "Indie", + "BritPop", "Negerpunk", "Polsk Punk", "Beat", "Christian Gangsta", + "Heavy Metal", "Black Metal", "Crossover", "Contemporary Christian", + "Christian Rock", "Merengue", "Salsa", "Thrash Metal", "Anime", "JPop", + "SynthPop" +}; + +#define GENRE_NAME_COUNT \ + ((int)(sizeof genre_names / sizeof (const char *const))) + +static const int genre_alpha_map[] = { + 123, 34, 74, 73, 99, 20, 40, 26, 145, 90, 116, 41, 135, 85, 96, 138, 89, 0, + 107, 132, 65, 88, 104, 102, 97, 136, 61, 141, 32, 1, 112, 128, 57, 140, 2, + 139, 58, 3, 125, 50, 22, 4, 55, 127, 122, 120, 98, 52, 48, 54, 124, 25, 84, + 80, 115, 81, 119, 5, 30, 36, 59, 126, 38, 49, 91, 6, 129, 79, 137, 7, 35, + 100, 131, 19, 33, 46, 47, 8, 29, 146, 63, 86, 71, 45, 142, 9, 77, 82, 64, + 133, 10, 66, 39, 11, 103, 12, 75, 134, 13, 53, 62, 109, 117, 23, 108, 92, + 67, 93, 43, 121, 15, 68, 14, 16, 76, 87, 118, 17, 78, 143, 114, 110, 69, 21, + 111, 95, 105, 42, 37, 24, 56, 44, 101, 83, 94, 106, 147, 113, 18, 51, 130, + 144, 60, 70, 31, 72, 27, 28 +}; + +#define GENRE_ALPHA_COUNT ((int)(sizeof genre_alpha_map / sizeof (int))) + +#define GENRE_INDEX_OTHER 12 + + +#define FRAME_ID(a, b, c, d) \ + ( ((unsigned long)(a) << 24) \ + | ((unsigned long)(b) << 16) \ + | ((unsigned long)(c) << 8) \ + | ((unsigned long)(d) << 0) ) + +typedef enum UsualStringIDs { ID_TITLE = FRAME_ID('T', 'I', 'T', '2') + , ID_ARTIST = FRAME_ID('T', 'P', 'E', '1') + , ID_ALBUM = FRAME_ID('T', 'A', 'L', 'B') + , ID_GENRE = FRAME_ID('T', 'C', 'O', 'N') + , ID_ENCODER = FRAME_ID('T', 'S', 'S', 'E') + , ID_PLAYLENGTH = FRAME_ID('T', 'L', 'E', 'N') + , ID_COMMENT = FRAME_ID('C', 'O', 'M', 'M') /* full text string */ +} UsualStringIDs; + +typedef enum NumericStringIDs { ID_DATE = FRAME_ID('T', 'D', 'A', 'T') /* "ddMM" */ + , ID_TIME = FRAME_ID('T', 'I', 'M', 'E') /* "hhmm" */ + , ID_TPOS = FRAME_ID('T', 'P', 'O', 'S') /* '0'-'9' and '/' allowed */ + , ID_TRACK = FRAME_ID('T', 'R', 'C', 'K') /* '0'-'9' and '/' allowed */ + , ID_YEAR = FRAME_ID('T', 'Y', 'E', 'R') /* "yyyy" */ +} NumericStringIDs; + +typedef enum MiscIDs { ID_TXXX = FRAME_ID('T', 'X', 'X', 'X') + , ID_WXXX = FRAME_ID('W', 'X', 'X', 'X') + , ID_SYLT = FRAME_ID('S', 'Y', 'L', 'T') + , ID_APIC = FRAME_ID('A', 'P', 'I', 'C') + , ID_GEOB = FRAME_ID('G', 'E', 'O', 'B') + , ID_PCNT = FRAME_ID('P', 'C', 'N', 'T') + , ID_AENC = FRAME_ID('A', 'E', 'N', 'C') + , ID_LINK = FRAME_ID('L', 'I', 'N', 'K') + , ID_ENCR = FRAME_ID('E', 'N', 'C', 'R') + , ID_GRID = FRAME_ID('G', 'R', 'I', 'D') + , ID_PRIV = FRAME_ID('P', 'R', 'I', 'V') + , ID_USLT = FRAME_ID('U', 'S', 'L', 'T') /* full text string */ + , ID_USER = FRAME_ID('U', 'S', 'E', 'R') /* full text string */ + , ID_PCST = FRAME_ID('P', 'C', 'S', 'T') /* iTunes Podcast indicator, only presence important */ + , ID_WFED = FRAME_ID('W', 'F', 'E', 'D') /* iTunes Podcast URL as TEXT FRAME !!! violates standard */ +} MiscIDs; + + +static int +frame_id_matches(int id, int mask) +{ + int result = 0, i, window = 0xff; + for (i = 0; i < 4; ++i, window <<= 8) { + int const mw = (mask & window); + int const iw = (id & window); + if (mw != 0 && mw != iw) { + result |= iw; + } + } + return result; +} + +static int +isFrameIdMatching(int id, int mask) +{ + return frame_id_matches(id, mask) == 0 ? 1 : 0; +} + +static int +test_tag_spec_flags(lame_internal_flags const *gfc, unsigned int tst) +{ + return (gfc->tag_spec.flags & tst) != 0u ? 1 : 0; +} + +#if 0 +static void +debug_tag_spec_flags(lame_internal_flags * gfc, const char* info) +{ + MSGF(gfc, "%s\n", info); + MSGF(gfc, "CHANGED_FLAG : %d\n", test_tag_spec_flags(gfc, CHANGED_FLAG )); + MSGF(gfc, "ADD_V2_FLAG : %d\n", test_tag_spec_flags(gfc, ADD_V2_FLAG )); + MSGF(gfc, "V1_ONLY_FLAG : %d\n", test_tag_spec_flags(gfc, V1_ONLY_FLAG )); + MSGF(gfc, "V2_ONLY_FLAG : %d\n", test_tag_spec_flags(gfc, V2_ONLY_FLAG )); + MSGF(gfc, "SPACE_V1_FLAG : %d\n", test_tag_spec_flags(gfc, SPACE_V1_FLAG)); + MSGF(gfc, "PAD_V2_FLAG : %d\n", test_tag_spec_flags(gfc, PAD_V2_FLAG )); +} +#endif + +static int +is_lame_internal_flags_null(lame_t gfp) +{ + return (gfp && gfp->internal_flags) ? 0 : 1; +} + +static int +id3v2_add_ucs2_lng(lame_t gfp, uint32_t frame_id, unsigned short const *desc, unsigned short const *text); +static int +id3v2_add_latin1_lng(lame_t gfp, uint32_t frame_id, char const *desc, char const *text); + + +static void +copyV1ToV2(lame_t gfp, int frame_id, char const *s) +{ + lame_internal_flags *gfc = gfp != 0 ? gfp->internal_flags : 0; + if (gfc != 0) { + unsigned int flags = gfc->tag_spec.flags; + id3v2_add_latin1_lng(gfp, frame_id, 0, s); + gfc->tag_spec.flags = flags; +#if 0 + debug_tag_spec_flags(gfc, "copyV1ToV2"); +#endif + } +} + + +static void +id3v2AddLameVersion(lame_t gfp) +{ + char buffer[1024]; + const char *b = get_lame_os_bitness(); + const char *v = get_lame_version(); + const char *u = get_lame_url(); + const size_t lenb = strlen(b); + + if (lenb > 0) { + sprintf(buffer, "LAME %s version %s (%s)", b, v, u); + } + else { + sprintf(buffer, "LAME version %s (%s)", v, u); + } + copyV1ToV2(gfp, ID_ENCODER, buffer); +} + +static void +id3v2AddAudioDuration(lame_t gfp, double ms) +{ + SessionConfig_t const *const cfg = &gfp->internal_flags->cfg; /* caller checked pointers */ + char buffer[1024]; + double const max_ulong = MAX_U_32_NUM; + unsigned long playlength_ms; + + ms *= 1000; + ms /= cfg->samplerate_in; + if (ms > max_ulong) { + playlength_ms = max_ulong; + } + else if (ms < 0) { + playlength_ms = 0; + } + else { + playlength_ms = ms; + } + sprintf(buffer, "%lu", playlength_ms); + copyV1ToV2(gfp, ID_PLAYLENGTH, buffer); +} + +void +id3tag_genre_list(void (*handler) (int, const char *, void *), void *cookie) +{ + if (handler) { + int i; + for (i = 0; i < GENRE_NAME_COUNT; ++i) { + if (i < GENRE_ALPHA_COUNT) { + int j = genre_alpha_map[i]; + handler(j, genre_names[j], cookie); + } + } + } +} + +#define GENRE_NUM_UNKNOWN 255 + + + +void +id3tag_init(lame_t gfp) +{ + lame_internal_flags *gfc = 0; + + if (is_lame_internal_flags_null(gfp)) { + return; + } + gfc = gfp->internal_flags; + free_id3tag(gfc); + memset(&gfc->tag_spec, 0, sizeof gfc->tag_spec); + gfc->tag_spec.genre_id3v1 = GENRE_NUM_UNKNOWN; + gfc->tag_spec.padding_size = 128; + id3v2AddLameVersion(gfp); +} + + + +void +id3tag_add_v2(lame_t gfp) +{ + lame_internal_flags *gfc = 0; + + if (is_lame_internal_flags_null(gfp)) { + return; + } + gfc = gfp->internal_flags; + gfc->tag_spec.flags &= ~V1_ONLY_FLAG; + gfc->tag_spec.flags |= ADD_V2_FLAG; +} + +void +id3tag_v1_only(lame_t gfp) +{ + lame_internal_flags *gfc = 0; + + if (is_lame_internal_flags_null(gfp)) { + return; + } + gfc = gfp->internal_flags; + gfc->tag_spec.flags &= ~(ADD_V2_FLAG | V2_ONLY_FLAG); + gfc->tag_spec.flags |= V1_ONLY_FLAG; +} + +void +id3tag_v2_only(lame_t gfp) +{ + lame_internal_flags *gfc = 0; + + if (is_lame_internal_flags_null(gfp)) { + return; + } + gfc = gfp->internal_flags; + gfc->tag_spec.flags &= ~V1_ONLY_FLAG; + gfc->tag_spec.flags |= V2_ONLY_FLAG; +} + +void +id3tag_space_v1(lame_t gfp) +{ + lame_internal_flags *gfc = 0; + + if (is_lame_internal_flags_null(gfp)) { + return; + } + gfc = gfp->internal_flags; + gfc->tag_spec.flags &= ~V2_ONLY_FLAG; + gfc->tag_spec.flags |= SPACE_V1_FLAG; +} + +void +id3tag_pad_v2(lame_t gfp) +{ + id3tag_set_pad(gfp, 128); +} + +void +id3tag_set_pad(lame_t gfp, size_t n) +{ + lame_internal_flags *gfc = 0; + + if (is_lame_internal_flags_null(gfp)) { + return; + } + gfc = gfp->internal_flags; + gfc->tag_spec.flags &= ~V1_ONLY_FLAG; + gfc->tag_spec.flags |= PAD_V2_FLAG; + gfc->tag_spec.flags |= ADD_V2_FLAG; + gfc->tag_spec.padding_size = (unsigned int)n; +} + +static int +hasUcs2ByteOrderMarker(unsigned short bom) +{ + if (bom == 0xFFFEu || bom == 0xFEFFu) { + return 1; + } + return 0; +} + + +static unsigned short +swap_bytes(unsigned short w) +{ + return (0xff00u & (w << 8)) | (0x00ffu & (w >> 8)); +} + + +static unsigned short +toLittleEndian(unsigned short bom, unsigned short c) +{ + if (bom == 0xFFFEu) { + return swap_bytes(c); + } + return c; +} + +static unsigned short +fromLatin1Char(const unsigned short* s, unsigned short c) +{ + if (s[0] == 0xFFFEu) { + return swap_bytes(c); + } + return c; +} + + +static size_t +local_strdup(char **dst, const char *src) +{ + if (dst == 0) { + return 0; + } + free(*dst); + *dst = 0; + if (src != 0) { + size_t n; + for (n = 0; src[n] != 0; ++n) { /* calc src string length */ + } + if (n > 0) { /* string length without zero termination */ + assert(sizeof(*src) == sizeof(**dst)); + *dst = lame_calloc(char, n + 1); + if (*dst != 0) { + memcpy(*dst, src, n * sizeof(**dst)); + (*dst)[n] = 0; + return n; + } + } + } + return 0; +} + +static size_t +local_ucs2_strdup(unsigned short **dst, unsigned short const *src) +{ + if (dst == 0) { + return 0; + } + free(*dst); /* free old string pointer */ + *dst = 0; + if (src != 0) { + size_t n; + for (n = 0; src[n] != 0; ++n) { /* calc src string length */ + } + if (n > 0) { /* string length without zero termination */ + assert(sizeof(*src) >= 2); + assert(sizeof(*src) == sizeof(**dst)); + *dst = lame_calloc(unsigned short, n + 1); + if (*dst != 0) { + memcpy(*dst, src, n * sizeof(**dst)); + (*dst)[n] = 0; + return n; + } + } + } + return 0; +} + + +static size_t +local_ucs2_strlen(unsigned short const *s) +{ + size_t n = 0; + if (s != 0) { + while (*s++) { + ++n; + } + } + return n; +} + + +static size_t +local_ucs2_substr(unsigned short** dst, unsigned short const* src, size_t start, size_t end) +{ + size_t const len = 1 + 1 + ((start < end) ? (end - start) : 0); + size_t n = 0; + unsigned short *ptr = lame_calloc(unsigned short, len); + *dst = ptr; + if (ptr == 0 || src == 0) { + return 0; + } + if (hasUcs2ByteOrderMarker(src[0])) { + ptr[n++] = src[0]; + if (start == 0) { + ++start; + } + } + while (start < end) { + ptr[n++] = src[start++]; + } + ptr[n] = 0; + return n; +} + +static int +local_ucs2_pos(unsigned short const* str, unsigned short c) +{ + int i; + for (i = 0; str != 0 && str[i] != 0; ++i) { + if (str[i] == c) { + return i; + } + } + return -1; +} + +static int +local_char_pos(char const* str, char c) +{ + int i; + for (i = 0; str != 0 && str[i] != 0; ++i) { + if (str[i] == c) { + return i; + } + } + return -1; +} + +static int +maybeLatin1(unsigned short const* text) +{ + if (text) { + unsigned short bom = *text++; + while (*text) { + unsigned short c = toLittleEndian(bom, *text++); + if (c > 0x00fe) return 0; + } + } + return 1; +} + +static int searchGenre(char const* genre); +static int sloppySearchGenre(char const* genre); + +static int +lookupGenre(char const* genre) +{ + char *str; + int num = strtol(genre, &str, 10); + /* is the input a string or a valid number? */ + if (*str) { + num = searchGenre(genre); + if (num == GENRE_NAME_COUNT) { + num = sloppySearchGenre(genre); + } + if (num == GENRE_NAME_COUNT) { + return -2; /* no common genre text found */ + } + } + else { + if ((num < 0) || (num >= GENRE_NAME_COUNT)) { + return -1; /* number unknown */ + } + } + return num; +} + +static unsigned char * +writeLoBytes(unsigned char *frame, unsigned short const *str, size_t n); + +static char* +local_strdup_utf16_to_latin1(unsigned short const* utf16) +{ + size_t len = local_ucs2_strlen(utf16); + unsigned char* latin1 = lame_calloc(unsigned char, len+1); + writeLoBytes(latin1, utf16, len); + return (char*)latin1; +} + + +static int +id3tag_set_genre_utf16(lame_t gfp, unsigned short const* text) +{ + lame_internal_flags* gfc = gfp->internal_flags; + int ret; + if (text == 0) { + return -3; + } + if (!hasUcs2ByteOrderMarker(text[0])) { + return -3; + } + if (maybeLatin1(text)) { + char* latin1 = local_strdup_utf16_to_latin1(text); + int num = lookupGenre(latin1); + free(latin1); + if (num == -1) return -1; /* number out of range */ + if (num >= 0) { /* common genre found */ + gfc->tag_spec.flags |= CHANGED_FLAG; + gfc->tag_spec.genre_id3v1 = num; + copyV1ToV2(gfp, ID_GENRE, genre_names[num]); + return 0; + } + } + ret = id3v2_add_ucs2_lng(gfp, ID_GENRE, 0, text); + if (ret == 0) { + gfc->tag_spec.flags |= CHANGED_FLAG; + gfc->tag_spec.genre_id3v1 = GENRE_INDEX_OTHER; + } + return ret; +} + +/* +Some existing options for ID3 tag can be specified by --tv option +as follows. +--tt <value>, --tv TIT2=value +--ta <value>, --tv TPE1=value +--tl <value>, --tv TALB=value +--ty <value>, --tv TYER=value +--tn <value>, --tv TRCK=value +--tg <value>, --tv TCON=value +(although some are not exactly same)*/ + +int +id3tag_set_albumart(lame_t gfp, const char *image, size_t size) +{ + int mimetype = MIMETYPE_NONE; + lame_internal_flags *gfc = 0; + + if (is_lame_internal_flags_null(gfp)) { + return 0; + } + gfc = gfp->internal_flags; + + if (image != 0) { + unsigned char const *data = (unsigned char const *) image; + /* determine MIME type from the actual image data */ + if (2 < size && data[0] == 0xFF && data[1] == 0xD8) { + mimetype = MIMETYPE_JPEG; + } + else if (4 < size && data[0] == 0x89 && strncmp((const char *) &data[1], "PNG", 3) == 0) { + mimetype = MIMETYPE_PNG; + } + else if (4 < size && strncmp((const char *) data, "GIF8", 4) == 0) { + mimetype = MIMETYPE_GIF; + } + else { + return -1; + } + } + if (gfc->tag_spec.albumart != 0) { + free(gfc->tag_spec.albumart); + gfc->tag_spec.albumart = 0; + gfc->tag_spec.albumart_size = 0; + gfc->tag_spec.albumart_mimetype = MIMETYPE_NONE; + } + if (size < 1 || mimetype == MIMETYPE_NONE) { + return 0; + } + gfc->tag_spec.albumart = lame_calloc(unsigned char, size); + if (gfc->tag_spec.albumart != 0) { + memcpy(gfc->tag_spec.albumart, image, size); + gfc->tag_spec.albumart_size = (unsigned int)size; + gfc->tag_spec.albumart_mimetype = mimetype; + gfc->tag_spec.flags |= CHANGED_FLAG; + id3tag_add_v2(gfp); + } + return 0; +} + +static unsigned char * +set_4_byte_value(unsigned char *bytes, uint32_t value) +{ + int i; + for (i = 3; i >= 0; --i) { + bytes[i] = value & 0xffUL; + value >>= 8; + } + return bytes + 4; +} + +static uint32_t +toID3v2TagId(char const *s) +{ + unsigned int i, x = 0; + if (s == 0) { + return 0; + } + for (i = 0; i < 4 && s[i] != 0; ++i) { + char const c = s[i]; + unsigned int const u = 0x0ff & c; + x <<= 8; + x |= u; + if (c < 'A' || 'Z' < c) { + if (c < '0' || '9' < c) { + return 0; + } + } + } + return x; +} + +static uint32_t +toID3v2TagId_ucs2(unsigned short const *s) +{ + unsigned int i, x = 0; + unsigned short bom = 0; + if (s == 0) { + return 0; + } + bom = s[0]; + if (hasUcs2ByteOrderMarker(bom)) { + ++s; + } + for (i = 0; i < 4 && s[i] != 0; ++i) { + unsigned short const c = toLittleEndian(bom, s[i]); + if (c < 'A' || 'Z' < c) { + if (c < '0' || '9' < c) { + return 0; + } + } + x <<= 8; + x |= c; + } + return x; +} + +#if 0 +static int +isNumericString(uint32_t frame_id) +{ + switch (frame_id) { + case ID_DATE: + case ID_TIME: + case ID_TPOS: + case ID_TRACK: + case ID_YEAR: + return 1; + } + return 0; +} +#endif + +static int +isMultiFrame(uint32_t frame_id) +{ + switch (frame_id) { + case ID_TXXX: + case ID_WXXX: + case ID_COMMENT: + case ID_SYLT: + case ID_APIC: + case ID_GEOB: + case ID_PCNT: + case ID_AENC: + case ID_LINK: + case ID_ENCR: + case ID_GRID: + case ID_PRIV: + return 1; + } + return 0; +} + +#if 0 +static int +isFullTextString(int frame_id) +{ + switch (frame_id) { + case ID_VSLT: + case ID_COMMENT: + return 1; + } + return 0; +} +#endif + +static FrameDataNode * +findNode(id3tag_spec const *tag, uint32_t frame_id, FrameDataNode const *last) +{ + FrameDataNode *node = last ? last->nxt : tag->v2_head; + while (node != 0) { + if (node->fid == frame_id) { + return node; + } + node = node->nxt; + } + return 0; +} + +static void +appendNode(id3tag_spec * tag, FrameDataNode * node) +{ + if (tag->v2_tail == 0 || tag->v2_head == 0) { + tag->v2_head = node; + tag->v2_tail = node; + } + else { + tag->v2_tail->nxt = node; + tag->v2_tail = node; + } +} + +static void +setLang(char *dst, char const *src) +{ + int i; + if (src == 0 || src[0] == 0) { + dst[0] = 'e'; + dst[1] = 'n'; + dst[2] = 'g'; + } + else { + for (i = 0; i < 3 && src && *src; ++i) { + dst[i] = src[i]; + } + for (; i < 3; ++i) { + dst[i] = ' '; + } + } +} + +static int +isSameLang(char const *l1, char const *l2) +{ + char d[3]; + int i; + setLang(d, l2); + for (i = 0; i < 3; ++i) { + char a = tolower(l1[i]); + char b = tolower(d[i]); + if (a < ' ') + a = ' '; + if (b < ' ') + b = ' '; + if (a != b) { + return 0; + } + } + return 1; +} + +static int +isSameDescriptor(FrameDataNode const *node, char const *dsc) +{ + size_t i; + if (node->dsc.enc == 1 && node->dsc.dim > 0) { + return 0; + } + for (i = 0; i < node->dsc.dim; ++i) { + if (!dsc || node->dsc.ptr.l[i] != dsc[i]) { + return 0; + } + } + return 1; +} + +static int +isSameDescriptorUcs2(FrameDataNode const *node, unsigned short const *dsc) +{ + size_t i; + if (node->dsc.enc != 1 && node->dsc.dim > 0) { + return 0; + } + for (i = 0; i < node->dsc.dim; ++i) { + if (!dsc || node->dsc.ptr.u[i] != dsc[i]) { + return 0; + } + } + return 1; +} + +static int +id3v2_add_ucs2(lame_t gfp, uint32_t frame_id, char const *lng, unsigned short const *desc, unsigned short const *text) +{ + lame_internal_flags *gfc = gfp != 0 ? gfp->internal_flags : 0; + if (gfc != 0) { + FrameDataNode *node = findNode(&gfc->tag_spec, frame_id, 0); + char lang[4]; + setLang(lang, lng); + if (isMultiFrame(frame_id)) { + while (node) { + if (isSameLang(node->lng, lang)) { + if (isSameDescriptorUcs2(node, desc)) { + break; + } + } + node = findNode(&gfc->tag_spec, frame_id, node); + } + } + if (node == 0) { + node = lame_calloc(FrameDataNode, 1); + if (node == 0) { + return -254; /* memory problem */ + } + appendNode(&gfc->tag_spec, node); + } + node->fid = frame_id; + setLang(node->lng, lang); + node->dsc.dim = local_ucs2_strdup(&node->dsc.ptr.u, desc); + node->dsc.enc = 1; + node->txt.dim = local_ucs2_strdup(&node->txt.ptr.u, text); + node->txt.enc = 1; + gfc->tag_spec.flags |= (CHANGED_FLAG | ADD_V2_FLAG); + return 0; + } + return -255; +} + +static int +id3v2_add_latin1(lame_t gfp, uint32_t frame_id, char const *lng, char const *desc, char const *text) +{ + lame_internal_flags *gfc = gfp != 0 ? gfp->internal_flags : 0; + if (gfc != 0) { + FrameDataNode *node = findNode(&gfc->tag_spec, frame_id, 0); + char lang[4]; + setLang(lang, lng); + if (isMultiFrame(frame_id)) { + while (node) { + if (isSameLang(node->lng, lang)) { + if (isSameDescriptor(node, desc)) { + break; + } + } + node = findNode(&gfc->tag_spec, frame_id, node); + } + } + if (node == 0) { + node = lame_calloc(FrameDataNode, 1); + if (node == 0) { + return -254; /* memory problem */ + } + appendNode(&gfc->tag_spec, node); + } + node->fid = frame_id; + setLang(node->lng, lang); + node->dsc.dim = local_strdup(&node->dsc.ptr.l, desc); + node->dsc.enc = 0; + node->txt.dim = local_strdup(&node->txt.ptr.l, text); + node->txt.enc = 0; + gfc->tag_spec.flags |= (CHANGED_FLAG | ADD_V2_FLAG); + return 0; + } + return -255; +} + +static char const* +id3v2_get_language(lame_t gfp) +{ + lame_internal_flags const* gfc = gfp ? gfp->internal_flags : 0; + if (gfc) return gfc->tag_spec.language; + return 0; +} + +static int +id3v2_add_ucs2_lng(lame_t gfp, uint32_t frame_id, unsigned short const *desc, unsigned short const *text) +{ + char const* lang = id3v2_get_language(gfp); + return id3v2_add_ucs2(gfp, frame_id, lang, desc, text); +} + +static int +id3v2_add_latin1_lng(lame_t gfp, uint32_t frame_id, char const *desc, char const *text) +{ + char const* lang = id3v2_get_language(gfp); + return id3v2_add_latin1(gfp, frame_id, lang, desc, text); +} + +static int +id3tag_set_userinfo_latin1(lame_t gfp, uint32_t id, char const *fieldvalue) +{ + char const separator = '='; + int rc = -7; + int a = local_char_pos(fieldvalue, separator); + if (a >= 0) { + char* dup = 0; + local_strdup(&dup, fieldvalue); + dup[a] = 0; + rc = id3v2_add_latin1_lng(gfp, id, dup, dup+a+1); + free(dup); + } + return rc; +} + +static int +id3tag_set_userinfo_ucs2(lame_t gfp, uint32_t id, unsigned short const *fieldvalue) +{ + unsigned short const separator = fromLatin1Char(fieldvalue,'='); + int rc = -7; + size_t b = local_ucs2_strlen(fieldvalue); + int a = local_ucs2_pos(fieldvalue, separator); + if (a >= 0) { + unsigned short* dsc = 0, *val = 0; + local_ucs2_substr(&dsc, fieldvalue, 0, a); + local_ucs2_substr(&val, fieldvalue, a+1, b); + rc = id3v2_add_ucs2_lng(gfp, id, dsc, val); + free(dsc); + free(val); + } + return rc; +} + +int +id3tag_set_textinfo_utf16(lame_t gfp, char const *id, unsigned short const *text) +{ + uint32_t const frame_id = toID3v2TagId(id); + if (frame_id == 0) { + return -1; + } + if (is_lame_internal_flags_null(gfp)) { + return 0; + } + if (text == 0) { + return 0; + } + if (!hasUcs2ByteOrderMarker(text[0])) { + return -3; /* BOM missing */ + } + if (frame_id == ID_TXXX || frame_id == ID_WXXX || frame_id == ID_COMMENT) { + return id3tag_set_userinfo_ucs2(gfp, frame_id, text); + } + if (frame_id == ID_GENRE) { + return id3tag_set_genre_utf16(gfp, text); + } + if (frame_id == ID_PCST) { + return id3v2_add_ucs2_lng(gfp, frame_id, 0, text); + } + if (frame_id == ID_USER) { + return id3v2_add_ucs2_lng(gfp, frame_id, text, 0); + } + if (frame_id == ID_WFED) { + return id3v2_add_ucs2_lng(gfp, frame_id, text, 0); /* iTunes expects WFED to be a text frame */ + } + if (isFrameIdMatching(frame_id, FRAME_ID('T', 0, 0, 0)) + ||isFrameIdMatching(frame_id, FRAME_ID('W', 0, 0, 0))) { +#if 0 + if (isNumericString(frame_id)) { + return -2; /* must be Latin-1 encoded */ + } +#endif + return id3v2_add_ucs2_lng(gfp, frame_id, 0, text); + } + return -255; /* not supported by now */ +} + +extern int +id3tag_set_textinfo_ucs2(lame_t gfp, char const *id, unsigned short const *text); + +int +id3tag_set_textinfo_ucs2(lame_t gfp, char const *id, unsigned short const *text) +{ + return id3tag_set_textinfo_utf16(gfp, id, text); +} + +int +id3tag_set_textinfo_latin1(lame_t gfp, char const *id, char const *text) +{ + uint32_t const frame_id = toID3v2TagId(id); + if (frame_id == 0) { + return -1; + } + if (is_lame_internal_flags_null(gfp)) { + return 0; + } + if (text == 0) { + return 0; + } + if (frame_id == ID_TXXX || frame_id == ID_WXXX || frame_id == ID_COMMENT) { + return id3tag_set_userinfo_latin1(gfp, frame_id, text); + } + if (frame_id == ID_GENRE) { + return id3tag_set_genre(gfp, text); + } + if (frame_id == ID_PCST) { + return id3v2_add_latin1_lng(gfp, frame_id, 0, text); + } + if (frame_id == ID_USER) { + return id3v2_add_latin1_lng(gfp, frame_id, text, 0); + } + if (frame_id == ID_WFED) { + return id3v2_add_latin1_lng(gfp, frame_id, text, 0); /* iTunes expects WFED to be a text frame */ + } + if (isFrameIdMatching(frame_id, FRAME_ID('T', 0, 0, 0)) + ||isFrameIdMatching(frame_id, FRAME_ID('W', 0, 0, 0))) { + return id3v2_add_latin1_lng(gfp, frame_id, 0, text); + } + return -255; /* not supported by now */ +} + + +int +id3tag_set_comment_latin1(lame_t gfp, char const *lang, char const *desc, char const *text) +{ + if (is_lame_internal_flags_null(gfp)) { + return 0; + } + return id3v2_add_latin1(gfp, ID_COMMENT, lang, desc, text); +} + + +int +id3tag_set_comment_utf16(lame_t gfp, char const *lang, unsigned short const *desc, unsigned short const *text) +{ + if (is_lame_internal_flags_null(gfp)) { + return 0; + } + return id3v2_add_ucs2(gfp, ID_COMMENT, lang, desc, text); +} + +extern int +id3tag_set_comment_ucs2(lame_t gfp, char const *lang, unsigned short const *desc, unsigned short const *text); + + +int +id3tag_set_comment_ucs2(lame_t gfp, char const *lang, unsigned short const *desc, unsigned short const *text) +{ + if (is_lame_internal_flags_null(gfp)) { + return 0; + } + return id3tag_set_comment_utf16(gfp, lang, desc, text); +} + + +void +id3tag_set_title(lame_t gfp, const char *title) +{ + lame_internal_flags *gfc = gfp != 0 ? gfp->internal_flags : 0; + if (gfc && title && *title) { + local_strdup(&gfc->tag_spec.title, title); + gfc->tag_spec.flags |= CHANGED_FLAG; + copyV1ToV2(gfp, ID_TITLE, title); + } +} + +void +id3tag_set_artist(lame_t gfp, const char *artist) +{ + lame_internal_flags *gfc = gfp != 0 ? gfp->internal_flags : 0; + if (gfc && artist && *artist) { + local_strdup(&gfc->tag_spec.artist, artist); + gfc->tag_spec.flags |= CHANGED_FLAG; + copyV1ToV2(gfp, ID_ARTIST, artist); + } +} + +void +id3tag_set_album(lame_t gfp, const char *album) +{ + lame_internal_flags *gfc = gfp != 0 ? gfp->internal_flags : 0; + if (gfc && album && *album) { + local_strdup(&gfc->tag_spec.album, album); + gfc->tag_spec.flags |= CHANGED_FLAG; + copyV1ToV2(gfp, ID_ALBUM, album); + } +} + +void +id3tag_set_year(lame_t gfp, const char *year) +{ + lame_internal_flags *gfc = gfp != 0 ? gfp->internal_flags : 0; + if (gfc && year && *year) { + int num = atoi(year); + if (num < 0) { + num = 0; + } + /* limit a year to 4 digits so it fits in a version 1 tag */ + if (num > 9999) { + num = 9999; + } + if (num) { + gfc->tag_spec.year = num; + gfc->tag_spec.flags |= CHANGED_FLAG; + } + copyV1ToV2(gfp, ID_YEAR, year); + } +} + +void +id3tag_set_comment(lame_t gfp, const char *comment) +{ + lame_internal_flags *gfc = gfp != 0 ? gfp->internal_flags : 0; + if (gfc && comment && *comment) { + local_strdup(&gfc->tag_spec.comment, comment); + gfc->tag_spec.flags |= CHANGED_FLAG; + { + uint32_t const flags = gfc->tag_spec.flags; + id3v2_add_latin1_lng(gfp, ID_COMMENT, "", comment); + gfc->tag_spec.flags = flags; + } + } +} + +int +id3tag_set_track(lame_t gfp, const char *track) +{ + char const *trackcount; + lame_internal_flags *gfc = gfp != 0 ? gfp->internal_flags : 0; + int ret = 0; + + if (gfc && track && *track) { + int num = atoi(track); + /* check for valid ID3v1 track number range */ + if (num < 1 || num > 255) { + num = 0; + ret = -1; /* track number out of ID3v1 range, ignored for ID3v1 */ + gfc->tag_spec.flags |= (CHANGED_FLAG | ADD_V2_FLAG); + } + if (num) { + gfc->tag_spec.track_id3v1 = num; + gfc->tag_spec.flags |= CHANGED_FLAG; + } + /* Look for the total track count after a "/", same restrictions */ + trackcount = strchr(track, '/'); + if (trackcount && *trackcount) { + gfc->tag_spec.flags |= (CHANGED_FLAG | ADD_V2_FLAG); + } + copyV1ToV2(gfp, ID_TRACK, track); + } + return ret; +} + +/* would use real "strcasecmp" but it isn't portable */ +static int +local_strcasecmp(const char *s1, const char *s2) +{ + unsigned char c1; + unsigned char c2; + do { + c1 = tolower(*s1); + c2 = tolower(*s2); + if (!c1) { + break; + } + ++s1; + ++s2; + } while (c1 == c2); + return c1 - c2; +} + + +static +const char* nextUpperAlpha(const char* p, char x) +{ + char c; + for(c = toupper(*p); *p != 0; c = toupper(*++p)) { + if ('A' <= c && c <= 'Z') { + if (c != x) { + return p; + } + } + } + return p; +} + + +static int +sloppyCompared(const char* p, const char* q) +{ + char cp, cq; + p = nextUpperAlpha(p, 0); + q = nextUpperAlpha(q, 0); + cp = toupper(*p); + cq = toupper(*q); + while (cp == cq) { + if (cp == 0) { + return 1; + } + if (p[1] == '.') { /* some abbrevation */ + while (*q && *q++ != ' ') { + } + } + p = nextUpperAlpha(p, cp); + q = nextUpperAlpha(q, cq); + cp = toupper(*p); + cq = toupper(*q); + } + return 0; +} + + +static int +sloppySearchGenre(const char *genre) +{ + int i; + for (i = 0; i < GENRE_NAME_COUNT; ++i) { + if (sloppyCompared(genre, genre_names[i])) { + return i; + } + } + return GENRE_NAME_COUNT; +} + + +static int +searchGenre(const char* genre) +{ + int i; + for (i = 0; i < GENRE_NAME_COUNT; ++i) { + if (!local_strcasecmp(genre, genre_names[i])) { + return i; + } + } + return GENRE_NAME_COUNT; +} + + +int +id3tag_set_genre(lame_t gfp, const char *genre) +{ + lame_internal_flags *gfc = gfp != 0 ? gfp->internal_flags : 0; + int ret = 0; + if (gfc && genre && *genre) { + int const num = lookupGenre(genre); + if (num == -1) return num; + gfc->tag_spec.flags |= CHANGED_FLAG; + if (num >= 0) { + gfc->tag_spec.genre_id3v1 = num; + genre = genre_names[num]; + } + else { + gfc->tag_spec.genre_id3v1 = GENRE_INDEX_OTHER; + gfc->tag_spec.flags |= ADD_V2_FLAG; + } + copyV1ToV2(gfp, ID_GENRE, genre); + } + return ret; +} + + +static size_t +sizeOfNode(FrameDataNode const *node) +{ + size_t n = 0; + if (node) { + n = 10; /* header size */ + n += 1; /* text encoding flag */ + switch (node->txt.enc) { + default: + case 0: + if (node->dsc.dim > 0) { + n += node->dsc.dim + 1; + } + n += node->txt.dim; + break; + case 1: + if (node->dsc.dim > 0) { + n += (node->dsc.dim+1) * 2; + } + n += node->txt.dim * 2; + break; + } + } + return n; +} + +static size_t +sizeOfCommentNode(FrameDataNode const *node) +{ + size_t n = 0; + if (node) { + n = 10; /* header size */ + n += 1; /* text encoding flag */ + n += 3; /* language */ + switch (node->dsc.enc) { + default: + case 0: + n += 1 + node->dsc.dim; + break; + case 1: + n += 2 + node->dsc.dim * 2; + break; + } + switch (node->txt.enc) { + default: + case 0: + n += node->txt.dim; + break; + case 1: + n += node->txt.dim * 2; + break; + } + } + return n; +} + +static size_t +sizeOfWxxxNode(FrameDataNode const *node) +{ + size_t n = 0; + if (node) { + n = 10; /* header size */ + if (node->dsc.dim > 0) { + n += 1; /* text encoding flag */ + switch (node->dsc.enc) { + default: + case 0: + n += 1 + node->dsc.dim; + break; + case 1: + n += 2 + node->dsc.dim * 2; + break; + } + } + if (node->txt.dim > 0) { + switch (node->txt.enc) { + default: + case 0: + n += node->txt.dim; + break; + case 1: + n += node->txt.dim - 1; /* UCS2 -> Latin1, skip BOM */ + break; + } + } + } + return n; +} + +static unsigned char * +writeChars(unsigned char *frame, char const *str, size_t n) +{ + while (n--) { + *frame++ = *str++; + } + return frame; +} + +static unsigned char * +writeUcs2s(unsigned char *frame, unsigned short const *str, size_t n) +{ + if (n > 0) { + unsigned short const bom = *str; + while (n--) { + unsigned short const c = toLittleEndian(bom, *str++); + *frame++ = 0x00ffu & c; + *frame++ = 0x00ffu & (c >> 8); + } + } + return frame; +} + +static unsigned char * +writeLoBytes(unsigned char *frame, unsigned short const *str, size_t n) +{ + if (n > 0) { + unsigned short const bom = *str; + if (hasUcs2ByteOrderMarker(bom)) { + str++; n--; /* skip BOM */ + } + while (n--) { + unsigned short const c = toLittleEndian(bom, *str++); + if (c < 0x0020u || 0x00ffu < c) { + *frame++ = 0x0020; /* blank */ + } + else { + *frame++ = c; + } + } + } + return frame; +} + +static unsigned char * +set_frame_comment(unsigned char *frame, FrameDataNode const *node) +{ + size_t const n = sizeOfCommentNode(node); + if (n > 10) { + frame = set_4_byte_value(frame, node->fid); + frame = set_4_byte_value(frame, (uint32_t) (n - 10)); + /* clear 2-byte header flags */ + *frame++ = 0; + *frame++ = 0; + /* encoding descriptor byte */ + *frame++ = node->txt.enc == 1 ? 1 : 0; + /* 3 bytes language */ + *frame++ = node->lng[0]; + *frame++ = node->lng[1]; + *frame++ = node->lng[2]; + /* descriptor with zero byte(s) separator */ + if (node->dsc.enc != 1) { + frame = writeChars(frame, node->dsc.ptr.l, node->dsc.dim); + *frame++ = 0; + } + else { + frame = writeUcs2s(frame, node->dsc.ptr.u, node->dsc.dim); + *frame++ = 0; + *frame++ = 0; + } + /* comment full text */ + if (node->txt.enc != 1) { + frame = writeChars(frame, node->txt.ptr.l, node->txt.dim); + } + else { + frame = writeUcs2s(frame, node->txt.ptr.u, node->txt.dim); + } + } + return frame; +} + +static unsigned char * +set_frame_custom2(unsigned char *frame, FrameDataNode const *node) +{ + size_t const n = sizeOfNode(node); + if (n > 10) { + frame = set_4_byte_value(frame, node->fid); + frame = set_4_byte_value(frame, (unsigned long) (n - 10)); + /* clear 2-byte header flags */ + *frame++ = 0; + *frame++ = 0; + /* clear 1 encoding descriptor byte to indicate ISO-8859-1 format */ + *frame++ = node->txt.enc == 1 ? 1 : 0; + if (node->dsc.dim > 0) { + if (node->dsc.enc != 1) { + frame = writeChars(frame, node->dsc.ptr.l, node->dsc.dim); + *frame++ = 0; + } + else { + frame = writeUcs2s(frame, node->dsc.ptr.u, node->dsc.dim); + *frame++ = 0; + *frame++ = 0; + } + } + if (node->txt.enc != 1) { + frame = writeChars(frame, node->txt.ptr.l, node->txt.dim); + } + else { + frame = writeUcs2s(frame, node->txt.ptr.u, node->txt.dim); + } + } + return frame; +} + +static unsigned char * +set_frame_wxxx(unsigned char *frame, FrameDataNode const *node) +{ + size_t const n = sizeOfWxxxNode(node); + if (n > 10) { + frame = set_4_byte_value(frame, node->fid); + frame = set_4_byte_value(frame, (unsigned long) (n - 10)); + /* clear 2-byte header flags */ + *frame++ = 0; + *frame++ = 0; + if (node->dsc.dim > 0) { + /* clear 1 encoding descriptor byte to indicate ISO-8859-1 format */ + *frame++ = node->dsc.enc == 1 ? 1 : 0; + if (node->dsc.enc != 1) { + frame = writeChars(frame, node->dsc.ptr.l, node->dsc.dim); + *frame++ = 0; + } + else { + frame = writeUcs2s(frame, node->dsc.ptr.u, node->dsc.dim); + *frame++ = 0; + *frame++ = 0; + } + } + if (node->txt.enc != 1) { + frame = writeChars(frame, node->txt.ptr.l, node->txt.dim); + } + else { + frame = writeLoBytes(frame, node->txt.ptr.u, node->txt.dim); + } + } + return frame; +} + +static unsigned char * +set_frame_apic(unsigned char *frame, const char *mimetype, const unsigned char *data, size_t size) +{ + /* ID3v2.3 standard APIC frame: + * <Header for 'Attached picture', ID: "APIC"> + * Text encoding $xx + * MIME type <text string> $00 + * Picture type $xx + * Description <text string according to encoding> $00 (00) + * Picture data <binary data> + */ + if (mimetype && data && size) { + frame = set_4_byte_value(frame, FRAME_ID('A', 'P', 'I', 'C')); + frame = set_4_byte_value(frame, (unsigned long) (4 + strlen(mimetype) + size)); + /* clear 2-byte header flags */ + *frame++ = 0; + *frame++ = 0; + /* clear 1 encoding descriptor byte to indicate ISO-8859-1 format */ + *frame++ = 0; + /* copy mime_type */ + while (*mimetype) { + *frame++ = *mimetype++; + } + *frame++ = 0; + /* set picture type to 0 */ + *frame++ = 0; + /* empty description field */ + *frame++ = 0; + /* copy the image data */ + while (size--) { + *frame++ = *data++; + } + } + return frame; +} + +int +id3tag_set_fieldvalue(lame_t gfp, const char *fieldvalue) +{ + if (is_lame_internal_flags_null(gfp)) { + return 0; + } + if (fieldvalue && *fieldvalue) { + if (strlen(fieldvalue) < 5 || fieldvalue[4] != '=') { + return -1; + } + return id3tag_set_textinfo_latin1(gfp, fieldvalue, &fieldvalue[5]); + } + return 0; +} + +int +id3tag_set_fieldvalue_utf16(lame_t gfp, const unsigned short *fieldvalue) +{ + if (is_lame_internal_flags_null(gfp)) { + return 0; + } + if (fieldvalue && *fieldvalue) { + size_t dx = hasUcs2ByteOrderMarker(fieldvalue[0]); + unsigned short const separator = fromLatin1Char(fieldvalue, '='); + char fid[5] = {0,0,0,0,0}; + uint32_t const frame_id = toID3v2TagId_ucs2(fieldvalue); + if (local_ucs2_strlen(fieldvalue) < (5+dx) || fieldvalue[4+dx] != separator) { + return -1; + } + fid[0] = (frame_id >> 24) & 0x0ff; + fid[1] = (frame_id >> 16) & 0x0ff; + fid[2] = (frame_id >> 8) & 0x0ff; + fid[3] = frame_id & 0x0ff; + if (frame_id != 0) { + unsigned short* txt = 0; + int rc; + local_ucs2_substr(&txt, fieldvalue, dx+5, local_ucs2_strlen(fieldvalue)); + rc = id3tag_set_textinfo_utf16(gfp, fid, txt); + free(txt); + return rc; + } + } + return -1; +} + +extern int +id3tag_set_fieldvalue_ucs2(lame_t gfp, const unsigned short *fieldvalue); + +int +id3tag_set_fieldvalue_ucs2(lame_t gfp, const unsigned short *fieldvalue) +{ + if (is_lame_internal_flags_null(gfp)) { + return 0; + } + return id3tag_set_fieldvalue_utf16(gfp, fieldvalue); +} + +size_t +lame_get_id3v2_tag(lame_t gfp, unsigned char *buffer, size_t size) +{ + lame_internal_flags *gfc = 0; + + if (is_lame_internal_flags_null(gfp)) { + return 0; + } + gfc = gfp->internal_flags; + if (test_tag_spec_flags(gfc, V1_ONLY_FLAG)) { + return 0; + } +#if 0 + debug_tag_spec_flags(gfc, "lame_get_id3v2_tag"); +#endif + { + int usev2 = test_tag_spec_flags(gfc, ADD_V2_FLAG | V2_ONLY_FLAG); + /* calculate length of four fields which may not fit in verion 1 tag */ + size_t title_length = gfc->tag_spec.title ? strlen(gfc->tag_spec.title) : 0; + size_t artist_length = gfc->tag_spec.artist ? strlen(gfc->tag_spec.artist) : 0; + size_t album_length = gfc->tag_spec.album ? strlen(gfc->tag_spec.album) : 0; + size_t comment_length = gfc->tag_spec.comment ? strlen(gfc->tag_spec.comment) : 0; + /* write tag if explicitly requested or if fields overflow */ + if ((title_length > 30) + || (artist_length > 30) + || (album_length > 30) + || (comment_length > 30) + || (gfc->tag_spec.track_id3v1 && (comment_length > 28))) { + usev2 = 1; + } + if (usev2) { + size_t tag_size; + unsigned char *p; + size_t adjusted_tag_size; + const char *albumart_mime = NULL; + static const char *mime_jpeg = "image/jpeg"; + static const char *mime_png = "image/png"; + static const char *mime_gif = "image/gif"; + + if (gfp->num_samples != MAX_U_32_NUM) { + id3v2AddAudioDuration(gfp, gfp->num_samples); + } + + /* calulate size of tag starting with 10-byte tag header */ + tag_size = 10; + if (gfc->tag_spec.albumart && gfc->tag_spec.albumart_size) { + switch (gfc->tag_spec.albumart_mimetype) { + case MIMETYPE_JPEG: + albumart_mime = mime_jpeg; + break; + case MIMETYPE_PNG: + albumart_mime = mime_png; + break; + case MIMETYPE_GIF: + albumart_mime = mime_gif; + break; + } + if (albumart_mime) { + tag_size += 10 + 4 + strlen(albumart_mime) + gfc->tag_spec.albumart_size; + } + } + { + id3tag_spec *tag = &gfc->tag_spec; + if (tag->v2_head != 0) { + FrameDataNode *node; + for (node = tag->v2_head; node != 0; node = node->nxt) { + if (node->fid == ID_COMMENT || node->fid == ID_USER) { + tag_size += sizeOfCommentNode(node); + } + else if (isFrameIdMatching(node->fid, FRAME_ID('W',0,0,0))) { + tag_size += sizeOfWxxxNode(node); + } + else { + tag_size += sizeOfNode(node); + } + } + } + } + if (test_tag_spec_flags(gfc, PAD_V2_FLAG)) { + /* add some bytes of padding */ + tag_size += gfc->tag_spec.padding_size; + } + if (size < tag_size) { + return tag_size; + } + if (buffer == 0) { + return 0; + } + p = buffer; + /* set tag header starting with file identifier */ + *p++ = 'I'; + *p++ = 'D'; + *p++ = '3'; + /* set version number word */ + *p++ = 3; + *p++ = 0; + /* clear flags byte */ + *p++ = 0; + /* calculate and set tag size = total size - header size */ + adjusted_tag_size = tag_size - 10; + /* encode adjusted size into four bytes where most significant + * bit is clear in each byte, for 28-bit total */ + *p++ = (unsigned char) ((adjusted_tag_size >> 21) & 0x7fu); + *p++ = (unsigned char) ((adjusted_tag_size >> 14) & 0x7fu); + *p++ = (unsigned char) ((adjusted_tag_size >> 7) & 0x7fu); + *p++ = (unsigned char) (adjusted_tag_size & 0x7fu); + + /* + * NOTE: The remainder of the tag (frames and padding, if any) + * are not "unsynchronized" to prevent false MPEG audio headers + * from appearing in the bitstream. Why? Well, most players + * and utilities know how to skip the ID3 version 2 tag by now + * even if they don't read its contents, and it's actually + * very unlikely that such a false "sync" pattern would occur + * in just the simple text frames added here. + */ + + /* set each frame in tag */ + { + id3tag_spec *tag = &gfc->tag_spec; + if (tag->v2_head != 0) { + FrameDataNode *node; + for (node = tag->v2_head; node != 0; node = node->nxt) { + if (node->fid == ID_COMMENT || node->fid == ID_USER) { + p = set_frame_comment(p, node); + } + else if (isFrameIdMatching(node->fid,FRAME_ID('W',0,0,0))) { + p = set_frame_wxxx(p, node); + } + else { + p = set_frame_custom2(p, node); + } + } + } + } + if (albumart_mime) { + p = set_frame_apic(p, albumart_mime, gfc->tag_spec.albumart, + gfc->tag_spec.albumart_size); + } + /* clear any padding bytes */ + memset(p, 0, tag_size - (p - buffer)); + return tag_size; + } + } + return 0; +} + +int +id3tag_write_v2(lame_t gfp) +{ + lame_internal_flags *gfc = 0; + + if (is_lame_internal_flags_null(gfp)) { + return 0; + } + gfc = gfp->internal_flags; +#if 0 + debug_tag_spec_flags(gfc, "write v2"); +#endif + if (test_tag_spec_flags(gfc, V1_ONLY_FLAG)) { + return 0; + } + if (test_tag_spec_flags(gfc, CHANGED_FLAG)) { + unsigned char *tag = 0; + size_t tag_size, n; + + n = lame_get_id3v2_tag(gfp, 0, 0); + tag = lame_calloc(unsigned char, n); + if (tag == 0) { + return -1; + } + tag_size = lame_get_id3v2_tag(gfp, tag, n); + if (tag_size > n) { + free(tag); + return -1; + } + else { + size_t i; + /* write tag directly into bitstream at current position */ + for (i = 0; i < tag_size; ++i) { + add_dummy_byte(gfc, tag[i], 1); + } + } + free(tag); + return (int) tag_size; /* ok, tag should not exceed 2GB */ + } + return 0; +} + +static unsigned char * +set_text_field(unsigned char *field, const char *text, size_t size, int pad) +{ + while (size--) { + if (text && *text) { + *field++ = *text++; + } + else { + *field++ = pad; + } + } + return field; +} + +size_t +lame_get_id3v1_tag(lame_t gfp, unsigned char *buffer, size_t size) +{ + size_t const tag_size = 128; + lame_internal_flags *gfc; + + if (gfp == 0) { + return 0; + } + if (size < tag_size) { + return tag_size; + } + gfc = gfp->internal_flags; + if (gfc == 0) { + return 0; + } + if (buffer == 0) { + return 0; + } + if (test_tag_spec_flags(gfc, V2_ONLY_FLAG)) { + return 0; + } + if (test_tag_spec_flags(gfc, CHANGED_FLAG)) { + unsigned char *p = buffer; + int pad = test_tag_spec_flags(gfc, SPACE_V1_FLAG) ? ' ' : 0; + char year[5]; + + /* set tag identifier */ + *p++ = 'T'; + *p++ = 'A'; + *p++ = 'G'; + /* set each field in tag */ + p = set_text_field(p, gfc->tag_spec.title, 30, pad); + p = set_text_field(p, gfc->tag_spec.artist, 30, pad); + p = set_text_field(p, gfc->tag_spec.album, 30, pad); + sprintf(year, "%d", gfc->tag_spec.year); + p = set_text_field(p, gfc->tag_spec.year ? year : NULL, 4, pad); + /* limit comment field to 28 bytes if a track is specified */ + p = set_text_field(p, gfc->tag_spec.comment, gfc->tag_spec.track_id3v1 ? 28 : 30, pad); + if (gfc->tag_spec.track_id3v1) { + /* clear the next byte to indicate a version 1.1 tag */ + *p++ = 0; + *p++ = gfc->tag_spec.track_id3v1; + } + *p++ = gfc->tag_spec.genre_id3v1; + return tag_size; + } + return 0; +} + +int +id3tag_write_v1(lame_t gfp) +{ + lame_internal_flags* gfc = 0; + size_t i, n, m; + unsigned char tag[128]; + + if (is_lame_internal_flags_null(gfp)) { + return 0; + } + gfc = gfp->internal_flags; + + m = sizeof(tag); + n = lame_get_id3v1_tag(gfp, tag, m); + if (n > m) { + return 0; + } + /* write tag directly into bitstream at current position */ + for (i = 0; i < n; ++i) { + add_dummy_byte(gfc, tag[i], 1); + } + return (int) n; /* ok, tag has fixed size of 128 bytes, well below 2GB */ +} diff --git a/libmp3lame/id3tag.h b/libmp3lame/id3tag.h new file mode 100644 index 0000000..9cd9ad9 --- /dev/null +++ b/libmp3lame/id3tag.h @@ -0,0 +1,64 @@ + +#ifndef LAME_ID3_H +#define LAME_ID3_H + + +#define CHANGED_FLAG (1U << 0) +#define ADD_V2_FLAG (1U << 1) +#define V1_ONLY_FLAG (1U << 2) +#define V2_ONLY_FLAG (1U << 3) +#define SPACE_V1_FLAG (1U << 4) +#define PAD_V2_FLAG (1U << 5) + +enum { + MIMETYPE_NONE = 0, + MIMETYPE_JPEG, + MIMETYPE_PNG, + MIMETYPE_GIF +}; + +typedef struct FrameDataNode { + struct FrameDataNode *nxt; + uint32_t fid; /* Frame Identifier */ + char lng[4]; /* 3-character language descriptor */ + struct { + union { + char *l; /* ptr to Latin-1 chars */ + unsigned short *u; /* ptr to UCS-2 text */ + unsigned char *b; /* ptr to raw bytes */ + } ptr; + size_t dim; + int enc; /* 0:Latin-1, 1:UCS-2, 2:RAW */ + } dsc , txt; +} FrameDataNode; + + +typedef struct id3tag_spec { + /* private data members */ + unsigned int flags; + int year; + char *title; + char *artist; + char *album; + char *comment; + int track_id3v1; + int genre_id3v1; + unsigned char *albumart; + unsigned int albumart_size; + unsigned int padding_size; + int albumart_mimetype; + char language[4]; /* the language of the frame's content, according to ISO-639-2 */ + FrameDataNode *v2_head, *v2_tail; +} id3tag_spec; + + +/* write tag into stream at current position */ +extern int id3tag_write_v2(lame_global_flags * gfp); +extern int id3tag_write_v1(lame_global_flags * gfp); +/* + * NOTE: A version 2 tag will NOT be added unless one of the text fields won't + * fit in a version 1 tag (e.g. the title string is longer than 30 characters), + * or the "id3tag_add_v2" or "id3tag_v2_only" functions are used. + */ + +#endif diff --git a/libmp3lame/l3side.h b/libmp3lame/l3side.h new file mode 100644 index 0000000..f65bbed --- /dev/null +++ b/libmp3lame/l3side.h @@ -0,0 +1,95 @@ +/* + * Layer 3 side include file + * + * Copyright (c) 1999 Mark Taylor + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef LAME_L3SIDE_H +#define LAME_L3SIDE_H + +/* max scalefactor band, max(SBMAX_l, SBMAX_s*3, (SBMAX_s-3)*3+8) */ +#define SFBMAX (SBMAX_s*3) + +/* Layer III side information. */ +typedef struct { + int l[1 + SBMAX_l]; + int s[1 + SBMAX_s]; + int psfb21[1 + PSFB21]; + int psfb12[1 + PSFB12]; +} scalefac_struct; + + +typedef struct { + FLOAT l[SBMAX_l]; + FLOAT s[SBMAX_s][3]; +} III_psy_xmin; + +typedef struct { + III_psy_xmin thm; + III_psy_xmin en; +} III_psy_ratio; + +typedef struct { + FLOAT xr[576]; + int l3_enc[576]; + int scalefac[SFBMAX]; + FLOAT xrpow_max; + + int part2_3_length; + int big_values; + int count1; + int global_gain; + int scalefac_compress; + int block_type; + int mixed_block_flag; + int table_select[3]; + int subblock_gain[3 + 1]; + int region0_count; + int region1_count; + int preflag; + int scalefac_scale; + int count1table_select; + + int part2_length; + int sfb_lmax; + int sfb_smin; + int psy_lmax; + int sfbmax; + int psymax; + int sfbdivide; + int width[SFBMAX]; + int window[SFBMAX]; + int count1bits; + /* added for LSF */ + const int *sfb_partition_table; + int slen[4]; + + int max_nonzero_coeff; + char energy_above_cutoff[SFBMAX]; +} gr_info; + +typedef struct { + gr_info tt[2][2]; + int main_data_begin; + int private_bits; + int resvDrain_pre; + int resvDrain_post; + int scfsi[2][4]; +} III_side_info_t; + +#endif diff --git a/libmp3lame/lame-analysis.h b/libmp3lame/lame-analysis.h new file mode 100644 index 0000000..5055a60 --- /dev/null +++ b/libmp3lame/lame-analysis.h @@ -0,0 +1,96 @@ +/* + * GTK plotting routines source file + * + * Copyright (c) 1999 Mark Taylor + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef LAME_GTKANAL_H +#define LAME_GTKANAL_H + + +#define READ_AHEAD 40 /* number of frames to read ahead */ +#define MAXMPGLAG READ_AHEAD /* if the mpg123 lag becomes bigger than this + we have to stop */ +#define NUMBACK 6 /* number of frames we can back up */ +#define NUMPINFO (NUMBACK+READ_AHEAD+1) + + + +struct plotting_data { + int frameNum; /* current frame number */ + int frameNum123; + int num_samples; /* number of pcm samples read for this frame */ + double frametime; /* starting time of frame, in seconds */ + double pcmdata[2][1600]; + double pcmdata2[2][1152 + 1152 - DECDELAY]; + double xr[2][2][576]; + double mpg123xr[2][2][576]; + double ms_ratio[2]; + double ms_ener_ratio[2]; + + /* L,R, M and S values */ + double energy_save[4][BLKSIZE]; /* psymodel is one ahead */ + double energy[2][4][BLKSIZE]; + double pe[2][4]; + double thr[2][4][SBMAX_l]; + double en[2][4][SBMAX_l]; + double thr_s[2][4][3 * SBMAX_s]; + double en_s[2][4][3 * SBMAX_s]; + double ers_save[4]; /* psymodel is one ahead */ + double ers[2][4]; + + double sfb[2][2][SBMAX_l]; + double sfb_s[2][2][3 * SBMAX_s]; + double LAMEsfb[2][2][SBMAX_l]; + double LAMEsfb_s[2][2][3 * SBMAX_s]; + + int LAMEqss[2][2]; + int qss[2][2]; + int big_values[2][2]; + int sub_gain[2][2][3]; + + double xfsf[2][2][SBMAX_l]; + double xfsf_s[2][2][3 * SBMAX_s]; + + int over[2][2]; + double tot_noise[2][2]; + double max_noise[2][2]; + double over_noise[2][2]; + int over_SSD[2][2]; + int blocktype[2][2]; + int scalefac_scale[2][2]; + int preflag[2][2]; + int mpg123blocktype[2][2]; + int mixed[2][2]; + int mainbits[2][2]; + int sfbits[2][2]; + int LAMEmainbits[2][2]; + int LAMEsfbits[2][2]; + int framesize, stereo, js, ms_stereo, i_stereo, emph, bitrate, sampfreq, maindata; + int crc, padding; + int scfsi[2], mean_bits, resvsize; + int totbits; +}; +#ifndef plotting_data_defined +#define plotting_data_defined +typedef struct plotting_data plotting_data; +#endif +#if 0 +extern plotting_data *pinfo; +#endif +#endif diff --git a/libmp3lame/lame.c b/libmp3lame/lame.c new file mode 100644 index 0000000..cb82225 --- /dev/null +++ b/libmp3lame/lame.c @@ -0,0 +1,2665 @@ +/* -*- mode: C; mode: fold -*- */ +/* + * LAME MP3 encoding engine + * + * Copyright (c) 1999-2000 Mark Taylor + * Copyright (c) 2000-2005 Takehiro Tominaga + * Copyright (c) 2000-2017 Robert Hegemann + * Copyright (c) 2000-2005 Gabriel Bouvigne + * Copyright (c) 2000-2004 Alexander Leidinger + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* $Id: lame.c,v 1.377 2017/09/26 12:14:02 robert Exp $ */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + + +#include "lame.h" +#include "machine.h" + +#include "encoder.h" +#include "util.h" +#include "lame_global_flags.h" +#include "gain_analysis.h" +#include "bitstream.h" +#include "quantize_pvt.h" +#include "set_get.h" +#include "quantize.h" +#include "psymodel.h" +#include "version.h" +#include "VbrTag.h" +#include "tables.h" + + +#if defined(__FreeBSD__) && !defined(__alpha__) +#include <floatingpoint.h> +#endif +#ifdef __riscos__ +#include "asmstuff.h" +#endif + +#ifdef __sun__ +/* woraround for SunOS 4.x, it has SEEK_* defined here */ +#include <unistd.h> +#endif + + +#define LAME_DEFAULT_QUALITY 3 + + + +int +is_lame_global_flags_valid(const lame_global_flags * gfp) +{ + if (gfp == NULL) + return 0; + if (gfp->class_id != LAME_ID) + return 0; + return 1; +} + + +int +is_lame_internal_flags_valid(const lame_internal_flags * gfc) +{ + if (gfc == NULL) + return 0; + if (gfc->class_id != LAME_ID) + return 0; + if (gfc->lame_init_params_successful <=0) + return 0; + return 1; +} + + + +static FLOAT +filter_coef(FLOAT x) +{ + if (x > 1.0) + return 0.0; + if (x <= 0.0) + return 1.0; + + return cos(PI / 2 * x); +} + +static void +lame_init_params_ppflt(lame_internal_flags * gfc) +{ + SessionConfig_t *const cfg = &gfc->cfg; + + /***************************************************************/ + /* compute info needed for polyphase filter (filter type==0, default) */ + /***************************************************************/ + + int band, maxband, minband; + FLOAT freq; + int lowpass_band = 32; + int highpass_band = -1; + + if (cfg->lowpass1 > 0) { + minband = 999; + for (band = 0; band <= 31; band++) { + freq = band / 31.0; + /* this band and above will be zeroed: */ + if (freq >= cfg->lowpass2) { + lowpass_band = Min(lowpass_band, band); + } + if (cfg->lowpass1 < freq && freq < cfg->lowpass2) { + minband = Min(minband, band); + } + } + + /* compute the *actual* transition band implemented by + * the polyphase filter */ + if (minband == 999) { + cfg->lowpass1 = (lowpass_band - .75) / 31.0; + } + else { + cfg->lowpass1 = (minband - .75) / 31.0; + } + cfg->lowpass2 = lowpass_band / 31.0; + } + + /* make sure highpass filter is within 90% of what the effective + * highpass frequency will be */ + if (cfg->highpass2 > 0) { + if (cfg->highpass2 < .9 * (.75 / 31.0)) { + cfg->highpass1 = 0; + cfg->highpass2 = 0; + MSGF(gfc, "Warning: highpass filter disabled. " "highpass frequency too small\n"); + } + } + + if (cfg->highpass2 > 0) { + maxband = -1; + for (band = 0; band <= 31; band++) { + freq = band / 31.0; + /* this band and below will be zereod */ + if (freq <= cfg->highpass1) { + highpass_band = Max(highpass_band, band); + } + if (cfg->highpass1 < freq && freq < cfg->highpass2) { + maxband = Max(maxband, band); + } + } + /* compute the *actual* transition band implemented by + * the polyphase filter */ + cfg->highpass1 = highpass_band / 31.0; + if (maxband == -1) { + cfg->highpass2 = (highpass_band + .75) / 31.0; + } + else { + cfg->highpass2 = (maxband + .75) / 31.0; + } + } + + for (band = 0; band < 32; band++) { + FLOAT fc1, fc2; + freq = band / 31.0f; + if (cfg->highpass2 > cfg->highpass1) { + fc1 = filter_coef((cfg->highpass2 - freq) / (cfg->highpass2 - cfg->highpass1 + 1e-20)); + } + else { + fc1 = 1.0f; + } + if (cfg->lowpass2 > cfg->lowpass1) { + fc2 = filter_coef((freq - cfg->lowpass1) / (cfg->lowpass2 - cfg->lowpass1 + 1e-20)); + } + else { + fc2 = 1.0f; + } + gfc->sv_enc.amp_filter[band] = fc1 * fc2; + } +} + + +static void +optimum_bandwidth(double *const lowerlimit, double *const upperlimit, const unsigned bitrate) +{ +/* + * Input: + * bitrate total bitrate in kbps + * + * Output: + * lowerlimit: best lowpass frequency limit for input filter in Hz + * upperlimit: best highpass frequency limit for input filter in Hz + */ + int table_index; + + typedef struct { + int bitrate; /* only indicative value */ + int lowpass; + } band_pass_t; + + const band_pass_t freq_map[] = { + {8, 2000}, + {16, 3700}, + {24, 3900}, + {32, 5500}, + {40, 7000}, + {48, 7500}, + {56, 10000}, + {64, 11000}, + {80, 13500}, + {96, 15100}, + {112, 15600}, + {128, 17000}, + {160, 17500}, + {192, 18600}, + {224, 19400}, + {256, 19700}, + {320, 20500} + }; + + + table_index = nearestBitrateFullIndex(bitrate); + + (void) freq_map[table_index].bitrate; + *lowerlimit = freq_map[table_index].lowpass; + + +/* + * Now we try to choose a good high pass filtering frequency. + * This value is currently not used. + * For fu < 16 kHz: sqrt(fu*fl) = 560 Hz + * For fu = 18 kHz: no high pass filtering + * This gives: + * + * 2 kHz => 160 Hz + * 3 kHz => 107 Hz + * 4 kHz => 80 Hz + * 8 kHz => 40 Hz + * 16 kHz => 20 Hz + * 17 kHz => 10 Hz + * 18 kHz => 0 Hz + * + * These are ad hoc values and these can be optimized if a high pass is available. + */ +/* if (f_low <= 16000) + f_high = 16000. * 20. / f_low; + else if (f_low <= 18000) + f_high = 180. - 0.01 * f_low; + else + f_high = 0.;*/ + + /* + * When we sometimes have a good highpass filter, we can add the highpass + * frequency to the lowpass frequency + */ + + /*if (upperlimit != NULL) + *upperlimit = f_high;*/ + (void) upperlimit; +} + + +static int +optimum_samplefreq(int lowpassfreq, int input_samplefreq) +{ +/* + * Rules: + * - if possible, sfb21 should NOT be used + * + */ + int suggested_samplefreq = 44100; + + if (input_samplefreq >= 48000) + suggested_samplefreq = 48000; + else if (input_samplefreq >= 44100) + suggested_samplefreq = 44100; + else if (input_samplefreq >= 32000) + suggested_samplefreq = 32000; + else if (input_samplefreq >= 24000) + suggested_samplefreq = 24000; + else if (input_samplefreq >= 22050) + suggested_samplefreq = 22050; + else if (input_samplefreq >= 16000) + suggested_samplefreq = 16000; + else if (input_samplefreq >= 12000) + suggested_samplefreq = 12000; + else if (input_samplefreq >= 11025) + suggested_samplefreq = 11025; + else if (input_samplefreq >= 8000) + suggested_samplefreq = 8000; + + if (lowpassfreq == -1) + return suggested_samplefreq; + + if (lowpassfreq <= 15960) + suggested_samplefreq = 44100; + if (lowpassfreq <= 15250) + suggested_samplefreq = 32000; + if (lowpassfreq <= 11220) + suggested_samplefreq = 24000; + if (lowpassfreq <= 9970) + suggested_samplefreq = 22050; + if (lowpassfreq <= 7230) + suggested_samplefreq = 16000; + if (lowpassfreq <= 5420) + suggested_samplefreq = 12000; + if (lowpassfreq <= 4510) + suggested_samplefreq = 11025; + if (lowpassfreq <= 3970) + suggested_samplefreq = 8000; + + if (input_samplefreq < suggested_samplefreq) { + /* choose a valid MPEG sample frequency above the input sample frequency + to avoid SFB21/12 bitrate bloat + rh 061115 + */ + if (input_samplefreq > 44100) { + return 48000; + } + if (input_samplefreq > 32000) { + return 44100; + } + if (input_samplefreq > 24000) { + return 32000; + } + if (input_samplefreq > 22050) { + return 24000; + } + if (input_samplefreq > 16000) { + return 22050; + } + if (input_samplefreq > 12000) { + return 16000; + } + if (input_samplefreq > 11025) { + return 12000; + } + if (input_samplefreq > 8000) { + return 11025; + } + return 8000; + } + return suggested_samplefreq; +} + + + + + +/* set internal feature flags. USER should not access these since + * some combinations will produce strange results */ +static void +lame_init_qval(lame_global_flags * gfp) +{ + lame_internal_flags *const gfc = gfp->internal_flags; + SessionConfig_t *const cfg = &gfc->cfg; + + switch (gfp->quality) { + default: + case 9: /* no psymodel, no noise shaping */ + cfg->noise_shaping = 0; + cfg->noise_shaping_amp = 0; + cfg->noise_shaping_stop = 0; + cfg->use_best_huffman = 0; + cfg->full_outer_loop = 0; + break; + + case 8: + gfp->quality = 7; + /*lint --fallthrough */ + case 7: /* use psymodel (for short block and m/s switching), but no noise shapping */ + cfg->noise_shaping = 0; + cfg->noise_shaping_amp = 0; + cfg->noise_shaping_stop = 0; + cfg->use_best_huffman = 0; + cfg->full_outer_loop = 0; + if (cfg->vbr == vbr_mt || cfg->vbr == vbr_mtrh) { + cfg->full_outer_loop = -1; + } + break; + + case 6: + if (cfg->noise_shaping == 0) + cfg->noise_shaping = 1; + cfg->noise_shaping_amp = 0; + cfg->noise_shaping_stop = 0; + if (cfg->subblock_gain == -1) + cfg->subblock_gain = 1; + cfg->use_best_huffman = 0; + cfg->full_outer_loop = 0; + break; + + case 5: + if (cfg->noise_shaping == 0) + cfg->noise_shaping = 1; + cfg->noise_shaping_amp = 0; + cfg->noise_shaping_stop = 0; + if (cfg->subblock_gain == -1) + cfg->subblock_gain = 1; + cfg->use_best_huffman = 0; + cfg->full_outer_loop = 0; + break; + + case 4: + if (cfg->noise_shaping == 0) + cfg->noise_shaping = 1; + cfg->noise_shaping_amp = 0; + cfg->noise_shaping_stop = 0; + if (cfg->subblock_gain == -1) + cfg->subblock_gain = 1; + cfg->use_best_huffman = 1; + cfg->full_outer_loop = 0; + break; + + case 3: + if (cfg->noise_shaping == 0) + cfg->noise_shaping = 1; + cfg->noise_shaping_amp = 1; + cfg->noise_shaping_stop = 1; + if (cfg->subblock_gain == -1) + cfg->subblock_gain = 1; + cfg->use_best_huffman = 1; + cfg->full_outer_loop = 0; + break; + + case 2: + if (cfg->noise_shaping == 0) + cfg->noise_shaping = 1; + if (gfc->sv_qnt.substep_shaping == 0) + gfc->sv_qnt.substep_shaping = 2; + cfg->noise_shaping_amp = 1; + cfg->noise_shaping_stop = 1; + if (cfg->subblock_gain == -1) + cfg->subblock_gain = 1; + cfg->use_best_huffman = 1; /* inner loop */ + cfg->full_outer_loop = 0; + break; + + case 1: + if (cfg->noise_shaping == 0) + cfg->noise_shaping = 1; + if (gfc->sv_qnt.substep_shaping == 0) + gfc->sv_qnt.substep_shaping = 2; + cfg->noise_shaping_amp = 2; + cfg->noise_shaping_stop = 1; + if (cfg->subblock_gain == -1) + cfg->subblock_gain = 1; + cfg->use_best_huffman = 1; + cfg->full_outer_loop = 0; + break; + + case 0: + if (cfg->noise_shaping == 0) + cfg->noise_shaping = 1; + if (gfc->sv_qnt.substep_shaping == 0) + gfc->sv_qnt.substep_shaping = 2; + cfg->noise_shaping_amp = 2; + cfg->noise_shaping_stop = 1; + if (cfg->subblock_gain == -1) + cfg->subblock_gain = 1; + cfg->use_best_huffman = 1; /*type 2 disabled because of it slowness, + in favor of full outer loop search */ + cfg->full_outer_loop = 1; + break; + } + +} + + + +static double +linear_int(double a, double b, double m) +{ + return a + m * (b - a); +} + + + +/******************************************************************** + * initialize internal params based on data in gf + * (globalflags struct filled in by calling program) + * + * OUTLINE: + * + * We first have some complex code to determine bitrate, + * output samplerate and mode. It is complicated by the fact + * that we allow the user to set some or all of these parameters, + * and need to determine best possible values for the rest of them: + * + * 1. set some CPU related flags + * 2. check if we are mono->mono, stereo->mono or stereo->stereo + * 3. compute bitrate and output samplerate: + * user may have set compression ratio + * user may have set a bitrate + * user may have set a output samplerate + * 4. set some options which depend on output samplerate + * 5. compute the actual compression ratio + * 6. set mode based on compression ratio + * + * The remaining code is much simpler - it just sets options + * based on the mode & compression ratio: + * + * set allow_diff_short based on mode + * select lowpass filter based on compression ratio & mode + * set the bitrate index, and min/max bitrates for VBR modes + * disable VBR tag if it is not appropriate + * initialize the bitstream + * initialize scalefac_band data + * set sideinfo_len (based on channels, CRC, out_samplerate) + * write an id3v2 tag into the bitstream + * write VBR tag into the bitstream + * set mpeg1/2 flag + * estimate the number of frames (based on a lot of data) + * + * now we set more flags: + * nspsytune: + * see code + * VBR modes + * see code + * CBR/ABR + * see code + * + * Finally, we set the algorithm flags based on the gfp->quality value + * lame_init_qval(gfp); + * + ********************************************************************/ +int +lame_init_params(lame_global_flags * gfp) +{ + + int i; + int j; + lame_internal_flags *gfc; + SessionConfig_t *cfg; + + if (!is_lame_global_flags_valid(gfp)) + return -1; + + gfc = gfp->internal_flags; + if (gfc == 0) + return -1; + + if (is_lame_internal_flags_valid(gfc)) + return -1; /* already initialized */ + + /* start updating lame internal flags */ + gfc->class_id = LAME_ID; + gfc->lame_init_params_successful = 0; /* will be set to one, when we get through until the end */ + + if (gfp->samplerate_in < 1) + return -1; /* input sample rate makes no sense */ + if (gfp->num_channels < 1 || 2 < gfp->num_channels) + return -1; /* number of input channels makes no sense */ + if (gfp->samplerate_out != 0) { + int v=0; + if (SmpFrqIndex(gfp->samplerate_out, &v) < 0) + return -1; /* output sample rate makes no sense */ + } + + cfg = &gfc->cfg; + + cfg->enforce_min_bitrate = gfp->VBR_hard_min; + cfg->analysis = gfp->analysis; + if (cfg->analysis) + gfp->write_lame_tag = 0; + + /* some file options not allowed if output is: not specified or stdout */ + if (gfc->pinfo != NULL) + gfp->write_lame_tag = 0; /* disable Xing VBR tag */ + + /* report functions */ + gfc->report_msg = gfp->report.msgf; + gfc->report_dbg = gfp->report.debugf; + gfc->report_err = gfp->report.errorf; + + if (gfp->asm_optimizations.amd3dnow) + gfc->CPU_features.AMD_3DNow = has_3DNow(); + else + gfc->CPU_features.AMD_3DNow = 0; + + if (gfp->asm_optimizations.mmx) + gfc->CPU_features.MMX = has_MMX(); + else + gfc->CPU_features.MMX = 0; + + if (gfp->asm_optimizations.sse) { + gfc->CPU_features.SSE = has_SSE(); + gfc->CPU_features.SSE2 = has_SSE2(); + } + else { + gfc->CPU_features.SSE = 0; + gfc->CPU_features.SSE2 = 0; + } + + + cfg->vbr = gfp->VBR; + cfg->error_protection = gfp->error_protection; + cfg->copyright = gfp->copyright; + cfg->original = gfp->original; + cfg->extension = gfp->extension; + cfg->emphasis = gfp->emphasis; + + cfg->channels_in = gfp->num_channels; + if (cfg->channels_in == 1) + gfp->mode = MONO; + cfg->channels_out = (gfp->mode == MONO) ? 1 : 2; + if (gfp->mode != JOINT_STEREO) + gfp->force_ms = 0; /* forced mid/side stereo for j-stereo only */ + cfg->force_ms = gfp->force_ms; + + if (cfg->vbr == vbr_off && gfp->VBR_mean_bitrate_kbps != 128 && gfp->brate == 0) + gfp->brate = gfp->VBR_mean_bitrate_kbps; + + switch (cfg->vbr) { + case vbr_off: + case vbr_mtrh: + case vbr_mt: + /* these modes can handle free format condition */ + break; + default: + gfp->free_format = 0; /* mode can't be mixed with free format */ + break; + } + + cfg->free_format = gfp->free_format; + + if (cfg->vbr == vbr_off && gfp->brate == 0) { + /* no bitrate or compression ratio specified, use 11.025 */ + if (EQ(gfp->compression_ratio, 0)) + gfp->compression_ratio = 11.025; /* rate to compress a CD down to exactly 128000 bps */ + } + + /* find bitrate if user specify a compression ratio */ + if (cfg->vbr == vbr_off && gfp->compression_ratio > 0) { + + if (gfp->samplerate_out == 0) + gfp->samplerate_out = map2MP3Frequency((int) (0.97 * gfp->samplerate_in)); /* round up with a margin of 3% */ + + /* choose a bitrate for the output samplerate which achieves + * specified compression ratio + */ + gfp->brate = gfp->samplerate_out * 16 * cfg->channels_out / (1.e3 * gfp->compression_ratio); + + /* we need the version for the bitrate table look up */ + cfg->samplerate_index = SmpFrqIndex(gfp->samplerate_out, &cfg->version); + assert(cfg->samplerate_index >=0); + + if (!cfg->free_format) /* for non Free Format find the nearest allowed bitrate */ + gfp->brate = FindNearestBitrate(gfp->brate, cfg->version, gfp->samplerate_out); + } + if (gfp->samplerate_out) { + if (gfp->samplerate_out < 16000) { + gfp->VBR_mean_bitrate_kbps = Max(gfp->VBR_mean_bitrate_kbps, 8); + gfp->VBR_mean_bitrate_kbps = Min(gfp->VBR_mean_bitrate_kbps, 64); + } + else if (gfp->samplerate_out < 32000) { + gfp->VBR_mean_bitrate_kbps = Max(gfp->VBR_mean_bitrate_kbps, 8); + gfp->VBR_mean_bitrate_kbps = Min(gfp->VBR_mean_bitrate_kbps, 160); + } + else { + gfp->VBR_mean_bitrate_kbps = Max(gfp->VBR_mean_bitrate_kbps, 32); + gfp->VBR_mean_bitrate_kbps = Min(gfp->VBR_mean_bitrate_kbps, 320); + } + } + /* WORK IN PROGRESS */ + /* mapping VBR scale to internal VBR quality settings */ + if (gfp->samplerate_out == 0 && (cfg->vbr == vbr_mt || cfg->vbr == vbr_mtrh)) { + float const qval = gfp->VBR_q + gfp->VBR_q_frac; + struct q_map { int sr_a; float qa, qb, ta, tb; int lp; }; + struct q_map const m[9] + = { {48000, 0.0,6.5, 0.0,6.5, 23700} + , {44100, 0.0,6.5, 0.0,6.5, 21780} + , {32000, 6.5,8.0, 5.2,6.5, 15800} + , {24000, 8.0,8.5, 5.2,6.0, 11850} + , {22050, 8.5,9.01, 5.2,6.5, 10892} + , {16000, 9.01,9.4, 4.9,6.5, 7903} + , {12000, 9.4,9.6, 4.5,6.0, 5928} + , {11025, 9.6,9.9, 5.1,6.5, 5446} + , { 8000, 9.9,10., 4.9,6.5, 3952} + }; + for (i = 2; i < 9; ++i) { + if (gfp->samplerate_in == m[i].sr_a) { + if (qval < m[i].qa) { + double d = qval / m[i].qa; + d = d * m[i].ta; + gfp->VBR_q = (int)d; + gfp->VBR_q_frac = d - gfp->VBR_q; + } + } + if (gfp->samplerate_in >= m[i].sr_a) { + if (m[i].qa <= qval && qval < m[i].qb) { + float const q_ = m[i].qb-m[i].qa; + float const t_ = m[i].tb-m[i].ta; + double d = m[i].ta + t_ * (qval-m[i].qa) / q_; + gfp->VBR_q = (int)d; + gfp->VBR_q_frac = d - gfp->VBR_q; + gfp->samplerate_out = m[i].sr_a; + if (gfp->lowpassfreq == 0) { + gfp->lowpassfreq = -1; + } + break; + } + } + } + } + + /****************************************************************/ + /* if a filter has not been enabled, see if we should add one: */ + /****************************************************************/ + if (gfp->lowpassfreq == 0) { + double lowpass = 16000; + double highpass; + + switch (cfg->vbr) { + case vbr_off:{ + optimum_bandwidth(&lowpass, &highpass, gfp->brate); + break; + } + case vbr_abr:{ + optimum_bandwidth(&lowpass, &highpass, gfp->VBR_mean_bitrate_kbps); + break; + } + case vbr_rh:{ + int const x[11] = { + 19500, 19000, 18600, 18000, 17500, 16000, 15600, 14900, 12500, 10000, 3950 + }; + if (0 <= gfp->VBR_q && gfp->VBR_q <= 9) { + double a = x[gfp->VBR_q], b = x[gfp->VBR_q + 1], m = gfp->VBR_q_frac; + lowpass = linear_int(a, b, m); + } + else { + lowpass = 19500; + } + break; + } + case vbr_mtrh: + case vbr_mt:{ + int const x[11] = { + 24000, 19500, 18500, 18000, 17500, 17000, 16500, 15600, 15200, 7230, 3950 + }; + if (0 <= gfp->VBR_q && gfp->VBR_q <= 9) { + double a = x[gfp->VBR_q], b = x[gfp->VBR_q + 1], m = gfp->VBR_q_frac; + lowpass = linear_int(a, b, m); + } + else { + lowpass = 21500; + } + break; + } + default:{ + int const x[11] = { + 19500, 19000, 18500, 18000, 17500, 16500, 15500, 14500, 12500, 9500, 3950 + }; + if (0 <= gfp->VBR_q && gfp->VBR_q <= 9) { + double a = x[gfp->VBR_q], b = x[gfp->VBR_q + 1], m = gfp->VBR_q_frac; + lowpass = linear_int(a, b, m); + } + else { + lowpass = 19500; + } + } + } + + if (gfp->mode == MONO && (cfg->vbr == vbr_off || cfg->vbr == vbr_abr)) + lowpass *= 1.5; + + gfp->lowpassfreq = lowpass; + } + + if (gfp->samplerate_out == 0) { + if (2 * gfp->lowpassfreq > gfp->samplerate_in) { + gfp->lowpassfreq = gfp->samplerate_in / 2; + } + gfp->samplerate_out = optimum_samplefreq((int) gfp->lowpassfreq, gfp->samplerate_in); + } + if (cfg->vbr == vbr_mt || cfg->vbr == vbr_mtrh) { + gfp->lowpassfreq = Min(24000, gfp->lowpassfreq); + } + else { + gfp->lowpassfreq = Min(20500, gfp->lowpassfreq); + } + gfp->lowpassfreq = Min(gfp->samplerate_out / 2, gfp->lowpassfreq); + + if (cfg->vbr == vbr_off) { + gfp->compression_ratio = gfp->samplerate_out * 16 * cfg->channels_out / (1.e3 * gfp->brate); + } + if (cfg->vbr == vbr_abr) { + gfp->compression_ratio = + gfp->samplerate_out * 16 * cfg->channels_out / (1.e3 * gfp->VBR_mean_bitrate_kbps); + } + + cfg->disable_reservoir = gfp->disable_reservoir; + cfg->lowpassfreq = gfp->lowpassfreq; + cfg->highpassfreq = gfp->highpassfreq; + cfg->samplerate_in = gfp->samplerate_in; + cfg->samplerate_out = gfp->samplerate_out; + cfg->mode_gr = cfg->samplerate_out <= 24000 ? 1 : 2; /* Number of granules per frame */ + + + /* + * sample freq bitrate compression ratio + * [kHz] [kbps/channel] for 16 bit input + * 44.1 56 12.6 + * 44.1 64 11.025 + * 44.1 80 8.82 + * 22.05 24 14.7 + * 22.05 32 11.025 + * 22.05 40 8.82 + * 16 16 16.0 + * 16 24 10.667 + * + */ + /* + * For VBR, take a guess at the compression_ratio. + * For example: + * + * VBR_q compression like + * - 4.4 320 kbps/44 kHz + * 0...1 5.5 256 kbps/44 kHz + * 2 7.3 192 kbps/44 kHz + * 4 8.8 160 kbps/44 kHz + * 6 11 128 kbps/44 kHz + * 9 14.7 96 kbps + * + * for lower bitrates, downsample with --resample + */ + + switch (cfg->vbr) { + case vbr_mt: + case vbr_rh: + case vbr_mtrh: + { + /*numbers are a bit strange, but they determine the lowpass value */ + FLOAT const cmp[] = { 5.7, 6.5, 7.3, 8.2, 10, 11.9, 13, 14, 15, 16.5 }; + gfp->compression_ratio = cmp[gfp->VBR_q]; + } + break; + case vbr_abr: + gfp->compression_ratio = + cfg->samplerate_out * 16 * cfg->channels_out / (1.e3 * gfp->VBR_mean_bitrate_kbps); + break; + default: + gfp->compression_ratio = cfg->samplerate_out * 16 * cfg->channels_out / (1.e3 * gfp->brate); + break; + } + + + /* mode = -1 (not set by user) or + * mode = MONO (because of only 1 input channel). + * If mode has not been set, then select J-STEREO + */ + if (gfp->mode == NOT_SET) { + gfp->mode = JOINT_STEREO; + } + + cfg->mode = gfp->mode; + + + /* apply user driven high pass filter */ + if (cfg->highpassfreq > 0) { + cfg->highpass1 = 2. * cfg->highpassfreq; + + if (gfp->highpasswidth >= 0) + cfg->highpass2 = 2. * (cfg->highpassfreq + gfp->highpasswidth); + else /* 0% above on default */ + cfg->highpass2 = (1 + 0.00) * 2. * cfg->highpassfreq; + + cfg->highpass1 /= cfg->samplerate_out; + cfg->highpass2 /= cfg->samplerate_out; + } + else { + cfg->highpass1 = 0; + cfg->highpass2 = 0; + } + /* apply user driven low pass filter */ + cfg->lowpass1 = 0; + cfg->lowpass2 = 0; + if (cfg->lowpassfreq > 0 && cfg->lowpassfreq < (cfg->samplerate_out / 2) ) { + cfg->lowpass2 = 2. * cfg->lowpassfreq; + if (gfp->lowpasswidth >= 0) { + cfg->lowpass1 = 2. * (cfg->lowpassfreq - gfp->lowpasswidth); + if (cfg->lowpass1 < 0) /* has to be >= 0 */ + cfg->lowpass1 = 0; + } + else { /* 0% below on default */ + cfg->lowpass1 = (1 - 0.00) * 2. * cfg->lowpassfreq; + } + cfg->lowpass1 /= cfg->samplerate_out; + cfg->lowpass2 /= cfg->samplerate_out; + } + + + + + /**********************************************************************/ + /* compute info needed for polyphase filter (filter type==0, default) */ + /**********************************************************************/ + lame_init_params_ppflt(gfc); + + + /******************************************************* + * samplerate and bitrate index + *******************************************************/ + cfg->samplerate_index = SmpFrqIndex(cfg->samplerate_out, &cfg->version); + assert(cfg->samplerate_index >= 0); + + if (cfg->vbr == vbr_off) { + if (cfg->free_format) { + gfc->ov_enc.bitrate_index = 0; + } + else { + gfp->brate = FindNearestBitrate(gfp->brate, cfg->version, cfg->samplerate_out); + gfc->ov_enc.bitrate_index = BitrateIndex(gfp->brate, cfg->version, cfg->samplerate_out); + if (gfc->ov_enc.bitrate_index <= 0) { + /* This never happens, because of preceding FindNearestBitrate! + * But, set a sane value, just in case + */ + assert(0); + gfc->ov_enc.bitrate_index = 8; + } + } + } + else { + gfc->ov_enc.bitrate_index = 1; + } + + init_bit_stream_w(gfc); + + j = cfg->samplerate_index + (3 * cfg->version) + 6 * (cfg->samplerate_out < 16000); + for (i = 0; i < SBMAX_l + 1; i++) + gfc->scalefac_band.l[i] = sfBandIndex[j].l[i]; + + for (i = 0; i < PSFB21 + 1; i++) { + int const size = (gfc->scalefac_band.l[22] - gfc->scalefac_band.l[21]) / PSFB21; + int const start = gfc->scalefac_band.l[21] + i * size; + gfc->scalefac_band.psfb21[i] = start; + } + gfc->scalefac_band.psfb21[PSFB21] = 576; + + for (i = 0; i < SBMAX_s + 1; i++) + gfc->scalefac_band.s[i] = sfBandIndex[j].s[i]; + + for (i = 0; i < PSFB12 + 1; i++) { + int const size = (gfc->scalefac_band.s[13] - gfc->scalefac_band.s[12]) / PSFB12; + int const start = gfc->scalefac_band.s[12] + i * size; + gfc->scalefac_band.psfb12[i] = start; + } + gfc->scalefac_band.psfb12[PSFB12] = 192; + + /* determine the mean bitrate for main data */ + if (cfg->mode_gr == 2) /* MPEG 1 */ + cfg->sideinfo_len = (cfg->channels_out == 1) ? 4 + 17 : 4 + 32; + else /* MPEG 2 */ + cfg->sideinfo_len = (cfg->channels_out == 1) ? 4 + 9 : 4 + 17; + + if (cfg->error_protection) + cfg->sideinfo_len += 2; + + { + int k; + + for (k = 0; k < 19; k++) + gfc->sv_enc.pefirbuf[k] = 700 * cfg->mode_gr * cfg->channels_out; + + if (gfp->ATHtype == -1) + gfp->ATHtype = 4; + } + + assert(gfp->VBR_q <= 9); + assert(gfp->VBR_q >= 0); + + switch (cfg->vbr) { + + case vbr_mt: + case vbr_mtrh:{ + if (gfp->strict_ISO < 0) { + gfp->strict_ISO = MDB_MAXIMUM; + } + if (gfp->useTemporal < 0) { + gfp->useTemporal = 0; /* off by default for this VBR mode */ + } + + (void) apply_preset(gfp, 500 - (gfp->VBR_q * 10), 0); + /* The newer VBR code supports only a limited + subset of quality levels: + 9-5=5 are the same, uses x^3/4 quantization + 4-0=0 are the same 5 plus best huffman divide code + */ + if (gfp->quality < 0) + gfp->quality = LAME_DEFAULT_QUALITY; + if (gfp->quality < 5) + gfp->quality = 0; + if (gfp->quality > 7) + gfp->quality = 7; + + /* sfb21 extra only with MPEG-1 at higher sampling rates + */ + if (gfp->experimentalY) + gfc->sv_qnt.sfb21_extra = 0; + else + gfc->sv_qnt.sfb21_extra = (cfg->samplerate_out > 44000); + + break; + + } + case vbr_rh:{ + + (void) apply_preset(gfp, 500 - (gfp->VBR_q * 10), 0); + + /* sfb21 extra only with MPEG-1 at higher sampling rates + */ + if (gfp->experimentalY) + gfc->sv_qnt.sfb21_extra = 0; + else + gfc->sv_qnt.sfb21_extra = (cfg->samplerate_out > 44000); + + /* VBR needs at least the output of GPSYCHO, + * so we have to garantee that by setting a minimum + * quality level, actually level 6 does it. + * down to level 6 + */ + if (gfp->quality > 6) + gfp->quality = 6; + + + if (gfp->quality < 0) + gfp->quality = LAME_DEFAULT_QUALITY; + + break; + } + + default: /* cbr/abr */ { + + /* no sfb21 extra with CBR code + */ + gfc->sv_qnt.sfb21_extra = 0; + + if (gfp->quality < 0) + gfp->quality = LAME_DEFAULT_QUALITY; + + + if (cfg->vbr == vbr_off) + (void) lame_set_VBR_mean_bitrate_kbps(gfp, gfp->brate); + /* second, set parameters depending on bitrate */ + (void) apply_preset(gfp, gfp->VBR_mean_bitrate_kbps, 0); + gfp->VBR = cfg->vbr; + + break; + } + } + + /*initialize default values common for all modes */ + + gfc->sv_qnt.mask_adjust = gfp->maskingadjust; + gfc->sv_qnt.mask_adjust_short = gfp->maskingadjust_short; + + /* just another daily changing developer switch */ + if (gfp->tune) { + gfc->sv_qnt.mask_adjust += gfp->tune_value_a; + gfc->sv_qnt.mask_adjust_short += gfp->tune_value_a; + } + + + if (cfg->vbr != vbr_off) { /* choose a min/max bitrate for VBR */ + /* if the user didn't specify VBR_max_bitrate: */ + cfg->vbr_min_bitrate_index = 1; /* default: allow 8 kbps (MPEG-2) or 32 kbps (MPEG-1) */ + cfg->vbr_max_bitrate_index = 14; /* default: allow 160 kbps (MPEG-2) or 320 kbps (MPEG-1) */ + if (cfg->samplerate_out < 16000) + cfg->vbr_max_bitrate_index = 8; /* default: allow 64 kbps (MPEG-2.5) */ + if (gfp->VBR_min_bitrate_kbps) { + gfp->VBR_min_bitrate_kbps = + FindNearestBitrate(gfp->VBR_min_bitrate_kbps, cfg->version, cfg->samplerate_out); + cfg->vbr_min_bitrate_index = + BitrateIndex(gfp->VBR_min_bitrate_kbps, cfg->version, cfg->samplerate_out); + if (cfg->vbr_min_bitrate_index < 0) { + /* This never happens, because of preceding FindNearestBitrate! + * But, set a sane value, just in case + */ + assert(0); + cfg->vbr_min_bitrate_index = 1; + } + } + if (gfp->VBR_max_bitrate_kbps) { + gfp->VBR_max_bitrate_kbps = + FindNearestBitrate(gfp->VBR_max_bitrate_kbps, cfg->version, cfg->samplerate_out); + cfg->vbr_max_bitrate_index = + BitrateIndex(gfp->VBR_max_bitrate_kbps, cfg->version, cfg->samplerate_out); + if (cfg->vbr_max_bitrate_index < 0) { + /* This never happens, because of preceding FindNearestBitrate! + * But, set a sane value, just in case + */ + assert(0); + cfg->vbr_max_bitrate_index = cfg->samplerate_out < 16000 ? 8 : 14; + } + } + gfp->VBR_min_bitrate_kbps = bitrate_table[cfg->version][cfg->vbr_min_bitrate_index]; + gfp->VBR_max_bitrate_kbps = bitrate_table[cfg->version][cfg->vbr_max_bitrate_index]; + gfp->VBR_mean_bitrate_kbps = + Min(bitrate_table[cfg->version][cfg->vbr_max_bitrate_index], + gfp->VBR_mean_bitrate_kbps); + gfp->VBR_mean_bitrate_kbps = + Max(bitrate_table[cfg->version][cfg->vbr_min_bitrate_index], + gfp->VBR_mean_bitrate_kbps); + } + + cfg->preset = gfp->preset; + cfg->write_lame_tag = gfp->write_lame_tag; + gfc->sv_qnt.substep_shaping = gfp->substep_shaping; + cfg->noise_shaping = gfp->noise_shaping; + cfg->subblock_gain = gfp->subblock_gain; + cfg->use_best_huffman = gfp->use_best_huffman; + cfg->avg_bitrate = gfp->brate; + cfg->vbr_avg_bitrate_kbps = gfp->VBR_mean_bitrate_kbps; + cfg->compression_ratio = gfp->compression_ratio; + + /* initialize internal qval settings */ + lame_init_qval(gfp); + + + /* automatic ATH adjustment on + */ + if (gfp->athaa_type < 0) + gfc->ATH->use_adjust = 3; + else + gfc->ATH->use_adjust = gfp->athaa_type; + + + /* initialize internal adaptive ATH settings -jd */ + gfc->ATH->aa_sensitivity_p = pow(10.0, gfp->athaa_sensitivity / -10.0); + + + if (gfp->short_blocks == short_block_not_set) { + gfp->short_blocks = short_block_allowed; + } + + /*Note Jan/2003: Many hardware decoders cannot handle short blocks in regular + stereo mode unless they are coupled (same type in both channels) + it is a rare event (1 frame per min. or so) that LAME would use + uncoupled short blocks, so lets turn them off until we decide + how to handle this. No other encoders allow uncoupled short blocks, + even though it is in the standard. */ + /* rh 20040217: coupling makes no sense for mono and dual-mono streams + */ + if (gfp->short_blocks == short_block_allowed + && (cfg->mode == JOINT_STEREO || cfg->mode == STEREO)) { + gfp->short_blocks = short_block_coupled; + } + + cfg->short_blocks = gfp->short_blocks; + + + if (lame_get_quant_comp(gfp) < 0) + (void) lame_set_quant_comp(gfp, 1); + if (lame_get_quant_comp_short(gfp) < 0) + (void) lame_set_quant_comp_short(gfp, 0); + + if (lame_get_msfix(gfp) < 0) + lame_set_msfix(gfp, 0); + + /* select psychoacoustic model */ + (void) lame_set_exp_nspsytune(gfp, lame_get_exp_nspsytune(gfp) | 1); + + if (gfp->ATHtype < 0) + gfp->ATHtype = 4; + + if (gfp->ATHcurve < 0) + gfp->ATHcurve = 4; + + if (gfp->interChRatio < 0) + gfp->interChRatio = 0; + + if (gfp->useTemporal < 0) + gfp->useTemporal = 1; /* on by default */ + + + cfg->interChRatio = gfp->interChRatio; + cfg->msfix = gfp->msfix; + cfg->ATH_offset_db = 0-gfp->ATH_lower_db; + cfg->ATH_offset_factor = powf(10.f, cfg->ATH_offset_db * 0.1f); + cfg->ATHcurve = gfp->ATHcurve; + cfg->ATHtype = gfp->ATHtype; + cfg->ATHonly = gfp->ATHonly; + cfg->ATHshort = gfp->ATHshort; + cfg->noATH = gfp->noATH; + + cfg->quant_comp = gfp->quant_comp; + cfg->quant_comp_short = gfp->quant_comp_short; + + cfg->use_temporal_masking_effect = gfp->useTemporal; + if (cfg->mode == JOINT_STEREO) { + cfg->use_safe_joint_stereo = gfp->exp_nspsytune & 2; + } + else { + cfg->use_safe_joint_stereo = 0; + } + { + cfg->adjust_bass_db = (gfp->exp_nspsytune >> 2) & 63; + if (cfg->adjust_bass_db >= 32.f) + cfg->adjust_bass_db -= 64.f; + cfg->adjust_bass_db *= 0.25f; + + cfg->adjust_alto_db = (gfp->exp_nspsytune >> 8) & 63; + if (cfg->adjust_alto_db >= 32.f) + cfg->adjust_alto_db -= 64.f; + cfg->adjust_alto_db *= 0.25f; + + cfg->adjust_treble_db = (gfp->exp_nspsytune >> 14) & 63; + if (cfg->adjust_treble_db >= 32.f) + cfg->adjust_treble_db -= 64.f; + cfg->adjust_treble_db *= 0.25f; + + /* to be compatible with Naoki's original code, the next 6 bits + * define only the amount of changing treble for sfb21 */ + cfg->adjust_sfb21_db = (gfp->exp_nspsytune >> 20) & 63; + if (cfg->adjust_sfb21_db >= 32.f) + cfg->adjust_sfb21_db -= 64.f; + cfg->adjust_sfb21_db *= 0.25f; + cfg->adjust_sfb21_db += cfg->adjust_treble_db; + } + + /* Setting up the PCM input data transform matrix, to apply + * user defined re-scaling, and or two-to-one channel downmix. + */ + { + FLOAT m[2][2] = { {1.0f, 0.0f}, {0.0f, 1.0f} }; + + /* user selected scaling of the samples */ + m[0][0] *= gfp->scale; + m[0][1] *= gfp->scale; + m[1][0] *= gfp->scale; + m[1][1] *= gfp->scale; + /* user selected scaling of the channel 0 (left) samples */ + m[0][0] *= gfp->scale_left; + m[0][1] *= gfp->scale_left; + /* user selected scaling of the channel 1 (right) samples */ + m[1][0] *= gfp->scale_right; + m[1][1] *= gfp->scale_right; + /* Downsample to Mono if 2 channels in and 1 channel out */ + if (cfg->channels_in == 2 && cfg->channels_out == 1) { + m[0][0] = 0.5f * (m[0][0] + m[1][0]); + m[0][1] = 0.5f * (m[0][1] + m[1][1]); + m[1][0] = 0; + m[1][1] = 0; + } + cfg->pcm_transform[0][0] = m[0][0]; + cfg->pcm_transform[0][1] = m[0][1]; + cfg->pcm_transform[1][0] = m[1][0]; + cfg->pcm_transform[1][1] = m[1][1]; + } + + /* padding method as described in + * "MPEG-Layer3 / Bitstream Syntax and Decoding" + * by Martin Sieler, Ralph Sperschneider + * + * note: there is no padding for the very first frame + * + * Robert Hegemann 2000-06-22 + */ + gfc->sv_enc.slot_lag = gfc->sv_enc.frac_SpF = 0; + if (cfg->vbr == vbr_off) + gfc->sv_enc.slot_lag = gfc->sv_enc.frac_SpF + = ((cfg->version + 1) * 72000L * cfg->avg_bitrate) % cfg->samplerate_out; + + (void) lame_init_bitstream(gfp); + + iteration_init(gfc); + (void) psymodel_init(gfp); + + cfg->buffer_constraint = get_max_frame_buffer_size_by_constraint(cfg, gfp->strict_ISO); + + + cfg->findReplayGain = gfp->findReplayGain; + cfg->decode_on_the_fly = gfp->decode_on_the_fly; + + if (cfg->decode_on_the_fly) + cfg->findPeakSample = 1; + + if (cfg->findReplayGain) { + if (InitGainAnalysis(gfc->sv_rpg.rgdata, cfg->samplerate_out) == INIT_GAIN_ANALYSIS_ERROR) { + /* Actually this never happens, our samplerates are the ones RG accepts! + * But just in case, turn RG off + */ + assert(0); + cfg->findReplayGain = 0; + } + } + +#ifdef DECODE_ON_THE_FLY + if (cfg->decode_on_the_fly && !gfp->decode_only) { + if (gfc->hip) { + hip_decode_exit(gfc->hip); + } + gfc->hip = hip_decode_init(); + /* report functions */ + hip_set_errorf(gfc->hip, gfp->report.errorf); + hip_set_debugf(gfc->hip, gfp->report.debugf); + hip_set_msgf(gfc->hip, gfp->report.msgf); + } +#endif + /* updating lame internal flags finished successful */ + gfc->lame_init_params_successful = 1; + return 0; +} + +static void +concatSep(char* dest, char const* sep, char const* str) +{ + if (*dest != 0) strcat(dest, sep); + strcat(dest, str); +} + +/* + * print_config + * + * Prints some selected information about the coding parameters via + * the macro command MSGF(), which is currently mapped to lame_errorf + * (reports via a error function?), which is a printf-like function + * for <stderr>. + */ + +void +lame_print_config(const lame_global_flags * gfp) +{ + lame_internal_flags const *const gfc = gfp->internal_flags; + SessionConfig_t const *const cfg = &gfc->cfg; + double const out_samplerate = cfg->samplerate_out; + double const in_samplerate = cfg->samplerate_in; + + MSGF(gfc, "LAME %s %s (%s)\n", get_lame_version(), get_lame_os_bitness(), get_lame_url()); + +#if (LAME_ALPHA_VERSION) + MSGF(gfc, "warning: alpha versions should be used for testing only\n"); +#endif + if (gfc->CPU_features.MMX + || gfc->CPU_features.AMD_3DNow || gfc->CPU_features.SSE || gfc->CPU_features.SSE2) { + char text[256] = { 0 }; + int fft_asm_used = 0; +#ifdef HAVE_NASM + if (gfc->CPU_features.AMD_3DNow) { + fft_asm_used = 1; + } + else if (gfc->CPU_features.SSE) { + fft_asm_used = 2; + } +#else +# if defined( HAVE_XMMINTRIN_H ) && defined( MIN_ARCH_SSE ) + { + fft_asm_used = 3; + } +# endif +#endif + if (gfc->CPU_features.MMX) { +#ifdef MMX_choose_table + concatSep(text, ", ", "MMX (ASM used)"); +#else + concatSep(text, ", ", "MMX"); +#endif + } + if (gfc->CPU_features.AMD_3DNow) { + concatSep(text, ", ", (fft_asm_used == 1) ? "3DNow! (ASM used)" : "3DNow!"); + } + if (gfc->CPU_features.SSE) { +#if defined(HAVE_XMMINTRIN_H) + concatSep(text, ", ", "SSE (ASM used)"); +#else + concatSep(text, ", ", (fft_asm_used == 2) ? "SSE (ASM used)" : "SSE"); +#endif + } + if (gfc->CPU_features.SSE2) { + concatSep(text, ", ", (fft_asm_used == 3) ? "SSE2 (ASM used)" : "SSE2"); + } + MSGF(gfc, "CPU features: %s\n", text); + } + + if (cfg->channels_in == 2 && cfg->channels_out == 1 /* mono */ ) { + MSGF(gfc, "Autoconverting from stereo to mono. Setting encoding to mono mode.\n"); + } + + if (isResamplingNecessary(cfg)) { + MSGF(gfc, "Resampling: input %g kHz output %g kHz\n", + 1.e-3 * in_samplerate, 1.e-3 * out_samplerate); + } + + if (cfg->highpass2 > 0.) + MSGF(gfc, + "Using polyphase highpass filter, transition band: %5.0f Hz - %5.0f Hz\n", + 0.5 * cfg->highpass1 * out_samplerate, 0.5 * cfg->highpass2 * out_samplerate); + if (0. < cfg->lowpass1 || 0. < cfg->lowpass2) { + MSGF(gfc, + "Using polyphase lowpass filter, transition band: %5.0f Hz - %5.0f Hz\n", + 0.5 * cfg->lowpass1 * out_samplerate, 0.5 * cfg->lowpass2 * out_samplerate); + } + else { + MSGF(gfc, "polyphase lowpass filter disabled\n"); + } + + if (cfg->free_format) { + MSGF(gfc, "Warning: many decoders cannot handle free format bitstreams\n"); + if (cfg->avg_bitrate > 320) { + MSGF(gfc, + "Warning: many decoders cannot handle free format bitrates >320 kbps (see documentation)\n"); + } + } +} + + +/** rh: + * some pretty printing is very welcome at this point! + * so, if someone is willing to do so, please do it! + * add more, if you see more... + */ +void +lame_print_internals(const lame_global_flags * gfp) +{ + lame_internal_flags const *const gfc = gfp->internal_flags; + SessionConfig_t const *const cfg = &gfc->cfg; + const char *pc = ""; + + /* compiler/processor optimizations, operational, etc. + */ + MSGF(gfc, "\nmisc:\n\n"); + + MSGF(gfc, "\tscaling: %g\n", gfp->scale); + MSGF(gfc, "\tch0 (left) scaling: %g\n", gfp->scale_left); + MSGF(gfc, "\tch1 (right) scaling: %g\n", gfp->scale_right); + switch (cfg->use_best_huffman) { + default: + pc = "normal"; + break; + case 1: + pc = "best (outside loop)"; + break; + case 2: + pc = "best (inside loop, slow)"; + break; + } + MSGF(gfc, "\thuffman search: %s\n", pc); + MSGF(gfc, "\texperimental Y=%d\n", gfp->experimentalY); + MSGF(gfc, "\t...\n"); + + /* everything controlling the stream format + */ + MSGF(gfc, "\nstream format:\n\n"); + switch (cfg->version) { + case 0: + pc = "2.5"; + break; + case 1: + pc = "1"; + break; + case 2: + pc = "2"; + break; + default: + pc = "?"; + break; + } + MSGF(gfc, "\tMPEG-%s Layer 3\n", pc); + switch (cfg->mode) { + case JOINT_STEREO: + pc = "joint stereo"; + break; + case STEREO: + pc = "stereo"; + break; + case DUAL_CHANNEL: + pc = "dual channel"; + break; + case MONO: + pc = "mono"; + break; + case NOT_SET: + pc = "not set (error)"; + break; + default: + pc = "unknown (error)"; + break; + } + MSGF(gfc, "\t%d channel - %s\n", cfg->channels_out, pc); + + switch (cfg->vbr) { + case vbr_off: + pc = "off"; + break; + default: + pc = "all"; + break; + } + MSGF(gfc, "\tpadding: %s\n", pc); + + if (vbr_default == cfg->vbr) + pc = "(default)"; + else if (cfg->free_format) + pc = "(free format)"; + else + pc = ""; + switch (cfg->vbr) { + case vbr_off: + MSGF(gfc, "\tconstant bitrate - CBR %s\n", pc); + break; + case vbr_abr: + MSGF(gfc, "\tvariable bitrate - ABR %s\n", pc); + break; + case vbr_rh: + MSGF(gfc, "\tvariable bitrate - VBR rh %s\n", pc); + break; + case vbr_mt: + MSGF(gfc, "\tvariable bitrate - VBR mt %s\n", pc); + break; + case vbr_mtrh: + MSGF(gfc, "\tvariable bitrate - VBR mtrh %s\n", pc); + break; + default: + MSGF(gfc, "\t ?? oops, some new one ?? \n"); + break; + } + if (cfg->write_lame_tag) + MSGF(gfc, "\tusing LAME Tag\n"); + MSGF(gfc, "\t...\n"); + + /* everything controlling psychoacoustic settings, like ATH, etc. + */ + MSGF(gfc, "\npsychoacoustic:\n\n"); + + switch (cfg->short_blocks) { + default: + case short_block_not_set: + pc = "?"; + break; + case short_block_allowed: + pc = "allowed"; + break; + case short_block_coupled: + pc = "channel coupled"; + break; + case short_block_dispensed: + pc = "dispensed"; + break; + case short_block_forced: + pc = "forced"; + break; + } + MSGF(gfc, "\tusing short blocks: %s\n", pc); + MSGF(gfc, "\tsubblock gain: %d\n", cfg->subblock_gain); + MSGF(gfc, "\tadjust masking: %g dB\n", gfc->sv_qnt.mask_adjust); + MSGF(gfc, "\tadjust masking short: %g dB\n", gfc->sv_qnt.mask_adjust_short); + MSGF(gfc, "\tquantization comparison: %d\n", cfg->quant_comp); + MSGF(gfc, "\t ^ comparison short blocks: %d\n", cfg->quant_comp_short); + MSGF(gfc, "\tnoise shaping: %d\n", cfg->noise_shaping); + MSGF(gfc, "\t ^ amplification: %d\n", cfg->noise_shaping_amp); + MSGF(gfc, "\t ^ stopping: %d\n", cfg->noise_shaping_stop); + + pc = "using"; + if (cfg->ATHshort) + pc = "the only masking for short blocks"; + if (cfg->ATHonly) + pc = "the only masking"; + if (cfg->noATH) + pc = "not used"; + MSGF(gfc, "\tATH: %s\n", pc); + MSGF(gfc, "\t ^ type: %d\n", cfg->ATHtype); + MSGF(gfc, "\t ^ shape: %g%s\n", cfg->ATHcurve, " (only for type 4)"); + MSGF(gfc, "\t ^ level adjustement: %g dB\n", cfg->ATH_offset_db); + MSGF(gfc, "\t ^ adjust type: %d\n", gfc->ATH->use_adjust); + MSGF(gfc, "\t ^ adjust sensitivity power: %f\n", gfc->ATH->aa_sensitivity_p); + + MSGF(gfc, "\texperimental psy tunings by Naoki Shibata\n"); + MSGF(gfc, "\t adjust masking bass=%g dB, alto=%g dB, treble=%g dB, sfb21=%g dB\n", + 10 * log10(gfc->sv_qnt.longfact[0]), + 10 * log10(gfc->sv_qnt.longfact[7]), + 10 * log10(gfc->sv_qnt.longfact[14]), 10 * log10(gfc->sv_qnt.longfact[21])); + + pc = cfg->use_temporal_masking_effect ? "yes" : "no"; + MSGF(gfc, "\tusing temporal masking effect: %s\n", pc); + MSGF(gfc, "\tinterchannel masking ratio: %g\n", cfg->interChRatio); + MSGF(gfc, "\t...\n"); + + /* that's all ? + */ + MSGF(gfc, "\n"); + return; +} + + +static void +save_gain_values(lame_internal_flags * gfc) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + RpgStateVar_t const *const rsv = &gfc->sv_rpg; + RpgResult_t *const rov = &gfc->ov_rpg; + /* save the ReplayGain value */ + if (cfg->findReplayGain) { + FLOAT const RadioGain = (FLOAT) GetTitleGain(rsv->rgdata); + if (NEQ(RadioGain, GAIN_NOT_ENOUGH_SAMPLES)) { + rov->RadioGain = (int) floor(RadioGain * 10.0 + 0.5); /* round to nearest */ + } + else { + rov->RadioGain = 0; + } + } + + /* find the gain and scale change required for no clipping */ + if (cfg->findPeakSample) { + rov->noclipGainChange = (int) ceil(log10(rov->PeakSample / 32767.0) * 20.0 * 10.0); /* round up */ + + if (rov->noclipGainChange > 0) { /* clipping occurs */ + rov->noclipScale = floor((32767.0f / rov->PeakSample) * 100.0f) / 100.0f; /* round down */ + } + else /* no clipping */ + rov->noclipScale = -1.0f; + } +} + + + +static int +update_inbuffer_size(lame_internal_flags * gfc, const int nsamples) +{ + EncStateVar_t *const esv = &gfc->sv_enc; + if (esv->in_buffer_0 == 0 || esv->in_buffer_nsamples < nsamples) { + if (esv->in_buffer_0) { + free(esv->in_buffer_0); + } + if (esv->in_buffer_1) { + free(esv->in_buffer_1); + } + esv->in_buffer_0 = lame_calloc(sample_t, nsamples); + esv->in_buffer_1 = lame_calloc(sample_t, nsamples); + esv->in_buffer_nsamples = nsamples; + } + if (esv->in_buffer_0 == NULL || esv->in_buffer_1 == NULL) { + if (esv->in_buffer_0) { + free(esv->in_buffer_0); + } + if (esv->in_buffer_1) { + free(esv->in_buffer_1); + } + esv->in_buffer_0 = 0; + esv->in_buffer_1 = 0; + esv->in_buffer_nsamples = 0; + ERRORF(gfc, "Error: can't allocate in_buffer buffer\n"); + return -2; + } + return 0; +} + + +static int +calcNeeded(SessionConfig_t const * cfg) +{ + int mf_needed; + int pcm_samples_per_frame = 576 * cfg->mode_gr; + + /* some sanity checks */ +#if ENCDELAY < MDCTDELAY +# error ENCDELAY is less than MDCTDELAY, see encoder.h +#endif +#if FFTOFFSET > BLKSIZE +# error FFTOFFSET is greater than BLKSIZE, see encoder.h +#endif + + mf_needed = BLKSIZE + pcm_samples_per_frame - FFTOFFSET; /* amount needed for FFT */ + /*mf_needed = Max(mf_needed, 286 + 576 * (1 + gfc->mode_gr)); */ + mf_needed = Max(mf_needed, 512 + pcm_samples_per_frame - 32); + + assert(MFSIZE >= mf_needed); + + return mf_needed; +} + + +/* + * THE MAIN LAME ENCODING INTERFACE + * mt 3/00 + * + * input pcm data, output (maybe) mp3 frames. + * This routine handles all buffering, resampling and filtering for you. + * The required mp3buffer_size can be computed from num_samples, + * samplerate and encoding rate, but here is a worst case estimate: + * + * mp3buffer_size in bytes = 1.25*num_samples + 7200 + * + * return code = number of bytes output in mp3buffer. can be 0 + * + * NOTE: this routine uses LAME's internal PCM data representation, + * 'sample_t'. It should not be used by any application. + * applications should use lame_encode_buffer(), + * lame_encode_buffer_float() + * lame_encode_buffer_int() + * etc... depending on what type of data they are working with. +*/ +static int +lame_encode_buffer_sample_t(lame_internal_flags * gfc, + int nsamples, unsigned char *mp3buf, const int mp3buf_size) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + EncStateVar_t *const esv = &gfc->sv_enc; + int pcm_samples_per_frame = 576 * cfg->mode_gr; + int mp3size = 0, ret, i, ch, mf_needed; + int mp3out; + sample_t *mfbuf[2]; + sample_t *in_buffer[2]; + + if (gfc->class_id != LAME_ID) + return -3; + + if (nsamples == 0) + return 0; + + /* copy out any tags that may have been written into bitstream */ + { /* if user specifed buffer size = 0, dont check size */ + int const buf_size = mp3buf_size == 0 ? INT_MAX : mp3buf_size; + mp3out = copy_buffer(gfc, mp3buf, buf_size, 0); + } + if (mp3out < 0) + return mp3out; /* not enough buffer space */ + mp3buf += mp3out; + mp3size += mp3out; + + in_buffer[0] = esv->in_buffer_0; + in_buffer[1] = esv->in_buffer_1; + + mf_needed = calcNeeded(cfg); + + mfbuf[0] = esv->mfbuf[0]; + mfbuf[1] = esv->mfbuf[1]; + + while (nsamples > 0) { + sample_t const *in_buffer_ptr[2]; + int n_in = 0; /* number of input samples processed with fill_buffer */ + int n_out = 0; /* number of samples output with fill_buffer */ + /* n_in <> n_out if we are resampling */ + + in_buffer_ptr[0] = in_buffer[0]; + in_buffer_ptr[1] = in_buffer[1]; + /* copy in new samples into mfbuf, with resampling */ + fill_buffer(gfc, mfbuf, &in_buffer_ptr[0], nsamples, &n_in, &n_out); + + /* compute ReplayGain of resampled input if requested */ + if (cfg->findReplayGain && !cfg->decode_on_the_fly) + if (AnalyzeSamples + (gfc->sv_rpg.rgdata, &mfbuf[0][esv->mf_size], &mfbuf[1][esv->mf_size], n_out, + cfg->channels_out) == GAIN_ANALYSIS_ERROR) + return -6; + + + + /* update in_buffer counters */ + nsamples -= n_in; + in_buffer[0] += n_in; + if (cfg->channels_out == 2) + in_buffer[1] += n_in; + + /* update mfbuf[] counters */ + esv->mf_size += n_out; + assert(esv->mf_size <= MFSIZE); + + /* lame_encode_flush may have set gfc->mf_sample_to_encode to 0 + * so we have to reinitialize it here when that happened. + */ + if (esv->mf_samples_to_encode < 1) { + esv->mf_samples_to_encode = ENCDELAY + POSTDELAY; + } + esv->mf_samples_to_encode += n_out; + + + if (esv->mf_size >= mf_needed) { + /* encode the frame. */ + /* mp3buf = pointer to current location in buffer */ + /* mp3buf_size = size of original mp3 output buffer */ + /* = 0 if we should not worry about the */ + /* buffer size because calling program is */ + /* to lazy to compute it */ + /* mp3size = size of data written to buffer so far */ + /* mp3buf_size-mp3size = amount of space avalable */ + + int buf_size = mp3buf_size - mp3size; + if (mp3buf_size == 0) + buf_size = INT_MAX; + + ret = lame_encode_mp3_frame(gfc, mfbuf[0], mfbuf[1], mp3buf, buf_size); + + if (ret < 0) + return ret; + mp3buf += ret; + mp3size += ret; + + /* shift out old samples */ + esv->mf_size -= pcm_samples_per_frame; + esv->mf_samples_to_encode -= pcm_samples_per_frame; + for (ch = 0; ch < cfg->channels_out; ch++) + for (i = 0; i < esv->mf_size; i++) + mfbuf[ch][i] = mfbuf[ch][i + pcm_samples_per_frame]; + } + } + assert(nsamples == 0); + + return mp3size; +} + +enum PCMSampleType +{ pcm_short_type +, pcm_int_type +, pcm_long_type +, pcm_float_type +, pcm_double_type +}; + +static void +lame_copy_inbuffer(lame_internal_flags* gfc, + void const* l, void const* r, int nsamples, + enum PCMSampleType pcm_type, int jump, FLOAT s) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + EncStateVar_t *const esv = &gfc->sv_enc; + sample_t* ib0 = esv->in_buffer_0; + sample_t* ib1 = esv->in_buffer_1; + FLOAT m[2][2]; + + /* Apply user defined re-scaling */ + m[0][0] = s * cfg->pcm_transform[0][0]; + m[0][1] = s * cfg->pcm_transform[0][1]; + m[1][0] = s * cfg->pcm_transform[1][0]; + m[1][1] = s * cfg->pcm_transform[1][1]; + + /* make a copy of input buffer, changing type to sample_t */ +#define COPY_AND_TRANSFORM(T) \ +{ \ + T const *bl = l, *br = r; \ + int i; \ + for (i = 0; i < nsamples; i++) { \ + sample_t const xl = *bl; \ + sample_t const xr = *br; \ + sample_t const u = xl * m[0][0] + xr * m[0][1]; \ + sample_t const v = xl * m[1][0] + xr * m[1][1]; \ + ib0[i] = u; \ + ib1[i] = v; \ + bl += jump; \ + br += jump; \ + } \ +} + switch ( pcm_type ) { + case pcm_short_type: + COPY_AND_TRANSFORM(short int); + break; + case pcm_int_type: + COPY_AND_TRANSFORM(int); + break; + case pcm_long_type: + COPY_AND_TRANSFORM(long int); + break; + case pcm_float_type: + COPY_AND_TRANSFORM(float); + break; + case pcm_double_type: + COPY_AND_TRANSFORM(double); + break; + } +} + + +static int +lame_encode_buffer_template(lame_global_flags * gfp, + void const* buffer_l, void const* buffer_r, const int nsamples, + unsigned char *mp3buf, const int mp3buf_size, enum PCMSampleType pcm_type, int aa, FLOAT norm) +{ + if (is_lame_global_flags_valid(gfp)) { + lame_internal_flags *const gfc = gfp->internal_flags; + if (is_lame_internal_flags_valid(gfc)) { + SessionConfig_t const *const cfg = &gfc->cfg; + + if (nsamples == 0) + return 0; + + if (update_inbuffer_size(gfc, nsamples) != 0) { + return -2; + } + /* make a copy of input buffer, changing type to sample_t */ + if (cfg->channels_in > 1) { + if (buffer_l == 0 || buffer_r == 0) { + return 0; + } + lame_copy_inbuffer(gfc, buffer_l, buffer_r, nsamples, pcm_type, aa, norm); + } + else { + if (buffer_l == 0) { + return 0; + } + lame_copy_inbuffer(gfc, buffer_l, buffer_l, nsamples, pcm_type, aa, norm); + } + + return lame_encode_buffer_sample_t(gfc, nsamples, mp3buf, mp3buf_size); + } + } + return -3; +} + +int +lame_encode_buffer(lame_global_flags * gfp, + const short int pcm_l[], const short int pcm_r[], const int nsamples, + unsigned char *mp3buf, const int mp3buf_size) +{ + return lame_encode_buffer_template(gfp, pcm_l, pcm_r, nsamples, mp3buf, mp3buf_size, pcm_short_type, 1, 1.0); +} + + +int +lame_encode_buffer_float(lame_global_flags * gfp, + const float pcm_l[], const float pcm_r[], const int nsamples, + unsigned char *mp3buf, const int mp3buf_size) +{ + /* input is assumed to be normalized to +/- 32768 for full scale */ + return lame_encode_buffer_template(gfp, pcm_l, pcm_r, nsamples, mp3buf, mp3buf_size, pcm_float_type, 1, 1.0); +} + + +int +lame_encode_buffer_ieee_float(lame_t gfp, + const float pcm_l[], const float pcm_r[], const int nsamples, + unsigned char *mp3buf, const int mp3buf_size) +{ + /* input is assumed to be normalized to +/- 1.0 for full scale */ + return lame_encode_buffer_template(gfp, pcm_l, pcm_r, nsamples, mp3buf, mp3buf_size, pcm_float_type, 1, 32767.0); +} + + +int +lame_encode_buffer_interleaved_ieee_float(lame_t gfp, + const float pcm[], const int nsamples, + unsigned char *mp3buf, const int mp3buf_size) +{ + /* input is assumed to be normalized to +/- 1.0 for full scale */ + return lame_encode_buffer_template(gfp, pcm, pcm+1, nsamples, mp3buf, mp3buf_size, pcm_float_type, 2, 32767.0); +} + + +int +lame_encode_buffer_ieee_double(lame_t gfp, + const double pcm_l[], const double pcm_r[], const int nsamples, + unsigned char *mp3buf, const int mp3buf_size) +{ + /* input is assumed to be normalized to +/- 1.0 for full scale */ + return lame_encode_buffer_template(gfp, pcm_l, pcm_r, nsamples, mp3buf, mp3buf_size, pcm_double_type, 1, 32767.0); +} + + +int +lame_encode_buffer_interleaved_ieee_double(lame_t gfp, + const double pcm[], const int nsamples, + unsigned char *mp3buf, const int mp3buf_size) +{ + /* input is assumed to be normalized to +/- 1.0 for full scale */ + return lame_encode_buffer_template(gfp, pcm, pcm+1, nsamples, mp3buf, mp3buf_size, pcm_double_type, 2, 32767.0); +} + + +int +lame_encode_buffer_int(lame_global_flags * gfp, + const int pcm_l[], const int pcm_r[], const int nsamples, + unsigned char *mp3buf, const int mp3buf_size) +{ + /* input is assumed to be normalized to +/- MAX_INT for full scale */ + FLOAT const norm = (1.0 / (1L << (8 * sizeof(int) - 16))); + return lame_encode_buffer_template(gfp, pcm_l, pcm_r, nsamples, mp3buf, mp3buf_size, pcm_int_type, 1, norm); +} + + +int +lame_encode_buffer_long2(lame_global_flags * gfp, + const long pcm_l[], const long pcm_r[], const int nsamples, + unsigned char *mp3buf, const int mp3buf_size) +{ + /* input is assumed to be normalized to +/- MAX_LONG for full scale */ + FLOAT const norm = (1.0 / (1L << (8 * sizeof(long) - 16))); + return lame_encode_buffer_template(gfp, pcm_l, pcm_r, nsamples, mp3buf, mp3buf_size, pcm_long_type, 1, norm); +} + + +int +lame_encode_buffer_long(lame_global_flags * gfp, + const long pcm_l[], const long pcm_r[], const int nsamples, + unsigned char *mp3buf, const int mp3buf_size) +{ + /* input is assumed to be normalized to +/- 32768 for full scale */ + return lame_encode_buffer_template(gfp, pcm_l, pcm_r, nsamples, mp3buf, mp3buf_size, pcm_long_type, 1, 1.0); +} + + + +int +lame_encode_buffer_interleaved(lame_global_flags * gfp, + short int pcm[], int nsamples, + unsigned char *mp3buf, int mp3buf_size) +{ + /* input is assumed to be normalized to +/- MAX_SHORT for full scale */ + return lame_encode_buffer_template(gfp, pcm, pcm+1, nsamples, mp3buf, mp3buf_size, pcm_short_type, 2, 1.0); +} + + +int +lame_encode_buffer_interleaved_int(lame_t gfp, + const int pcm[], const int nsamples, + unsigned char *mp3buf, const int mp3buf_size) +{ + /* input is assumed to be normalized to +/- MAX(int) for full scale */ + FLOAT const norm = (1.0 / (1L << (8 * sizeof(int)-16))); + return lame_encode_buffer_template(gfp, pcm, pcm + 1, nsamples, mp3buf, mp3buf_size, pcm_int_type, 2, norm); +} + + + + +/***************************************************************** + Flush mp3 buffer, pad with ancillary data so last frame is complete. + Reset reservoir size to 0 + but keep all PCM samples and MDCT data in memory + This option is used to break a large file into several mp3 files + that when concatenated together will decode with no gaps + Because we set the reservoir=0, they will also decode seperately + with no errors. +*********************************************************************/ +int +lame_encode_flush_nogap(lame_global_flags * gfp, unsigned char *mp3buffer, int mp3buffer_size) +{ + int rc = -3; + if (is_lame_global_flags_valid(gfp)) { + lame_internal_flags *const gfc = gfp->internal_flags; + if (is_lame_internal_flags_valid(gfc)) { + flush_bitstream(gfc); + /* if user specifed buffer size = 0, dont check size */ + if (mp3buffer_size == 0) + mp3buffer_size = INT_MAX; + rc = copy_buffer(gfc, mp3buffer, mp3buffer_size, 1); + save_gain_values(gfc); + } + } + return rc; +} + + +/* called by lame_init_params. You can also call this after flush_nogap + if you want to write new id3v2 and Xing VBR tags into the bitstream */ +int +lame_init_bitstream(lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + lame_internal_flags *const gfc = gfp->internal_flags; + if (gfc != 0) { + gfc->ov_enc.frame_number = 0; + + if (gfp->write_id3tag_automatic) { + (void) id3tag_write_v2(gfp); + } + /* initialize histogram data optionally used by frontend */ + memset(gfc->ov_enc.bitrate_channelmode_hist, 0, + sizeof(gfc->ov_enc.bitrate_channelmode_hist)); + memset(gfc->ov_enc.bitrate_blocktype_hist, 0, + sizeof(gfc->ov_enc.bitrate_blocktype_hist)); + + gfc->ov_rpg.PeakSample = 0.0; + + /* Write initial VBR Header to bitstream and init VBR data */ + if (gfc->cfg.write_lame_tag) + (void) InitVbrTag(gfp); + + + return 0; + } + } + return -3; +} + + +/*****************************************************************/ +/* flush internal PCM sample buffers, then mp3 buffers */ +/* then write id3 v1 tags into bitstream. */ +/*****************************************************************/ + +int +lame_encode_flush(lame_global_flags * gfp, unsigned char *mp3buffer, int mp3buffer_size) +{ + lame_internal_flags *gfc; + SessionConfig_t const *cfg; + EncStateVar_t *esv; + short int buffer[2][1152]; + int imp3 = 0, mp3count, mp3buffer_size_remaining; + + /* we always add POSTDELAY=288 padding to make sure granule with real + * data can be complety decoded (because of 50% overlap with next granule */ + int end_padding; + int frames_left; + int samples_to_encode; + int pcm_samples_per_frame; + int mf_needed; + int is_resampling_necessary; + double resample_ratio = 1; + + if (!is_lame_global_flags_valid(gfp)) { + return -3; + } + gfc = gfp->internal_flags; + if (!is_lame_internal_flags_valid(gfc)) { + return -3; + } + cfg = &gfc->cfg; + esv = &gfc->sv_enc; + + /* Was flush already called? */ + if (esv->mf_samples_to_encode < 1) { + return 0; + } + pcm_samples_per_frame = 576 * cfg->mode_gr; + mf_needed = calcNeeded(cfg); + + samples_to_encode = esv->mf_samples_to_encode - POSTDELAY; + + memset(buffer, 0, sizeof(buffer)); + mp3count = 0; + + is_resampling_necessary = isResamplingNecessary(cfg); + if (is_resampling_necessary) { + resample_ratio = (double)cfg->samplerate_in / (double)cfg->samplerate_out; + /* delay due to resampling; needs to be fixed, if resampling code gets changed */ + samples_to_encode += 16. / resample_ratio; + } + end_padding = pcm_samples_per_frame - (samples_to_encode % pcm_samples_per_frame); + if (end_padding < 576) + end_padding += pcm_samples_per_frame; + gfc->ov_enc.encoder_padding = end_padding; + + frames_left = (samples_to_encode + end_padding) / pcm_samples_per_frame; + while (frames_left > 0 && imp3 >= 0) { + int const frame_num = gfc->ov_enc.frame_number; + int bunch = mf_needed - esv->mf_size; + + bunch *= resample_ratio; + if (bunch > 1152) bunch = 1152; + if (bunch < 1) bunch = 1; + + mp3buffer_size_remaining = mp3buffer_size - mp3count; + + /* if user specifed buffer size = 0, dont check size */ + if (mp3buffer_size == 0) + mp3buffer_size_remaining = 0; + + /* send in a frame of 0 padding until all internal sample buffers + * are flushed + */ + imp3 = lame_encode_buffer(gfp, buffer[0], buffer[1], bunch, + mp3buffer, mp3buffer_size_remaining); + + mp3buffer += imp3; + mp3count += imp3; + { /* even a single pcm sample can produce several frames! + * for example: 1 Hz input file resampled to 8 kHz mpeg2.5 + */ + int const new_frames = gfc->ov_enc.frame_number - frame_num; + if (new_frames > 0) + frames_left -= new_frames; + } + } + /* Set esv->mf_samples_to_encode to 0, so we may detect + * and break loops calling it more than once in a row. + */ + esv->mf_samples_to_encode = 0; + + if (imp3 < 0) { + /* some type of fatal error */ + return imp3; + } + + mp3buffer_size_remaining = mp3buffer_size - mp3count; + /* if user specifed buffer size = 0, dont check size */ + if (mp3buffer_size == 0) + mp3buffer_size_remaining = INT_MAX; + + /* mp3 related stuff. bit buffer might still contain some mp3 data */ + flush_bitstream(gfc); + imp3 = copy_buffer(gfc, mp3buffer, mp3buffer_size_remaining, 1); + save_gain_values(gfc); + if (imp3 < 0) { + /* some type of fatal error */ + return imp3; + } + mp3buffer += imp3; + mp3count += imp3; + mp3buffer_size_remaining = mp3buffer_size - mp3count; + /* if user specifed buffer size = 0, dont check size */ + if (mp3buffer_size == 0) + mp3buffer_size_remaining = INT_MAX; + + if (gfp->write_id3tag_automatic) { + /* write a id3 tag to the bitstream */ + (void) id3tag_write_v1(gfp); + + imp3 = copy_buffer(gfc, mp3buffer, mp3buffer_size_remaining, 0); + + if (imp3 < 0) { + return imp3; + } + mp3count += imp3; + } +#if 0 + { + int const ed = gfc->ov_enc.encoder_delay; + int const ep = gfc->ov_enc.encoder_padding; + int const ns = (gfc->ov_enc.frame_number * pcm_samples_per_frame) - (ed + ep); + double duration = ns; + duration /= cfg->samplerate_out; + MSGF(gfc, "frames=%d\n", gfc->ov_enc.frame_number); + MSGF(gfc, "pcm_samples_per_frame=%d\n", pcm_samples_per_frame); + MSGF(gfc, "encoder delay=%d\n", ed); + MSGF(gfc, "encoder padding=%d\n", ep); + MSGF(gfc, "sample count=%d (%g)\n", ns, cfg->samplerate_in * duration); + MSGF(gfc, "duration=%g sec\n", duration); + } +#endif + return mp3count; +} + +/*********************************************************************** + * + * lame_close () + * + * frees internal buffers + * + ***********************************************************************/ + +int +lame_close(lame_global_flags * gfp) +{ + int ret = 0; + if (gfp && gfp->class_id == LAME_ID) { + lame_internal_flags *const gfc = gfp->internal_flags; + gfp->class_id = 0; + if (NULL == gfc || gfc->class_id != LAME_ID) { + ret = -3; + } + if (NULL != gfc) { + gfc->lame_init_params_successful = 0; + gfc->class_id = 0; + /* this routine will free all malloc'd data in gfc, and then free gfc: */ + freegfc(gfc); + gfp->internal_flags = NULL; + } + if (gfp->lame_allocated_gfp) { + gfp->lame_allocated_gfp = 0; + free(gfp); + } + } + return ret; +} + +/*****************************************************************/ +/* flush internal mp3 buffers, and free internal buffers */ +/*****************************************************************/ +#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED +int CDECL +lame_encode_finish(lame_global_flags * gfp, unsigned char *mp3buffer, int mp3buffer_size); +#else +#endif + +int +lame_encode_finish(lame_global_flags * gfp, unsigned char *mp3buffer, int mp3buffer_size) +{ + int const ret = lame_encode_flush(gfp, mp3buffer, mp3buffer_size); + + (void) lame_close(gfp); + + return ret; +} + +/*****************************************************************/ +/* write VBR Xing header, and ID3 version 1 tag, if asked for */ +/*****************************************************************/ +void lame_mp3_tags_fid(lame_global_flags * gfp, FILE * fpStream); + +void +lame_mp3_tags_fid(lame_global_flags * gfp, FILE * fpStream) +{ + lame_internal_flags *gfc; + SessionConfig_t const *cfg; + if (!is_lame_global_flags_valid(gfp)) { + return; + } + gfc = gfp->internal_flags; + if (!is_lame_internal_flags_valid(gfc)) { + return; + } + cfg = &gfc->cfg; + if (!cfg->write_lame_tag) { + return; + } + /* Write Xing header again */ + if (fpStream && !fseek(fpStream, 0, SEEK_SET)) { + int rc = PutVbrTag(gfp, fpStream); + switch (rc) { + default: + /* OK */ + break; + + case -1: + ERRORF(gfc, "Error: could not update LAME tag.\n"); + break; + + case -2: + ERRORF(gfc, "Error: could not update LAME tag, file not seekable.\n"); + break; + + case -3: + ERRORF(gfc, "Error: could not update LAME tag, file not readable.\n"); + break; + } + } +} + + +static int +lame_init_internal_flags(lame_internal_flags* gfc) +{ + if (NULL == gfc) + return -1; + + gfc->cfg.vbr_min_bitrate_index = 1; /* not 0 ????? */ + gfc->cfg.vbr_max_bitrate_index = 13; /* not 14 ????? */ + gfc->cfg.decode_on_the_fly = 0; + gfc->cfg.findReplayGain = 0; + gfc->cfg.findPeakSample = 0; + + gfc->sv_qnt.OldValue[0] = 180; + gfc->sv_qnt.OldValue[1] = 180; + gfc->sv_qnt.CurrentStep[0] = 4; + gfc->sv_qnt.CurrentStep[1] = 4; + gfc->sv_qnt.masking_lower = 1; + + /* The reason for + * int mf_samples_to_encode = ENCDELAY + POSTDELAY; + * ENCDELAY = internal encoder delay. And then we have to add POSTDELAY=288 + * because of the 50% MDCT overlap. A 576 MDCT granule decodes to + * 1152 samples. To synthesize the 576 samples centered under this granule + * we need the previous granule for the first 288 samples (no problem), and + * the next granule for the next 288 samples (not possible if this is last + * granule). So we need to pad with 288 samples to make sure we can + * encode the 576 samples we are interested in. + */ + gfc->sv_enc.mf_samples_to_encode = ENCDELAY + POSTDELAY; + gfc->sv_enc.mf_size = ENCDELAY - MDCTDELAY; /* we pad input with this many 0's */ + gfc->ov_enc.encoder_padding = 0; + gfc->ov_enc.encoder_delay = ENCDELAY; + + gfc->ov_rpg.RadioGain = 0; + gfc->ov_rpg.noclipGainChange = 0; + gfc->ov_rpg.noclipScale = -1.0; + + gfc->ATH = lame_calloc(ATH_t, 1); + if (NULL == gfc->ATH) + return -2; /* maybe error codes should be enumerated in lame.h ?? */ + + gfc->sv_rpg.rgdata = lame_calloc(replaygain_t, 1); + if (NULL == gfc->sv_rpg.rgdata) { + return -2; + } + return 0; +} + +/* initialize mp3 encoder */ +#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED +static +#else +#endif +int +lame_init_old(lame_global_flags * gfp) +{ + disable_FPE(); /* disable floating point exceptions */ + + memset(gfp, 0, sizeof(lame_global_flags)); + + gfp->class_id = LAME_ID; + + /* Global flags. set defaults here for non-zero values */ + /* see lame.h for description */ + /* set integer values to -1 to mean that LAME will compute the + * best value, UNLESS the calling program as set it + * (and the value is no longer -1) + */ + gfp->strict_ISO = MDB_MAXIMUM; + + gfp->mode = NOT_SET; + gfp->original = 1; + gfp->samplerate_in = 44100; + gfp->num_channels = 2; + gfp->num_samples = MAX_U_32_NUM; + + gfp->write_lame_tag = 1; + gfp->quality = -1; + gfp->short_blocks = short_block_not_set; + gfp->subblock_gain = -1; + + gfp->lowpassfreq = 0; + gfp->highpassfreq = 0; + gfp->lowpasswidth = -1; + gfp->highpasswidth = -1; + + gfp->VBR = vbr_off; + gfp->VBR_q = 4; + gfp->VBR_mean_bitrate_kbps = 128; + gfp->VBR_min_bitrate_kbps = 0; + gfp->VBR_max_bitrate_kbps = 0; + gfp->VBR_hard_min = 0; + + gfp->quant_comp = -1; + gfp->quant_comp_short = -1; + + gfp->msfix = -1; + + gfp->attackthre = -1; + gfp->attackthre_s = -1; + + gfp->scale = 1; + gfp->scale_left = 1; + gfp->scale_right = 1; + + gfp->ATHcurve = -1; + gfp->ATHtype = -1; /* default = -1 = set in lame_init_params */ + /* 2 = equal loudness curve */ + gfp->athaa_sensitivity = 0.0; /* no offset */ + gfp->athaa_type = -1; + gfp->useTemporal = -1; + gfp->interChRatio = -1; + + gfp->findReplayGain = 0; + gfp->decode_on_the_fly = 0; + + gfp->asm_optimizations.mmx = 1; + gfp->asm_optimizations.amd3dnow = 1; + gfp->asm_optimizations.sse = 1; + + gfp->preset = 0; + + gfp->write_id3tag_automatic = 1; + + gfp->report.debugf = &lame_report_def; + gfp->report.errorf = &lame_report_def; + gfp->report.msgf = &lame_report_def; + + gfp->internal_flags = lame_calloc(lame_internal_flags, 1); + + if (lame_init_internal_flags(gfp->internal_flags) < 0) { + freegfc(gfp->internal_flags); + gfp->internal_flags = 0; + return -1; + } + return 0; +} + + +lame_global_flags * +lame_init(void) +{ + lame_global_flags *gfp; + int ret; + + init_log_table(); + + gfp = lame_calloc(lame_global_flags, 1); + if (gfp == NULL) + return NULL; + + ret = lame_init_old(gfp); + if (ret != 0) { + free(gfp); + return NULL; + } + + gfp->lame_allocated_gfp = 1; + return gfp; +} + + +/*********************************************************************** + * + * some simple statistics + * + * Robert Hegemann 2000-10-11 + * + ***********************************************************************/ + +/* histogram of used bitrate indexes: + * One has to weight them to calculate the average bitrate in kbps + * + * bitrate indices: + * there are 14 possible bitrate indices, 0 has the special meaning + * "free format" which is not possible to mix with VBR and 15 is forbidden + * anyway. + * + * stereo modes: + * 0: LR number of left-right encoded frames + * 1: LR-I number of left-right and intensity encoded frames + * 2: MS number of mid-side encoded frames + * 3: MS-I number of mid-side and intensity encoded frames + * + * 4: number of encoded frames + * + */ + +void +lame_bitrate_kbps(const lame_global_flags * gfp, int bitrate_kbps[14]) +{ + if (is_lame_global_flags_valid(gfp)) { + lame_internal_flags const *const gfc = gfp->internal_flags; + if (is_lame_internal_flags_valid(gfc)) { + SessionConfig_t const *const cfg = &gfc->cfg; + int i; + if (cfg->free_format) { + for (i = 0; i < 14; i++) + bitrate_kbps[i] = -1; + bitrate_kbps[0] = cfg->avg_bitrate; + } + else { + for (i = 0; i < 14; i++) + bitrate_kbps[i] = bitrate_table[cfg->version][i + 1]; + } + } + } +} + + +void +lame_bitrate_hist(const lame_global_flags * gfp, int bitrate_count[14]) +{ + if (is_lame_global_flags_valid(gfp)) { + lame_internal_flags const *const gfc = gfp->internal_flags; + if (is_lame_internal_flags_valid(gfc)) { + SessionConfig_t const *const cfg = &gfc->cfg; + EncResult_t const *const eov = &gfc->ov_enc; + int i; + + if (cfg->free_format) { + for (i = 0; i < 14; i++) { + bitrate_count[i] = 0; + } + bitrate_count[0] = eov->bitrate_channelmode_hist[0][4]; + } + else { + for (i = 0; i < 14; i++) { + bitrate_count[i] = eov->bitrate_channelmode_hist[i + 1][4]; + } + } + } + } +} + + +void +lame_stereo_mode_hist(const lame_global_flags * gfp, int stmode_count[4]) +{ + if (is_lame_global_flags_valid(gfp)) { + lame_internal_flags const *const gfc = gfp->internal_flags; + if (is_lame_internal_flags_valid(gfc)) { + EncResult_t const *const eov = &gfc->ov_enc; + int i; + + for (i = 0; i < 4; i++) { + stmode_count[i] = eov->bitrate_channelmode_hist[15][i]; + } + } + } +} + + + +void +lame_bitrate_stereo_mode_hist(const lame_global_flags * gfp, int bitrate_stmode_count[14][4]) +{ + if (is_lame_global_flags_valid(gfp)) { + lame_internal_flags const *const gfc = gfp->internal_flags; + if (is_lame_internal_flags_valid(gfc)) { + SessionConfig_t const *const cfg = &gfc->cfg; + EncResult_t const *const eov = &gfc->ov_enc; + int i; + int j; + + if (cfg->free_format) { + for (j = 0; j < 14; j++) + for (i = 0; i < 4; i++) { + bitrate_stmode_count[j][i] = 0; + } + for (i = 0; i < 4; i++) { + bitrate_stmode_count[0][i] = eov->bitrate_channelmode_hist[0][i]; + } + } + else { + for (j = 0; j < 14; j++) { + for (i = 0; i < 4; i++) { + bitrate_stmode_count[j][i] = eov->bitrate_channelmode_hist[j + 1][i]; + } + } + } + } + } +} + + +void +lame_block_type_hist(const lame_global_flags * gfp, int btype_count[6]) +{ + if (is_lame_global_flags_valid(gfp)) { + lame_internal_flags const *const gfc = gfp->internal_flags; + if (is_lame_internal_flags_valid(gfc)) { + EncResult_t const *const eov = &gfc->ov_enc; + int i; + + for (i = 0; i < 6; ++i) { + btype_count[i] = eov->bitrate_blocktype_hist[15][i]; + } + } + } +} + + + +void +lame_bitrate_block_type_hist(const lame_global_flags * gfp, int bitrate_btype_count[14][6]) +{ + if (is_lame_global_flags_valid(gfp)) { + lame_internal_flags const *const gfc = gfp->internal_flags; + if (is_lame_internal_flags_valid(gfc)) { + SessionConfig_t const *const cfg = &gfc->cfg; + EncResult_t const *const eov = &gfc->ov_enc; + int i, j; + + if (cfg->free_format) { + for (j = 0; j < 14; ++j) { + for (i = 0; i < 6; ++i) { + bitrate_btype_count[j][i] = 0; + } + } + for (i = 0; i < 6; ++i) { + bitrate_btype_count[0][i] = eov->bitrate_blocktype_hist[0][i]; + } + } + else { + for (j = 0; j < 14; ++j) { + for (i = 0; i < 6; ++i) { + bitrate_btype_count[j][i] = eov->bitrate_blocktype_hist[j + 1][i]; + } + } + } + } + } +} + +/* end of lame.c */ diff --git a/libmp3lame/lame.rc b/libmp3lame/lame.rc new file mode 100644 index 0000000..12d0193 --- /dev/null +++ b/libmp3lame/lame.rc @@ -0,0 +1,50 @@ +#include <winver.h> +#include "version.h" + +#ifdef _DLL +IDI_ICON1 ICON DISCARDABLE "logoe.ico" +#else +IDI_ICON1 ICON DISCARDABLE "logoe.ico" +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION LAME_MAJOR_VERSION,LAME_MINOR_VERSION,LAME_TYPE_VERSION,LAME_PATCH_VERSION + PRODUCTVERSION LAME_MAJOR_VERSION,LAME_MINOR_VERSION,LAME_TYPE_VERSION,LAME_PATCH_VERSION + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 +#ifdef _DLL + FILETYPE VFT_DLL +#else + FILETYPE VFT_APP +#endif + FILESUBTYPE 0x0L + BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" // Lang=US English, CharSet=Windows Multilingual + BEGIN + VALUE "CompanyName", LAME_URL "\0" + VALUE "FileDescription", "MP3 Encoder.\0" + VALUE "FileVersion", LAME_VERSION_STRING "\0" + VALUE "LegalCopyright", "Copyright (C) 1999-2011 The L.A.M.E. Team\0" +#ifdef _DLL + VALUE "OriginalFilename", STR(_DLL) "\0" +#else + VALUE "OriginalFilename", STR(_APP) "\0" +#endif + VALUE "ProductName", "L.A.M.E.\0" + VALUE "ProductVersion", LAME_VERSION_STRING "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 // mandatory by convention + END + END +/* End of Version info */ + diff --git a/libmp3lame/lame_global_flags.h b/libmp3lame/lame_global_flags.h new file mode 100644 index 0000000..ad9e677 --- /dev/null +++ b/libmp3lame/lame_global_flags.h @@ -0,0 +1,184 @@ +#ifndef LAME_GLOBAL_FLAGS_H +#define LAME_GLOBAL_FLAGS_H + +#ifndef lame_internal_flags_defined +#define lame_internal_flags_defined +struct lame_internal_flags; +typedef struct lame_internal_flags lame_internal_flags; +#endif + + +typedef enum short_block_e { + short_block_not_set = -1, /* allow LAME to decide */ + short_block_allowed = 0, /* LAME may use them, even different block types for L/R */ + short_block_coupled, /* LAME may use them, but always same block types in L/R */ + short_block_dispensed, /* LAME will not use short blocks, long blocks only */ + short_block_forced /* LAME will not use long blocks, short blocks only */ +} short_block_t; + +/*********************************************************************** +* +* Control Parameters set by User. These parameters are here for +* backwards compatibility with the old, non-shared lib API. +* Please use the lame_set_variablename() functions below +* +* +***********************************************************************/ +struct lame_global_struct { + unsigned int class_id; + + /* input description */ + unsigned long num_samples; /* number of samples. default=2^32-1 */ + int num_channels; /* input number of channels. default=2 */ + int samplerate_in; /* input_samp_rate in Hz. default=44.1 kHz */ + int samplerate_out; /* output_samp_rate. + default: LAME picks best value + at least not used for MP3 decoding: + Remember 44.1 kHz MP3s and AC97 */ + float scale; /* scale input by this amount before encoding + at least not used for MP3 decoding */ + float scale_left; /* scale input of channel 0 (left) by this + amount before encoding */ + float scale_right; /* scale input of channel 1 (right) by this + amount before encoding */ + + /* general control params */ + int analysis; /* collect data for a MP3 frame analyzer? */ + int write_lame_tag; /* add Xing VBR tag? */ + int decode_only; /* use lame/mpglib to convert mp3 to wav */ + int quality; /* quality setting 0=best, 9=worst default=5 */ + MPEG_mode mode; /* see enum in lame.h + default = LAME picks best value */ + int force_ms; /* force M/S mode. requires mode=1 */ + int free_format; /* use free format? default=0 */ + int findReplayGain; /* find the RG value? default=0 */ + int decode_on_the_fly; /* decode on the fly? default=0 */ + int write_id3tag_automatic; /* 1 (default) writes ID3 tags, 0 not */ + + int nogap_total; + int nogap_current; + + int substep_shaping; + int noise_shaping; + int subblock_gain; /* 0 = no, 1 = yes */ + int use_best_huffman; /* 0 = no. 1=outside loop 2=inside loop(slow) */ + + /* + * set either brate>0 or compression_ratio>0, LAME will compute + * the value of the variable not set. + * Default is compression_ratio = 11.025 + */ + int brate; /* bitrate */ + float compression_ratio; /* sizeof(wav file)/sizeof(mp3 file) */ + + + /* frame params */ + int copyright; /* mark as copyright. default=0 */ + int original; /* mark as original. default=1 */ + int extension; /* the MP3 'private extension' bit. + Meaningless */ + int emphasis; /* Input PCM is emphased PCM (for + instance from one of the rarely + emphased CDs), it is STRONGLY not + recommended to use this, because + psycho does not take it into account, + and last but not least many decoders + don't care about these bits */ + int error_protection; /* use 2 bytes per frame for a CRC + checksum. default=0 */ + int strict_ISO; /* enforce ISO spec as much as possible */ + + int disable_reservoir; /* use bit reservoir? */ + + /* quantization/noise shaping */ + int quant_comp; + int quant_comp_short; + int experimentalY; + int experimentalZ; + int exp_nspsytune; + + int preset; + + /* VBR control */ + vbr_mode VBR; + float VBR_q_frac; /* Range [0,...,1[ */ + int VBR_q; /* Range [0,...,9] */ + int VBR_mean_bitrate_kbps; + int VBR_min_bitrate_kbps; + int VBR_max_bitrate_kbps; + int VBR_hard_min; /* strictly enforce VBR_min_bitrate + normaly, it will be violated for analog + silence */ + + + /* resampling and filtering */ + int lowpassfreq; /* freq in Hz. 0=lame choses. + -1=no filter */ + int highpassfreq; /* freq in Hz. 0=lame choses. + -1=no filter */ + int lowpasswidth; /* freq width of filter, in Hz + (default=15%) */ + int highpasswidth; /* freq width of filter, in Hz + (default=15%) */ + + + + /* + * psycho acoustics and other arguments which you should not change + * unless you know what you are doing + */ + float maskingadjust; + float maskingadjust_short; + int ATHonly; /* only use ATH */ + int ATHshort; /* only use ATH for short blocks */ + int noATH; /* disable ATH */ + int ATHtype; /* select ATH formula */ + float ATHcurve; /* change ATH formula 4 shape */ + float ATH_lower_db; /* lower ATH by this many db */ + int athaa_type; /* select ATH auto-adjust scheme */ + float athaa_sensitivity; /* dB, tune active region of auto-level */ + short_block_t short_blocks; + int useTemporal; /* use temporal masking effect */ + float interChRatio; + float msfix; /* Naoki's adjustment of Mid/Side maskings */ + + int tune; /* 0 off, 1 on */ + float tune_value_a; /* used to pass values for debugging and stuff */ + + float attackthre; /* attack threshold for L/R/M channel */ + float attackthre_s; /* attack threshold for S channel */ + + + struct { + void (*msgf) (const char *format, va_list ap); + void (*debugf) (const char *format, va_list ap); + void (*errorf) (const char *format, va_list ap); + } report; + + /************************************************************************/ + /* internal variables, do not set... */ + /* provided because they may be of use to calling application */ + /************************************************************************/ + + int lame_allocated_gfp; /* is this struct owned by calling + program or lame? */ + + + + /**************************************************************************/ + /* more internal variables are stored in this structure: */ + /**************************************************************************/ + lame_internal_flags *internal_flags; + + + struct { + int mmx; + int amd3dnow; + int sse; + + } asm_optimizations; +}; + +int is_lame_global_flags_valid(const lame_global_flags * gfp); + +#endif /* LAME_GLOBAL_FLAGS_H */ diff --git a/libmp3lame/lameerror.h b/libmp3lame/lameerror.h new file mode 100644 index 0000000..7d9216b --- /dev/null +++ b/libmp3lame/lameerror.h @@ -0,0 +1,26 @@ +/* + * A collection of LAME Error Codes + * + * Please use the constants defined here instead of some arbitrary + * values. Currently the values starting at -10 to avoid intersection + * with the -1, -2, -3 and -4 used in the current code. + * + * May be this should be a part of the include/lame.h. + */ + +typedef enum { + LAME_OKAY = 0, + LAME_NOERROR = 0, + LAME_GENERICERROR = -1, + LAME_NOMEM = -10, + LAME_BADBITRATE = -11, + LAME_BADSAMPFREQ = -12, + LAME_INTERNALERROR = -13, + + FRONTEND_READERROR = -80, + FRONTEND_WRITEERROR = -81, + FRONTEND_FILETOOLARGE = -82, + +} lame_errorcodes_t; + +/* end of lameerror.h */ diff --git a/libmp3lame/logoe.ico b/libmp3lame/logoe.ico new file mode 100644 index 0000000..70994ae Binary files /dev/null and b/libmp3lame/logoe.ico differ diff --git a/libmp3lame/machine.h b/libmp3lame/machine.h new file mode 100644 index 0000000..bf6fff2 --- /dev/null +++ b/libmp3lame/machine.h @@ -0,0 +1,189 @@ +/* + * Machine dependent defines/includes for LAME. + * + * Copyright (c) 1999 A.L. Faber + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef LAME_MACHINE_H +#define LAME_MACHINE_H + +#include "version.h" + +#include <stdio.h> +#include <assert.h> + +#ifdef STDC_HEADERS +# include <stdlib.h> +# include <string.h> +#else +# ifndef HAVE_STRCHR +# define strchr index +# define strrchr rindex +# endif +char *strchr(), *strrchr(); +# ifndef HAVE_MEMCPY +# define memcpy(d, s, n) bcopy ((s), (d), (n)) +# define memmove(d, s, n) bcopy ((s), (d), (n)) +# endif +#endif + +#if defined(__riscos__) && defined(FPA10) +# include "ymath.h" +#else +# include <math.h> +#endif +#include <limits.h> + +#include <ctype.h> + +#ifdef HAVE_ERRNO_H +# include <errno.h> +#endif +#ifdef HAVE_FCNTL_H +# include <fcntl.h> +#endif + +#if defined(macintosh) +# include <types.h> +# include <stat.h> +#else +# include <sys/types.h> +# include <sys/stat.h> +#endif + +#ifdef HAVE_INTTYPES_H +# include <inttypes.h> +#else +# ifdef HAVE_STDINT_H +# include <stdint.h> +# endif +#endif + +#ifdef WITH_DMALLOC +#include <dmalloc.h> +#endif + +/* + * 3 different types of pow() functions: + * - table lookup + * - pow() + * - exp() on some machines this is claimed to be faster than pow() + */ + +#define POW20(x) (assert(0 <= (x+Q_MAX2) && x < Q_MAX), pow20[x+Q_MAX2]) +/*#define POW20(x) pow(2.0,((double)(x)-210)*.25) */ +/*#define POW20(x) exp( ((double)(x)-210)*(.25*LOG2) ) */ + +#define IPOW20(x) (assert(0 <= x && x < Q_MAX), ipow20[x]) +/*#define IPOW20(x) exp( -((double)(x)-210)*.1875*LOG2 ) */ +/*#define IPOW20(x) pow(2.0,-((double)(x)-210)*.1875) */ + +/* in case this is used without configure */ +#ifndef inline +# define inline +#endif + +#if defined(_MSC_VER) +# undef inline +# define inline _inline +#elif defined(__SASC) || defined(__GNUC__) || defined(__ICC) || defined(__ECC) +/* if __GNUC__ we always want to inline, not only if the user requests it */ +# undef inline +# define inline __inline +#endif + +#if defined(_MSC_VER) +# pragma warning( disable : 4244 ) +/*# pragma warning( disable : 4305 ) */ +#endif + +/* + * FLOAT for variables which require at least 32 bits + * FLOAT8 for variables which require at least 64 bits + * + * On some machines, 64 bit will be faster than 32 bit. Also, some math + * routines require 64 bit float, so setting FLOAT=float will result in a + * lot of conversions. + */ + +#if ( defined(_MSC_VER) || defined(__BORLANDC__) || defined(__MINGW32__) ) +# define WIN32_LEAN_AND_MEAN +# include <windows.h> +# include <float.h> +# define FLOAT_MAX FLT_MAX +#else +# ifndef FLOAT +typedef float FLOAT; +# ifdef FLT_MAX +# define FLOAT_MAX FLT_MAX +# else +# define FLOAT_MAX 1e37 /* approx */ +# endif +# endif +#endif + +#ifndef FLOAT8 +typedef double FLOAT8; +# ifdef DBL_MAX +# define FLOAT8_MAX DBL_MAX +# else +# define FLOAT8_MAX 1e99 /* approx */ +# endif +#else +# ifdef FLT_MAX +# define FLOAT8_MAX FLT_MAX +# else +# define FLOAT8_MAX 1e37 /* approx */ +# endif +#endif + +/* sample_t must be floating point, at least 32 bits */ +typedef FLOAT sample_t; + +#define dimension_of(array) (sizeof(array)/sizeof(array[0])) +#define beyond(array) (array+dimension_of(array)) +#define compiletime_assert(expression) enum{static_assert_##FILE##_##LINE = 1/((expression)?1:0)} +#define lame_calloc(TYPE, COUNT) ((TYPE*)calloc(COUNT, sizeof(TYPE))) +#define multiple_of(CHUNK, COUNT) (\ + ( (COUNT) < 1 || (CHUNK) < 1 || (COUNT) % (CHUNK) == 0 ) \ + ? (COUNT) \ + : ((COUNT) + (CHUNK) - (COUNT) % (CHUNK)) \ + ) + +#if 1 +#define EQ(a,b) (\ +(fabs(a) > fabs(b)) \ + ? (fabs((a)-(b)) <= (fabs(a) * 1e-6f)) \ + : (fabs((a)-(b)) <= (fabs(b) * 1e-6f))) +#else +#define EQ(a,b) (fabs((a)-(b))<1E-37) +#endif + +#define NEQ(a,b) (!EQ(a,b)) + +#ifdef _MSC_VER +# if _MSC_VER < 1400 +# define fabsf fabs +# define powf pow +# define log10f log10 +# endif +#endif + +#endif + +/* end of machine.h */ diff --git a/libmp3lame/mpglib_interface.c b/libmp3lame/mpglib_interface.c new file mode 100644 index 0000000..d0f0b1d --- /dev/null +++ b/libmp3lame/mpglib_interface.c @@ -0,0 +1,477 @@ +/* -*- mode: C; mode: fold -*- */ +/* + * LAME MP3 encoding engine + * + * Copyright (c) 1999-2000 Mark Taylor + * Copyright (c) 2003 Olcios + * Copyright (c) 2008 Robert Hegemann + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* $Id: mpglib_interface.c,v 1.44 2012/02/18 13:09:00 robert Exp $ */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#ifdef HAVE_MPGLIB +#define hip_global_struct mpstr_tag +#include "lame.h" +#include "machine.h" +#include "encoder.h" +#include "interface.h" + +#include "util.h" + + + +#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED +/* + * OBSOLETE: + * - kept to let it link + * - forward declaration to silence compiler + */ +int CDECL lame_decode_init(void); +int CDECL lame_decode( + unsigned char * mp3buf, + int len, + short pcm_l[], + short pcm_r[] ); +int CDECL lame_decode_headers( + unsigned char* mp3buf, + int len, + short pcm_l[], + short pcm_r[], + mp3data_struct* mp3data ); +int CDECL lame_decode1( + unsigned char* mp3buf, + int len, + short pcm_l[], + short pcm_r[] ); +int CDECL lame_decode1_headers( + unsigned char* mp3buf, + int len, + short pcm_l[], + short pcm_r[], + mp3data_struct* mp3data ); +int CDECL lame_decode1_headersB( + unsigned char* mp3buf, + int len, + short pcm_l[], + short pcm_r[], + mp3data_struct* mp3data, + int *enc_delay, + int *enc_padding ); +int CDECL lame_decode_exit(void); +#endif + + +static MPSTR mp; + +int +lame_decode_exit(void) +{ + ExitMP3(&mp); + return 0; +} + + +int +lame_decode_init(void) +{ + (void) InitMP3(&mp); + return 0; +} + + + + +/* copy mono samples */ +#define COPY_MONO(DST_TYPE, SRC_TYPE) \ + DST_TYPE *pcm_l = (DST_TYPE *)pcm_l_raw; \ + SRC_TYPE const *p_samples = (SRC_TYPE const *)p; \ + for (i = 0; i < processed_samples; i++) \ + *pcm_l++ = (DST_TYPE)(*p_samples++); + +/* copy stereo samples */ +#define COPY_STEREO(DST_TYPE, SRC_TYPE) \ + DST_TYPE *pcm_l = (DST_TYPE *)pcm_l_raw, *pcm_r = (DST_TYPE *)pcm_r_raw; \ + SRC_TYPE const *p_samples = (SRC_TYPE const *)p; \ + for (i = 0; i < processed_samples; i++) { \ + *pcm_l++ = (DST_TYPE)(*p_samples++); \ + *pcm_r++ = (DST_TYPE)(*p_samples++); \ + } + + + +/* + * For lame_decode: return code + * -1 error + * 0 ok, but need more data before outputing any samples + * n number of samples output. either 576 or 1152 depending on MP3 file. + */ + +static int +decode1_headersB_clipchoice(PMPSTR pmp, unsigned char *buffer, size_t len, + char pcm_l_raw[], char pcm_r_raw[], mp3data_struct * mp3data, + int *enc_delay, int *enc_padding, + char *p, size_t psize, int decoded_sample_size, + int (*decodeMP3_ptr) (PMPSTR, unsigned char *, int, char *, int, + int *)) +{ + static const int smpls[2][4] = { + /* Layer I II III */ + {0, 384, 1152, 1152}, /* MPEG-1 */ + {0, 384, 1152, 576} /* MPEG-2(.5) */ + }; + + int processed_bytes; + int processed_samples; /* processed samples per channel */ + int ret; + int i; + int const len_l = len < INT_MAX ? (int) len : INT_MAX; + int const psize_l = psize < INT_MAX ? (int) psize : INT_MAX; + + mp3data->header_parsed = 0; + ret = (*decodeMP3_ptr) (pmp, buffer, len_l, p, psize_l, &processed_bytes); + /* three cases: + * 1. headers parsed, but data not complete + * pmp->header_parsed==1 + * pmp->framesize=0 + * pmp->fsizeold=size of last frame, or 0 if this is first frame + * + * 2. headers, data parsed, but ancillary data not complete + * pmp->header_parsed==1 + * pmp->framesize=size of frame + * pmp->fsizeold=size of last frame, or 0 if this is first frame + * + * 3. frame fully decoded: + * pmp->header_parsed==0 + * pmp->framesize=0 + * pmp->fsizeold=size of frame (which is now the last frame) + * + */ + if (pmp->header_parsed || pmp->fsizeold > 0 || pmp->framesize > 0) { + mp3data->header_parsed = 1; + mp3data->stereo = pmp->fr.stereo; + mp3data->samplerate = freqs[pmp->fr.sampling_frequency]; + mp3data->mode = pmp->fr.mode; + mp3data->mode_ext = pmp->fr.mode_ext; + mp3data->framesize = smpls[pmp->fr.lsf][pmp->fr.lay]; + + /* free format, we need the entire frame before we can determine + * the bitrate. If we haven't gotten the entire frame, bitrate=0 */ + if (pmp->fsizeold > 0) /* works for free format and fixed, no overrun, temporal results are < 400.e6 */ + mp3data->bitrate = 8 * (4 + pmp->fsizeold) * mp3data->samplerate / + (1.e3 * mp3data->framesize) + 0.5; + else if (pmp->framesize > 0) + mp3data->bitrate = 8 * (4 + pmp->framesize) * mp3data->samplerate / + (1.e3 * mp3data->framesize) + 0.5; + else + mp3data->bitrate = tabsel_123[pmp->fr.lsf][pmp->fr.lay - 1][pmp->fr.bitrate_index]; + + + + if (pmp->num_frames > 0) { + /* Xing VBR header found and num_frames was set */ + mp3data->totalframes = pmp->num_frames; + mp3data->nsamp = mp3data->framesize * pmp->num_frames; + *enc_delay = pmp->enc_delay; + *enc_padding = pmp->enc_padding; + } + } + + switch (ret) { + case MP3_OK: + switch (pmp->fr.stereo) { + case 1: + processed_samples = processed_bytes / decoded_sample_size; + if (decoded_sample_size == sizeof(short)) { + COPY_MONO(short, short) + } + else { + COPY_MONO(sample_t, FLOAT) + } + break; + case 2: + processed_samples = (processed_bytes / decoded_sample_size) >> 1; + if (decoded_sample_size == sizeof(short)) { + COPY_STEREO(short, short) + } + else { + COPY_STEREO(sample_t, FLOAT) + } + break; + default: + processed_samples = -1; + assert(0); + break; + } + break; + + case MP3_NEED_MORE: + processed_samples = 0; + break; + + case MP3_ERR: + processed_samples = -1; + break; + + default: + processed_samples = -1; + assert(0); + break; + } + + /*fprintf(stderr,"ok, more, err: %i %i %i\n", MP3_OK, MP3_NEED_MORE, MP3_ERR ); */ + /*fprintf(stderr,"ret = %i out=%i\n", ret, processed_samples ); */ + return processed_samples; +} + + +#define OUTSIZE_CLIPPED (4096*sizeof(short)) + +int +lame_decode1_headersB(unsigned char *buffer, + int len, + short pcm_l[], short pcm_r[], mp3data_struct * mp3data, + int *enc_delay, int *enc_padding) +{ + static char out[OUTSIZE_CLIPPED]; + + return decode1_headersB_clipchoice(&mp, buffer, len, (char *) pcm_l, (char *) pcm_r, mp3data, + enc_delay, enc_padding, out, OUTSIZE_CLIPPED, + sizeof(short), decodeMP3); +} + + + + + +/* + * For lame_decode: return code + * -1 error + * 0 ok, but need more data before outputing any samples + * n number of samples output. Will be at most one frame of + * MPEG data. + */ + +int +lame_decode1_headers(unsigned char *buffer, + int len, short pcm_l[], short pcm_r[], mp3data_struct * mp3data) +{ + int enc_delay, enc_padding; + return lame_decode1_headersB(buffer, len, pcm_l, pcm_r, mp3data, &enc_delay, &enc_padding); +} + + +int +lame_decode1(unsigned char *buffer, int len, short pcm_l[], short pcm_r[]) +{ + mp3data_struct mp3data; + + return lame_decode1_headers(buffer, len, pcm_l, pcm_r, &mp3data); +} + + +/* + * For lame_decode: return code + * -1 error + * 0 ok, but need more data before outputing any samples + * n number of samples output. a multiple of 576 or 1152 depending on MP3 file. + */ + +int +lame_decode_headers(unsigned char *buffer, + int len, short pcm_l[], short pcm_r[], mp3data_struct * mp3data) +{ + int ret; + int totsize = 0; /* number of decoded samples per channel */ + + for (;;) { + switch (ret = lame_decode1_headers(buffer, len, pcm_l + totsize, pcm_r + totsize, mp3data)) { + case -1: + return ret; + case 0: + return totsize; + default: + totsize += ret; + len = 0; /* future calls to decodeMP3 are just to flush buffers */ + break; + } + } +} + + +int +lame_decode(unsigned char *buffer, int len, short pcm_l[], short pcm_r[]) +{ + mp3data_struct mp3data; + + return lame_decode_headers(buffer, len, pcm_l, pcm_r, &mp3data); +} + + + + +hip_t hip_decode_init(void) +{ + hip_t hip = lame_calloc(hip_global_flags, 1); + InitMP3(hip); + return hip; +} + + +int hip_decode_exit(hip_t hip) +{ + if (hip) { + ExitMP3(hip); + free(hip); + } + return 0; +} + + +/* we forbid input with more than 1152 samples per channel for output in the unclipped mode */ +#define OUTSIZE_UNCLIPPED (1152*2*sizeof(FLOAT)) + +int +hip_decode1_unclipped(hip_t hip, unsigned char *buffer, size_t len, sample_t pcm_l[], sample_t pcm_r[]) +{ + static char out[OUTSIZE_UNCLIPPED]; + mp3data_struct mp3data; + int enc_delay, enc_padding; + + if (hip) { + return decode1_headersB_clipchoice(hip, buffer, len, (char *) pcm_l, (char *) pcm_r, &mp3data, + &enc_delay, &enc_padding, out, OUTSIZE_UNCLIPPED, + sizeof(FLOAT), decodeMP3_unclipped); + } + return 0; +} + +/* + * For hip_decode: return code + * -1 error + * 0 ok, but need more data before outputing any samples + * n number of samples output. Will be at most one frame of + * MPEG data. + */ + +int +hip_decode1_headers(hip_t hip, unsigned char *buffer, + size_t len, short pcm_l[], short pcm_r[], mp3data_struct * mp3data) +{ + int enc_delay, enc_padding; + return hip_decode1_headersB(hip, buffer, len, pcm_l, pcm_r, mp3data, &enc_delay, &enc_padding); +} + + +int +hip_decode1(hip_t hip, unsigned char *buffer, size_t len, short pcm_l[], short pcm_r[]) +{ + mp3data_struct mp3data; + return hip_decode1_headers(hip, buffer, len, pcm_l, pcm_r, &mp3data); +} + + +/* + * For hip_decode: return code + * -1 error + * 0 ok, but need more data before outputing any samples + * n number of samples output. a multiple of 576 or 1152 depending on MP3 file. + */ + +int +hip_decode_headers(hip_t hip, unsigned char *buffer, + size_t len, short pcm_l[], short pcm_r[], mp3data_struct * mp3data) +{ + int ret; + int totsize = 0; /* number of decoded samples per channel */ + + for (;;) { + switch (ret = hip_decode1_headers(hip, buffer, len, pcm_l + totsize, pcm_r + totsize, mp3data)) { + case -1: + return ret; + case 0: + return totsize; + default: + totsize += ret; + len = 0; /* future calls to decodeMP3 are just to flush buffers */ + break; + } + } +} + + +int +hip_decode(hip_t hip, unsigned char *buffer, size_t len, short pcm_l[], short pcm_r[]) +{ + mp3data_struct mp3data; + return hip_decode_headers(hip, buffer, len, pcm_l, pcm_r, &mp3data); +} + + +int +hip_decode1_headersB(hip_t hip, unsigned char *buffer, + size_t len, + short pcm_l[], short pcm_r[], mp3data_struct * mp3data, + int *enc_delay, int *enc_padding) +{ + static char out[OUTSIZE_CLIPPED]; + if (hip) { + return decode1_headersB_clipchoice(hip, buffer, len, (char *) pcm_l, (char *) pcm_r, mp3data, + enc_delay, enc_padding, out, OUTSIZE_CLIPPED, + sizeof(short), decodeMP3); + } + return -1; +} + + +void hip_set_pinfo(hip_t hip, plotting_data* pinfo) +{ + if (hip) { + hip->pinfo = pinfo; + } +} + + + +void hip_set_errorf(hip_t hip, lame_report_function func) +{ + if (hip) { + hip->report_err = func; + } +} + +void hip_set_debugf(hip_t hip, lame_report_function func) +{ + if (hip) { + hip->report_dbg = func; + } +} + +void hip_set_msgf (hip_t hip, lame_report_function func) +{ + if (hip) { + hip->report_msg = func; + } +} + +#endif + +/* end of mpglib_interface.c */ diff --git a/libmp3lame/newmdct.c b/libmp3lame/newmdct.c new file mode 100644 index 0000000..596cac9 --- /dev/null +++ b/libmp3lame/newmdct.c @@ -0,0 +1,1039 @@ +/* + * MP3 window subband -> subband filtering -> mdct routine + * + * Copyright (c) 1999-2000 Takehiro Tominaga + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Special Thanks to Patrick De Smet for your advices. + */ + +/* $Id: newmdct.c,v 1.39 2011/05/07 16:05:17 rbrito Exp $ */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include "lame.h" +#include "machine.h" +#include "encoder.h" +#include "util.h" +#include "newmdct.h" + + + +#ifndef USE_GOGO_SUBBAND +static const FLOAT enwindow[] = { + -4.77e-07 * 0.740951125354959 / 2.384e-06, 1.03951e-04 * 0.740951125354959 / 2.384e-06, + 9.53674e-04 * 0.740951125354959 / 2.384e-06, 2.841473e-03 * 0.740951125354959 / 2.384e-06, + 3.5758972e-02 * 0.740951125354959 / 2.384e-06, 3.401756e-03 * 0.740951125354959 / 2.384e-06, 9.83715e-04 * 0.740951125354959 / 2.384e-06, 9.9182e-05 * 0.740951125354959 / 2.384e-06, /* 15 */ + 1.2398e-05 * 0.740951125354959 / 2.384e-06, 1.91212e-04 * 0.740951125354959 / 2.384e-06, + 2.283096e-03 * 0.740951125354959 / 2.384e-06, 1.6994476e-02 * 0.740951125354959 / 2.384e-06, + -1.8756866e-02 * 0.740951125354959 / 2.384e-06, -2.630711e-03 * 0.740951125354959 / 2.384e-06, + -2.47478e-04 * 0.740951125354959 / 2.384e-06, -1.4782e-05 * 0.740951125354959 / 2.384e-06, + 9.063471690191471e-01, + 1.960342806591213e-01, + + + -4.77e-07 * 0.773010453362737 / 2.384e-06, 1.05858e-04 * 0.773010453362737 / 2.384e-06, + 9.30786e-04 * 0.773010453362737 / 2.384e-06, 2.521515e-03 * 0.773010453362737 / 2.384e-06, + 3.5694122e-02 * 0.773010453362737 / 2.384e-06, 3.643036e-03 * 0.773010453362737 / 2.384e-06, 9.91821e-04 * 0.773010453362737 / 2.384e-06, 9.6321e-05 * 0.773010453362737 / 2.384e-06, /* 14 */ + 1.1444e-05 * 0.773010453362737 / 2.384e-06, 1.65462e-04 * 0.773010453362737 / 2.384e-06, + 2.110004e-03 * 0.773010453362737 / 2.384e-06, 1.6112804e-02 * 0.773010453362737 / 2.384e-06, + -1.9634247e-02 * 0.773010453362737 / 2.384e-06, -2.803326e-03 * 0.773010453362737 / 2.384e-06, + -2.77042e-04 * 0.773010453362737 / 2.384e-06, -1.6689e-05 * 0.773010453362737 / 2.384e-06, + 8.206787908286602e-01, + 3.901806440322567e-01, + + + -4.77e-07 * 0.803207531480645 / 2.384e-06, 1.07288e-04 * 0.803207531480645 / 2.384e-06, + 9.02653e-04 * 0.803207531480645 / 2.384e-06, 2.174854e-03 * 0.803207531480645 / 2.384e-06, + 3.5586357e-02 * 0.803207531480645 / 2.384e-06, 3.858566e-03 * 0.803207531480645 / 2.384e-06, 9.95159e-04 * 0.803207531480645 / 2.384e-06, 9.3460e-05 * 0.803207531480645 / 2.384e-06, /* 13 */ + 1.0014e-05 * 0.803207531480645 / 2.384e-06, 1.40190e-04 * 0.803207531480645 / 2.384e-06, + 1.937389e-03 * 0.803207531480645 / 2.384e-06, 1.5233517e-02 * 0.803207531480645 / 2.384e-06, + -2.0506859e-02 * 0.803207531480645 / 2.384e-06, -2.974033e-03 * 0.803207531480645 / 2.384e-06, + -3.07560e-04 * 0.803207531480645 / 2.384e-06, -1.8120e-05 * 0.803207531480645 / 2.384e-06, + 7.416505462720353e-01, + 5.805693545089249e-01, + + + -4.77e-07 * 0.831469612302545 / 2.384e-06, 1.08242e-04 * 0.831469612302545 / 2.384e-06, + 8.68797e-04 * 0.831469612302545 / 2.384e-06, 1.800537e-03 * 0.831469612302545 / 2.384e-06, + 3.5435200e-02 * 0.831469612302545 / 2.384e-06, 4.049301e-03 * 0.831469612302545 / 2.384e-06, 9.94205e-04 * 0.831469612302545 / 2.384e-06, 9.0599e-05 * 0.831469612302545 / 2.384e-06, /* 12 */ + 9.060e-06 * 0.831469612302545 / 2.384e-06, 1.16348e-04 * 0.831469612302545 / 2.384e-06, + 1.766682e-03 * 0.831469612302545 / 2.384e-06, 1.4358521e-02 * 0.831469612302545 / 2.384e-06, + -2.1372318e-02 * 0.831469612302545 / 2.384e-06, -3.14188e-03 * 0.831469612302545 / 2.384e-06, + -3.39031e-04 * 0.831469612302545 / 2.384e-06, -1.9550e-05 * 0.831469612302545 / 2.384e-06, + 6.681786379192989e-01, + 7.653668647301797e-01, + + + -4.77e-07 * 0.857728610000272 / 2.384e-06, 1.08719e-04 * 0.857728610000272 / 2.384e-06, + 8.29220e-04 * 0.857728610000272 / 2.384e-06, 1.399517e-03 * 0.857728610000272 / 2.384e-06, + 3.5242081e-02 * 0.857728610000272 / 2.384e-06, 4.215240e-03 * 0.857728610000272 / 2.384e-06, 9.89437e-04 * 0.857728610000272 / 2.384e-06, 8.7261e-05 * 0.857728610000272 / 2.384e-06, /* 11 */ + 8.106e-06 * 0.857728610000272 / 2.384e-06, 9.3937e-05 * 0.857728610000272 / 2.384e-06, + 1.597881e-03 * 0.857728610000272 / 2.384e-06, 1.3489246e-02 * 0.857728610000272 / 2.384e-06, + -2.2228718e-02 * 0.857728610000272 / 2.384e-06, -3.306866e-03 * 0.857728610000272 / 2.384e-06, + -3.71456e-04 * 0.857728610000272 / 2.384e-06, -2.1458e-05 * 0.857728610000272 / 2.384e-06, + 5.993769336819237e-01, + 9.427934736519954e-01, + + + -4.77e-07 * 0.881921264348355 / 2.384e-06, 1.08719e-04 * 0.881921264348355 / 2.384e-06, + 7.8392e-04 * 0.881921264348355 / 2.384e-06, 9.71317e-04 * 0.881921264348355 / 2.384e-06, + 3.5007000e-02 * 0.881921264348355 / 2.384e-06, 4.357815e-03 * 0.881921264348355 / 2.384e-06, 9.80854e-04 * 0.881921264348355 / 2.384e-06, 8.3923e-05 * 0.881921264348355 / 2.384e-06, /* 10 */ + 7.629e-06 * 0.881921264348355 / 2.384e-06, 7.2956e-05 * 0.881921264348355 / 2.384e-06, + 1.432419e-03 * 0.881921264348355 / 2.384e-06, 1.2627602e-02 * 0.881921264348355 / 2.384e-06, + -2.3074150e-02 * 0.881921264348355 / 2.384e-06, -3.467083e-03 * 0.881921264348355 / 2.384e-06, + -4.04358e-04 * 0.881921264348355 / 2.384e-06, -2.3365e-05 * 0.881921264348355 / 2.384e-06, + 5.345111359507916e-01, + 1.111140466039205e+00, + + + -9.54e-07 * 0.903989293123443 / 2.384e-06, 1.08242e-04 * 0.903989293123443 / 2.384e-06, + 7.31945e-04 * 0.903989293123443 / 2.384e-06, 5.15938e-04 * 0.903989293123443 / 2.384e-06, + 3.4730434e-02 * 0.903989293123443 / 2.384e-06, 4.477024e-03 * 0.903989293123443 / 2.384e-06, 9.68933e-04 * 0.903989293123443 / 2.384e-06, 8.0585e-05 * 0.903989293123443 / 2.384e-06, /* 9 */ + 6.676e-06 * 0.903989293123443 / 2.384e-06, 5.2929e-05 * 0.903989293123443 / 2.384e-06, + 1.269817e-03 * 0.903989293123443 / 2.384e-06, 1.1775017e-02 * 0.903989293123443 / 2.384e-06, + -2.3907185e-02 * 0.903989293123443 / 2.384e-06, -3.622532e-03 * 0.903989293123443 / 2.384e-06, + -4.38213e-04 * 0.903989293123443 / 2.384e-06, -2.5272e-05 * 0.903989293123443 / 2.384e-06, + 4.729647758913199e-01, + 1.268786568327291e+00, + + + -9.54e-07 * 0.92387953251128675613 / 2.384e-06, + 1.06812e-04 * 0.92387953251128675613 / 2.384e-06, + 6.74248e-04 * 0.92387953251128675613 / 2.384e-06, + 3.3379e-05 * 0.92387953251128675613 / 2.384e-06, + 3.4412861e-02 * 0.92387953251128675613 / 2.384e-06, + 4.573822e-03 * 0.92387953251128675613 / 2.384e-06, + 9.54151e-04 * 0.92387953251128675613 / 2.384e-06, + 7.6771e-05 * 0.92387953251128675613 / 2.384e-06, + 6.199e-06 * 0.92387953251128675613 / 2.384e-06, 3.4332e-05 * 0.92387953251128675613 / 2.384e-06, + 1.111031e-03 * 0.92387953251128675613 / 2.384e-06, + 1.0933399e-02 * 0.92387953251128675613 / 2.384e-06, + -2.4725437e-02 * 0.92387953251128675613 / 2.384e-06, + -3.771782e-03 * 0.92387953251128675613 / 2.384e-06, + -4.72546e-04 * 0.92387953251128675613 / 2.384e-06, + -2.7657e-05 * 0.92387953251128675613 / 2.384e-06, + 4.1421356237309504879e-01, /* tan(PI/8) */ + 1.414213562373095e+00, + + + -9.54e-07 * 0.941544065183021 / 2.384e-06, 1.05381e-04 * 0.941544065183021 / 2.384e-06, + 6.10352e-04 * 0.941544065183021 / 2.384e-06, -4.75883e-04 * 0.941544065183021 / 2.384e-06, + 3.4055710e-02 * 0.941544065183021 / 2.384e-06, 4.649162e-03 * 0.941544065183021 / 2.384e-06, 9.35555e-04 * 0.941544065183021 / 2.384e-06, 7.3433e-05 * 0.941544065183021 / 2.384e-06, /* 7 */ + 5.245e-06 * 0.941544065183021 / 2.384e-06, 1.7166e-05 * 0.941544065183021 / 2.384e-06, + 9.56535e-04 * 0.941544065183021 / 2.384e-06, 1.0103703e-02 * 0.941544065183021 / 2.384e-06, + -2.5527000e-02 * 0.941544065183021 / 2.384e-06, -3.914356e-03 * 0.941544065183021 / 2.384e-06, + -5.07355e-04 * 0.941544065183021 / 2.384e-06, -3.0041e-05 * 0.941544065183021 / 2.384e-06, + 3.578057213145241e-01, + 1.546020906725474e+00, + + + -9.54e-07 * 0.956940335732209 / 2.384e-06, 1.02520e-04 * 0.956940335732209 / 2.384e-06, + 5.39303e-04 * 0.956940335732209 / 2.384e-06, -1.011848e-03 * 0.956940335732209 / 2.384e-06, + 3.3659935e-02 * 0.956940335732209 / 2.384e-06, 4.703045e-03 * 0.956940335732209 / 2.384e-06, 9.15051e-04 * 0.956940335732209 / 2.384e-06, 7.0095e-05 * 0.956940335732209 / 2.384e-06, /* 6 */ + 4.768e-06 * 0.956940335732209 / 2.384e-06, 9.54e-07 * 0.956940335732209 / 2.384e-06, + 8.06808e-04 * 0.956940335732209 / 2.384e-06, 9.287834e-03 * 0.956940335732209 / 2.384e-06, + -2.6310921e-02 * 0.956940335732209 / 2.384e-06, -4.048824e-03 * 0.956940335732209 / 2.384e-06, + -5.42164e-04 * 0.956940335732209 / 2.384e-06, -3.2425e-05 * 0.956940335732209 / 2.384e-06, + 3.033466836073424e-01, + 1.662939224605090e+00, + + + -1.431e-06 * 0.970031253194544 / 2.384e-06, 9.9182e-05 * 0.970031253194544 / 2.384e-06, + 4.62532e-04 * 0.970031253194544 / 2.384e-06, -1.573563e-03 * 0.970031253194544 / 2.384e-06, + 3.3225536e-02 * 0.970031253194544 / 2.384e-06, 4.737377e-03 * 0.970031253194544 / 2.384e-06, 8.91685e-04 * 0.970031253194544 / 2.384e-06, 6.6280e-05 * 0.970031253194544 / 2.384e-06, /* 5 */ + 4.292e-06 * 0.970031253194544 / 2.384e-06, -1.3828e-05 * 0.970031253194544 / 2.384e-06, + 6.61850e-04 * 0.970031253194544 / 2.384e-06, 8.487225e-03 * 0.970031253194544 / 2.384e-06, + -2.7073860e-02 * 0.970031253194544 / 2.384e-06, -4.174709e-03 * 0.970031253194544 / 2.384e-06, + -5.76973e-04 * 0.970031253194544 / 2.384e-06, -3.4809e-05 * 0.970031253194544 / 2.384e-06, + 2.504869601913055e-01, + 1.763842528696710e+00, + + + -1.431e-06 * 0.98078528040323 / 2.384e-06, 9.5367e-05 * 0.98078528040323 / 2.384e-06, + 3.78609e-04 * 0.98078528040323 / 2.384e-06, -2.161503e-03 * 0.98078528040323 / 2.384e-06, + 3.2754898e-02 * 0.98078528040323 / 2.384e-06, 4.752159e-03 * 0.98078528040323 / 2.384e-06, 8.66413e-04 * 0.98078528040323 / 2.384e-06, 6.2943e-05 * 0.98078528040323 / 2.384e-06, /* 4 */ + 3.815e-06 * 0.98078528040323 / 2.384e-06, -2.718e-05 * 0.98078528040323 / 2.384e-06, + 5.22137e-04 * 0.98078528040323 / 2.384e-06, 7.703304e-03 * 0.98078528040323 / 2.384e-06, + -2.7815342e-02 * 0.98078528040323 / 2.384e-06, -4.290581e-03 * 0.98078528040323 / 2.384e-06, + -6.11782e-04 * 0.98078528040323 / 2.384e-06, -3.7670e-05 * 0.98078528040323 / 2.384e-06, + 1.989123673796580e-01, + 1.847759065022573e+00, + + + -1.907e-06 * 0.989176509964781 / 2.384e-06, 9.0122e-05 * 0.989176509964781 / 2.384e-06, + 2.88486e-04 * 0.989176509964781 / 2.384e-06, -2.774239e-03 * 0.989176509964781 / 2.384e-06, + 3.2248020e-02 * 0.989176509964781 / 2.384e-06, 4.748821e-03 * 0.989176509964781 / 2.384e-06, 8.38757e-04 * 0.989176509964781 / 2.384e-06, 5.9605e-05 * 0.989176509964781 / 2.384e-06, /* 3 */ + 3.338e-06 * 0.989176509964781 / 2.384e-06, -3.9577e-05 * 0.989176509964781 / 2.384e-06, + 3.88145e-04 * 0.989176509964781 / 2.384e-06, 6.937027e-03 * 0.989176509964781 / 2.384e-06, + -2.8532982e-02 * 0.989176509964781 / 2.384e-06, -4.395962e-03 * 0.989176509964781 / 2.384e-06, + -6.46591e-04 * 0.989176509964781 / 2.384e-06, -4.0531e-05 * 0.989176509964781 / 2.384e-06, + 1.483359875383474e-01, + 1.913880671464418e+00, + + + -1.907e-06 * 0.995184726672197 / 2.384e-06, 8.4400e-05 * 0.995184726672197 / 2.384e-06, + 1.91689e-04 * 0.995184726672197 / 2.384e-06, -3.411293e-03 * 0.995184726672197 / 2.384e-06, + 3.1706810e-02 * 0.995184726672197 / 2.384e-06, 4.728317e-03 * 0.995184726672197 / 2.384e-06, + 8.09669e-04 * 0.995184726672197 / 2.384e-06, 5.579e-05 * 0.995184726672197 / 2.384e-06, + 3.338e-06 * 0.995184726672197 / 2.384e-06, -5.0545e-05 * 0.995184726672197 / 2.384e-06, + 2.59876e-04 * 0.995184726672197 / 2.384e-06, 6.189346e-03 * 0.995184726672197 / 2.384e-06, + -2.9224873e-02 * 0.995184726672197 / 2.384e-06, -4.489899e-03 * 0.995184726672197 / 2.384e-06, + -6.80923e-04 * 0.995184726672197 / 2.384e-06, -4.3392e-05 * 0.995184726672197 / 2.384e-06, + 9.849140335716425e-02, + 1.961570560806461e+00, + + + -2.384e-06 * 0.998795456205172 / 2.384e-06, 7.7724e-05 * 0.998795456205172 / 2.384e-06, + 8.8215e-05 * 0.998795456205172 / 2.384e-06, -4.072189e-03 * 0.998795456205172 / 2.384e-06, + 3.1132698e-02 * 0.998795456205172 / 2.384e-06, 4.691124e-03 * 0.998795456205172 / 2.384e-06, + 7.79152e-04 * 0.998795456205172 / 2.384e-06, 5.2929e-05 * 0.998795456205172 / 2.384e-06, + 2.861e-06 * 0.998795456205172 / 2.384e-06, -6.0558e-05 * 0.998795456205172 / 2.384e-06, + 1.37329e-04 * 0.998795456205172 / 2.384e-06, 5.462170e-03 * 0.998795456205172 / 2.384e-06, + -2.9890060e-02 * 0.998795456205172 / 2.384e-06, -4.570484e-03 * 0.998795456205172 / 2.384e-06, + -7.14302e-04 * 0.998795456205172 / 2.384e-06, -4.6253e-05 * 0.998795456205172 / 2.384e-06, + 4.912684976946725e-02, + 1.990369453344394e+00, + + + 3.5780907e-02 * SQRT2 * 0.5 / 2.384e-06, 1.7876148e-02 * SQRT2 * 0.5 / 2.384e-06, + 3.134727e-03 * SQRT2 * 0.5 / 2.384e-06, 2.457142e-03 * SQRT2 * 0.5 / 2.384e-06, + 9.71317e-04 * SQRT2 * 0.5 / 2.384e-06, 2.18868e-04 * SQRT2 * 0.5 / 2.384e-06, + 1.01566e-04 * SQRT2 * 0.5 / 2.384e-06, 1.3828e-05 * SQRT2 * 0.5 / 2.384e-06, + + 3.0526638e-02 / 2.384e-06, 4.638195e-03 / 2.384e-06, 7.47204e-04 / 2.384e-06, + 4.9591e-05 / 2.384e-06, + 4.756451e-03 / 2.384e-06, 2.1458e-05 / 2.384e-06, -6.9618e-05 / 2.384e-06, /* 2.384e-06/2.384e-06 */ +}; +#endif + + +#define NS 12 +#define NL 36 + +static const FLOAT win[4][NL] = { + { + 2.382191739347913e-13, + 6.423305872147834e-13, + 9.400849094049688e-13, + 1.122435026096556e-12, + 1.183840321267481e-12, + 1.122435026096556e-12, + 9.400849094049690e-13, + 6.423305872147839e-13, + 2.382191739347918e-13, + + 5.456116108943412e-12, + 4.878985199565852e-12, + 4.240448995017367e-12, + 3.559909094758252e-12, + 2.858043359288075e-12, + 2.156177623817898e-12, + 1.475637723558783e-12, + 8.371015190102974e-13, + 2.599706096327376e-13, + + -5.456116108943412e-12, + -4.878985199565852e-12, + -4.240448995017367e-12, + -3.559909094758252e-12, + -2.858043359288076e-12, + -2.156177623817898e-12, + -1.475637723558783e-12, + -8.371015190102975e-13, + -2.599706096327376e-13, + + -2.382191739347923e-13, + -6.423305872147843e-13, + -9.400849094049696e-13, + -1.122435026096556e-12, + -1.183840321267481e-12, + -1.122435026096556e-12, + -9.400849094049694e-13, + -6.423305872147840e-13, + -2.382191739347918e-13, + }, + { + 2.382191739347913e-13, + 6.423305872147834e-13, + 9.400849094049688e-13, + 1.122435026096556e-12, + 1.183840321267481e-12, + 1.122435026096556e-12, + 9.400849094049688e-13, + 6.423305872147841e-13, + 2.382191739347918e-13, + + 5.456116108943413e-12, + 4.878985199565852e-12, + 4.240448995017367e-12, + 3.559909094758253e-12, + 2.858043359288075e-12, + 2.156177623817898e-12, + 1.475637723558782e-12, + 8.371015190102975e-13, + 2.599706096327376e-13, + + -5.461314069809755e-12, + -4.921085770524055e-12, + -4.343405037091838e-12, + -3.732668368707687e-12, + -3.093523840190885e-12, + -2.430835727329465e-12, + -1.734679010007751e-12, + -9.748253656609281e-13, + -2.797435120168326e-13, + + 0.000000000000000e+00, + 0.000000000000000e+00, + 0.000000000000000e+00, + 0.000000000000000e+00, + 0.000000000000000e+00, + 0.000000000000000e+00, + -2.283748241799531e-13, + -4.037858874020686e-13, + -2.146547464825323e-13, + }, + { + 1.316524975873958e-01, /* win[SHORT_TYPE] */ + 4.142135623730950e-01, + 7.673269879789602e-01, + + 1.091308501069271e+00, /* tantab_l */ + 1.303225372841206e+00, + 1.569685577117490e+00, + 1.920982126971166e+00, + 2.414213562373094e+00, + 3.171594802363212e+00, + 4.510708503662055e+00, + 7.595754112725146e+00, + 2.290376554843115e+01, + + 0.98480775301220802032, /* cx */ + 0.64278760968653936292, + 0.34202014332566882393, + 0.93969262078590842791, + -0.17364817766693030343, + -0.76604444311897790243, + 0.86602540378443870761, + 0.500000000000000e+00, + + -5.144957554275265e-01, /* ca */ + -4.717319685649723e-01, + -3.133774542039019e-01, + -1.819131996109812e-01, + -9.457419252642064e-02, + -4.096558288530405e-02, + -1.419856857247115e-02, + -3.699974673760037e-03, + + 8.574929257125442e-01, /* cs */ + 8.817419973177052e-01, + 9.496286491027329e-01, + 9.833145924917901e-01, + 9.955178160675857e-01, + 9.991605581781475e-01, + 9.998991952444470e-01, + 9.999931550702802e-01, + }, + { + 0.000000000000000e+00, + 0.000000000000000e+00, + 0.000000000000000e+00, + 0.000000000000000e+00, + 0.000000000000000e+00, + 0.000000000000000e+00, + 2.283748241799531e-13, + 4.037858874020686e-13, + 2.146547464825323e-13, + + 5.461314069809755e-12, + 4.921085770524055e-12, + 4.343405037091838e-12, + 3.732668368707687e-12, + 3.093523840190885e-12, + 2.430835727329466e-12, + 1.734679010007751e-12, + 9.748253656609281e-13, + 2.797435120168326e-13, + + -5.456116108943413e-12, + -4.878985199565852e-12, + -4.240448995017367e-12, + -3.559909094758253e-12, + -2.858043359288075e-12, + -2.156177623817898e-12, + -1.475637723558782e-12, + -8.371015190102975e-13, + -2.599706096327376e-13, + + -2.382191739347913e-13, + -6.423305872147834e-13, + -9.400849094049688e-13, + -1.122435026096556e-12, + -1.183840321267481e-12, + -1.122435026096556e-12, + -9.400849094049688e-13, + -6.423305872147841e-13, + -2.382191739347918e-13, + } +}; + +#define tantab_l (win[SHORT_TYPE]+3) +#define cx (win[SHORT_TYPE]+12) +#define ca (win[SHORT_TYPE]+20) +#define cs (win[SHORT_TYPE]+28) + +/************************************************************************ +* +* window_subband() +* +* PURPOSE: Overlapping window on PCM samples +* +* SEMANTICS: +* 32 16-bit pcm samples are scaled to fractional 2's complement and +* concatenated to the end of the window buffer #x#. The updated window +* buffer #x# is then windowed by the analysis window #c# to produce the +* windowed sample #z# +* +************************************************************************/ + +/* + * new IDCT routine written by Takehiro TOMINAGA + */ +static const int order[] = { + 0, 1, 16, 17, 8, 9, 24, 25, 4, 5, 20, 21, 12, 13, 28, 29, + 2, 3, 18, 19, 10, 11, 26, 27, 6, 7, 22, 23, 14, 15, 30, 31 +}; + + +/* returns sum_j=0^31 a[j]*cos(PI*j*(k+1/2)/32), 0<=k<32 */ +inline static void +window_subband(const sample_t * x1, FLOAT a[SBLIMIT]) +{ + int i; + FLOAT const *wp = enwindow + 10; + + const sample_t *x2 = &x1[238 - 14 - 286]; + + for (i = -15; i < 0; i++) { + FLOAT w, s, t; + + w = wp[-10]; + s = x2[-224] * w; + t = x1[224] * w; + w = wp[-9]; + s += x2[-160] * w; + t += x1[160] * w; + w = wp[-8]; + s += x2[-96] * w; + t += x1[96] * w; + w = wp[-7]; + s += x2[-32] * w; + t += x1[32] * w; + w = wp[-6]; + s += x2[32] * w; + t += x1[-32] * w; + w = wp[-5]; + s += x2[96] * w; + t += x1[-96] * w; + w = wp[-4]; + s += x2[160] * w; + t += x1[-160] * w; + w = wp[-3]; + s += x2[224] * w; + t += x1[-224] * w; + + w = wp[-2]; + s += x1[-256] * w; + t -= x2[256] * w; + w = wp[-1]; + s += x1[-192] * w; + t -= x2[192] * w; + w = wp[0]; + s += x1[-128] * w; + t -= x2[128] * w; + w = wp[1]; + s += x1[-64] * w; + t -= x2[64] * w; + w = wp[2]; + s += x1[0] * w; + t -= x2[0] * w; + w = wp[3]; + s += x1[64] * w; + t -= x2[-64] * w; + w = wp[4]; + s += x1[128] * w; + t -= x2[-128] * w; + w = wp[5]; + s += x1[192] * w; + t -= x2[-192] * w; + + /* + * this multiplyer could be removed, but it needs more 256 FLOAT data. + * thinking about the data cache performance, I think we should not + * use such a huge table. tt 2000/Oct/25 + */ + s *= wp[6]; + w = t - s; + a[30 + i * 2] = t + s; + a[31 + i * 2] = wp[7] * w; + wp += 18; + x1--; + x2++; + } + { + FLOAT s, t, u, v; + t = x1[-16] * wp[-10]; + s = x1[-32] * wp[-2]; + t += (x1[-48] - x1[16]) * wp[-9]; + s += x1[-96] * wp[-1]; + t += (x1[-80] + x1[48]) * wp[-8]; + s += x1[-160] * wp[0]; + t += (x1[-112] - x1[80]) * wp[-7]; + s += x1[-224] * wp[1]; + t += (x1[-144] + x1[112]) * wp[-6]; + s -= x1[32] * wp[2]; + t += (x1[-176] - x1[144]) * wp[-5]; + s -= x1[96] * wp[3]; + t += (x1[-208] + x1[176]) * wp[-4]; + s -= x1[160] * wp[4]; + t += (x1[-240] - x1[208]) * wp[-3]; + s -= x1[224]; + + u = s - t; + v = s + t; + + t = a[14]; + s = a[15] - t; + + a[31] = v + t; /* A0 */ + a[30] = u + s; /* A1 */ + a[15] = u - s; /* A2 */ + a[14] = v - t; /* A3 */ + } + { + FLOAT xr; + xr = a[28] - a[0]; + a[0] += a[28]; + a[28] = xr * wp[-2 * 18 + 7]; + xr = a[29] - a[1]; + a[1] += a[29]; + a[29] = xr * wp[-2 * 18 + 7]; + + xr = a[26] - a[2]; + a[2] += a[26]; + a[26] = xr * wp[-4 * 18 + 7]; + xr = a[27] - a[3]; + a[3] += a[27]; + a[27] = xr * wp[-4 * 18 + 7]; + + xr = a[24] - a[4]; + a[4] += a[24]; + a[24] = xr * wp[-6 * 18 + 7]; + xr = a[25] - a[5]; + a[5] += a[25]; + a[25] = xr * wp[-6 * 18 + 7]; + + xr = a[22] - a[6]; + a[6] += a[22]; + a[22] = xr * SQRT2; + xr = a[23] - a[7]; + a[7] += a[23]; + a[23] = xr * SQRT2 - a[7]; + a[7] -= a[6]; + a[22] -= a[7]; + a[23] -= a[22]; + + xr = a[6]; + a[6] = a[31] - xr; + a[31] = a[31] + xr; + xr = a[7]; + a[7] = a[30] - xr; + a[30] = a[30] + xr; + xr = a[22]; + a[22] = a[15] - xr; + a[15] = a[15] + xr; + xr = a[23]; + a[23] = a[14] - xr; + a[14] = a[14] + xr; + + xr = a[20] - a[8]; + a[8] += a[20]; + a[20] = xr * wp[-10 * 18 + 7]; + xr = a[21] - a[9]; + a[9] += a[21]; + a[21] = xr * wp[-10 * 18 + 7]; + + xr = a[18] - a[10]; + a[10] += a[18]; + a[18] = xr * wp[-12 * 18 + 7]; + xr = a[19] - a[11]; + a[11] += a[19]; + a[19] = xr * wp[-12 * 18 + 7]; + + xr = a[16] - a[12]; + a[12] += a[16]; + a[16] = xr * wp[-14 * 18 + 7]; + xr = a[17] - a[13]; + a[13] += a[17]; + a[17] = xr * wp[-14 * 18 + 7]; + + xr = -a[20] + a[24]; + a[20] += a[24]; + a[24] = xr * wp[-12 * 18 + 7]; + xr = -a[21] + a[25]; + a[21] += a[25]; + a[25] = xr * wp[-12 * 18 + 7]; + + xr = a[4] - a[8]; + a[4] += a[8]; + a[8] = xr * wp[-12 * 18 + 7]; + xr = a[5] - a[9]; + a[5] += a[9]; + a[9] = xr * wp[-12 * 18 + 7]; + + xr = a[0] - a[12]; + a[0] += a[12]; + a[12] = xr * wp[-4 * 18 + 7]; + xr = a[1] - a[13]; + a[1] += a[13]; + a[13] = xr * wp[-4 * 18 + 7]; + xr = a[16] - a[28]; + a[16] += a[28]; + a[28] = xr * wp[-4 * 18 + 7]; + xr = -a[17] + a[29]; + a[17] += a[29]; + a[29] = xr * wp[-4 * 18 + 7]; + + xr = SQRT2 * (a[2] - a[10]); + a[2] += a[10]; + a[10] = xr; + xr = SQRT2 * (a[3] - a[11]); + a[3] += a[11]; + a[11] = xr; + xr = SQRT2 * (-a[18] + a[26]); + a[18] += a[26]; + a[26] = xr - a[18]; + xr = SQRT2 * (-a[19] + a[27]); + a[19] += a[27]; + a[27] = xr - a[19]; + + xr = a[2]; + a[19] -= a[3]; + a[3] -= xr; + a[2] = a[31] - xr; + a[31] += xr; + xr = a[3]; + a[11] -= a[19]; + a[18] -= xr; + a[3] = a[30] - xr; + a[30] += xr; + xr = a[18]; + a[27] -= a[11]; + a[19] -= xr; + a[18] = a[15] - xr; + a[15] += xr; + + xr = a[19]; + a[10] -= xr; + a[19] = a[14] - xr; + a[14] += xr; + xr = a[10]; + a[11] -= xr; + a[10] = a[23] - xr; + a[23] += xr; + xr = a[11]; + a[26] -= xr; + a[11] = a[22] - xr; + a[22] += xr; + xr = a[26]; + a[27] -= xr; + a[26] = a[7] - xr; + a[7] += xr; + + xr = a[27]; + a[27] = a[6] - xr; + a[6] += xr; + + xr = SQRT2 * (a[0] - a[4]); + a[0] += a[4]; + a[4] = xr; + xr = SQRT2 * (a[1] - a[5]); + a[1] += a[5]; + a[5] = xr; + xr = SQRT2 * (a[16] - a[20]); + a[16] += a[20]; + a[20] = xr; + xr = SQRT2 * (a[17] - a[21]); + a[17] += a[21]; + a[21] = xr; + + xr = -SQRT2 * (a[8] - a[12]); + a[8] += a[12]; + a[12] = xr - a[8]; + xr = -SQRT2 * (a[9] - a[13]); + a[9] += a[13]; + a[13] = xr - a[9]; + xr = -SQRT2 * (a[25] - a[29]); + a[25] += a[29]; + a[29] = xr - a[25]; + xr = -SQRT2 * (a[24] + a[28]); + a[24] -= a[28]; + a[28] = xr - a[24]; + + xr = a[24] - a[16]; + a[24] = xr; + xr = a[20] - xr; + a[20] = xr; + xr = a[28] - xr; + a[28] = xr; + + xr = a[25] - a[17]; + a[25] = xr; + xr = a[21] - xr; + a[21] = xr; + xr = a[29] - xr; + a[29] = xr; + + xr = a[17] - a[1]; + a[17] = xr; + xr = a[9] - xr; + a[9] = xr; + xr = a[25] - xr; + a[25] = xr; + xr = a[5] - xr; + a[5] = xr; + xr = a[21] - xr; + a[21] = xr; + xr = a[13] - xr; + a[13] = xr; + xr = a[29] - xr; + a[29] = xr; + + xr = a[1] - a[0]; + a[1] = xr; + xr = a[16] - xr; + a[16] = xr; + xr = a[17] - xr; + a[17] = xr; + xr = a[8] - xr; + a[8] = xr; + xr = a[9] - xr; + a[9] = xr; + xr = a[24] - xr; + a[24] = xr; + xr = a[25] - xr; + a[25] = xr; + xr = a[4] - xr; + a[4] = xr; + xr = a[5] - xr; + a[5] = xr; + xr = a[20] - xr; + a[20] = xr; + xr = a[21] - xr; + a[21] = xr; + xr = a[12] - xr; + a[12] = xr; + xr = a[13] - xr; + a[13] = xr; + xr = a[28] - xr; + a[28] = xr; + xr = a[29] - xr; + a[29] = xr; + + xr = a[0]; + a[0] += a[31]; + a[31] -= xr; + xr = a[1]; + a[1] += a[30]; + a[30] -= xr; + xr = a[16]; + a[16] += a[15]; + a[15] -= xr; + xr = a[17]; + a[17] += a[14]; + a[14] -= xr; + xr = a[8]; + a[8] += a[23]; + a[23] -= xr; + xr = a[9]; + a[9] += a[22]; + a[22] -= xr; + xr = a[24]; + a[24] += a[7]; + a[7] -= xr; + xr = a[25]; + a[25] += a[6]; + a[6] -= xr; + xr = a[4]; + a[4] += a[27]; + a[27] -= xr; + xr = a[5]; + a[5] += a[26]; + a[26] -= xr; + xr = a[20]; + a[20] += a[11]; + a[11] -= xr; + xr = a[21]; + a[21] += a[10]; + a[10] -= xr; + xr = a[12]; + a[12] += a[19]; + a[19] -= xr; + xr = a[13]; + a[13] += a[18]; + a[18] -= xr; + xr = a[28]; + a[28] += a[3]; + a[3] -= xr; + xr = a[29]; + a[29] += a[2]; + a[2] -= xr; + } + +} + + +/*-------------------------------------------------------------------*/ +/* */ +/* Function: Calculation of the MDCT */ +/* In the case of long blocks (type 0,1,3) there are */ +/* 36 coefficents in the time domain and 18 in the frequency */ +/* domain. */ +/* In the case of short blocks (type 2) there are 3 */ +/* transformations with short length. This leads to 12 coefficents */ +/* in the time and 6 in the frequency domain. In this case the */ +/* results are stored side by side in the vector out[]. */ +/* */ +/* New layer3 */ +/* */ +/*-------------------------------------------------------------------*/ + +inline static void +mdct_short(FLOAT * inout) +{ + int l; + for (l = 0; l < 3; l++) { + FLOAT tc0, tc1, tc2, ts0, ts1, ts2; + + ts0 = inout[2 * 3] * win[SHORT_TYPE][0] - inout[5 * 3]; + tc0 = inout[0 * 3] * win[SHORT_TYPE][2] - inout[3 * 3]; + tc1 = ts0 + tc0; + tc2 = ts0 - tc0; + + ts0 = inout[5 * 3] * win[SHORT_TYPE][0] + inout[2 * 3]; + tc0 = inout[3 * 3] * win[SHORT_TYPE][2] + inout[0 * 3]; + ts1 = ts0 + tc0; + ts2 = -ts0 + tc0; + + tc0 = (inout[1 * 3] * win[SHORT_TYPE][1] - inout[4 * 3]) * 2.069978111953089e-11; /* tritab_s[1] */ + ts0 = (inout[4 * 3] * win[SHORT_TYPE][1] + inout[1 * 3]) * 2.069978111953089e-11; /* tritab_s[1] */ + + inout[3 * 0] = tc1 * 1.907525191737280e-11 /* tritab_s[2] */ + tc0; + inout[3 * 5] = -ts1 * 1.907525191737280e-11 /* tritab_s[0] */ + ts0; + + tc2 = tc2 * 0.86602540378443870761 * 1.907525191737281e-11 /* tritab_s[2] */ ; + ts1 = ts1 * 0.5 * 1.907525191737281e-11 + ts0; + inout[3 * 1] = tc2 - ts1; + inout[3 * 2] = tc2 + ts1; + + tc1 = tc1 * 0.5 * 1.907525191737281e-11 - tc0; + ts2 = ts2 * 0.86602540378443870761 * 1.907525191737281e-11 /* tritab_s[0] */ ; + inout[3 * 3] = tc1 + ts2; + inout[3 * 4] = tc1 - ts2; + + inout++; + } +} + +inline static void +mdct_long(FLOAT * out, FLOAT const *in) +{ + FLOAT ct, st; + { + FLOAT tc1, tc2, tc3, tc4, ts5, ts6, ts7, ts8; + /* 1,2, 5,6, 9,10, 13,14, 17 */ + tc1 = in[17] - in[9]; + tc3 = in[15] - in[11]; + tc4 = in[14] - in[12]; + ts5 = in[0] + in[8]; + ts6 = in[1] + in[7]; + ts7 = in[2] + in[6]; + ts8 = in[3] + in[5]; + + out[17] = (ts5 + ts7 - ts8) - (ts6 - in[4]); + st = (ts5 + ts7 - ts8) * cx[7] + (ts6 - in[4]); + ct = (tc1 - tc3 - tc4) * cx[6]; + out[5] = ct + st; + out[6] = ct - st; + + tc2 = (in[16] - in[10]) * cx[6]; + ts6 = ts6 * cx[7] + in[4]; + ct = tc1 * cx[0] + tc2 + tc3 * cx[1] + tc4 * cx[2]; + st = -ts5 * cx[4] + ts6 - ts7 * cx[5] + ts8 * cx[3]; + out[1] = ct + st; + out[2] = ct - st; + + ct = tc1 * cx[1] - tc2 - tc3 * cx[2] + tc4 * cx[0]; + st = -ts5 * cx[5] + ts6 - ts7 * cx[3] + ts8 * cx[4]; + out[9] = ct + st; + out[10] = ct - st; + + ct = tc1 * cx[2] - tc2 + tc3 * cx[0] - tc4 * cx[1]; + st = ts5 * cx[3] - ts6 + ts7 * cx[4] - ts8 * cx[5]; + out[13] = ct + st; + out[14] = ct - st; + } + { + FLOAT ts1, ts2, ts3, ts4, tc5, tc6, tc7, tc8; + + ts1 = in[8] - in[0]; + ts3 = in[6] - in[2]; + ts4 = in[5] - in[3]; + tc5 = in[17] + in[9]; + tc6 = in[16] + in[10]; + tc7 = in[15] + in[11]; + tc8 = in[14] + in[12]; + + out[0] = (tc5 + tc7 + tc8) + (tc6 + in[13]); + ct = (tc5 + tc7 + tc8) * cx[7] - (tc6 + in[13]); + st = (ts1 - ts3 + ts4) * cx[6]; + out[11] = ct + st; + out[12] = ct - st; + + ts2 = (in[7] - in[1]) * cx[6]; + tc6 = in[13] - tc6 * cx[7]; + ct = tc5 * cx[3] - tc6 + tc7 * cx[4] + tc8 * cx[5]; + st = ts1 * cx[2] + ts2 + ts3 * cx[0] + ts4 * cx[1]; + out[3] = ct + st; + out[4] = ct - st; + + ct = -tc5 * cx[5] + tc6 - tc7 * cx[3] - tc8 * cx[4]; + st = ts1 * cx[1] + ts2 - ts3 * cx[2] - ts4 * cx[0]; + out[7] = ct + st; + out[8] = ct - st; + + ct = -tc5 * cx[4] + tc6 - tc7 * cx[5] - tc8 * cx[3]; + st = ts1 * cx[0] - ts2 + ts3 * cx[1] - ts4 * cx[2]; + out[15] = ct + st; + out[16] = ct - st; + } +} + + +void +mdct_sub48(lame_internal_flags * gfc, const sample_t * w0, const sample_t * w1) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + EncStateVar_t *const esv = &gfc->sv_enc; + int gr, k, ch; + const sample_t *wk; + + wk = w0 + 286; + /* thinking cache performance, ch->gr loop is better than gr->ch loop */ + for (ch = 0; ch < cfg->channels_out; ch++) { + for (gr = 0; gr < cfg->mode_gr; gr++) { + int band; + gr_info *const gi = &(gfc->l3_side.tt[gr][ch]); + FLOAT *mdct_enc = gi->xr; + FLOAT *samp = esv->sb_sample[ch][1 - gr][0]; + + for (k = 0; k < 18 / 2; k++) { + window_subband(wk, samp); + window_subband(wk + 32, samp + 32); + samp += 64; + wk += 64; + /* + * Compensate for inversion in the analysis filter + */ + for (band = 1; band < 32; band += 2) { + samp[band - 32] *= -1; + } + } + + /* + * Perform imdct of 18 previous subband samples + * + 18 current subband samples + */ + for (band = 0; band < 32; band++, mdct_enc += 18) { + int type = gi->block_type; + FLOAT const *const band0 = esv->sb_sample[ch][gr][0] + order[band]; + FLOAT *const band1 = esv->sb_sample[ch][1 - gr][0] + order[band]; + if (gi->mixed_block_flag && band < 2) + type = 0; + if (esv->amp_filter[band] < 1e-12) { + memset(mdct_enc, 0, 18 * sizeof(FLOAT)); + } + else { + if (esv->amp_filter[band] < 1.0) { + for (k = 0; k < 18; k++) + band1[k * 32] *= esv->amp_filter[band]; + } + if (type == SHORT_TYPE) { + for (k = -NS / 4; k < 0; k++) { + FLOAT const w = win[SHORT_TYPE][k + 3]; + mdct_enc[k * 3 + 9] = band0[(9 + k) * 32] * w - band0[(8 - k) * 32]; + mdct_enc[k * 3 + 18] = band0[(14 - k) * 32] * w + band0[(15 + k) * 32]; + mdct_enc[k * 3 + 10] = band0[(15 + k) * 32] * w - band0[(14 - k) * 32]; + mdct_enc[k * 3 + 19] = band1[(2 - k) * 32] * w + band1[(3 + k) * 32]; + mdct_enc[k * 3 + 11] = band1[(3 + k) * 32] * w - band1[(2 - k) * 32]; + mdct_enc[k * 3 + 20] = band1[(8 - k) * 32] * w + band1[(9 + k) * 32]; + } + mdct_short(mdct_enc); + } + else { + FLOAT work[18]; + for (k = -NL / 4; k < 0; k++) { + FLOAT a, b; + a = win[type][k + 27] * band1[(k + 9) * 32] + + win[type][k + 36] * band1[(8 - k) * 32]; + b = win[type][k + 9] * band0[(k + 9) * 32] + - win[type][k + 18] * band0[(8 - k) * 32]; + work[k + 9] = a - b * tantab_l[k + 9]; + work[k + 18] = a * tantab_l[k + 9] + b; + } + + mdct_long(mdct_enc, work); + } + } + /* + * Perform aliasing reduction butterfly + */ + if (type != SHORT_TYPE && band != 0) { + for (k = 7; k >= 0; --k) { + FLOAT bu, bd; + bu = mdct_enc[k] * ca[k] + mdct_enc[-1 - k] * cs[k]; + bd = mdct_enc[k] * cs[k] - mdct_enc[-1 - k] * ca[k]; + + mdct_enc[-1 - k] = bu; + mdct_enc[k] = bd; + } + } + } + } + wk = w1 + 286; + if (cfg->mode_gr == 1) { + memcpy(esv->sb_sample[ch][0], esv->sb_sample[ch][1], 576 * sizeof(FLOAT)); + } + } +} diff --git a/libmp3lame/newmdct.h b/libmp3lame/newmdct.h new file mode 100644 index 0000000..0b58a95 --- /dev/null +++ b/libmp3lame/newmdct.h @@ -0,0 +1,27 @@ +/* + * New Modified DCT include file + * + * Copyright (c) 1999 Takehiro TOMINAGA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef LAME_NEWMDCT_H +#define LAME_NEWMDCT_H + +void mdct_sub48(lame_internal_flags * gfc, const sample_t * w0, const sample_t * w1); + +#endif /* LAME_NEWMDCT_H */ diff --git a/libmp3lame/presets.c b/libmp3lame/presets.c new file mode 100644 index 0000000..93594f5 --- /dev/null +++ b/libmp3lame/presets.c @@ -0,0 +1,404 @@ +/* + * presets.c -- Apply presets + * + * Copyright (c) 2002-2008 Gabriel Bouvigne + * Copyright (c) 2007-2012 Robert Hegemann + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. + */ + + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include "lame.h" +#include "machine.h" +#include "set_get.h" +#include "encoder.h" +#include "util.h" +#include "lame_global_flags.h" + +#define SET_OPTION(opt, val, def) if (enforce) \ + (void) lame_set_##opt(gfp, val); \ + else if (!(fabs(lame_get_##opt(gfp) - def) > 0)) \ + (void) lame_set_##opt(gfp, val); + +#define SET__OPTION(opt, val, def) if (enforce) \ + lame_set_##opt(gfp, val); \ + else if (!(fabs(lame_get_##opt(gfp) - def) > 0)) \ + lame_set_##opt(gfp, val); + +#undef Min +#undef Max + +static inline int +min_int(int a, int b) +{ + if (a < b) { + return a; + } + return b; +} + +static inline int +max_int(int a, int b) +{ + if (a > b) { + return a; + } + return b; +} + + + +typedef struct { + int vbr_q; + int quant_comp; + int quant_comp_s; + int expY; + FLOAT st_lrm; /*short threshold */ + FLOAT st_s; + FLOAT masking_adj; + FLOAT masking_adj_short; + FLOAT ath_lower; + FLOAT ath_curve; + FLOAT ath_sensitivity; + FLOAT interch; + int safejoint; + int sfb21mod; + FLOAT msfix; + FLOAT minval; + FLOAT ath_fixpoint; +} vbr_presets_t; + + /* *INDENT-OFF* */ + + /* Switch mappings for VBR mode VBR_RH */ + static const vbr_presets_t vbr_old_switch_map[] = { + /*vbr_q qcomp_l qcomp_s expY st_lrm st_s mask adj_l adj_s ath_lower ath_curve ath_sens interChR safejoint sfb21mod msfix */ + {0, 9, 9, 0, 5.20, 125.0, -4.2, -6.3, 4.8, 1, 0, 0, 2, 21, 0.97, 5, 100}, + {1, 9, 9, 0, 5.30, 125.0, -3.6, -5.6, 4.5, 1.5, 0, 0, 2, 21, 1.35, 5, 100}, + {2, 9, 9, 0, 5.60, 125.0, -2.2, -3.5, 2.8, 2, 0, 0, 2, 21, 1.49, 5, 100}, + {3, 9, 9, 1, 5.80, 130.0, -1.8, -2.8, 2.6, 3, -4, 0, 2, 20, 1.64, 5, 100}, + {4, 9, 9, 1, 6.00, 135.0, -0.7, -1.1, 1.1, 3.5, -8, 0, 2, 0, 1.79, 5, 100}, + {5, 9, 9, 1, 6.40, 140.0, 0.5, 0.4, -7.5, 4, -12, 0.0002, 0, 0, 1.95, 5, 100}, + {6, 9, 9, 1, 6.60, 145.0, 0.67, 0.65, -14.7, 6.5, -19, 0.0004, 0, 0, 2.30, 5, 100}, + {7, 9, 9, 1, 6.60, 145.0, 0.8, 0.75, -19.7, 8, -22, 0.0006, 0, 0, 2.70, 5, 100}, + {8, 9, 9, 1, 6.60, 145.0, 1.2, 1.15, -27.5, 10, -23, 0.0007, 0, 0, 0, 5, 100}, + {9, 9, 9, 1, 6.60, 145.0, 1.6, 1.6, -36, 11, -25, 0.0008, 0, 0, 0, 5, 100}, + {10, 9, 9, 1, 6.60, 145.0, 2.0, 2.0, -36, 12, -25, 0.0008, 0, 0, 0, 5, 100} + }; + + static const vbr_presets_t vbr_mt_psy_switch_map[] = { + /*vbr_q qcomp_l qcomp_s expY st_lrm st_s mask adj_l adj_s ath_lower ath_curve ath_sens --- safejoint sfb21mod msfix */ + {0, 9, 9, 0, 4.20, 25.0, -6.8, -6.8, 7.1, 1, 0, 0, 2, 31, 1.000, 5, 100}, + {1, 9, 9, 0, 4.20, 25.0, -4.8, -4.8, 5.4, 1.4, -1, 0, 2, 27, 1.122, 5, 98}, + {2, 9, 9, 0, 4.20, 25.0, -2.6, -2.6, 3.7, 2.0, -3, 0, 2, 23, 1.288, 5, 97}, + {3, 9, 9, 1, 4.20, 25.0, -1.6, -1.6, 2.0, 2.0, -5, 0, 2, 18, 1.479, 5, 96}, + {4, 9, 9, 1, 4.20, 25.0, -0.0, -0.0, 0.0, 2.0, -8, 0, 2, 12, 1.698, 5, 95}, + {5, 9, 9, 1, 4.20, 25.0, 1.3, 1.3, -6, 3.5, -11, 0, 2, 8, 1.950, 5, 94.2}, +#if 0 + {6, 9, 9, 1, 4.50, 100.0, 1.5, 1.5, -24.0, 6.0, -14, 0, 2, 4, 2.239, 3, 93.9}, + {7, 9, 9, 1, 4.80, 200.0, 1.7, 1.7, -28.0, 9.0, -20, 0, 2, 0, 2.570, 1, 93.6}, +#else + {6, 9, 9, 1, 4.50, 100.0, 2.2, 2.3, -12.0, 6.0, -14, 0, 2, 4, 2.239, 3, 93.9}, + {7, 9, 9, 1, 4.80, 200.0, 2.7, 2.7, -18.0, 9.0, -17, 0, 2, 0, 2.570, 1, 93.6}, +#endif + {8, 9, 9, 1, 5.30, 300.0, 2.8, 2.8, -21.0, 10.0, -23, 0.0002, 0, 0, 2.951, 0, 93.3}, + {9, 9, 9, 1, 6.60, 300.0, 2.8, 2.8, -23.0, 11.0, -25, 0.0006, 0, 0, 3.388, 0, 93.3}, + {10, 9, 9, 1, 25.00, 300.0, 2.8, 2.8, -25.0, 12.0, -27, 0.0025, 0, 0, 3.500, 0, 93.3} + }; + + /* *INDENT-ON* */ + +static vbr_presets_t const* +get_vbr_preset(int v) +{ + switch (v) { + case vbr_mtrh: + case vbr_mt: + return &vbr_mt_psy_switch_map[0]; + default: + return &vbr_old_switch_map[0]; + } +} + +#define NOOP(m) (void)p.m +#define LERP(m) (p.m = p.m + x * (q.m - p.m)) + +static void +apply_vbr_preset(lame_global_flags * gfp, int a, int enforce) +{ + vbr_presets_t const *vbr_preset = get_vbr_preset(lame_get_VBR(gfp)); + float x = gfp->VBR_q_frac; + vbr_presets_t p = vbr_preset[a]; + vbr_presets_t q = vbr_preset[a + 1]; + vbr_presets_t const *set = &p; + + NOOP(vbr_q); + NOOP(quant_comp); + NOOP(quant_comp_s); + NOOP(expY); + LERP(st_lrm); + LERP(st_s); + LERP(masking_adj); + LERP(masking_adj_short); + LERP(ath_lower); + LERP(ath_curve); + LERP(ath_sensitivity); + LERP(interch); + NOOP(safejoint); + LERP(sfb21mod); + LERP(msfix); + LERP(minval); + LERP(ath_fixpoint); + + (void) lame_set_VBR_q(gfp, set->vbr_q); + SET_OPTION(quant_comp, set->quant_comp, -1); + SET_OPTION(quant_comp_short, set->quant_comp_s, -1); + if (set->expY) { + (void) lame_set_experimentalY(gfp, set->expY); + } + SET_OPTION(short_threshold_lrm, set->st_lrm, -1); + SET_OPTION(short_threshold_s, set->st_s, -1); + SET_OPTION(maskingadjust, set->masking_adj, 0); + SET_OPTION(maskingadjust_short, set->masking_adj_short, 0); + if (lame_get_VBR(gfp) == vbr_mt || lame_get_VBR(gfp) == vbr_mtrh) { + lame_set_ATHtype(gfp, 5); + } + SET_OPTION(ATHlower, set->ath_lower, 0); + SET_OPTION(ATHcurve, set->ath_curve, -1); + SET_OPTION(athaa_sensitivity, set->ath_sensitivity, 0); + if (set->interch > 0) { + SET_OPTION(interChRatio, set->interch, -1); + } + + /* parameters for which there is no proper set/get interface */ + if (set->safejoint > 0) { + (void) lame_set_exp_nspsytune(gfp, lame_get_exp_nspsytune(gfp) | 2); + } + if (set->sfb21mod > 0) { + int const nsp = lame_get_exp_nspsytune(gfp); + int const val = (nsp >> 20) & 63; + if (val == 0) { + int const sf21mod = (set->sfb21mod << 20) | nsp; + (void) lame_set_exp_nspsytune(gfp, sf21mod); + } + } + SET__OPTION(msfix, set->msfix, -1); + + if (enforce == 0) { + gfp->VBR_q = a; + gfp->VBR_q_frac = x; + } + gfp->internal_flags->cfg.minval = set->minval; + { /* take care of gain adjustments */ + double const x = fabs(gfp->scale); + double const y = (x > 0.f) ? (10.f * log10(x)) : 0.f; + gfp->internal_flags->cfg.ATHfixpoint = set->ath_fixpoint - y; + } +} + +static int +apply_abr_preset(lame_global_flags * gfp, int preset, int enforce) +{ + typedef struct { + int abr_kbps; + int quant_comp; + int quant_comp_s; + int safejoint; + FLOAT nsmsfix; + FLOAT st_lrm; /*short threshold */ + FLOAT st_s; + FLOAT scale; + FLOAT masking_adj; + FLOAT ath_lower; + FLOAT ath_curve; + FLOAT interch; + int sfscale; + } abr_presets_t; + + + /* *INDENT-OFF* */ + + /* + * Switch mappings for ABR mode + */ + const abr_presets_t abr_switch_map[] = { + /* kbps quant q_s safejoint nsmsfix st_lrm st_s scale msk ath_lwr ath_curve interch , sfscale */ + { 8, 9, 9, 0, 0, 6.60, 145, 0.95, 0, -30.0, 11, 0.0012, 1}, /* 8, impossible to use in stereo */ + { 16, 9, 9, 0, 0, 6.60, 145, 0.95, 0, -25.0, 11, 0.0010, 1}, /* 16 */ + { 24, 9, 9, 0, 0, 6.60, 145, 0.95, 0, -20.0, 11, 0.0010, 1}, /* 24 */ + { 32, 9, 9, 0, 0, 6.60, 145, 0.95, 0, -15.0, 11, 0.0010, 1}, /* 32 */ + { 40, 9, 9, 0, 0, 6.60, 145, 0.95, 0, -10.0, 11, 0.0009, 1}, /* 40 */ + { 48, 9, 9, 0, 0, 6.60, 145, 0.95, 0, -10.0, 11, 0.0009, 1}, /* 48 */ + { 56, 9, 9, 0, 0, 6.60, 145, 0.95, 0, -6.0, 11, 0.0008, 1}, /* 56 */ + { 64, 9, 9, 0, 0, 6.60, 145, 0.95, 0, -2.0, 11, 0.0008, 1}, /* 64 */ + { 80, 9, 9, 0, 0, 6.60, 145, 0.95, 0, .0, 8, 0.0007, 1}, /* 80 */ + { 96, 9, 9, 0, 2.50, 6.60, 145, 0.95, 0, 1.0, 5.5, 0.0006, 1}, /* 96 */ + {112, 9, 9, 0, 2.25, 6.60, 145, 0.95, 0, 2.0, 4.5, 0.0005, 1}, /* 112 */ + {128, 9, 9, 0, 1.95, 6.40, 140, 0.95, 0, 3.0, 4, 0.0002, 1}, /* 128 */ + {160, 9, 9, 1, 1.79, 6.00, 135, 0.95, -2, 5.0, 3.5, 0, 1}, /* 160 */ + {192, 9, 9, 1, 1.49, 5.60, 125, 0.97, -4, 7.0, 3, 0, 0}, /* 192 */ + {224, 9, 9, 1, 1.25, 5.20, 125, 0.98, -6, 9.0, 2, 0, 0}, /* 224 */ + {256, 9, 9, 1, 0.97, 5.20, 125, 1.00, -8, 10.0, 1, 0, 0}, /* 256 */ + {320, 9, 9, 1, 0.90, 5.20, 125, 1.00, -10, 12.0, 0, 0, 0} /* 320 */ + }; + + /* *INDENT-ON* */ + + /* Variables for the ABR stuff */ + int r; + int actual_bitrate = preset; + + r = nearestBitrateFullIndex(preset); + + (void) lame_set_VBR(gfp, vbr_abr); + (void) lame_set_VBR_mean_bitrate_kbps(gfp, (actual_bitrate)); + (void) lame_set_VBR_mean_bitrate_kbps(gfp, min_int(lame_get_VBR_mean_bitrate_kbps(gfp), 320)); + (void) lame_set_VBR_mean_bitrate_kbps(gfp, max_int(lame_get_VBR_mean_bitrate_kbps(gfp), 8)); + (void) lame_set_brate(gfp, lame_get_VBR_mean_bitrate_kbps(gfp)); + + + /* parameters for which there is no proper set/get interface */ + if (abr_switch_map[r].safejoint > 0) + (void) lame_set_exp_nspsytune(gfp, lame_get_exp_nspsytune(gfp) | 2); /* safejoint */ + + if (abr_switch_map[r].sfscale > 0) + (void) lame_set_sfscale(gfp, 1); + + + SET_OPTION(quant_comp, abr_switch_map[r].quant_comp, -1); + SET_OPTION(quant_comp_short, abr_switch_map[r].quant_comp_s, -1); + + SET__OPTION(msfix, abr_switch_map[r].nsmsfix, -1); + + SET_OPTION(short_threshold_lrm, abr_switch_map[r].st_lrm, -1); + SET_OPTION(short_threshold_s, abr_switch_map[r].st_s, -1); + + /* ABR seems to have big problems with clipping, especially at low bitrates */ + /* so we compensate for that here by using a scale value depending on bitrate */ + lame_set_scale(gfp, lame_get_scale(gfp) * abr_switch_map[r].scale); + + SET_OPTION(maskingadjust, abr_switch_map[r].masking_adj, 0); + if (abr_switch_map[r].masking_adj > 0) { + SET_OPTION(maskingadjust_short, abr_switch_map[r].masking_adj * .9, 0); + } + else { + SET_OPTION(maskingadjust_short, abr_switch_map[r].masking_adj * 1.1, 0); + } + + + SET_OPTION(ATHlower, abr_switch_map[r].ath_lower, 0); + SET_OPTION(ATHcurve, abr_switch_map[r].ath_curve, -1); + + SET_OPTION(interChRatio, abr_switch_map[r].interch, -1); + + (void) abr_switch_map[r].abr_kbps; + + gfp->internal_flags->cfg.minval = 5. * (abr_switch_map[r].abr_kbps / 320.); + + return preset; +} + + + +int +apply_preset(lame_global_flags * gfp, int preset, int enforce) +{ + /*translate legacy presets */ + switch (preset) { + case R3MIX: + { + preset = V3; + (void) lame_set_VBR(gfp, vbr_mtrh); + break; + } + case MEDIUM: + case MEDIUM_FAST: + { + preset = V4; + (void) lame_set_VBR(gfp, vbr_mtrh); + break; + } + case STANDARD: + case STANDARD_FAST: + { + preset = V2; + (void) lame_set_VBR(gfp, vbr_mtrh); + break; + } + case EXTREME: + case EXTREME_FAST: + { + preset = V0; + (void) lame_set_VBR(gfp, vbr_mtrh); + break; + } + case INSANE: + { + preset = 320; + gfp->preset = preset; + (void) apply_abr_preset(gfp, preset, enforce); + lame_set_VBR(gfp, vbr_off); + return preset; + } + } + + gfp->preset = preset; + { + switch (preset) { + case V9: + apply_vbr_preset(gfp, 9, enforce); + return preset; + case V8: + apply_vbr_preset(gfp, 8, enforce); + return preset; + case V7: + apply_vbr_preset(gfp, 7, enforce); + return preset; + case V6: + apply_vbr_preset(gfp, 6, enforce); + return preset; + case V5: + apply_vbr_preset(gfp, 5, enforce); + return preset; + case V4: + apply_vbr_preset(gfp, 4, enforce); + return preset; + case V3: + apply_vbr_preset(gfp, 3, enforce); + return preset; + case V2: + apply_vbr_preset(gfp, 2, enforce); + return preset; + case V1: + apply_vbr_preset(gfp, 1, enforce); + return preset; + case V0: + apply_vbr_preset(gfp, 0, enforce); + return preset; + default: + break; + } + } + if (8 <= preset && preset <= 320) { + return apply_abr_preset(gfp, preset, enforce); + } + + gfp->preset = 0; /*no corresponding preset found */ + return preset; +} diff --git a/libmp3lame/psymodel.c b/libmp3lame/psymodel.c new file mode 100644 index 0000000..60076ee --- /dev/null +++ b/libmp3lame/psymodel.c @@ -0,0 +1,2167 @@ +/* + * psymodel.c + * + * Copyright (c) 1999-2000 Mark Taylor + * Copyright (c) 2001-2002 Naoki Shibata + * Copyright (c) 2000-2003 Takehiro Tominaga + * Copyright (c) 2000-2012 Robert Hegemann + * Copyright (c) 2000-2005 Gabriel Bouvigne + * Copyright (c) 2000-2005 Alexander Leidinger + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* $Id: psymodel.c,v 1.216 2017/09/06 19:38:23 aleidinger Exp $ */ + + +/* +PSYCHO ACOUSTICS + + +This routine computes the psycho acoustics, delayed by one granule. + +Input: buffer of PCM data (1024 samples). + +This window should be centered over the 576 sample granule window. +The routine will compute the psycho acoustics for +this granule, but return the psycho acoustics computed +for the *previous* granule. This is because the block +type of the previous granule can only be determined +after we have computed the psycho acoustics for the following +granule. + +Output: maskings and energies for each scalefactor band. +block type, PE, and some correlation measures. +The PE is used by CBR modes to determine if extra bits +from the bit reservoir should be used. The correlation +measures are used to determine mid/side or regular stereo. +*/ +/* +Notation: + +barks: a non-linear frequency scale. Mapping from frequency to + barks is given by freq2bark() + +scalefactor bands: The spectrum (frequencies) are broken into + SBMAX "scalefactor bands". Thes bands + are determined by the MPEG ISO spec. In + the noise shaping/quantization code, we allocate + bits among the partition bands to achieve the + best possible quality + +partition bands: The spectrum is also broken into about + 64 "partition bands". Each partition + band is about .34 barks wide. There are about 2-5 + partition bands for each scalefactor band. + +LAME computes all psycho acoustic information for each partition +band. Then at the end of the computations, this information +is mapped to scalefactor bands. The energy in each scalefactor +band is taken as the sum of the energy in all partition bands +which overlap the scalefactor band. The maskings can be computed +in the same way (and thus represent the average masking in that band) +or by taking the minmum value multiplied by the number of +partition bands used (which represents a minimum masking in that band). +*/ +/* +The general outline is as follows: + +1. compute the energy in each partition band +2. compute the tonality in each partition band +3. compute the strength of each partion band "masker" +4. compute the masking (via the spreading function applied to each masker) +5. Modifications for mid/side masking. + +Each partition band is considiered a "masker". The strength +of the i'th masker in band j is given by: + + s3(bark(i)-bark(j))*strength(i) + +The strength of the masker is a function of the energy and tonality. +The more tonal, the less masking. LAME uses a simple linear formula +(controlled by NMT and TMN) which says the strength is given by the +energy divided by a linear function of the tonality. +*/ +/* +s3() is the "spreading function". It is given by a formula +determined via listening tests. + +The total masking in the j'th partition band is the sum over +all maskings i. It is thus given by the convolution of +the strength with s3(), the "spreading function." + +masking(j) = sum_over_i s3(i-j)*strength(i) = s3 o strength + +where "o" = convolution operator. s3 is given by a formula determined +via listening tests. It is normalized so that s3 o 1 = 1. + +Note: instead of a simple convolution, LAME also has the +option of using "additive masking" + +The most critical part is step 2, computing the tonality of each +partition band. LAME has two tonality estimators. The first +is based on the ISO spec, and measures how predictiable the +signal is over time. The more predictable, the more tonal. +The second measure is based on looking at the spectrum of +a single granule. The more peaky the spectrum, the more +tonal. By most indications, the latter approach is better. + +Finally, in step 5, the maskings for the mid and side +channel are possibly increased. Under certain circumstances, +noise in the mid & side channels is assumed to also +be masked by strong maskers in the L or R channels. + + +Other data computed by the psy-model: + +ms_ratio side-channel / mid-channel masking ratio (for previous granule) +ms_ratio_next side-channel / mid-channel masking ratio for this granule + +percep_entropy[2] L and R values (prev granule) of PE - A measure of how + much pre-echo is in the previous granule +percep_entropy_MS[2] mid and side channel values (prev granule) of percep_entropy +energy[4] L,R,M,S energy in each channel, prev granule +blocktype_d[2] block type to use for previous granule +*/ + + + + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <float.h> + +#include "lame.h" +#include "machine.h" +#include "encoder.h" +#include "util.h" +#include "psymodel.h" +#include "lame_global_flags.h" +#include "fft.h" +#include "lame-analysis.h" + + +#define NSFIRLEN 21 + +#ifdef M_LN10 +#define LN_TO_LOG10 (M_LN10/10) +#else +#define LN_TO_LOG10 0.2302585093 +#endif + + +/* + L3psycho_anal. Compute psycho acoustics. + + Data returned to the calling program must be delayed by one + granule. + + This is done in two places. + If we do not need to know the blocktype, the copying + can be done here at the top of the program: we copy the data for + the last granule (computed during the last call) before it is + overwritten with the new data. It looks like this: + + 0. static psymodel_data + 1. calling_program_data = psymodel_data + 2. compute psymodel_data + + For data which needs to know the blocktype, the copying must be + done at the end of this loop, and the old values must be saved: + + 0. static psymodel_data_old + 1. compute psymodel_data + 2. compute possible block type of this granule + 3. compute final block type of previous granule based on #2. + 4. calling_program_data = psymodel_data_old + 5. psymodel_data_old = psymodel_data +*/ + + + + + +/* psycho_loudness_approx + jd - 2001 mar 12 +in: energy - BLKSIZE/2 elements of frequency magnitudes ^ 2 + gfp - uses out_samplerate, ATHtype (also needed for ATHformula) +returns: loudness^2 approximation, a positive value roughly tuned for a value + of 1.0 for signals near clipping. +notes: When calibrated, feeding this function binary white noise at sample + values +32767 or -32768 should return values that approach 3. + ATHformula is used to approximate an equal loudness curve. +future: Data indicates that the shape of the equal loudness curve varies + with intensity. This function might be improved by using an equal + loudness curve shaped for typical playback levels (instead of the + ATH, that is shaped for the threshold). A flexible realization might + simply bend the existing ATH curve to achieve the desired shape. + However, the potential gain may not be enough to justify an effort. +*/ +static FLOAT +psycho_loudness_approx(FLOAT const *energy, FLOAT const *eql_w) +{ + int i; + FLOAT loudness_power; + + loudness_power = 0.0; + /* apply weights to power in freq. bands */ + for (i = 0; i < BLKSIZE / 2; ++i) + loudness_power += energy[i] * eql_w[i]; + loudness_power *= VO_SCALE; + + return loudness_power; +} + +/* mask_add optimization */ +/* init the limit values used to avoid computing log in mask_add when it is not necessary */ + +/* For example, with i = 10*log10(m2/m1)/10*16 (= log10(m2/m1)*16) + * + * abs(i)>8 is equivalent (as i is an integer) to + * abs(i)>=9 + * i>=9 || i<=-9 + * equivalent to (as i is the biggest integer smaller than log10(m2/m1)*16 + * or the smallest integer bigger than log10(m2/m1)*16 depending on the sign of log10(m2/m1)*16) + * log10(m2/m1)>=9/16 || log10(m2/m1)<=-9/16 + * exp10 is strictly increasing thus this is equivalent to + * m2/m1 >= 10^(9/16) || m2/m1<=10^(-9/16) which are comparisons to constants + */ + + +#define I1LIMIT 8 /* as in if(i>8) */ +#define I2LIMIT 23 /* as in if(i>24) -> changed 23 */ +#define MLIMIT 15 /* as in if(m<15) */ + +/* pow(10, (I1LIMIT + 1) / 16.0); */ +static const FLOAT ma_max_i1 = 3.6517412725483771; +/* pow(10, (I2LIMIT + 1) / 16.0); */ +static const FLOAT ma_max_i2 = 31.622776601683793; +/* pow(10, (MLIMIT) / 10.0); */ +static const FLOAT ma_max_m = 31.622776601683793; + + /*This is the masking table: + According to tonality, values are going from 0dB (TMN) + to 9.3dB (NMT). + After additive masking computation, 8dB are added, so + final values are going from 8dB to 17.3dB + */ +static const FLOAT tab[] = { + 1.0 /*pow(10, -0) */ , + 0.79433 /*pow(10, -0.1) */ , + 0.63096 /*pow(10, -0.2) */ , + 0.63096 /*pow(10, -0.2) */ , + 0.63096 /*pow(10, -0.2) */ , + 0.63096 /*pow(10, -0.2) */ , + 0.63096 /*pow(10, -0.2) */ , + 0.25119 /*pow(10, -0.6) */ , + 0.11749 /*pow(10, -0.93) */ +}; + +static const int tab_mask_add_delta[] = { 2, 2, 2, 1, 1, 1, 0, 0, -1 }; +#define STATIC_ASSERT_EQUAL_DIMENSION(A,B) enum{static_assert_##A=1/((dimension_of(A) == dimension_of(B))?1:0)} + +inline static int +mask_add_delta(int i) +{ + STATIC_ASSERT_EQUAL_DIMENSION(tab_mask_add_delta,tab); + assert(i < (int)dimension_of(tab)); + return tab_mask_add_delta[i]; +} + + +static void +init_mask_add_max_values(void) +{ +#ifndef NDEBUG + FLOAT const _ma_max_i1 = pow(10, (I1LIMIT + 1) / 16.0); + FLOAT const _ma_max_i2 = pow(10, (I2LIMIT + 1) / 16.0); + FLOAT const _ma_max_m = pow(10, (MLIMIT) / 10.0); + assert(fabs(ma_max_i1 - _ma_max_i1) <= FLT_EPSILON); + assert(fabs(ma_max_i2 - _ma_max_i2) <= FLT_EPSILON); + assert(fabs(ma_max_m - _ma_max_m ) <= FLT_EPSILON); +#endif +} + + + + +/* addition of simultaneous masking Naoki Shibata 2000/7 */ +inline static FLOAT +vbrpsy_mask_add(FLOAT m1, FLOAT m2, int b, int delta) +{ + static const FLOAT table2[] = { + 1.33352 * 1.33352, 1.35879 * 1.35879, 1.38454 * 1.38454, 1.39497 * 1.39497, + 1.40548 * 1.40548, 1.3537 * 1.3537, 1.30382 * 1.30382, 1.22321 * 1.22321, + 1.14758 * 1.14758, + 1 + }; + + FLOAT ratio; + + if (m1 < 0) { + m1 = 0; + } + if (m2 < 0) { + m2 = 0; + } + if (m1 <= 0) { + return m2; + } + if (m2 <= 0) { + return m1; + } + if (m2 > m1) { + ratio = m2 / m1; + } + else { + ratio = m1 / m2; + } + if (abs(b) <= delta) { /* approximately, 1 bark = 3 partitions */ + /* originally 'if(i > 8)' */ + if (ratio >= ma_max_i1) { + return m1 + m2; + } + else { + int i = (int) (FAST_LOG10_X(ratio, 16.0f)); + return (m1 + m2) * table2[i]; + } + } + if (ratio < ma_max_i2) { + return m1 + m2; + } + if (m1 < m2) { + m1 = m2; + } + return m1; +} + + +/* short block threshold calculation (part 2) + + partition band bo_s[sfb] is at the transition from scalefactor + band sfb to the next one sfb+1; enn and thmm have to be split + between them +*/ +static void +convert_partition2scalefac(PsyConst_CB2SB_t const *const gd, FLOAT const *eb, FLOAT const *thr, + FLOAT enn_out[], FLOAT thm_out[]) +{ + FLOAT enn, thmm; + int sb, b, n = gd->n_sb; + enn = thmm = 0.0f; + for (sb = b = 0; sb < n; ++b, ++sb) { + int const bo_sb = gd->bo[sb]; + int const npart = gd->npart; + int const b_lim = bo_sb < npart ? bo_sb : npart; + while (b < b_lim) { + assert(eb[b] >= 0); /* iff failed, it may indicate some index error elsewhere */ + assert(thr[b] >= 0); + enn += eb[b]; + thmm += thr[b]; + b++; + } + if (b >= npart) { + enn_out[sb] = enn; + thm_out[sb] = thmm; + ++sb; + break; + } + assert(eb[b] >= 0); /* iff failed, it may indicate some index error elsewhere */ + assert(thr[b] >= 0); + { + /* at transition sfb -> sfb+1 */ + FLOAT const w_curr = gd->bo_weight[sb]; + FLOAT const w_next = 1.0f - w_curr; + enn += w_curr * eb[b]; + thmm += w_curr * thr[b]; + enn_out[sb] = enn; + thm_out[sb] = thmm; + enn = w_next * eb[b]; + thmm = w_next * thr[b]; + } + } + /* zero initialize the rest */ + for (; sb < n; ++sb) { + enn_out[sb] = 0; + thm_out[sb] = 0; + } +} + +static void +convert_partition2scalefac_s(lame_internal_flags * gfc, FLOAT const *eb, FLOAT const *thr, int chn, + int sblock) +{ + PsyStateVar_t *const psv = &gfc->sv_psy; + PsyConst_CB2SB_t const *const gds = &gfc->cd_psy->s; + FLOAT enn[SBMAX_s], thm[SBMAX_s]; + int sb; + convert_partition2scalefac(gds, eb, thr, enn, thm); + for (sb = 0; sb < SBMAX_s; ++sb) { + psv->en[chn].s[sb][sblock] = enn[sb]; + psv->thm[chn].s[sb][sblock] = thm[sb]; + } +} + +/* longblock threshold calculation (part 2) */ +static void +convert_partition2scalefac_l(lame_internal_flags * gfc, FLOAT const *eb, FLOAT const *thr, int chn) +{ + PsyStateVar_t *const psv = &gfc->sv_psy; + PsyConst_CB2SB_t const *const gdl = &gfc->cd_psy->l; + FLOAT *enn = &psv->en[chn].l[0]; + FLOAT *thm = &psv->thm[chn].l[0]; + convert_partition2scalefac(gdl, eb, thr, enn, thm); +} + +static void +convert_partition2scalefac_l_to_s(lame_internal_flags * gfc, FLOAT const *eb, FLOAT const *thr, + int chn) +{ + PsyStateVar_t *const psv = &gfc->sv_psy; + PsyConst_CB2SB_t const *const gds = &gfc->cd_psy->l_to_s; + FLOAT enn[SBMAX_s], thm[SBMAX_s]; + int sb, sblock; + convert_partition2scalefac(gds, eb, thr, enn, thm); + for (sb = 0; sb < SBMAX_s; ++sb) { + FLOAT const scale = 1. / 64.f; + FLOAT const tmp_enn = enn[sb]; + FLOAT const tmp_thm = thm[sb] * scale; + for (sblock = 0; sblock < 3; ++sblock) { + psv->en[chn].s[sb][sblock] = tmp_enn; + psv->thm[chn].s[sb][sblock] = tmp_thm; + } + } +} + + + +static inline FLOAT +NS_INTERP(FLOAT x, FLOAT y, FLOAT r) +{ + /* was pow((x),(r))*pow((y),1-(r)) */ + if (r >= 1.0f) + return x; /* 99.7% of the time */ + if (r <= 0.0f) + return y; + if (y > 0.0f) + return powf(x / y, r) * y; /* rest of the time */ + return 0.0f; /* never happens */ +} + + + +static FLOAT +pecalc_s(III_psy_ratio const *mr, FLOAT masking_lower) +{ + FLOAT pe_s; + static const FLOAT regcoef_s[] = { + 11.8, /* these values are tuned only for 44.1kHz... */ + 13.6, + 17.2, + 32, + 46.5, + 51.3, + 57.5, + 67.1, + 71.5, + 84.6, + 97.6, + 130, +/* 255.8 */ + }; + unsigned int sb, sblock; + + pe_s = 1236.28f / 4; + for (sb = 0; sb < SBMAX_s - 1; sb++) { + for (sblock = 0; sblock < 3; sblock++) { + FLOAT const thm = mr->thm.s[sb][sblock]; + assert(sb < dimension_of(regcoef_s)); + if (thm > 0.0f) { + FLOAT const x = thm * masking_lower; + FLOAT const en = mr->en.s[sb][sblock]; + if (en > x) { + if (en > x * 1e10f) { + pe_s += regcoef_s[sb] * (10.0f * LOG10); + } + else { + assert(x > 0); + pe_s += regcoef_s[sb] * FAST_LOG10(en / x); + } + } + } + } + } + + return pe_s; +} + +static FLOAT +pecalc_l(III_psy_ratio const *mr, FLOAT masking_lower) +{ + FLOAT pe_l; + static const FLOAT regcoef_l[] = { + 6.8, /* these values are tuned only for 44.1kHz... */ + 5.8, + 5.8, + 6.4, + 6.5, + 9.9, + 12.1, + 14.4, + 15, + 18.9, + 21.6, + 26.9, + 34.2, + 40.2, + 46.8, + 56.5, + 60.7, + 73.9, + 85.7, + 93.4, + 126.1, +/* 241.3 */ + }; + unsigned int sb; + + pe_l = 1124.23f / 4; + for (sb = 0; sb < SBMAX_l - 1; sb++) { + FLOAT const thm = mr->thm.l[sb]; + assert(sb < dimension_of(regcoef_l)); + if (thm > 0.0f) { + FLOAT const x = thm * masking_lower; + FLOAT const en = mr->en.l[sb]; + if (en > x) { + if (en > x * 1e10f) { + pe_l += regcoef_l[sb] * (10.0f * LOG10); + } + else { + assert(x > 0); + pe_l += regcoef_l[sb] * FAST_LOG10(en / x); + } + } + } + } + + return pe_l; +} + + +static void +calc_energy(PsyConst_CB2SB_t const *l, FLOAT const *fftenergy, FLOAT * eb, FLOAT * max, FLOAT * avg) +{ + int b, j; + + for (b = j = 0; b < l->npart; ++b) { + FLOAT ebb = 0, m = 0; + int i; + for (i = 0; i < l->numlines[b]; ++i, ++j) { + FLOAT const el = fftenergy[j]; + assert(el >= 0); + ebb += el; + if (m < el) + m = el; + } + eb[b] = ebb; + max[b] = m; + avg[b] = ebb * l->rnumlines[b]; + assert(l->rnumlines[b] >= 0); + assert(ebb >= 0); + assert(eb[b] >= 0); + assert(max[b] >= 0); + assert(avg[b] >= 0); + } +} + + +static void +calc_mask_index_l(lame_internal_flags const *gfc, FLOAT const *max, + FLOAT const *avg, unsigned char *mask_idx) +{ + PsyConst_CB2SB_t const *const gdl = &gfc->cd_psy->l; + FLOAT m, a; + int b, k; + int const last_tab_entry = sizeof(tab) / sizeof(tab[0]) - 1; + b = 0; + a = avg[b] + avg[b + 1]; + assert(a >= 0); + if (a > 0.0f) { + m = max[b]; + if (m < max[b + 1]) + m = max[b + 1]; + assert((gdl->numlines[b] + gdl->numlines[b + 1] - 1) > 0); + a = 20.0f * (m * 2.0f - a) + / (a * (gdl->numlines[b] + gdl->numlines[b + 1] - 1)); + k = (int) a; + if (k > last_tab_entry) + k = last_tab_entry; + mask_idx[b] = k; + } + else { + mask_idx[b] = 0; + } + + for (b = 1; b < gdl->npart - 1; b++) { + a = avg[b - 1] + avg[b] + avg[b + 1]; + assert(a >= 0); + if (a > 0.0f) { + m = max[b - 1]; + if (m < max[b]) + m = max[b]; + if (m < max[b + 1]) + m = max[b + 1]; + assert((gdl->numlines[b - 1] + gdl->numlines[b] + gdl->numlines[b + 1] - 1) > 0); + a = 20.0f * (m * 3.0f - a) + / (a * (gdl->numlines[b - 1] + gdl->numlines[b] + gdl->numlines[b + 1] - 1)); + k = (int) a; + if (k > last_tab_entry) + k = last_tab_entry; + mask_idx[b] = k; + } + else { + mask_idx[b] = 0; + } + } + assert(b > 0); + assert(b == gdl->npart - 1); + + a = avg[b - 1] + avg[b]; + assert(a >= 0); + if (a > 0.0f) { + m = max[b - 1]; + if (m < max[b]) + m = max[b]; + assert((gdl->numlines[b - 1] + gdl->numlines[b] - 1) > 0); + a = 20.0f * (m * 2.0f - a) + / (a * (gdl->numlines[b - 1] + gdl->numlines[b] - 1)); + k = (int) a; + if (k > last_tab_entry) + k = last_tab_entry; + mask_idx[b] = k; + } + else { + mask_idx[b] = 0; + } + assert(b == (gdl->npart - 1)); +} + + +static void +vbrpsy_compute_fft_l(lame_internal_flags * gfc, const sample_t * const buffer[2], int chn, + int gr_out, FLOAT fftenergy[HBLKSIZE], FLOAT(*wsamp_l)[BLKSIZE]) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + PsyStateVar_t *psv = &gfc->sv_psy; + plotting_data *plt = cfg->analysis ? gfc->pinfo : 0; + int j; + + if (chn < 2) { + fft_long(gfc, *wsamp_l, chn, buffer); + } + else if (chn == 2) { + FLOAT const sqrt2_half = SQRT2 * 0.5f; + /* FFT data for mid and side channel is derived from L & R */ + for (j = BLKSIZE - 1; j >= 0; --j) { + FLOAT const l = wsamp_l[0][j]; + FLOAT const r = wsamp_l[1][j]; + wsamp_l[0][j] = (l + r) * sqrt2_half; + wsamp_l[1][j] = (l - r) * sqrt2_half; + } + } + + /********************************************************************* + * compute energies + *********************************************************************/ + fftenergy[0] = wsamp_l[0][0]; + fftenergy[0] *= fftenergy[0]; + + for (j = BLKSIZE / 2 - 1; j >= 0; --j) { + FLOAT const re = (*wsamp_l)[BLKSIZE / 2 - j]; + FLOAT const im = (*wsamp_l)[BLKSIZE / 2 + j]; + fftenergy[BLKSIZE / 2 - j] = (re * re + im * im) * 0.5f; + } + /* total energy */ + { + FLOAT totalenergy = 0.0f; + for (j = 11; j < HBLKSIZE; j++) + totalenergy += fftenergy[j]; + + psv->tot_ener[chn] = totalenergy; + } + + if (plt) { + for (j = 0; j < HBLKSIZE; j++) { + plt->energy[gr_out][chn][j] = plt->energy_save[chn][j]; + plt->energy_save[chn][j] = fftenergy[j]; + } + } +} + + +static void +vbrpsy_compute_fft_s(lame_internal_flags const *gfc, const sample_t * const buffer[2], int chn, + int sblock, FLOAT(*fftenergy_s)[HBLKSIZE_s], FLOAT(*wsamp_s)[3][BLKSIZE_s]) +{ + int j; + + if (sblock == 0 && chn < 2) { + fft_short(gfc, *wsamp_s, chn, buffer); + } + if (chn == 2) { + FLOAT const sqrt2_half = SQRT2 * 0.5f; + /* FFT data for mid and side channel is derived from L & R */ + for (j = BLKSIZE_s - 1; j >= 0; --j) { + FLOAT const l = wsamp_s[0][sblock][j]; + FLOAT const r = wsamp_s[1][sblock][j]; + wsamp_s[0][sblock][j] = (l + r) * sqrt2_half; + wsamp_s[1][sblock][j] = (l - r) * sqrt2_half; + } + } + + /********************************************************************* + * compute energies + *********************************************************************/ + fftenergy_s[sblock][0] = (*wsamp_s)[sblock][0]; + fftenergy_s[sblock][0] *= fftenergy_s[sblock][0]; + for (j = BLKSIZE_s / 2 - 1; j >= 0; --j) { + FLOAT const re = (*wsamp_s)[sblock][BLKSIZE_s / 2 - j]; + FLOAT const im = (*wsamp_s)[sblock][BLKSIZE_s / 2 + j]; + fftenergy_s[sblock][BLKSIZE_s / 2 - j] = (re * re + im * im) * 0.5f; + } +} + + + /********************************************************************* + * compute loudness approximation (used for ATH auto-level adjustment) + *********************************************************************/ +static void +vbrpsy_compute_loudness_approximation_l(lame_internal_flags * gfc, int gr_out, int chn, + const FLOAT fftenergy[HBLKSIZE]) +{ + PsyStateVar_t *psv = &gfc->sv_psy; + if (chn < 2) { /*no loudness for mid/side ch */ + gfc->ov_psy.loudness_sq[gr_out][chn] = psv->loudness_sq_save[chn]; + psv->loudness_sq_save[chn] = psycho_loudness_approx(fftenergy, gfc->ATH->eql_w); + } +} + + + /********************************************************************** + * Apply HPF of fs/4 to the input signal. + * This is used for attack detection / handling. + **********************************************************************/ +static void +vbrpsy_attack_detection(lame_internal_flags * gfc, const sample_t * const buffer[2], int gr_out, + III_psy_ratio masking_ratio[2][2], III_psy_ratio masking_MS_ratio[2][2], + FLOAT energy[4], FLOAT sub_short_factor[4][3], int ns_attacks[4][4], + int uselongblock[2]) +{ + FLOAT ns_hpfsmpl[2][576]; + SessionConfig_t const *const cfg = &gfc->cfg; + PsyStateVar_t *const psv = &gfc->sv_psy; + plotting_data *plt = cfg->analysis ? gfc->pinfo : 0; + int const n_chn_out = cfg->channels_out; + /* chn=2 and 3 = Mid and Side channels */ + int const n_chn_psy = (cfg->mode == JOINT_STEREO) ? 4 : n_chn_out; + int chn, i, j; + + memset(&ns_hpfsmpl[0][0], 0, sizeof(ns_hpfsmpl)); + /* Don't copy the input buffer into a temporary buffer */ + /* unroll the loop 2 times */ + for (chn = 0; chn < n_chn_out; chn++) { + static const FLOAT fircoef[] = { + -8.65163e-18 * 2, -0.00851586 * 2, -6.74764e-18 * 2, 0.0209036 * 2, + -3.36639e-17 * 2, -0.0438162 * 2, -1.54175e-17 * 2, 0.0931738 * 2, + -5.52212e-17 * 2, -0.313819 * 2 + }; + /* apply high pass filter of fs/4 */ + const sample_t *const firbuf = &buffer[chn][576 - 350 - NSFIRLEN + 192]; + assert(dimension_of(fircoef) == ((NSFIRLEN - 1) / 2)); + for (i = 0; i < 576; i++) { + FLOAT sum1, sum2; + sum1 = firbuf[i + 10]; + sum2 = 0.0; + for (j = 0; j < ((NSFIRLEN - 1) / 2) - 1; j += 2) { + sum1 += fircoef[j] * (firbuf[i + j] + firbuf[i + NSFIRLEN - j]); + sum2 += fircoef[j + 1] * (firbuf[i + j + 1] + firbuf[i + NSFIRLEN - j - 1]); + } + ns_hpfsmpl[chn][i] = sum1 + sum2; + } + masking_ratio[gr_out][chn].en = psv->en[chn]; + masking_ratio[gr_out][chn].thm = psv->thm[chn]; + if (n_chn_psy > 2) { + /* MS maskings */ + /*percep_MS_entropy [chn-2] = gfc -> pe [chn]; */ + masking_MS_ratio[gr_out][chn].en = psv->en[chn + 2]; + masking_MS_ratio[gr_out][chn].thm = psv->thm[chn + 2]; + } + } + for (chn = 0; chn < n_chn_psy; chn++) { + FLOAT attack_intensity[12]; + FLOAT en_subshort[12]; + FLOAT en_short[4] = { 0, 0, 0, 0 }; + FLOAT const *pf = ns_hpfsmpl[chn & 1]; + int ns_uselongblock = 1; + + if (chn == 2) { + for (i = 0, j = 576; j > 0; ++i, --j) { + FLOAT const l = ns_hpfsmpl[0][i]; + FLOAT const r = ns_hpfsmpl[1][i]; + ns_hpfsmpl[0][i] = l + r; + ns_hpfsmpl[1][i] = l - r; + } + } + /*************************************************************** + * determine the block type (window type) + ***************************************************************/ + /* calculate energies of each sub-shortblocks */ + for (i = 0; i < 3; i++) { + en_subshort[i] = psv->last_en_subshort[chn][i + 6]; + assert(psv->last_en_subshort[chn][i + 4] > 0); + attack_intensity[i] = en_subshort[i] / psv->last_en_subshort[chn][i + 4]; + en_short[0] += en_subshort[i]; + } + + for (i = 0; i < 9; i++) { + FLOAT const *const pfe = pf + 576 / 9; + FLOAT p = 1.; + for (; pf < pfe; pf++) + if (p < fabs(*pf)) + p = fabs(*pf); + psv->last_en_subshort[chn][i] = en_subshort[i + 3] = p; + en_short[1 + i / 3] += p; + if (p > en_subshort[i + 3 - 2]) { + assert(en_subshort[i + 3 - 2] > 0); + p = p / en_subshort[i + 3 - 2]; + } + else if (en_subshort[i + 3 - 2] > p * 10.0f) { + assert(p > 0); + p = en_subshort[i + 3 - 2] / (p * 10.0f); + } + else { + p = 0.0; + } + attack_intensity[i + 3] = p; + } + + /* pulse like signal detection for fatboy.wav and so on */ + for (i = 0; i < 3; ++i) { + FLOAT const enn = + en_subshort[i * 3 + 3] + en_subshort[i * 3 + 4] + en_subshort[i * 3 + 5]; + FLOAT factor = 1.f; + if (en_subshort[i * 3 + 5] * 6 < enn) { + factor *= 0.5f; + if (en_subshort[i * 3 + 4] * 6 < enn) { + factor *= 0.5f; + } + } + sub_short_factor[chn][i] = factor; + } + + if (plt) { + FLOAT x = attack_intensity[0]; + for (i = 1; i < 12; i++) { + if (x < attack_intensity[i]) { + x = attack_intensity[i]; + } + } + plt->ers[gr_out][chn] = plt->ers_save[chn]; + plt->ers_save[chn] = x; + } + + /* compare energies between sub-shortblocks */ + { + FLOAT x = gfc->cd_psy->attack_threshold[chn]; + for (i = 0; i < 12; i++) { + if (ns_attacks[chn][i / 3] == 0) { + if (attack_intensity[i] > x) { + ns_attacks[chn][i / 3] = (i % 3) + 1; + } + } + } + } + /* should have energy change between short blocks, in order to avoid periodic signals */ + /* Good samples to show the effect are Trumpet test songs */ + /* GB: tuned (1) to avoid too many short blocks for test sample TRUMPET */ + /* RH: tuned (2) to let enough short blocks through for test sample FSOL and SNAPS */ + for (i = 1; i < 4; i++) { + FLOAT const u = en_short[i - 1]; + FLOAT const v = en_short[i]; + FLOAT const m = Max(u, v); + if (m < 40000) { /* (2) */ + if (u < 1.7f * v && v < 1.7f * u) { /* (1) */ + if (i == 1 && ns_attacks[chn][0] <= ns_attacks[chn][i]) { + ns_attacks[chn][0] = 0; + } + ns_attacks[chn][i] = 0; + } + } + } + + if (ns_attacks[chn][0] <= psv->last_attacks[chn]) { + ns_attacks[chn][0] = 0; + } + + if (psv->last_attacks[chn] == 3 || + ns_attacks[chn][0] + ns_attacks[chn][1] + ns_attacks[chn][2] + ns_attacks[chn][3]) { + ns_uselongblock = 0; + + if (ns_attacks[chn][1] && ns_attacks[chn][0]) { + ns_attacks[chn][1] = 0; + } + if (ns_attacks[chn][2] && ns_attacks[chn][1]) { + ns_attacks[chn][2] = 0; + } + if (ns_attacks[chn][3] && ns_attacks[chn][2]) { + ns_attacks[chn][3] = 0; + } + } + + if (chn < 2) { + uselongblock[chn] = ns_uselongblock; + } + else { + if (ns_uselongblock == 0) { + uselongblock[0] = uselongblock[1] = 0; + } + } + + /* there is a one granule delay. Copy maskings computed last call + * into masking_ratio to return to calling program. + */ + energy[chn] = psv->tot_ener[chn]; + } +} + + +static void +vbrpsy_skip_masking_s(lame_internal_flags * gfc, int chn, int sblock) +{ + if (sblock == 0) { + FLOAT *nbs2 = &gfc->sv_psy.nb_s2[chn][0]; + FLOAT *nbs1 = &gfc->sv_psy.nb_s1[chn][0]; + int const n = gfc->cd_psy->s.npart; + int b; + for (b = 0; b < n; b++) { + nbs2[b] = nbs1[b]; + } + } +} + + +static void +vbrpsy_calc_mask_index_s(lame_internal_flags const *gfc, FLOAT const *max, + FLOAT const *avg, unsigned char *mask_idx) +{ + PsyConst_CB2SB_t const *const gds = &gfc->cd_psy->s; + FLOAT m, a; + int b, k; + int const last_tab_entry = dimension_of(tab) - 1; + b = 0; + a = avg[b] + avg[b + 1]; + assert(a >= 0); + if (a > 0.0f) { + m = max[b]; + if (m < max[b + 1]) + m = max[b + 1]; + assert((gds->numlines[b] + gds->numlines[b + 1] - 1) > 0); + a = 20.0f * (m * 2.0f - a) + / (a * (gds->numlines[b] + gds->numlines[b + 1] - 1)); + k = (int) a; + if (k > last_tab_entry) + k = last_tab_entry; + mask_idx[b] = k; + } + else { + mask_idx[b] = 0; + } + + for (b = 1; b < gds->npart - 1; b++) { + a = avg[b - 1] + avg[b] + avg[b + 1]; + assert(b + 1 < gds->npart); + assert(a >= 0); + if (a > 0.0) { + m = max[b - 1]; + if (m < max[b]) + m = max[b]; + if (m < max[b + 1]) + m = max[b + 1]; + assert((gds->numlines[b - 1] + gds->numlines[b] + gds->numlines[b + 1] - 1) > 0); + a = 20.0f * (m * 3.0f - a) + / (a * (gds->numlines[b - 1] + gds->numlines[b] + gds->numlines[b + 1] - 1)); + k = (int) a; + if (k > last_tab_entry) + k = last_tab_entry; + mask_idx[b] = k; + } + else { + mask_idx[b] = 0; + } + } + assert(b > 0); + assert(b == gds->npart - 1); + + a = avg[b - 1] + avg[b]; + assert(a >= 0); + if (a > 0.0f) { + m = max[b - 1]; + if (m < max[b]) + m = max[b]; + assert((gds->numlines[b - 1] + gds->numlines[b] - 1) > 0); + a = 20.0f * (m * 2.0f - a) + / (a * (gds->numlines[b - 1] + gds->numlines[b] - 1)); + k = (int) a; + if (k > last_tab_entry) + k = last_tab_entry; + mask_idx[b] = k; + } + else { + mask_idx[b] = 0; + } + assert(b == (gds->npart - 1)); +} + + +static void +vbrpsy_compute_masking_s(lame_internal_flags * gfc, const FLOAT(*fftenergy_s)[HBLKSIZE_s], + FLOAT * eb, FLOAT * thr, int chn, int sblock) +{ + PsyStateVar_t *const psv = &gfc->sv_psy; + PsyConst_CB2SB_t const *const gds = &gfc->cd_psy->s; + FLOAT max[CBANDS], avg[CBANDS]; + int i, j, b; + unsigned char mask_idx_s[CBANDS]; + + memset(max, 0, sizeof(max)); + memset(avg, 0, sizeof(avg)); + + for (b = j = 0; b < gds->npart; ++b) { + FLOAT ebb = 0, m = 0; + int const n = gds->numlines[b]; + for (i = 0; i < n; ++i, ++j) { + FLOAT const el = fftenergy_s[sblock][j]; + ebb += el; + if (m < el) + m = el; + } + eb[b] = ebb; + assert(ebb >= 0); + max[b] = m; + assert(n > 0); + avg[b] = ebb * gds->rnumlines[b]; + assert(avg[b] >= 0); + } + assert(b == gds->npart); + assert(j == 129); + vbrpsy_calc_mask_index_s(gfc, max, avg, mask_idx_s); + for (j = b = 0; b < gds->npart; b++) { + int kk = gds->s3ind[b][0]; + int const last = gds->s3ind[b][1]; + int const delta = mask_add_delta(mask_idx_s[b]); + int dd, dd_n; + FLOAT x, ecb, avg_mask; + FLOAT const masking_lower = gds->masking_lower[b] * gfc->sv_qnt.masking_lower; + + dd = mask_idx_s[kk]; + dd_n = 1; + ecb = gds->s3[j] * eb[kk] * tab[mask_idx_s[kk]]; + ++j, ++kk; + while (kk <= last) { + dd += mask_idx_s[kk]; + dd_n += 1; + x = gds->s3[j] * eb[kk] * tab[mask_idx_s[kk]]; + ecb = vbrpsy_mask_add(ecb, x, kk - b, delta); + ++j, ++kk; + } + dd = (1 + 2 * dd) / (2 * dd_n); + avg_mask = tab[dd] * 0.5f; + ecb *= avg_mask; +#if 0 /* we can do PRE ECHO control now here, or do it later */ + if (psv->blocktype_old[chn & 0x01] == SHORT_TYPE) { + /* limit calculated threshold by even older granule */ + FLOAT const t1 = rpelev_s * psv->nb_s1[chn][b]; + FLOAT const t2 = rpelev2_s * psv->nb_s2[chn][b]; + FLOAT const tm = (t2 > 0) ? Min(ecb, t2) : ecb; + thr[b] = (t1 > 0) ? NS_INTERP(Min(tm, t1), ecb, 0.6) : ecb; + } + else { + /* limit calculated threshold by older granule */ + FLOAT const t1 = rpelev_s * psv->nb_s1[chn][b]; + thr[b] = (t1 > 0) ? NS_INTERP(Min(ecb, t1), ecb, 0.6) : ecb; + } +#else /* we do it later */ + thr[b] = ecb; +#endif + psv->nb_s2[chn][b] = psv->nb_s1[chn][b]; + psv->nb_s1[chn][b] = ecb; + { + /* if THR exceeds EB, the quantization routines will take the difference + * from other bands. in case of strong tonal samples (tonaltest.wav) + * this leads to heavy distortions. that's why we limit THR here. + */ + x = max[b]; + x *= gds->minval[b]; + x *= avg_mask; + if (thr[b] > x) { + thr[b] = x; + } + } + if (masking_lower > 1) { + thr[b] *= masking_lower; + } + if (thr[b] > eb[b]) { + thr[b] = eb[b]; + } + if (masking_lower < 1) { + thr[b] *= masking_lower; + } + + assert(thr[b] >= 0); + } + for (; b < CBANDS; ++b) { + eb[b] = 0; + thr[b] = 0; + } +} + + +static void +vbrpsy_compute_masking_l(lame_internal_flags * gfc, const FLOAT fftenergy[HBLKSIZE], + FLOAT eb_l[CBANDS], FLOAT thr[CBANDS], int chn) +{ + PsyStateVar_t *const psv = &gfc->sv_psy; + PsyConst_CB2SB_t const *const gdl = &gfc->cd_psy->l; + FLOAT max[CBANDS], avg[CBANDS]; + unsigned char mask_idx_l[CBANDS + 2]; + int k, b; + + /********************************************************************* + * Calculate the energy and the tonality of each partition. + *********************************************************************/ + calc_energy(gdl, fftenergy, eb_l, max, avg); + calc_mask_index_l(gfc, max, avg, mask_idx_l); + + /********************************************************************* + * convolve the partitioned energy and unpredictability + * with the spreading function, s3_l[b][k] + ********************************************************************/ + k = 0; + for (b = 0; b < gdl->npart; b++) { + FLOAT x, ecb, avg_mask, t; + FLOAT const masking_lower = gdl->masking_lower[b] * gfc->sv_qnt.masking_lower; + /* convolve the partitioned energy with the spreading function */ + int kk = gdl->s3ind[b][0]; + int const last = gdl->s3ind[b][1]; + int const delta = mask_add_delta(mask_idx_l[b]); + int dd = 0, dd_n = 0; + + dd = mask_idx_l[kk]; + dd_n += 1; + ecb = gdl->s3[k] * eb_l[kk] * tab[mask_idx_l[kk]]; + ++k, ++kk; + while (kk <= last) { + dd += mask_idx_l[kk]; + dd_n += 1; + x = gdl->s3[k] * eb_l[kk] * tab[mask_idx_l[kk]]; + t = vbrpsy_mask_add(ecb, x, kk - b, delta); +#if 0 + ecb += eb_l[kk]; + if (ecb > t) { + ecb = t; + } +#else + ecb = t; +#endif + ++k, ++kk; + } + dd = (1 + 2 * dd) / (2 * dd_n); + avg_mask = tab[dd] * 0.5f; + ecb *= avg_mask; + + /**** long block pre-echo control ****/ + /* dont use long block pre-echo control if previous granule was + * a short block. This is to avoid the situation: + * frame0: quiet (very low masking) + * frame1: surge (triggers short blocks) + * frame2: regular frame. looks like pre-echo when compared to + * frame0, but all pre-echo was in frame1. + */ + /* chn=0,1 L and R channels + chn=2,3 S and M channels. + */ + if (psv->blocktype_old[chn & 0x01] == SHORT_TYPE) { + FLOAT const ecb_limit = rpelev * psv->nb_l1[chn][b]; + if (ecb_limit > 0) { + thr[b] = Min(ecb, ecb_limit); + } + else { + /* Robert 071209: + Because we don't calculate long block psy when we know a granule + should be of short blocks, we don't have any clue how the granule + before would have looked like as a long block. So we have to guess + a little bit for this END_TYPE block. + Most of the time we get away with this sloppyness. (fingers crossed :) + The speed increase is worth it. + */ + thr[b] = Min(ecb, eb_l[b] * NS_PREECHO_ATT2); + } + } + else { + FLOAT ecb_limit_2 = rpelev2 * psv->nb_l2[chn][b]; + FLOAT ecb_limit_1 = rpelev * psv->nb_l1[chn][b]; + FLOAT ecb_limit; + if (ecb_limit_2 <= 0) { + ecb_limit_2 = ecb; + } + if (ecb_limit_1 <= 0) { + ecb_limit_1 = ecb; + } + if (psv->blocktype_old[chn & 0x01] == NORM_TYPE) { + ecb_limit = Min(ecb_limit_1, ecb_limit_2); + } + else { + ecb_limit = ecb_limit_1; + } + thr[b] = Min(ecb, ecb_limit); + } + psv->nb_l2[chn][b] = psv->nb_l1[chn][b]; + psv->nb_l1[chn][b] = ecb; + { + /* if THR exceeds EB, the quantization routines will take the difference + * from other bands. in case of strong tonal samples (tonaltest.wav) + * this leads to heavy distortions. that's why we limit THR here. + */ + x = max[b]; + x *= gdl->minval[b]; + x *= avg_mask; + if (thr[b] > x) { + thr[b] = x; + } + } + if (masking_lower > 1) { + thr[b] *= masking_lower; + } + if (thr[b] > eb_l[b]) { + thr[b] = eb_l[b]; + } + if (masking_lower < 1) { + thr[b] *= masking_lower; + } + assert(thr[b] >= 0); + } + for (; b < CBANDS; ++b) { + eb_l[b] = 0; + thr[b] = 0; + } +} + + +static void +vbrpsy_compute_block_type(SessionConfig_t const *cfg, int *uselongblock) +{ + int chn; + + if (cfg->short_blocks == short_block_coupled + /* force both channels to use the same block type */ + /* this is necessary if the frame is to be encoded in ms_stereo. */ + /* But even without ms_stereo, FhG does this */ + && !(uselongblock[0] && uselongblock[1])) + uselongblock[0] = uselongblock[1] = 0; + + for (chn = 0; chn < cfg->channels_out; chn++) { + /* disable short blocks */ + if (cfg->short_blocks == short_block_dispensed) { + uselongblock[chn] = 1; + } + if (cfg->short_blocks == short_block_forced) { + uselongblock[chn] = 0; + } + } +} + + +static void +vbrpsy_apply_block_type(PsyStateVar_t * psv, int nch, int const *uselongblock, int *blocktype_d) +{ + int chn; + + /* update the blocktype of the previous granule, since it depends on what + * happend in this granule */ + for (chn = 0; chn < nch; chn++) { + int blocktype = NORM_TYPE; + /* disable short blocks */ + + if (uselongblock[chn]) { + /* no attack : use long blocks */ + assert(psv->blocktype_old[chn] != START_TYPE); + if (psv->blocktype_old[chn] == SHORT_TYPE) + blocktype = STOP_TYPE; + } + else { + /* attack : use short blocks */ + blocktype = SHORT_TYPE; + if (psv->blocktype_old[chn] == NORM_TYPE) { + psv->blocktype_old[chn] = START_TYPE; + } + if (psv->blocktype_old[chn] == STOP_TYPE) + psv->blocktype_old[chn] = SHORT_TYPE; + } + + blocktype_d[chn] = psv->blocktype_old[chn]; /* value returned to calling program */ + psv->blocktype_old[chn] = blocktype; /* save for next call to l3psy_anal */ + } +} + + +/*************************************************************** + * compute M/S thresholds from Johnston & Ferreira 1992 ICASSP paper + ***************************************************************/ + +static void +vbrpsy_compute_MS_thresholds(const FLOAT eb[4][CBANDS], FLOAT thr[4][CBANDS], + const FLOAT cb_mld[CBANDS], const FLOAT ath_cb[CBANDS], FLOAT athlower, + FLOAT msfix, int n) +{ + FLOAT const msfix2 = msfix * 2.f; + FLOAT rside, rmid; + int b; + for (b = 0; b < n; ++b) { + FLOAT const ebM = eb[2][b]; + FLOAT const ebS = eb[3][b]; + FLOAT const thmL = thr[0][b]; + FLOAT const thmR = thr[1][b]; + FLOAT thmM = thr[2][b]; + FLOAT thmS = thr[3][b]; + + /* use this fix if L & R masking differs by 2db or less */ + /* if db = 10*log10(x2/x1) < 2 */ + /* if (x2 < 1.58*x1) { */ + if (thmL <= 1.58f * thmR && thmR <= 1.58f * thmL) { + FLOAT const mld_m = cb_mld[b] * ebS; + FLOAT const mld_s = cb_mld[b] * ebM; + FLOAT const tmp_m = Min(thmS, mld_m); + FLOAT const tmp_s = Min(thmM, mld_s); + rmid = Max(thmM, tmp_m); + rside = Max(thmS, tmp_s); + } + else { + rmid = thmM; + rside = thmS; + } + if (msfix > 0.f) { + /***************************************************************/ + /* Adjust M/S maskings if user set "msfix" */ + /***************************************************************/ + /* Naoki Shibata 2000 */ + FLOAT thmLR, thmMS; + FLOAT const ath = ath_cb[b] * athlower; + FLOAT const tmp_l = Max(thmL, ath); + FLOAT const tmp_r = Max(thmR, ath); + thmLR = Min(tmp_l, tmp_r); + thmM = Max(rmid, ath); + thmS = Max(rside, ath); + thmMS = thmM + thmS; + if (thmMS > 0.f && (thmLR * msfix2) < thmMS) { + FLOAT const f = thmLR * msfix2 / thmMS; + thmM *= f; + thmS *= f; + assert(thmMS > 0.f); + } + rmid = Min(thmM, rmid); + rside = Min(thmS, rside); + } + if (rmid > ebM) { + rmid = ebM; + } + if (rside > ebS) { + rside = ebS; + } + thr[2][b] = rmid; + thr[3][b] = rside; + } +} + + +/* + * NOTE: the bitrate reduction from the inter-channel masking effect is low + * compared to the chance of getting annyoing artefacts. L3psycho_anal_vbr does + * not use this feature. (Robert 071216) +*/ + +int +L3psycho_anal_vbr(lame_internal_flags * gfc, + const sample_t * const buffer[2], int gr_out, + III_psy_ratio masking_ratio[2][2], + III_psy_ratio masking_MS_ratio[2][2], + FLOAT percep_entropy[2], FLOAT percep_MS_entropy[2], + FLOAT energy[4], int blocktype_d[2]) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + PsyStateVar_t *const psv = &gfc->sv_psy; + PsyConst_CB2SB_t const *const gdl = &gfc->cd_psy->l; + PsyConst_CB2SB_t const *const gds = &gfc->cd_psy->s; + plotting_data *plt = cfg->analysis ? gfc->pinfo : 0; + + III_psy_xmin last_thm[4]; + + /* fft and energy calculation */ + FLOAT(*wsamp_l)[BLKSIZE]; + FLOAT(*wsamp_s)[3][BLKSIZE_s]; + FLOAT fftenergy[HBLKSIZE]; + FLOAT fftenergy_s[3][HBLKSIZE_s]; + FLOAT wsamp_L[2][BLKSIZE]; + FLOAT wsamp_S[2][3][BLKSIZE_s]; + FLOAT eb[4][CBANDS], thr[4][CBANDS]; + + FLOAT sub_short_factor[4][3]; + FLOAT thmm; + FLOAT const pcfact = 0.6f; + FLOAT const ath_factor = + (cfg->msfix > 0.f) ? (cfg->ATH_offset_factor * gfc->ATH->adjust_factor) : 1.f; + + const FLOAT(*const_eb)[CBANDS] = (const FLOAT(*)[CBANDS]) eb; + const FLOAT(*const_fftenergy_s)[HBLKSIZE_s] = (const FLOAT(*)[HBLKSIZE_s]) fftenergy_s; + + /* block type */ + int ns_attacks[4][4] = { {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} }; + int uselongblock[2]; + + /* usual variables like loop indices, etc.. */ + int chn, sb, sblock; + + /* chn=2 and 3 = Mid and Side channels */ + int const n_chn_psy = (cfg->mode == JOINT_STEREO) ? 4 : cfg->channels_out; + + memcpy(&last_thm[0], &psv->thm[0], sizeof(last_thm)); + + vbrpsy_attack_detection(gfc, buffer, gr_out, masking_ratio, masking_MS_ratio, energy, + sub_short_factor, ns_attacks, uselongblock); + + vbrpsy_compute_block_type(cfg, uselongblock); + + /* LONG BLOCK CASE */ + { + for (chn = 0; chn < n_chn_psy; chn++) { + int const ch01 = chn & 0x01; + + wsamp_l = wsamp_L + ch01; + vbrpsy_compute_fft_l(gfc, buffer, chn, gr_out, fftenergy, wsamp_l); + vbrpsy_compute_loudness_approximation_l(gfc, gr_out, chn, fftenergy); + vbrpsy_compute_masking_l(gfc, fftenergy, eb[chn], thr[chn], chn); + } + if (cfg->mode == JOINT_STEREO) { + if ((uselongblock[0] + uselongblock[1]) == 2) { + vbrpsy_compute_MS_thresholds(const_eb, thr, gdl->mld_cb, gfc->ATH->cb_l, + ath_factor, cfg->msfix, gdl->npart); + } + } + /* TODO: apply adaptive ATH masking here ?? */ + for (chn = 0; chn < n_chn_psy; chn++) { + convert_partition2scalefac_l(gfc, eb[chn], thr[chn], chn); + convert_partition2scalefac_l_to_s(gfc, eb[chn], thr[chn], chn); + } + } + /* SHORT BLOCKS CASE */ + { + int const force_short_block_calc = gfc->cd_psy->force_short_block_calc; + for (sblock = 0; sblock < 3; sblock++) { + for (chn = 0; chn < n_chn_psy; ++chn) { + int const ch01 = chn & 0x01; + if (uselongblock[ch01] && !force_short_block_calc) { + vbrpsy_skip_masking_s(gfc, chn, sblock); + } + else { + /* compute masking thresholds for short blocks */ + wsamp_s = wsamp_S + ch01; + vbrpsy_compute_fft_s(gfc, buffer, chn, sblock, fftenergy_s, wsamp_s); + vbrpsy_compute_masking_s(gfc, const_fftenergy_s, eb[chn], thr[chn], chn, + sblock); + } + } + if (cfg->mode == JOINT_STEREO) { + if ((uselongblock[0] + uselongblock[1]) == 0) { + vbrpsy_compute_MS_thresholds(const_eb, thr, gds->mld_cb, gfc->ATH->cb_s, + ath_factor, cfg->msfix, gds->npart); + } + } + /* TODO: apply adaptive ATH masking here ?? */ + for (chn = 0; chn < n_chn_psy; ++chn) { + int const ch01 = chn & 0x01; + if (!uselongblock[ch01] || force_short_block_calc) { + convert_partition2scalefac_s(gfc, eb[chn], thr[chn], chn, sblock); + } + } + } + + /**** short block pre-echo control ****/ + for (chn = 0; chn < n_chn_psy; chn++) { + for (sb = 0; sb < SBMAX_s; sb++) { + FLOAT new_thmm[3], prev_thm, t1, t2; + for (sblock = 0; sblock < 3; sblock++) { + thmm = psv->thm[chn].s[sb][sblock]; + thmm *= NS_PREECHO_ATT0; + + t1 = t2 = thmm; + + if (sblock > 0) { + prev_thm = new_thmm[sblock - 1]; + } + else { + prev_thm = last_thm[chn].s[sb][2]; + } + if (ns_attacks[chn][sblock] >= 2 || ns_attacks[chn][sblock + 1] == 1) { + t1 = NS_INTERP(prev_thm, thmm, NS_PREECHO_ATT1 * pcfact); + } + thmm = Min(t1, thmm); + if (ns_attacks[chn][sblock] == 1) { + t2 = NS_INTERP(prev_thm, thmm, NS_PREECHO_ATT2 * pcfact); + } + else if ((sblock == 0 && psv->last_attacks[chn] == 3) + || (sblock > 0 && ns_attacks[chn][sblock - 1] == 3)) { /* 2nd preceeding block */ + switch (sblock) { + case 0: + prev_thm = last_thm[chn].s[sb][1]; + break; + case 1: + prev_thm = last_thm[chn].s[sb][2]; + break; + case 2: + prev_thm = new_thmm[0]; + break; + } + t2 = NS_INTERP(prev_thm, thmm, NS_PREECHO_ATT2 * pcfact); + } + + thmm = Min(t1, thmm); + thmm = Min(t2, thmm); + + /* pulse like signal detection for fatboy.wav and so on */ + thmm *= sub_short_factor[chn][sblock]; + + new_thmm[sblock] = thmm; + } + for (sblock = 0; sblock < 3; sblock++) { + psv->thm[chn].s[sb][sblock] = new_thmm[sblock]; + } + } + } + } + for (chn = 0; chn < n_chn_psy; chn++) { + psv->last_attacks[chn] = ns_attacks[chn][2]; + } + + + /*************************************************************** + * determine final block type + ***************************************************************/ + vbrpsy_apply_block_type(psv, cfg->channels_out, uselongblock, blocktype_d); + + /********************************************************************* + * compute the value of PE to return ... no delay and advance + *********************************************************************/ + for (chn = 0; chn < n_chn_psy; chn++) { + FLOAT *ppe; + int type; + III_psy_ratio const *mr; + + if (chn > 1) { + ppe = percep_MS_entropy - 2; + type = NORM_TYPE; + if (blocktype_d[0] == SHORT_TYPE || blocktype_d[1] == SHORT_TYPE) + type = SHORT_TYPE; + mr = &masking_MS_ratio[gr_out][chn - 2]; + } + else { + ppe = percep_entropy; + type = blocktype_d[chn]; + mr = &masking_ratio[gr_out][chn]; + } + if (type == SHORT_TYPE) { + ppe[chn] = pecalc_s(mr, gfc->sv_qnt.masking_lower); + } + else { + ppe[chn] = pecalc_l(mr, gfc->sv_qnt.masking_lower); + } + + if (plt) { + plt->pe[gr_out][chn] = ppe[chn]; + } + } + return 0; +} + + + + +/* + * The spreading function. Values returned in units of energy + */ +static FLOAT +s3_func(FLOAT bark) +{ + FLOAT tempx, x, tempy, temp; + tempx = bark; + if (tempx >= 0) + tempx *= 3; + else + tempx *= 1.5; + + if (tempx >= 0.5 && tempx <= 2.5) { + temp = tempx - 0.5; + x = 8.0 * (temp * temp - 2.0 * temp); + } + else + x = 0.0; + tempx += 0.474; + tempy = 15.811389 + 7.5 * tempx - 17.5 * sqrt(1.0 + tempx * tempx); + + if (tempy <= -60.0) + return 0.0; + + tempx = exp((x + tempy) * LN_TO_LOG10); + + /* Normalization. The spreading function should be normalized so that: + +inf + / + | s3 [ bark ] d(bark) = 1 + / + -inf + */ + tempx /= .6609193; + return tempx; +} + +#if 0 +static FLOAT +norm_s3_func(void) +{ + double lim_a = 0, lim_b = 0; + double x = 0, l, h; + for (x = 0; s3_func(x) > 1e-20; x -= 1); + l = x; + h = 0; + while (fabs(h - l) > 1e-12) { + x = (h + l) / 2; + if (s3_func(x) > 0) { + h = x; + } + else { + l = x; + } + } + lim_a = l; + for (x = 0; s3_func(x) > 1e-20; x += 1); + l = 0; + h = x; + while (fabs(h - l) > 1e-12) { + x = (h + l) / 2; + if (s3_func(x) > 0) { + l = x; + } + else { + h = x; + } + } + lim_b = h; + { + double sum = 0; + int const m = 1000; + int i; + for (i = 0; i <= m; ++i) { + double x = lim_a + i * (lim_b - lim_a) / m; + double y = s3_func(x); + sum += y; + } + { + double norm = (m + 1) / (sum * (lim_b - lim_a)); + /*printf( "norm = %lf\n",norm); */ + return norm; + } + } +} +#endif + +static FLOAT +stereo_demask(double f) +{ + /* setup stereo demasking thresholds */ + /* formula reverse enginerred from plot in paper */ + double arg = freq2bark(f); + arg = (Min(arg, 15.5) / 15.5); + + return pow(10.0, 1.25 * (1 - cos(PI * arg)) - 2.5); +} + +static void +init_numline(PsyConst_CB2SB_t * gd, FLOAT sfreq, int fft_size, + int mdct_size, int sbmax, int const *scalepos) +{ + FLOAT b_frq[CBANDS + 1]; + FLOAT const mdct_freq_frac = sfreq / (2.0f * mdct_size); + FLOAT const deltafreq = fft_size / (2.0f * mdct_size); + int partition[HBLKSIZE] = { 0 }; + int i, j, ni; + int sfb; + sfreq /= fft_size; + j = 0; + ni = 0; + /* compute numlines, the number of spectral lines in each partition band */ + /* each partition band should be about DELBARK wide. */ + for (i = 0; i < CBANDS; i++) { + FLOAT bark1; + int j2, nl; + bark1 = freq2bark(sfreq * j); + + b_frq[i] = sfreq * j; + + for (j2 = j; freq2bark(sfreq * j2) - bark1 < DELBARK && j2 <= fft_size / 2; j2++); + + nl = j2 - j; + gd->numlines[i] = nl; + gd->rnumlines[i] = (nl > 0) ? (1.0f / nl) : 0; + + ni = i + 1; + + while (j < j2) { + assert(j < HBLKSIZE); + partition[j++] = i; + } + if (j > fft_size / 2) { + j = fft_size / 2; + ++i; + break; + } + } + assert(i < CBANDS); + b_frq[i] = sfreq * j; + + gd->n_sb = sbmax; + gd->npart = ni; + + { + j = 0; + for (i = 0; i < gd->npart; i++) { + int const nl = gd->numlines[i]; + FLOAT const freq = sfreq * (j + nl / 2); + gd->mld_cb[i] = stereo_demask(freq); + j += nl; + } + for (; i < CBANDS; ++i) { + gd->mld_cb[i] = 1; + } + } + for (sfb = 0; sfb < sbmax; sfb++) { + int i1, i2, bo; + int start = scalepos[sfb]; + int end = scalepos[sfb + 1]; + + i1 = floor(.5 + deltafreq * (start - .5)); + if (i1 < 0) + i1 = 0; + i2 = floor(.5 + deltafreq * (end - .5)); + + if (i2 > fft_size / 2) + i2 = fft_size / 2; + + bo = partition[i2]; + gd->bm[sfb] = (partition[i1] + partition[i2]) / 2; + gd->bo[sfb] = bo; + + /* calculate how much of this band belongs to current scalefactor band */ + { + FLOAT const f_tmp = mdct_freq_frac * end; + FLOAT bo_w = (f_tmp - b_frq[bo]) / (b_frq[bo + 1] - b_frq[bo]); + if (bo_w < 0) { + bo_w = 0; + } + else { + if (bo_w > 1) { + bo_w = 1; + } + } + gd->bo_weight[sfb] = bo_w; + } + gd->mld[sfb] = stereo_demask(mdct_freq_frac * start); + } +} + +static void +compute_bark_values(PsyConst_CB2SB_t const *gd, FLOAT sfreq, int fft_size, + FLOAT * bval, FLOAT * bval_width) +{ + /* compute bark values of each critical band */ + int k, j = 0, ni = gd->npart; + sfreq /= fft_size; + for (k = 0; k < ni; k++) { + int const w = gd->numlines[k]; + FLOAT bark1, bark2; + + bark1 = freq2bark(sfreq * (j)); + bark2 = freq2bark(sfreq * (j + w - 1)); + bval[k] = .5 * (bark1 + bark2); + + bark1 = freq2bark(sfreq * (j - .5)); + bark2 = freq2bark(sfreq * (j + w - .5)); + bval_width[k] = bark2 - bark1; + j += w; + } +} + +static int +init_s3_values(FLOAT ** p, int (*s3ind)[2], int npart, + FLOAT const *bval, FLOAT const *bval_width, FLOAT const *norm) +{ + FLOAT s3[CBANDS][CBANDS]; + /* The s3 array is not linear in the bark scale. + * bval[x] should be used to get the bark value. + */ + int i, j, k; + int numberOfNoneZero = 0; + + memset(&s3[0][0], 0, sizeof(s3)); + + /* s[i][j], the value of the spreading function, + * centered at band j (masker), for band i (maskee) + * + * i.e.: sum over j to spread into signal barkval=i + * NOTE: i and j are used opposite as in the ISO docs + */ + for (i = 0; i < npart; i++) { + for (j = 0; j < npart; j++) { + FLOAT v = s3_func(bval[i] - bval[j]) * bval_width[j]; + s3[i][j] = v * norm[i]; + } + } + for (i = 0; i < npart; i++) { + for (j = 0; j < npart; j++) { + if (s3[i][j] > 0.0f) + break; + } + s3ind[i][0] = j; + + for (j = npart - 1; j > 0; j--) { + if (s3[i][j] > 0.0f) + break; + } + s3ind[i][1] = j; + numberOfNoneZero += (s3ind[i][1] - s3ind[i][0] + 1); + } + *p = lame_calloc(FLOAT, numberOfNoneZero); + if (!*p) + return -1; + + k = 0; + for (i = 0; i < npart; i++) + for (j = s3ind[i][0]; j <= s3ind[i][1]; j++) + (*p)[k++] = s3[i][j]; + + return 0; +} + +int +psymodel_init(lame_global_flags const *gfp) +{ + lame_internal_flags *const gfc = gfp->internal_flags; + SessionConfig_t *const cfg = &gfc->cfg; + PsyStateVar_t *const psv = &gfc->sv_psy; + PsyConst_t *gd; + int i, j, b, sb, k; + FLOAT bvl_a = 13, bvl_b = 24; + FLOAT snr_l_a = 0, snr_l_b = 0; + FLOAT snr_s_a = -8.25, snr_s_b = -4.5; + + FLOAT bval[CBANDS]; + FLOAT bval_width[CBANDS]; + FLOAT norm[CBANDS]; + FLOAT const sfreq = cfg->samplerate_out; + + FLOAT xav = 10, xbv = 12; + FLOAT const minval_low = (0.f - cfg->minval); + + if (gfc->cd_psy != 0) { + return 0; + } + memset(norm, 0, sizeof(norm)); + + gd = lame_calloc(PsyConst_t, 1); + gfc->cd_psy = gd; + + gd->force_short_block_calc = gfp->experimentalZ; + + psv->blocktype_old[0] = psv->blocktype_old[1] = NORM_TYPE; /* the vbr header is long blocks */ + + for (i = 0; i < 4; ++i) { + for (j = 0; j < CBANDS; ++j) { + psv->nb_l1[i][j] = 1e20; + psv->nb_l2[i][j] = 1e20; + psv->nb_s1[i][j] = psv->nb_s2[i][j] = 1.0; + } + for (sb = 0; sb < SBMAX_l; sb++) { + psv->en[i].l[sb] = 1e20; + psv->thm[i].l[sb] = 1e20; + } + for (j = 0; j < 3; ++j) { + for (sb = 0; sb < SBMAX_s; sb++) { + psv->en[i].s[sb][j] = 1e20; + psv->thm[i].s[sb][j] = 1e20; + } + psv->last_attacks[i] = 0; + } + for (j = 0; j < 9; j++) + psv->last_en_subshort[i][j] = 10.; + } + + + /* init. for loudness approx. -jd 2001 mar 27 */ + psv->loudness_sq_save[0] = psv->loudness_sq_save[1] = 0.0; + + + + /************************************************************************* + * now compute the psychoacoustic model specific constants + ************************************************************************/ + /* compute numlines, bo, bm, bval, bval_width, mld */ + init_numline(&gd->l, sfreq, BLKSIZE, 576, SBMAX_l, gfc->scalefac_band.l); + assert(gd->l.npart < CBANDS); + compute_bark_values(&gd->l, sfreq, BLKSIZE, bval, bval_width); + + /* compute the spreading function */ + for (i = 0; i < gd->l.npart; i++) { + double snr = snr_l_a; + if (bval[i] >= bvl_a) { + snr = snr_l_b * (bval[i] - bvl_a) / (bvl_b - bvl_a) + + snr_l_a * (bvl_b - bval[i]) / (bvl_b - bvl_a); + } + norm[i] = pow(10.0, snr / 10.0); + } + i = init_s3_values(&gd->l.s3, gd->l.s3ind, gd->l.npart, bval, bval_width, norm); + if (i) + return i; + + /* compute long block specific values, ATH and MINVAL */ + j = 0; + for (i = 0; i < gd->l.npart; i++) { + double x; + + /* ATH */ + x = FLOAT_MAX; + for (k = 0; k < gd->l.numlines[i]; k++, j++) { + FLOAT const freq = sfreq * j / (1000.0 * BLKSIZE); + FLOAT level; + /* freq = Min(.1,freq); *//* ATH below 100 Hz constant, not further climbing */ + level = ATHformula(cfg, freq * 1000) - 20; /* scale to FFT units; returned value is in dB */ + level = pow(10., 0.1 * level); /* convert from dB -> energy */ + level *= gd->l.numlines[i]; + if (x > level) + x = level; + } + gfc->ATH->cb_l[i] = x; + + /* MINVAL. + For low freq, the strength of the masking is limited by minval + this is an ISO MPEG1 thing, dont know if it is really needed */ + /* FIXME: it does work to reduce low-freq problems in S53-Wind-Sax + and lead-voice samples, but introduces some 3 kbps bit bloat too. + TODO: Further refinement of the shape of this hack. + */ + x = 20.0 * (bval[i] / xav - 1.0); + if (x > 6) { + x = 30; + } + if (x < minval_low) { + x = minval_low; + } + if (cfg->samplerate_out < 44000) { + x = 30; + } + x -= 8.; + gd->l.minval[i] = pow(10.0, x / 10.) * gd->l.numlines[i]; + } + + /************************************************************************ + * do the same things for short blocks + ************************************************************************/ + init_numline(&gd->s, sfreq, BLKSIZE_s, 192, SBMAX_s, gfc->scalefac_band.s); + assert(gd->s.npart < CBANDS); + compute_bark_values(&gd->s, sfreq, BLKSIZE_s, bval, bval_width); + + /* SNR formula. short block is normalized by SNR. is it still right ? */ + j = 0; + for (i = 0; i < gd->s.npart; i++) { + double x; + double snr = snr_s_a; + if (bval[i] >= bvl_a) { + snr = snr_s_b * (bval[i] - bvl_a) / (bvl_b - bvl_a) + + snr_s_a * (bvl_b - bval[i]) / (bvl_b - bvl_a); + } + norm[i] = pow(10.0, snr / 10.0); + + /* ATH */ + x = FLOAT_MAX; + for (k = 0; k < gd->s.numlines[i]; k++, j++) { + FLOAT const freq = sfreq * j / (1000.0 * BLKSIZE_s); + FLOAT level; + /* freq = Min(.1,freq); *//* ATH below 100 Hz constant, not further climbing */ + level = ATHformula(cfg, freq * 1000) - 20; /* scale to FFT units; returned value is in dB */ + level = pow(10., 0.1 * level); /* convert from dB -> energy */ + level *= gd->s.numlines[i]; + if (x > level) + x = level; + } + gfc->ATH->cb_s[i] = x; + + /* MINVAL. + For low freq, the strength of the masking is limited by minval + this is an ISO MPEG1 thing, dont know if it is really needed */ + x = 7.0 * (bval[i] / xbv - 1.0); + if (bval[i] > xbv) { + x *= 1 + log(1 + x) * 3.1; + } + if (bval[i] < xbv) { + x *= 1 + log(1 - x) * 2.3; + } + if (x > 6) { + x = 30; + } + if (x < minval_low) { + x = minval_low; + } + if (cfg->samplerate_out < 44000) { + x = 30; + } + x -= 8; + gd->s.minval[i] = pow(10.0, x / 10) * gd->s.numlines[i]; + } + + i = init_s3_values(&gd->s.s3, gd->s.s3ind, gd->s.npart, bval, bval_width, norm); + if (i) + return i; + + + init_mask_add_max_values(); + init_fft(gfc); + + /* setup temporal masking */ + gd->decay = exp(-1.0 * LOG10 / (temporalmask_sustain_sec * sfreq / 192.0)); + + { + FLOAT msfix; + msfix = NS_MSFIX; + if (cfg->use_safe_joint_stereo) + msfix = 1.0; + if (fabs(cfg->msfix) > 0.0) + msfix = cfg->msfix; + cfg->msfix = msfix; + + /* spread only from npart_l bands. Normally, we use the spreading + * function to convolve from npart_l down to npart_l bands + */ + for (b = 0; b < gd->l.npart; b++) + if (gd->l.s3ind[b][1] > gd->l.npart - 1) + gd->l.s3ind[b][1] = gd->l.npart - 1; + } + + /* prepare for ATH auto adjustment: + * we want to decrease the ATH by 12 dB per second + */ +#define frame_duration (576. * cfg->mode_gr / sfreq) + gfc->ATH->decay = pow(10., -12. / 10. * frame_duration); + gfc->ATH->adjust_factor = 0.01; /* minimum, for leading low loudness */ + gfc->ATH->adjust_limit = 1.0; /* on lead, allow adjust up to maximum */ +#undef frame_duration + + assert(gd->l.bo[SBMAX_l - 1] <= gd->l.npart); + assert(gd->s.bo[SBMAX_s - 1] <= gd->s.npart); + + if (cfg->ATHtype != -1) { + /* compute equal loudness weights (eql_w) */ + FLOAT freq; + FLOAT const freq_inc = (FLOAT) cfg->samplerate_out / (FLOAT) (BLKSIZE); + FLOAT eql_balance = 0.0; + freq = 0.0; + for (i = 0; i < BLKSIZE / 2; ++i) { + /* convert ATH dB to relative power (not dB) */ + /* to determine eql_w */ + freq += freq_inc; + gfc->ATH->eql_w[i] = 1. / pow(10, ATHformula(cfg, freq) / 10); + eql_balance += gfc->ATH->eql_w[i]; + } + eql_balance = 1.0 / eql_balance; + for (i = BLKSIZE / 2; --i >= 0;) { /* scale weights */ + gfc->ATH->eql_w[i] *= eql_balance; + } + } + { + for (b = j = 0; b < gd->s.npart; ++b) { + for (i = 0; i < gd->s.numlines[b]; ++i) { + ++j; + } + } + assert(j == 129); + for (b = j = 0; b < gd->l.npart; ++b) { + for (i = 0; i < gd->l.numlines[b]; ++i) { + ++j; + } + } + assert(j == 513); + } + /* short block attack threshold */ + { + float x = gfp->attackthre; + float y = gfp->attackthre_s; + if (x < 0) { + x = NSATTACKTHRE; + } + if (y < 0) { + y = NSATTACKTHRE_S; + } + gd->attack_threshold[0] = gd->attack_threshold[1] = gd->attack_threshold[2] = x; + gd->attack_threshold[3] = y; + } + { + float sk_s = -10.f, sk_l = -4.7f; + static float const sk[] = + { -7.4, -7.4, -7.4, -9.5, -7.4, -6.1, -5.5, -4.7, -4.7, -4.7, -4.7 }; + if (gfp->VBR_q < 4) { + sk_l = sk_s = sk[0]; + } + else { + sk_l = sk_s = sk[gfp->VBR_q] + gfp->VBR_q_frac * (sk[gfp->VBR_q] - sk[gfp->VBR_q + 1]); + } + b = 0; + for (; b < gd->s.npart; b++) { + float m = (float) (gd->s.npart - b) / gd->s.npart; + gd->s.masking_lower[b] = powf(10.f, sk_s * m * 0.1f); + } + for (; b < CBANDS; ++b) { + gd->s.masking_lower[b] = 1.f; + } + b = 0; + for (; b < gd->l.npart; b++) { + float m = (float) (gd->l.npart - b) / gd->l.npart; + gd->l.masking_lower[b] = powf(10.f, sk_l * m * 0.1f); + } + for (; b < CBANDS; ++b) { + gd->l.masking_lower[b] = 1.f; + } + } + memcpy(&gd->l_to_s, &gd->l, sizeof(gd->l_to_s)); + init_numline(&gd->l_to_s, sfreq, BLKSIZE, 192, SBMAX_s, gfc->scalefac_band.s); + return 0; +} diff --git a/libmp3lame/psymodel.h b/libmp3lame/psymodel.h new file mode 100644 index 0000000..f46083c --- /dev/null +++ b/libmp3lame/psymodel.h @@ -0,0 +1,64 @@ +/* + * psymodel.h + * + * Copyright (c) 1999 Mark Taylor + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef LAME_PSYMODEL_H +#define LAME_PSYMODEL_H + + +int L3psycho_anal_ns(lame_internal_flags * gfc, + const sample_t *const buffer[2], int gr, + III_psy_ratio ratio[2][2], + III_psy_ratio MS_ratio[2][2], + FLOAT pe[2], FLOAT pe_MS[2], FLOAT ener[2], int blocktype_d[2]); + +int L3psycho_anal_vbr(lame_internal_flags * gfc, + const sample_t *const buffer[2], int gr, + III_psy_ratio ratio[2][2], + III_psy_ratio MS_ratio[2][2], + FLOAT pe[2], FLOAT pe_MS[2], FLOAT ener[2], int blocktype_d[2]); + + +int psymodel_init(lame_global_flags const* gfp); + + +#define rpelev 2 +#define rpelev2 16 +#define rpelev_s 2 +#define rpelev2_s 16 + +/* size of each partition band, in barks: */ +#define DELBARK .34 + + +/* tuned for output level (sensitive to energy scale) */ +#define VO_SCALE (1./( 14752*14752 )/(BLKSIZE/2)) + +#define temporalmask_sustain_sec 0.01 + +#define NS_PREECHO_ATT0 0.8 +#define NS_PREECHO_ATT1 0.6 +#define NS_PREECHO_ATT2 0.3 + +#define NS_MSFIX 3.5 +#define NSATTACKTHRE 4.4 +#define NSATTACKTHRE_S 25 + +#endif /* LAME_PSYMODEL_H */ diff --git a/libmp3lame/quantize.c b/libmp3lame/quantize.c new file mode 100644 index 0000000..9ba9c16 --- /dev/null +++ b/libmp3lame/quantize.c @@ -0,0 +1,2050 @@ +/* + * MP3 quantization + * + * Copyright (c) 1999-2000 Mark Taylor + * Copyright (c) 1999-2003 Takehiro Tominaga + * Copyright (c) 2000-2011 Robert Hegemann + * Copyright (c) 2001-2005 Gabriel Bouvigne + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* $Id: quantize.c,v 1.219 2017/08/02 19:48:05 robert Exp $ */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include "lame.h" +#include "machine.h" +#include "encoder.h" +#include "util.h" +#include "quantize_pvt.h" +#include "reservoir.h" +#include "bitstream.h" +#include "vbrquantize.h" +#include "quantize.h" +#ifdef HAVE_XMMINTRIN_H +#include "vector/lame_intrin.h" +#endif + + + + +/* convert from L/R <-> Mid/Side */ +static void +ms_convert(III_side_info_t * l3_side, int gr) +{ + int i; + for (i = 0; i < 576; ++i) { + FLOAT l, r; + l = l3_side->tt[gr][0].xr[i]; + r = l3_side->tt[gr][1].xr[i]; + l3_side->tt[gr][0].xr[i] = (l + r) * (FLOAT) (SQRT2 * 0.5); + l3_side->tt[gr][1].xr[i] = (l - r) * (FLOAT) (SQRT2 * 0.5); + } +} + +/************************************************************************ + * + * init_outer_loop() + * mt 6/99 + * + * initializes cod_info, scalefac and xrpow + * + * returns 0 if all energies in xr are zero, else 1 + * + ************************************************************************/ + +static void +init_xrpow_core_c(gr_info * const cod_info, FLOAT xrpow[576], int upper, FLOAT * sum) +{ + int i; + FLOAT tmp; + *sum = 0; + for (i = 0; i <= upper; ++i) { + tmp = fabs(cod_info->xr[i]); + *sum += tmp; + xrpow[i] = sqrt(tmp * sqrt(tmp)); + + if (xrpow[i] > cod_info->xrpow_max) + cod_info->xrpow_max = xrpow[i]; + } +} + + + + + +void +init_xrpow_core_init(lame_internal_flags * const gfc) +{ + gfc->init_xrpow_core = init_xrpow_core_c; + +#if defined(HAVE_XMMINTRIN_H) + if (gfc->CPU_features.SSE) + gfc->init_xrpow_core = init_xrpow_core_sse; +#endif +#ifndef HAVE_NASM +#ifdef MIN_ARCH_SSE + gfc->init_xrpow_core = init_xrpow_core_sse; +#endif +#endif +} + + + +static int +init_xrpow(lame_internal_flags * gfc, gr_info * const cod_info, FLOAT xrpow[576]) +{ + FLOAT sum = 0; + int i; + int const upper = cod_info->max_nonzero_coeff; + + assert(xrpow != NULL); + cod_info->xrpow_max = 0; + + /* check if there is some energy we have to quantize + * and calculate xrpow matching our fresh scalefactors + */ + assert(0 <= upper && upper <= 575); + memset(&(xrpow[upper]), 0, (576 - upper) * sizeof(xrpow[0])); + + + gfc->init_xrpow_core(cod_info, xrpow, upper, &sum); + + /* return 1 if we have something to quantize, else 0 + */ + if (sum > (FLOAT) 1E-20) { + int j = 0; + if (gfc->sv_qnt.substep_shaping & 2) + j = 1; + + for (i = 0; i < cod_info->psymax; i++) + gfc->sv_qnt.pseudohalf[i] = j; + + return 1; + } + + memset(&cod_info->l3_enc[0], 0, sizeof(int) * 576); + return 0; +} + + + + + +/* +Gabriel Bouvigne feb/apr 2003 +Analog silence detection in partitionned sfb21 +or sfb12 for short blocks + +From top to bottom of sfb, changes to 0 +coeffs which are below ath. It stops on the first +coeff higher than ath. +*/ +static void +psfb21_analogsilence(lame_internal_flags const *gfc, gr_info * const cod_info) +{ + ATH_t const *const ATH = gfc->ATH; + FLOAT *const xr = cod_info->xr; + + if (cod_info->block_type != SHORT_TYPE) { /* NORM, START or STOP type, but not SHORT blocks */ + int gsfb; + int stop = 0; + for (gsfb = PSFB21 - 1; gsfb >= 0 && !stop; gsfb--) { + int const start = gfc->scalefac_band.psfb21[gsfb]; + int const end = gfc->scalefac_band.psfb21[gsfb + 1]; + int j; + FLOAT ath21; + ath21 = athAdjust(ATH->adjust_factor, ATH->psfb21[gsfb], ATH->floor, 0); + + if (gfc->sv_qnt.longfact[21] > 1e-12f) + ath21 *= gfc->sv_qnt.longfact[21]; + + for (j = end - 1; j >= start; j--) { + if (fabs(xr[j]) < ath21) + xr[j] = 0; + else { + stop = 1; + break; + } + } + } + } + else { + /*note: short blocks coeffs are reordered */ + int block; + for (block = 0; block < 3; block++) { + + int gsfb; + int stop = 0; + for (gsfb = PSFB12 - 1; gsfb >= 0 && !stop; gsfb--) { + int const start = gfc->scalefac_band.s[12] * 3 + + (gfc->scalefac_band.s[13] - gfc->scalefac_band.s[12]) * block + + (gfc->scalefac_band.psfb12[gsfb] - gfc->scalefac_band.psfb12[0]); + int const end = + start + (gfc->scalefac_band.psfb12[gsfb + 1] - gfc->scalefac_band.psfb12[gsfb]); + int j; + FLOAT ath12; + ath12 = athAdjust(ATH->adjust_factor, ATH->psfb12[gsfb], ATH->floor, 0); + + if (gfc->sv_qnt.shortfact[12] > 1e-12f) + ath12 *= gfc->sv_qnt.shortfact[12]; + + for (j = end - 1; j >= start; j--) { + if (fabs(xr[j]) < ath12) + xr[j] = 0; + else { + stop = 1; + break; + } + } + } + } + } + +} + + + + + +static void +init_outer_loop(lame_internal_flags const *gfc, gr_info * const cod_info) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + int sfb, j; + /* initialize fresh cod_info + */ + cod_info->part2_3_length = 0; + cod_info->big_values = 0; + cod_info->count1 = 0; + cod_info->global_gain = 210; + cod_info->scalefac_compress = 0; + /* mixed_block_flag, block_type was set in psymodel.c */ + cod_info->table_select[0] = 0; + cod_info->table_select[1] = 0; + cod_info->table_select[2] = 0; + cod_info->subblock_gain[0] = 0; + cod_info->subblock_gain[1] = 0; + cod_info->subblock_gain[2] = 0; + cod_info->subblock_gain[3] = 0; /* this one is always 0 */ + cod_info->region0_count = 0; + cod_info->region1_count = 0; + cod_info->preflag = 0; + cod_info->scalefac_scale = 0; + cod_info->count1table_select = 0; + cod_info->part2_length = 0; + if (cfg->samplerate_out <= 8000) { + cod_info->sfb_lmax = 17; + cod_info->sfb_smin = 9; + cod_info->psy_lmax = 17; + } + else { + cod_info->sfb_lmax = SBPSY_l; + cod_info->sfb_smin = SBPSY_s; + cod_info->psy_lmax = gfc->sv_qnt.sfb21_extra ? SBMAX_l : SBPSY_l; + } + cod_info->psymax = cod_info->psy_lmax; + cod_info->sfbmax = cod_info->sfb_lmax; + cod_info->sfbdivide = 11; + for (sfb = 0; sfb < SBMAX_l; sfb++) { + cod_info->width[sfb] + = gfc->scalefac_band.l[sfb + 1] - gfc->scalefac_band.l[sfb]; + cod_info->window[sfb] = 3; /* which is always 0. */ + } + if (cod_info->block_type == SHORT_TYPE) { + FLOAT ixwork[576]; + FLOAT *ix; + + cod_info->sfb_smin = 0; + cod_info->sfb_lmax = 0; + if (cod_info->mixed_block_flag) { + /* + * MPEG-1: sfbs 0-7 long block, 3-12 short blocks + * MPEG-2(.5): sfbs 0-5 long block, 3-12 short blocks + */ + cod_info->sfb_smin = 3; + cod_info->sfb_lmax = cfg->mode_gr * 2 + 4; + } + if (cfg->samplerate_out <= 8000) { + cod_info->psymax + = cod_info->sfb_lmax + + 3 * (9 - cod_info->sfb_smin); + cod_info->sfbmax = cod_info->sfb_lmax + 3 * (9 - cod_info->sfb_smin); + } + else { + cod_info->psymax + = cod_info->sfb_lmax + + 3 * ((gfc->sv_qnt.sfb21_extra ? SBMAX_s : SBPSY_s) - cod_info->sfb_smin); + cod_info->sfbmax = cod_info->sfb_lmax + 3 * (SBPSY_s - cod_info->sfb_smin); + } + cod_info->sfbdivide = cod_info->sfbmax - 18; + cod_info->psy_lmax = cod_info->sfb_lmax; + /* re-order the short blocks, for more efficient encoding below */ + /* By Takehiro TOMINAGA */ + /* + Within each scalefactor band, data is given for successive + time windows, beginning with window 0 and ending with window 2. + Within each window, the quantized values are then arranged in + order of increasing frequency... + */ + ix = &cod_info->xr[gfc->scalefac_band.l[cod_info->sfb_lmax]]; + memcpy(ixwork, cod_info->xr, 576 * sizeof(FLOAT)); + for (sfb = cod_info->sfb_smin; sfb < SBMAX_s; sfb++) { + int const start = gfc->scalefac_band.s[sfb]; + int const end = gfc->scalefac_band.s[sfb + 1]; + int window, l; + for (window = 0; window < 3; window++) { + for (l = start; l < end; l++) { + *ix++ = ixwork[3 * l + window]; + } + } + } + + j = cod_info->sfb_lmax; + for (sfb = cod_info->sfb_smin; sfb < SBMAX_s; sfb++) { + cod_info->width[j] = cod_info->width[j + 1] = cod_info->width[j + 2] + = gfc->scalefac_band.s[sfb + 1] - gfc->scalefac_band.s[sfb]; + cod_info->window[j] = 0; + cod_info->window[j + 1] = 1; + cod_info->window[j + 2] = 2; + j += 3; + } + } + + cod_info->count1bits = 0; + cod_info->sfb_partition_table = nr_of_sfb_block[0][0]; + cod_info->slen[0] = 0; + cod_info->slen[1] = 0; + cod_info->slen[2] = 0; + cod_info->slen[3] = 0; + + cod_info->max_nonzero_coeff = 575; + + /* fresh scalefactors are all zero + */ + memset(cod_info->scalefac, 0, sizeof(cod_info->scalefac)); + + if (cfg->vbr != vbr_mt && cfg->vbr != vbr_mtrh && cfg->vbr != vbr_abr && cfg->vbr != vbr_off) { + psfb21_analogsilence(gfc, cod_info); + } +} + + + +/************************************************************************ + * + * bin_search_StepSize() + * + * author/date?? + * + * binary step size search + * used by outer_loop to get a quantizer step size to start with + * + ************************************************************************/ + +typedef enum { + BINSEARCH_NONE, + BINSEARCH_UP, + BINSEARCH_DOWN +} binsearchDirection_t; + +static int +bin_search_StepSize(lame_internal_flags * const gfc, gr_info * const cod_info, + int desired_rate, const int ch, const FLOAT xrpow[576]) +{ + int nBits; + int CurrentStep = gfc->sv_qnt.CurrentStep[ch]; + int flag_GoneOver = 0; + int const start = gfc->sv_qnt.OldValue[ch]; + binsearchDirection_t Direction = BINSEARCH_NONE; + cod_info->global_gain = start; + desired_rate -= cod_info->part2_length; + + assert(CurrentStep); + for (;;) { + int step; + nBits = count_bits(gfc, xrpow, cod_info, 0); + + if (CurrentStep == 1 || nBits == desired_rate) + break; /* nothing to adjust anymore */ + + if (nBits > desired_rate) { + /* increase Quantize_StepSize */ + if (Direction == BINSEARCH_DOWN) + flag_GoneOver = 1; + + if (flag_GoneOver) + CurrentStep /= 2; + Direction = BINSEARCH_UP; + step = CurrentStep; + } + else { + /* decrease Quantize_StepSize */ + if (Direction == BINSEARCH_UP) + flag_GoneOver = 1; + + if (flag_GoneOver) + CurrentStep /= 2; + Direction = BINSEARCH_DOWN; + step = -CurrentStep; + } + cod_info->global_gain += step; + if (cod_info->global_gain < 0) { + cod_info->global_gain = 0; + flag_GoneOver = 1; + } + if (cod_info->global_gain > 255) { + cod_info->global_gain = 255; + flag_GoneOver = 1; + } + } + + assert(cod_info->global_gain >= 0); + assert(cod_info->global_gain < 256); + + while (nBits > desired_rate && cod_info->global_gain < 255) { + cod_info->global_gain++; + nBits = count_bits(gfc, xrpow, cod_info, 0); + } + gfc->sv_qnt.CurrentStep[ch] = (start - cod_info->global_gain >= 4) ? 4 : 2; + gfc->sv_qnt.OldValue[ch] = cod_info->global_gain; + cod_info->part2_3_length = nBits; + return nBits; +} + + + + +/************************************************************************ + * + * trancate_smallspectrums() + * + * Takehiro TOMINAGA 2002-07-21 + * + * trancate smaller nubmers into 0 as long as the noise threshold is allowed. + * + ************************************************************************/ +static int +floatcompare(const void *v1, const void *v2) +{ + const FLOAT *const a = v1, *const b = v2; + if (*a > *b) + return 1; + if (*a < *b) + return -1; + return 0; +} + +static void +trancate_smallspectrums(lame_internal_flags const *gfc, + gr_info * const gi, const FLOAT * const l3_xmin, FLOAT * const work) +{ + int sfb, j, width; + FLOAT distort[SFBMAX]; + calc_noise_result dummy; + + if ((!(gfc->sv_qnt.substep_shaping & 4) && gi->block_type == SHORT_TYPE) + || gfc->sv_qnt.substep_shaping & 0x80) + return; + (void) calc_noise(gi, l3_xmin, distort, &dummy, 0); + for (j = 0; j < 576; j++) { + FLOAT xr = 0.0; + if (gi->l3_enc[j] != 0) + xr = fabs(gi->xr[j]); + work[j] = xr; + } + + j = 0; + sfb = 8; + if (gi->block_type == SHORT_TYPE) + sfb = 6; + do { + FLOAT allowedNoise, trancateThreshold; + int nsame, start; + + width = gi->width[sfb]; + j += width; + if (distort[sfb] >= 1.0) + continue; + + qsort(&work[j - width], width, sizeof(FLOAT), floatcompare); + if (EQ(work[j - 1], 0.0)) + continue; /* all zero sfb */ + + allowedNoise = (1.0 - distort[sfb]) * l3_xmin[sfb]; + trancateThreshold = 0.0; + start = 0; + do { + FLOAT noise; + for (nsame = 1; start + nsame < width; nsame++) + if (NEQ(work[start + j - width], work[start + j + nsame - width])) + break; + + noise = work[start + j - width] * work[start + j - width] * nsame; + if (allowedNoise < noise) { + if (start != 0) + trancateThreshold = work[start + j - width - 1]; + break; + } + allowedNoise -= noise; + start += nsame; + } while (start < width); + if (EQ(trancateThreshold, 0.0)) + continue; + +/* printf("%e %e %e\n", */ +/* trancateThreshold/l3_xmin[sfb], */ +/* trancateThreshold/(l3_xmin[sfb]*start), */ +/* trancateThreshold/(l3_xmin[sfb]*(start+width)) */ +/* ); */ +/* if (trancateThreshold > 1000*l3_xmin[sfb]*start) */ +/* trancateThreshold = 1000*l3_xmin[sfb]*start; */ + + do { + if (fabs(gi->xr[j - width]) <= trancateThreshold) + gi->l3_enc[j - width] = 0; + } while (--width > 0); + } while (++sfb < gi->psymax); + + gi->part2_3_length = noquant_count_bits(gfc, gi, 0); +} + + +/************************************************************************* + * + * loop_break() + * + * author/date?? + * + * Function: Returns zero if there is a scalefac which has not been + * amplified. Otherwise it returns one. + * + *************************************************************************/ + +inline static int +loop_break(const gr_info * const cod_info) +{ + int sfb; + + for (sfb = 0; sfb < cod_info->sfbmax; sfb++) + if (cod_info->scalefac[sfb] + + cod_info->subblock_gain[cod_info->window[sfb]] == 0) + return 0; + + return 1; +} + + + + +/* mt 5/99: Function: Improved calc_noise for a single channel */ + +/************************************************************************* + * + * quant_compare() + * + * author/date?? + * + * several different codes to decide which quantization is better + * + *************************************************************************/ + +static double +penalties(double noise) +{ + return FAST_LOG10(0.368 + 0.632 * noise * noise * noise); +} + +static double +get_klemm_noise(const FLOAT * distort, const gr_info * const gi) +{ + int sfb; + double klemm_noise = 1E-37; + for (sfb = 0; sfb < gi->psymax; sfb++) + klemm_noise += penalties(distort[sfb]); + + return Max(1e-20, klemm_noise); +} + +inline static int +quant_compare(const int quant_comp, + const calc_noise_result * const best, + calc_noise_result * const calc, const gr_info * const gi, const FLOAT * distort) +{ + /* + noise is given in decibels (dB) relative to masking thesholds. + + over_noise: ??? (the previous comment is fully wrong) + tot_noise: ??? (the previous comment is fully wrong) + max_noise: max quantization noise + + */ + int better; + + switch (quant_comp) { + default: + case 9:{ + if (best->over_count > 0) { + /* there are distorted sfb */ + better = calc->over_SSD <= best->over_SSD; + if (calc->over_SSD == best->over_SSD) + better = calc->bits < best->bits; + } + else { + /* no distorted sfb */ + better = ((calc->max_noise < 0) && + ((calc->max_noise * 10 + calc->bits) <= + (best->max_noise * 10 + best->bits))); + } + break; + } + + case 0: + better = calc->over_count < best->over_count + || (calc->over_count == best->over_count && calc->over_noise < best->over_noise) + || (calc->over_count == best->over_count && + EQ(calc->over_noise, best->over_noise) && calc->tot_noise < best->tot_noise); + break; + + case 8: + calc->max_noise = get_klemm_noise(distort, gi); + /*lint --fallthrough */ + case 1: + better = calc->max_noise < best->max_noise; + break; + case 2: + better = calc->tot_noise < best->tot_noise; + break; + case 3: + better = (calc->tot_noise < best->tot_noise) + && (calc->max_noise < best->max_noise); + break; + case 4: + better = (calc->max_noise <= 0.0 && best->max_noise > 0.2) + || (calc->max_noise <= 0.0 && + best->max_noise < 0.0 && + best->max_noise > calc->max_noise - 0.2 && calc->tot_noise < best->tot_noise) + || (calc->max_noise <= 0.0 && + best->max_noise > 0.0 && + best->max_noise > calc->max_noise - 0.2 && + calc->tot_noise < best->tot_noise + best->over_noise) + || (calc->max_noise > 0.0 && + best->max_noise > -0.05 && + best->max_noise > calc->max_noise - 0.1 && + calc->tot_noise + calc->over_noise < best->tot_noise + best->over_noise) + || (calc->max_noise > 0.0 && + best->max_noise > -0.1 && + best->max_noise > calc->max_noise - 0.15 && + calc->tot_noise + calc->over_noise + calc->over_noise < + best->tot_noise + best->over_noise + best->over_noise); + break; + case 5: + better = calc->over_noise < best->over_noise + || (EQ(calc->over_noise, best->over_noise) && calc->tot_noise < best->tot_noise); + break; + case 6: + better = calc->over_noise < best->over_noise + || (EQ(calc->over_noise, best->over_noise) && + (calc->max_noise < best->max_noise + || (EQ(calc->max_noise, best->max_noise) && calc->tot_noise <= best->tot_noise) + )); + break; + case 7: + better = calc->over_count < best->over_count || calc->over_noise < best->over_noise; + break; + } + + + if (best->over_count == 0) { + /* + If no distorted bands, only use this quantization + if it is better, and if it uses less bits. + Unfortunately, part2_3_length is sometimes a poor + estimator of the final size at low bitrates. + */ + better = better && calc->bits < best->bits; + } + + + return better; +} + + + +/************************************************************************* + * + * amp_scalefac_bands() + * + * author/date?? + * + * Amplify the scalefactor bands that violate the masking threshold. + * See ISO 11172-3 Section C.1.5.4.3.5 + * + * distort[] = noise/masking + * distort[] > 1 ==> noise is not masked + * distort[] < 1 ==> noise is masked + * max_dist = maximum value of distort[] + * + * Three algorithms: + * noise_shaping_amp + * 0 Amplify all bands with distort[]>1. + * + * 1 Amplify all bands with distort[] >= max_dist^(.5); + * ( 50% in the db scale) + * + * 2 Amplify first band with distort[] >= max_dist; + * + * + * For algorithms 0 and 1, if max_dist < 1, then amplify all bands + * with distort[] >= .95*max_dist. This is to make sure we always + * amplify at least one band. + * + * + *************************************************************************/ +static void +amp_scalefac_bands(lame_internal_flags * gfc, + gr_info * const cod_info, FLOAT const *distort, FLOAT xrpow[576], int bRefine) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + int j, sfb; + FLOAT ifqstep34, trigger; + int noise_shaping_amp; + + if (cod_info->scalefac_scale == 0) { + ifqstep34 = 1.29683955465100964055; /* 2**(.75*.5) */ + } + else { + ifqstep34 = 1.68179283050742922612; /* 2**(.75*1) */ + } + + /* compute maximum value of distort[] */ + trigger = 0; + for (sfb = 0; sfb < cod_info->sfbmax; sfb++) { + if (trigger < distort[sfb]) + trigger = distort[sfb]; + } + + noise_shaping_amp = cfg->noise_shaping_amp; + if (noise_shaping_amp == 3) { + if (bRefine == 1) + noise_shaping_amp = 2; + else + noise_shaping_amp = 1; + } + switch (noise_shaping_amp) { + case 2: + /* amplify exactly 1 band */ + break; + + case 1: + /* amplify bands within 50% of max (on db scale) */ + if (trigger > 1.0) + trigger = pow(trigger, .5); + else + trigger *= .95; + break; + + case 0: + default: + /* ISO algorithm. amplify all bands with distort>1 */ + if (trigger > 1.0) + trigger = 1.0; + else + trigger *= .95; + break; + } + + j = 0; + for (sfb = 0; sfb < cod_info->sfbmax; sfb++) { + int const width = cod_info->width[sfb]; + int l; + j += width; + if (distort[sfb] < trigger) + continue; + + if (gfc->sv_qnt.substep_shaping & 2) { + gfc->sv_qnt.pseudohalf[sfb] = !gfc->sv_qnt.pseudohalf[sfb]; + if (!gfc->sv_qnt.pseudohalf[sfb] && cfg->noise_shaping_amp == 2) + return; + } + cod_info->scalefac[sfb]++; + for (l = -width; l < 0; l++) { + xrpow[j + l] *= ifqstep34; + if (xrpow[j + l] > cod_info->xrpow_max) + cod_info->xrpow_max = xrpow[j + l]; + } + + if (cfg->noise_shaping_amp == 2) + return; + } +} + +/************************************************************************* + * + * inc_scalefac_scale() + * + * Takehiro Tominaga 2000-xx-xx + * + * turns on scalefac scale and adjusts scalefactors + * + *************************************************************************/ + +static void +inc_scalefac_scale(gr_info * const cod_info, FLOAT xrpow[576]) +{ + int l, j, sfb; + const FLOAT ifqstep34 = 1.29683955465100964055; + + j = 0; + for (sfb = 0; sfb < cod_info->sfbmax; sfb++) { + int const width = cod_info->width[sfb]; + int s = cod_info->scalefac[sfb]; + if (cod_info->preflag) + s += pretab[sfb]; + j += width; + if (s & 1) { + s++; + for (l = -width; l < 0; l++) { + xrpow[j + l] *= ifqstep34; + if (xrpow[j + l] > cod_info->xrpow_max) + cod_info->xrpow_max = xrpow[j + l]; + } + } + cod_info->scalefac[sfb] = s >> 1; + } + cod_info->preflag = 0; + cod_info->scalefac_scale = 1; +} + + + +/************************************************************************* + * + * inc_subblock_gain() + * + * Takehiro Tominaga 2000-xx-xx + * + * increases the subblock gain and adjusts scalefactors + * + *************************************************************************/ + +static int +inc_subblock_gain(const lame_internal_flags * const gfc, gr_info * const cod_info, FLOAT xrpow[576]) +{ + int sfb, window; + int *const scalefac = cod_info->scalefac; + + /* subbloc_gain can't do anything in the long block region */ + for (sfb = 0; sfb < cod_info->sfb_lmax; sfb++) { + if (scalefac[sfb] >= 16) + return 1; + } + + for (window = 0; window < 3; window++) { + int s1, s2, l, j; + s1 = s2 = 0; + + for (sfb = cod_info->sfb_lmax + window; sfb < cod_info->sfbdivide; sfb += 3) { + if (s1 < scalefac[sfb]) + s1 = scalefac[sfb]; + } + for (; sfb < cod_info->sfbmax; sfb += 3) { + if (s2 < scalefac[sfb]) + s2 = scalefac[sfb]; + } + + if (s1 < 16 && s2 < 8) + continue; + + if (cod_info->subblock_gain[window] >= 7) + return 1; + + /* even though there is no scalefactor for sfb12 + * subblock gain affects upper frequencies too, that's why + * we have to go up to SBMAX_s + */ + cod_info->subblock_gain[window]++; + j = gfc->scalefac_band.l[cod_info->sfb_lmax]; + for (sfb = cod_info->sfb_lmax + window; sfb < cod_info->sfbmax; sfb += 3) { + FLOAT amp; + int const width = cod_info->width[sfb]; + int s = scalefac[sfb]; + assert(s >= 0); + s = s - (4 >> cod_info->scalefac_scale); + if (s >= 0) { + scalefac[sfb] = s; + j += width * 3; + continue; + } + + scalefac[sfb] = 0; + { + int const gain = 210 + (s << (cod_info->scalefac_scale + 1)); + amp = IPOW20(gain); + } + j += width * (window + 1); + for (l = -width; l < 0; l++) { + xrpow[j + l] *= amp; + if (xrpow[j + l] > cod_info->xrpow_max) + cod_info->xrpow_max = xrpow[j + l]; + } + j += width * (3 - window - 1); + } + + { + FLOAT const amp = IPOW20(202); + j += cod_info->width[sfb] * (window + 1); + for (l = -cod_info->width[sfb]; l < 0; l++) { + xrpow[j + l] *= amp; + if (xrpow[j + l] > cod_info->xrpow_max) + cod_info->xrpow_max = xrpow[j + l]; + } + } + } + return 0; +} + + + +/******************************************************************** + * + * balance_noise() + * + * Takehiro Tominaga /date?? + * Robert Hegemann 2000-09-06: made a function of it + * + * amplifies scalefactor bands, + * - if all are already amplified returns 0 + * - if some bands are amplified too much: + * * try to increase scalefac_scale + * * if already scalefac_scale was set + * try on short blocks to increase subblock gain + * + ********************************************************************/ +inline static int +balance_noise(lame_internal_flags * gfc, + gr_info * const cod_info, FLOAT const *distort, FLOAT xrpow[576], int bRefine) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + int status; + + amp_scalefac_bands(gfc, cod_info, distort, xrpow, bRefine); + + /* check to make sure we have not amplified too much + * loop_break returns 0 if there is an unamplified scalefac + * scale_bitcount returns 0 if no scalefactors are too large + */ + + status = loop_break(cod_info); + + if (status) + return 0; /* all bands amplified */ + + /* not all scalefactors have been amplified. so these + * scalefacs are possibly valid. encode them: + */ + status = scale_bitcount(gfc, cod_info); + + if (!status) + return 1; /* amplified some bands not exceeding limits */ + + /* some scalefactors are too large. + * lets try setting scalefac_scale=1 + */ + if (cfg->noise_shaping > 1) { + memset(&gfc->sv_qnt.pseudohalf[0], 0, sizeof(gfc->sv_qnt.pseudohalf)); + if (!cod_info->scalefac_scale) { + inc_scalefac_scale(cod_info, xrpow); + status = 0; + } + else { + if (cod_info->block_type == SHORT_TYPE && cfg->subblock_gain > 0) { + status = inc_subblock_gain(gfc, cod_info, xrpow) + || loop_break(cod_info); + } + } + } + + if (!status) { + status = scale_bitcount(gfc, cod_info); + } + return !status; +} + + + +/************************************************************************ + * + * outer_loop () + * + * Function: The outer iteration loop controls the masking conditions + * of all scalefactorbands. It computes the best scalefac and + * global gain. This module calls the inner iteration loop + * + * mt 5/99 completely rewritten to allow for bit reservoir control, + * mid/side channels with L/R or mid/side masking thresholds, + * and chooses best quantization instead of last quantization when + * no distortion free quantization can be found. + * + * added VBR support mt 5/99 + * + * some code shuffle rh 9/00 + ************************************************************************/ + +static int +outer_loop(lame_internal_flags * gfc, gr_info * const cod_info, const FLOAT * const l3_xmin, /* allowed distortion */ + FLOAT xrpow[576], /* coloured magnitudes of spectral */ + const int ch, const int targ_bits) +{ /* maximum allowed bits */ + SessionConfig_t const *const cfg = &gfc->cfg; + gr_info cod_info_w; + FLOAT save_xrpow[576]; + FLOAT distort[SFBMAX]; + calc_noise_result best_noise_info; + int huff_bits; + int better; + int age; + calc_noise_data prev_noise; + int best_part2_3_length = 9999999; + int bEndOfSearch = 0; + int bRefine = 0; + int best_ggain_pass1 = 0; + + (void) bin_search_StepSize(gfc, cod_info, targ_bits, ch, xrpow); + + if (!cfg->noise_shaping) + /* fast mode, no noise shaping, we are ready */ + return 100; /* default noise_info.over_count */ + + memset(&prev_noise, 0, sizeof(calc_noise_data)); + + + /* compute the distortion in this quantization */ + /* coefficients and thresholds both l/r (or both mid/side) */ + (void) calc_noise(cod_info, l3_xmin, distort, &best_noise_info, &prev_noise); + best_noise_info.bits = cod_info->part2_3_length; + + cod_info_w = *cod_info; + age = 0; + /* if (cfg->vbr == vbr_rh || cfg->vbr == vbr_mtrh) */ + memcpy(save_xrpow, xrpow, sizeof(FLOAT) * 576); + + while (!bEndOfSearch) { + /* BEGIN MAIN LOOP */ + do { + calc_noise_result noise_info; + int search_limit; + int maxggain = 255; + + /* When quantization with no distorted bands is found, + * allow up to X new unsuccesful tries in serial. This + * gives us more possibilities for different quant_compare modes. + * Much more than 3 makes not a big difference, it is only slower. + */ + + if (gfc->sv_qnt.substep_shaping & 2) { + search_limit = 20; + } + else { + search_limit = 3; + } + + + + /* Check if the last scalefactor band is distorted. + * in VBR mode we can't get rid of the distortion, so quit now + * and VBR mode will try again with more bits. + * (makes a 10% speed increase, the files I tested were + * binary identical, 2000/05/20 Robert Hegemann) + * distort[] > 1 means noise > allowed noise + */ + if (gfc->sv_qnt.sfb21_extra) { + if (distort[cod_info_w.sfbmax] > 1.0) + break; + if (cod_info_w.block_type == SHORT_TYPE + && (distort[cod_info_w.sfbmax + 1] > 1.0 + || distort[cod_info_w.sfbmax + 2] > 1.0)) + break; + } + + /* try a new scalefactor conbination on cod_info_w */ + if (balance_noise(gfc, &cod_info_w, distort, xrpow, bRefine) == 0) + break; + if (cod_info_w.scalefac_scale) + maxggain = 254; + + /* inner_loop starts with the initial quantization step computed above + * and slowly increases until the bits < huff_bits. + * Thus it is important not to start with too large of an inital + * quantization step. Too small is ok, but inner_loop will take longer + */ + huff_bits = targ_bits - cod_info_w.part2_length; + if (huff_bits <= 0) + break; + + /* increase quantizer stepsize until needed bits are below maximum + */ + while ((cod_info_w.part2_3_length + = count_bits(gfc, xrpow, &cod_info_w, &prev_noise)) > huff_bits + && cod_info_w.global_gain <= maxggain) + cod_info_w.global_gain++; + + if (cod_info_w.global_gain > maxggain) + break; + + if (best_noise_info.over_count == 0) { + + while ((cod_info_w.part2_3_length + = count_bits(gfc, xrpow, &cod_info_w, &prev_noise)) > best_part2_3_length + && cod_info_w.global_gain <= maxggain) + cod_info_w.global_gain++; + + if (cod_info_w.global_gain > maxggain) + break; + } + + /* compute the distortion in this quantization */ + (void) calc_noise(&cod_info_w, l3_xmin, distort, &noise_info, &prev_noise); + noise_info.bits = cod_info_w.part2_3_length; + + /* check if this quantization is better + * than our saved quantization */ + if (cod_info->block_type != SHORT_TYPE) /* NORM, START or STOP type */ + better = cfg->quant_comp; + else + better = cfg->quant_comp_short; + + + better = quant_compare(better, &best_noise_info, &noise_info, &cod_info_w, distort); + + + /* save data so we can restore this quantization later */ + if (better) { + best_part2_3_length = cod_info->part2_3_length; + best_noise_info = noise_info; + *cod_info = cod_info_w; + age = 0; + /* save data so we can restore this quantization later */ + /*if (cfg->vbr == vbr_rh || cfg->vbr == vbr_mtrh) */ { + /* store for later reuse */ + memcpy(save_xrpow, xrpow, sizeof(FLOAT) * 576); + } + } + else { + /* early stop? */ + if (cfg->full_outer_loop == 0) { + if (++age > search_limit && best_noise_info.over_count == 0) + break; + if ((cfg->noise_shaping_amp == 3) && bRefine && age > 30) + break; + if ((cfg->noise_shaping_amp == 3) && bRefine && + (cod_info_w.global_gain - best_ggain_pass1) > 15) + break; + } + } + } + while ((cod_info_w.global_gain + cod_info_w.scalefac_scale) < 255); + + if (cfg->noise_shaping_amp == 3) { + if (!bRefine) { + /* refine search */ + cod_info_w = *cod_info; + memcpy(xrpow, save_xrpow, sizeof(FLOAT) * 576); + age = 0; + best_ggain_pass1 = cod_info_w.global_gain; + + bRefine = 1; + } + else { + /* search already refined, stop */ + bEndOfSearch = 1; + } + + } + else { + bEndOfSearch = 1; + } + } + + assert((cod_info->global_gain + cod_info->scalefac_scale) <= 255); + /* finish up + */ + if (cfg->vbr == vbr_rh || cfg->vbr == vbr_mtrh || cfg->vbr == vbr_mt) + /* restore for reuse on next try */ + memcpy(xrpow, save_xrpow, sizeof(FLOAT) * 576); + /* do the 'substep shaping' + */ + else if (gfc->sv_qnt.substep_shaping & 1) + trancate_smallspectrums(gfc, cod_info, l3_xmin, xrpow); + + return best_noise_info.over_count; +} + + + + + +/************************************************************************ + * + * iteration_finish_one() + * + * Robert Hegemann 2000-09-06 + * + * update reservoir status after FINAL quantization/bitrate + * + ************************************************************************/ + +static void +iteration_finish_one(lame_internal_flags * gfc, int gr, int ch) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + III_side_info_t *const l3_side = &gfc->l3_side; + gr_info *const cod_info = &l3_side->tt[gr][ch]; + + /* try some better scalefac storage + */ + best_scalefac_store(gfc, gr, ch, l3_side); + + /* best huffman_divide may save some bits too + */ + if (cfg->use_best_huffman == 1) + best_huffman_divide(gfc, cod_info); + + /* update reservoir status after FINAL quantization/bitrate + */ + ResvAdjust(gfc, cod_info); +} + + + +/********************************************************************* + * + * VBR_encode_granule() + * + * 2000-09-04 Robert Hegemann + * + *********************************************************************/ + +static void +VBR_encode_granule(lame_internal_flags * gfc, gr_info * const cod_info, const FLOAT * const l3_xmin, /* allowed distortion of the scalefactor */ + FLOAT xrpow[576], /* coloured magnitudes of spectral values */ + const int ch, int min_bits, int max_bits) +{ + gr_info bst_cod_info; + FLOAT bst_xrpow[576]; + int const Max_bits = max_bits; + int real_bits = max_bits + 1; + int this_bits = (max_bits + min_bits) / 2; + int dbits, over, found = 0; + int const sfb21_extra = gfc->sv_qnt.sfb21_extra; + + assert(Max_bits <= MAX_BITS_PER_CHANNEL); + memset(bst_cod_info.l3_enc, 0, sizeof(bst_cod_info.l3_enc)); + + /* search within round about 40 bits of optimal + */ + do { + assert(this_bits >= min_bits); + assert(this_bits <= max_bits); + assert(min_bits <= max_bits); + + if (this_bits > Max_bits - 42) + gfc->sv_qnt.sfb21_extra = 0; + else + gfc->sv_qnt.sfb21_extra = sfb21_extra; + + over = outer_loop(gfc, cod_info, l3_xmin, xrpow, ch, this_bits); + + /* is quantization as good as we are looking for ? + * in this case: is no scalefactor band distorted? + */ + if (over <= 0) { + found = 1; + /* now we know it can be done with "real_bits" + * and maybe we can skip some iterations + */ + real_bits = cod_info->part2_3_length; + + /* store best quantization so far + */ + bst_cod_info = *cod_info; + memcpy(bst_xrpow, xrpow, sizeof(FLOAT) * 576); + + /* try with fewer bits + */ + max_bits = real_bits - 32; + dbits = max_bits - min_bits; + this_bits = (max_bits + min_bits) / 2; + } + else { + /* try with more bits + */ + min_bits = this_bits + 32; + dbits = max_bits - min_bits; + this_bits = (max_bits + min_bits) / 2; + + if (found) { + found = 2; + /* start again with best quantization so far + */ + *cod_info = bst_cod_info; + memcpy(xrpow, bst_xrpow, sizeof(FLOAT) * 576); + } + } + } while (dbits > 12); + + gfc->sv_qnt.sfb21_extra = sfb21_extra; + + /* found=0 => nothing found, use last one + * found=1 => we just found the best and left the loop + * found=2 => we restored a good one and have now l3_enc to restore too + */ + if (found == 2) { + memcpy(cod_info->l3_enc, bst_cod_info.l3_enc, sizeof(int) * 576); + } + assert(cod_info->part2_3_length <= Max_bits); + +} + + + +/************************************************************************ + * + * get_framebits() + * + * Robert Hegemann 2000-09-05 + * + * calculates + * * how many bits are available for analog silent granules + * * how many bits to use for the lowest allowed bitrate + * * how many bits each bitrate would provide + * + ************************************************************************/ + +static void +get_framebits(lame_internal_flags * gfc, int frameBits[15]) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + EncResult_t *const eov = &gfc->ov_enc; + int bitsPerFrame, i; + + /* always use at least this many bits per granule per channel + * unless we detect analog silence, see below + */ + eov->bitrate_index = cfg->vbr_min_bitrate_index; + bitsPerFrame = getframebits(gfc); + + /* bits for analog silence + */ + eov->bitrate_index = 1; + bitsPerFrame = getframebits(gfc); + + for (i = 1; i <= cfg->vbr_max_bitrate_index; i++) { + eov->bitrate_index = i; + frameBits[i] = ResvFrameBegin(gfc, &bitsPerFrame); + } +} + + + +/********************************************************************* + * + * VBR_prepare() + * + * 2000-09-04 Robert Hegemann + * + * * converts LR to MS coding when necessary + * * calculates allowed/adjusted quantization noise amounts + * * detects analog silent frames + * + * some remarks: + * - lower masking depending on Quality setting + * - quality control together with adjusted ATH MDCT scaling + * on lower quality setting allocate more noise from + * ATH masking, and on higher quality setting allocate + * less noise from ATH masking. + * - experiments show that going more than 2dB over GPSYCHO's + * limits ends up in very annoying artefacts + * + *********************************************************************/ + +/* RH: this one needs to be overhauled sometime */ + +static int +VBR_old_prepare(lame_internal_flags * gfc, + const FLOAT pe[2][2], FLOAT const ms_ener_ratio[2], + const III_psy_ratio ratio[2][2], + FLOAT l3_xmin[2][2][SFBMAX], + int frameBits[16], int min_bits[2][2], int max_bits[2][2], int bands[2][2]) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + EncResult_t *const eov = &gfc->ov_enc; + + FLOAT masking_lower_db, adjust = 0.0; + int gr, ch; + int analog_silence = 1; + int avg, mxb, bits = 0; + + eov->bitrate_index = cfg->vbr_max_bitrate_index; + avg = ResvFrameBegin(gfc, &avg) / cfg->mode_gr; + + get_framebits(gfc, frameBits); + + for (gr = 0; gr < cfg->mode_gr; gr++) { + mxb = on_pe(gfc, pe, max_bits[gr], avg, gr, 0); + if (gfc->ov_enc.mode_ext == MPG_MD_MS_LR) { + ms_convert(&gfc->l3_side, gr); + reduce_side(max_bits[gr], ms_ener_ratio[gr], avg, mxb); + } + for (ch = 0; ch < cfg->channels_out; ++ch) { + gr_info *const cod_info = &gfc->l3_side.tt[gr][ch]; + + if (cod_info->block_type != SHORT_TYPE) { /* NORM, START or STOP type */ + adjust = 1.28 / (1 + exp(3.5 - pe[gr][ch] / 300.)) - 0.05; + masking_lower_db = gfc->sv_qnt.mask_adjust - adjust; + } + else { + adjust = 2.56 / (1 + exp(3.5 - pe[gr][ch] / 300.)) - 0.14; + masking_lower_db = gfc->sv_qnt.mask_adjust_short - adjust; + } + gfc->sv_qnt.masking_lower = pow(10.0, masking_lower_db * 0.1); + + init_outer_loop(gfc, cod_info); + bands[gr][ch] = calc_xmin(gfc, &ratio[gr][ch], cod_info, l3_xmin[gr][ch]); + if (bands[gr][ch]) + analog_silence = 0; + + min_bits[gr][ch] = 126; + + bits += max_bits[gr][ch]; + } + } + for (gr = 0; gr < cfg->mode_gr; gr++) { + for (ch = 0; ch < cfg->channels_out; ch++) { + if (bits > frameBits[cfg->vbr_max_bitrate_index] && bits > 0) { + max_bits[gr][ch] *= frameBits[cfg->vbr_max_bitrate_index]; + max_bits[gr][ch] /= bits; + } + if (min_bits[gr][ch] > max_bits[gr][ch]) + min_bits[gr][ch] = max_bits[gr][ch]; + + } /* for ch */ + } /* for gr */ + + return analog_silence; +} + +static void +bitpressure_strategy(lame_internal_flags const *gfc, + FLOAT l3_xmin[2][2][SFBMAX], const int min_bits[2][2], int max_bits[2][2]) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + int gr, ch, sfb; + for (gr = 0; gr < cfg->mode_gr; gr++) { + for (ch = 0; ch < cfg->channels_out; ch++) { + gr_info const *const gi = &gfc->l3_side.tt[gr][ch]; + FLOAT *pxmin = l3_xmin[gr][ch]; + for (sfb = 0; sfb < gi->psy_lmax; sfb++) + *pxmin++ *= 1. + .029 * sfb * sfb / SBMAX_l / SBMAX_l; + + if (gi->block_type == SHORT_TYPE) { + for (sfb = gi->sfb_smin; sfb < SBMAX_s; sfb++) { + *pxmin++ *= 1. + .029 * sfb * sfb / SBMAX_s / SBMAX_s; + *pxmin++ *= 1. + .029 * sfb * sfb / SBMAX_s / SBMAX_s; + *pxmin++ *= 1. + .029 * sfb * sfb / SBMAX_s / SBMAX_s; + } + } + max_bits[gr][ch] = Max(min_bits[gr][ch], 0.9 * max_bits[gr][ch]); + } + } +} + +/************************************************************************ + * + * VBR_iteration_loop() + * + * tries to find out how many bits are needed for each granule and channel + * to get an acceptable quantization. An appropriate bitrate will then be + * choosed for quantization. rh 8/99 + * + * Robert Hegemann 2000-09-06 rewrite + * + ************************************************************************/ + +void +VBR_old_iteration_loop(lame_internal_flags * gfc, const FLOAT pe[2][2], + const FLOAT ms_ener_ratio[2], const III_psy_ratio ratio[2][2]) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + EncResult_t *const eov = &gfc->ov_enc; + FLOAT l3_xmin[2][2][SFBMAX]; + + FLOAT xrpow[576]; + int bands[2][2]; + int frameBits[15]; + int used_bits; + int bits; + int min_bits[2][2], max_bits[2][2]; + int mean_bits; + int ch, gr, analog_silence; + III_side_info_t *const l3_side = &gfc->l3_side; + + analog_silence = VBR_old_prepare(gfc, pe, ms_ener_ratio, ratio, + l3_xmin, frameBits, min_bits, max_bits, bands); + + /*---------------------------------*/ + for (;;) { + + /* quantize granules with lowest possible number of bits + */ + + used_bits = 0; + + for (gr = 0; gr < cfg->mode_gr; gr++) { + for (ch = 0; ch < cfg->channels_out; ch++) { + int ret; + gr_info *const cod_info = &l3_side->tt[gr][ch]; + + /* init_outer_loop sets up cod_info, scalefac and xrpow + */ + ret = init_xrpow(gfc, cod_info, xrpow); + if (ret == 0 || max_bits[gr][ch] == 0) { + /* xr contains no energy + * l3_enc, our encoding data, will be quantized to zero + */ + continue; /* with next channel */ + } + + VBR_encode_granule(gfc, cod_info, l3_xmin[gr][ch], xrpow, + ch, min_bits[gr][ch], max_bits[gr][ch]); + + /* do the 'substep shaping' + */ + if (gfc->sv_qnt.substep_shaping & 1) { + trancate_smallspectrums(gfc, &l3_side->tt[gr][ch], l3_xmin[gr][ch], xrpow); + } + + ret = cod_info->part2_3_length + cod_info->part2_length; + used_bits += ret; + } /* for ch */ + } /* for gr */ + + /* find lowest bitrate able to hold used bits + */ + if (analog_silence && !cfg->enforce_min_bitrate) + /* we detected analog silence and the user did not specify + * any hard framesize limit, so start with smallest possible frame + */ + eov->bitrate_index = 1; + else + eov->bitrate_index = cfg->vbr_min_bitrate_index; + + for (; eov->bitrate_index < cfg->vbr_max_bitrate_index; eov->bitrate_index++) { + if (used_bits <= frameBits[eov->bitrate_index]) + break; + } + bits = ResvFrameBegin(gfc, &mean_bits); + + if (used_bits <= bits) + break; + + bitpressure_strategy(gfc, l3_xmin, (const int (*)[2])min_bits, max_bits); + + } /* breaks adjusted */ + /*--------------------------------------*/ + + for (gr = 0; gr < cfg->mode_gr; gr++) { + for (ch = 0; ch < cfg->channels_out; ch++) { + iteration_finish_one(gfc, gr, ch); + } /* for ch */ + } /* for gr */ + ResvFrameEnd(gfc, mean_bits); +} + + + +static int +VBR_new_prepare(lame_internal_flags * gfc, + const FLOAT pe[2][2], const III_psy_ratio ratio[2][2], + FLOAT l3_xmin[2][2][SFBMAX], int frameBits[16], int max_bits[2][2], + int* max_resv) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + EncResult_t *const eov = &gfc->ov_enc; + + int gr, ch; + int analog_silence = 1; + int avg, bits = 0; + int maximum_framebits; + + if (!cfg->free_format) { + eov->bitrate_index = cfg->vbr_max_bitrate_index; + (void) ResvFrameBegin(gfc, &avg); + *max_resv = gfc->sv_enc.ResvMax; + + get_framebits(gfc, frameBits); + maximum_framebits = frameBits[cfg->vbr_max_bitrate_index]; + } + else { + eov->bitrate_index = 0; + maximum_framebits = ResvFrameBegin(gfc, &avg); + frameBits[0] = maximum_framebits; + *max_resv = gfc->sv_enc.ResvMax; + } + + for (gr = 0; gr < cfg->mode_gr; gr++) { + (void) on_pe(gfc, pe, max_bits[gr], avg, gr, 0); + if (gfc->ov_enc.mode_ext == MPG_MD_MS_LR) { + ms_convert(&gfc->l3_side, gr); + } + for (ch = 0; ch < cfg->channels_out; ++ch) { + gr_info *const cod_info = &gfc->l3_side.tt[gr][ch]; + + gfc->sv_qnt.masking_lower = pow(10.0, gfc->sv_qnt.mask_adjust * 0.1); + + init_outer_loop(gfc, cod_info); + if (0 != calc_xmin(gfc, &ratio[gr][ch], cod_info, l3_xmin[gr][ch])) + analog_silence = 0; + + bits += max_bits[gr][ch]; + } + } + for (gr = 0; gr < cfg->mode_gr; gr++) { + for (ch = 0; ch < cfg->channels_out; ch++) { + if (bits > maximum_framebits && bits > 0) { + max_bits[gr][ch] *= maximum_framebits; + max_bits[gr][ch] /= bits; + } + + } /* for ch */ + } /* for gr */ + if (analog_silence) { + *max_resv = 0; + } + return analog_silence; +} + + + +void +VBR_new_iteration_loop(lame_internal_flags * gfc, const FLOAT pe[2][2], + const FLOAT ms_ener_ratio[2], const III_psy_ratio ratio[2][2]) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + EncResult_t *const eov = &gfc->ov_enc; + FLOAT l3_xmin[2][2][SFBMAX]; + + FLOAT xrpow[2][2][576]; + int frameBits[15]; + int used_bits; + int max_bits[2][2]; + int ch, gr, analog_silence, pad; + III_side_info_t *const l3_side = &gfc->l3_side; + + const FLOAT (*const_l3_xmin)[2][SFBMAX] = (const FLOAT (*)[2][SFBMAX])l3_xmin; + const FLOAT (*const_xrpow)[2][576] = (const FLOAT (*)[2][576])xrpow; + const int (*const_max_bits)[2] = (const int (*)[2])max_bits; + + (void) ms_ener_ratio; /* not used */ + + memset(xrpow, 0, sizeof(xrpow)); + + analog_silence = VBR_new_prepare(gfc, pe, ratio, l3_xmin, frameBits, max_bits, &pad); + + for (gr = 0; gr < cfg->mode_gr; gr++) { + for (ch = 0; ch < cfg->channels_out; ch++) { + gr_info *const cod_info = &l3_side->tt[gr][ch]; + + /* init_outer_loop sets up cod_info, scalefac and xrpow + */ + if (0 == init_xrpow(gfc, cod_info, xrpow[gr][ch])) { + max_bits[gr][ch] = 0; /* silent granule needs no bits */ + } + } /* for ch */ + } /* for gr */ + + /* quantize granules with lowest possible number of bits + */ + + used_bits = VBR_encode_frame(gfc, const_xrpow, const_l3_xmin, const_max_bits); + + if (!cfg->free_format) { + int i, j; + + /* find lowest bitrate able to hold used bits + */ + if (analog_silence && !cfg->enforce_min_bitrate) { + /* we detected analog silence and the user did not specify + * any hard framesize limit, so start with smallest possible frame + */ + i = 1; + } + else { + i = cfg->vbr_min_bitrate_index; + } + + for (; i < cfg->vbr_max_bitrate_index; i++) { + if (used_bits <= frameBits[i]) + break; + } + if (i > cfg->vbr_max_bitrate_index) { + i = cfg->vbr_max_bitrate_index; + } + if (pad > 0) { + for (j = cfg->vbr_max_bitrate_index; j > i; --j) { + int const unused = frameBits[j] - used_bits; + if (unused <= pad) + break; + } + eov->bitrate_index = j; + } + else { + eov->bitrate_index = i; + } + } + else { +#if 0 + static int mmm = 0; + int fff = getFramesize_kbps(gfc, used_bits); + int hhh = getFramesize_kbps(gfc, MAX_BITS_PER_GRANULE * cfg->mode_gr); + if (mmm < fff) + mmm = fff; + printf("demand=%3d kbps max=%3d kbps limit=%3d kbps\n", fff, mmm, hhh); +#endif + eov->bitrate_index = 0; + } + if (used_bits <= frameBits[eov->bitrate_index]) { + /* update Reservoire status */ + int mean_bits, fullframebits; + fullframebits = ResvFrameBegin(gfc, &mean_bits); + assert(used_bits <= fullframebits); + for (gr = 0; gr < cfg->mode_gr; gr++) { + for (ch = 0; ch < cfg->channels_out; ch++) { + gr_info const *const cod_info = &l3_side->tt[gr][ch]; + ResvAdjust(gfc, cod_info); + } + } + ResvFrameEnd(gfc, mean_bits); + } + else { + /* SHOULD NOT HAPPEN INTERNAL ERROR + */ + ERRORF(gfc, "INTERNAL ERROR IN VBR NEW CODE, please send bug report\n"); + exit(-1); + } +} + + + + + +/******************************************************************** + * + * calc_target_bits() + * + * calculates target bits for ABR encoding + * + * mt 2000/05/31 + * + ********************************************************************/ + +static void +calc_target_bits(lame_internal_flags * gfc, + const FLOAT pe[2][2], + FLOAT const ms_ener_ratio[2], + int targ_bits[2][2], int *analog_silence_bits, int *max_frame_bits) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + EncResult_t *const eov = &gfc->ov_enc; + III_side_info_t const *const l3_side = &gfc->l3_side; + FLOAT res_factor; + int gr, ch, totbits, mean_bits; + int framesize = 576 * cfg->mode_gr; + + eov->bitrate_index = cfg->vbr_max_bitrate_index; + *max_frame_bits = ResvFrameBegin(gfc, &mean_bits); + + eov->bitrate_index = 1; + mean_bits = getframebits(gfc) - cfg->sideinfo_len * 8; + *analog_silence_bits = mean_bits / (cfg->mode_gr * cfg->channels_out); + + mean_bits = cfg->vbr_avg_bitrate_kbps * framesize * 1000; + if (gfc->sv_qnt.substep_shaping & 1) + mean_bits *= 1.09; + mean_bits /= cfg->samplerate_out; + mean_bits -= cfg->sideinfo_len * 8; + mean_bits /= (cfg->mode_gr * cfg->channels_out); + + /* + res_factor is the percentage of the target bitrate that should + be used on average. the remaining bits are added to the + bitreservoir and used for difficult to encode frames. + + Since we are tracking the average bitrate, we should adjust + res_factor "on the fly", increasing it if the average bitrate + is greater than the requested bitrate, and decreasing it + otherwise. Reasonable ranges are from .9 to 1.0 + + Until we get the above suggestion working, we use the following + tuning: + compression ratio res_factor + 5.5 (256kbps) 1.0 no need for bitreservoir + 11 (128kbps) .93 7% held for reservoir + + with linear interpolation for other values. + + */ + res_factor = .93 + .07 * (11.0 - cfg->compression_ratio) / (11.0 - 5.5); + if (res_factor < .90) + res_factor = .90; + if (res_factor > 1.00) + res_factor = 1.00; + + for (gr = 0; gr < cfg->mode_gr; gr++) { + int sum = 0; + for (ch = 0; ch < cfg->channels_out; ch++) { + targ_bits[gr][ch] = res_factor * mean_bits; + + if (pe[gr][ch] > 700) { + int add_bits = (pe[gr][ch] - 700) / 1.4; + + gr_info const *const cod_info = &l3_side->tt[gr][ch]; + targ_bits[gr][ch] = res_factor * mean_bits; + + /* short blocks use a little extra, no matter what the pe */ + if (cod_info->block_type == SHORT_TYPE) { + if (add_bits < mean_bits / 2) + add_bits = mean_bits / 2; + } + /* at most increase bits by 1.5*average */ + if (add_bits > mean_bits * 3 / 2) + add_bits = mean_bits * 3 / 2; + else if (add_bits < 0) + add_bits = 0; + + targ_bits[gr][ch] += add_bits; + } + if (targ_bits[gr][ch] > MAX_BITS_PER_CHANNEL) { + targ_bits[gr][ch] = MAX_BITS_PER_CHANNEL; + } + sum += targ_bits[gr][ch]; + } /* for ch */ + if (sum > MAX_BITS_PER_GRANULE) { + for (ch = 0; ch < cfg->channels_out; ++ch) { + targ_bits[gr][ch] *= MAX_BITS_PER_GRANULE; + targ_bits[gr][ch] /= sum; + } + } + } /* for gr */ + + if (gfc->ov_enc.mode_ext == MPG_MD_MS_LR) + for (gr = 0; gr < cfg->mode_gr; gr++) { + reduce_side(targ_bits[gr], ms_ener_ratio[gr], mean_bits * cfg->channels_out, + MAX_BITS_PER_GRANULE); + } + + /* sum target bits + */ + totbits = 0; + for (gr = 0; gr < cfg->mode_gr; gr++) { + for (ch = 0; ch < cfg->channels_out; ch++) { + if (targ_bits[gr][ch] > MAX_BITS_PER_CHANNEL) + targ_bits[gr][ch] = MAX_BITS_PER_CHANNEL; + totbits += targ_bits[gr][ch]; + } + } + + /* repartion target bits if needed + */ + if (totbits > *max_frame_bits && totbits > 0) { + for (gr = 0; gr < cfg->mode_gr; gr++) { + for (ch = 0; ch < cfg->channels_out; ch++) { + targ_bits[gr][ch] *= *max_frame_bits; + targ_bits[gr][ch] /= totbits; + } + } + } +} + + + + + + +/******************************************************************** + * + * ABR_iteration_loop() + * + * encode a frame with a disired average bitrate + * + * mt 2000/05/31 + * + ********************************************************************/ + +void +ABR_iteration_loop(lame_internal_flags * gfc, const FLOAT pe[2][2], + const FLOAT ms_ener_ratio[2], const III_psy_ratio ratio[2][2]) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + EncResult_t *const eov = &gfc->ov_enc; + FLOAT l3_xmin[SFBMAX]; + FLOAT xrpow[576]; + int targ_bits[2][2]; + int mean_bits, max_frame_bits; + int ch, gr, ath_over; + int analog_silence_bits; + gr_info *cod_info; + III_side_info_t *const l3_side = &gfc->l3_side; + + mean_bits = 0; + + calc_target_bits(gfc, pe, ms_ener_ratio, targ_bits, &analog_silence_bits, &max_frame_bits); + + /* encode granules + */ + for (gr = 0; gr < cfg->mode_gr; gr++) { + + if (gfc->ov_enc.mode_ext == MPG_MD_MS_LR) { + ms_convert(&gfc->l3_side, gr); + } + for (ch = 0; ch < cfg->channels_out; ch++) { + FLOAT adjust, masking_lower_db; + cod_info = &l3_side->tt[gr][ch]; + + if (cod_info->block_type != SHORT_TYPE) { /* NORM, START or STOP type */ + /* adjust = 1.28/(1+exp(3.5-pe[gr][ch]/300.))-0.05; */ + adjust = 0; + masking_lower_db = gfc->sv_qnt.mask_adjust - adjust; + } + else { + /* adjust = 2.56/(1+exp(3.5-pe[gr][ch]/300.))-0.14; */ + adjust = 0; + masking_lower_db = gfc->sv_qnt.mask_adjust_short - adjust; + } + gfc->sv_qnt.masking_lower = pow(10.0, masking_lower_db * 0.1); + + + /* cod_info, scalefac and xrpow get initialized in init_outer_loop + */ + init_outer_loop(gfc, cod_info); + if (init_xrpow(gfc, cod_info, xrpow)) { + /* xr contains energy we will have to encode + * calculate the masking abilities + * find some good quantization in outer_loop + */ + ath_over = calc_xmin(gfc, &ratio[gr][ch], cod_info, l3_xmin); + if (0 == ath_over) /* analog silence */ + targ_bits[gr][ch] = analog_silence_bits; + + (void) outer_loop(gfc, cod_info, l3_xmin, xrpow, ch, targ_bits[gr][ch]); + } + iteration_finish_one(gfc, gr, ch); + } /* ch */ + } /* gr */ + + /* find a bitrate which can refill the resevoir to positive size. + */ + for (eov->bitrate_index = cfg->vbr_min_bitrate_index; + eov->bitrate_index <= cfg->vbr_max_bitrate_index; eov->bitrate_index++) { + if (ResvFrameBegin(gfc, &mean_bits) >= 0) + break; + } + assert(eov->bitrate_index <= cfg->vbr_max_bitrate_index); + + ResvFrameEnd(gfc, mean_bits); +} + + + + + + +/************************************************************************ + * + * CBR_iteration_loop() + * + * author/date?? + * + * encodes one frame of MP3 data with constant bitrate + * + ************************************************************************/ + +void +CBR_iteration_loop(lame_internal_flags * gfc, const FLOAT pe[2][2], + const FLOAT ms_ener_ratio[2], const III_psy_ratio ratio[2][2]) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + FLOAT l3_xmin[SFBMAX]; + FLOAT xrpow[576]; + int targ_bits[2]; + int mean_bits, max_bits; + int gr, ch; + III_side_info_t *const l3_side = &gfc->l3_side; + gr_info *cod_info; + + (void) ResvFrameBegin(gfc, &mean_bits); + + /* quantize! */ + for (gr = 0; gr < cfg->mode_gr; gr++) { + + /* calculate needed bits + */ + max_bits = on_pe(gfc, pe, targ_bits, mean_bits, gr, gr); + + if (gfc->ov_enc.mode_ext == MPG_MD_MS_LR) { + ms_convert(&gfc->l3_side, gr); + reduce_side(targ_bits, ms_ener_ratio[gr], mean_bits, max_bits); + } + + for (ch = 0; ch < cfg->channels_out; ch++) { + FLOAT adjust, masking_lower_db; + cod_info = &l3_side->tt[gr][ch]; + + if (cod_info->block_type != SHORT_TYPE) { /* NORM, START or STOP type */ + /* adjust = 1.28/(1+exp(3.5-pe[gr][ch]/300.))-0.05; */ + adjust = 0; + masking_lower_db = gfc->sv_qnt.mask_adjust - adjust; + } + else { + /* adjust = 2.56/(1+exp(3.5-pe[gr][ch]/300.))-0.14; */ + adjust = 0; + masking_lower_db = gfc->sv_qnt.mask_adjust_short - adjust; + } + gfc->sv_qnt.masking_lower = pow(10.0, masking_lower_db * 0.1); + + /* init_outer_loop sets up cod_info, scalefac and xrpow + */ + init_outer_loop(gfc, cod_info); + if (init_xrpow(gfc, cod_info, xrpow)) { + /* xr contains energy we will have to encode + * calculate the masking abilities + * find some good quantization in outer_loop + */ + (void) calc_xmin(gfc, &ratio[gr][ch], cod_info, l3_xmin); + (void) outer_loop(gfc, cod_info, l3_xmin, xrpow, ch, targ_bits[ch]); + } + + iteration_finish_one(gfc, gr, ch); + assert(cod_info->part2_3_length <= MAX_BITS_PER_CHANNEL); + assert(cod_info->part2_3_length <= targ_bits[ch]); + } /* for ch */ + } /* for gr */ + + ResvFrameEnd(gfc, mean_bits); +} diff --git a/libmp3lame/quantize.h b/libmp3lame/quantize.h new file mode 100644 index 0000000..56edcc7 --- /dev/null +++ b/libmp3lame/quantize.h @@ -0,0 +1,38 @@ +/* + * MP3 quantization + * + * Copyright (c) 1999 Mark Taylor + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef LAME_QUANTIZE_H +#define LAME_QUANTIZE_H + +void CBR_iteration_loop(lame_internal_flags * gfc, const FLOAT pe[2][2], + const FLOAT ms_ratio[2], const III_psy_ratio ratio[2][2]); + +void VBR_old_iteration_loop(lame_internal_flags * gfc, const FLOAT pe[2][2], + const FLOAT ms_ratio[2], const III_psy_ratio ratio[2][2]); + +void VBR_new_iteration_loop(lame_internal_flags * gfc, const FLOAT pe[2][2], + const FLOAT ms_ratio[2], const III_psy_ratio ratio[2][2]); + +void ABR_iteration_loop(lame_internal_flags * gfc, const FLOAT pe[2][2], + const FLOAT ms_ratio[2], const III_psy_ratio ratio[2][2]); + + +#endif /* LAME_QUANTIZE_H */ diff --git a/libmp3lame/quantize_pvt.c b/libmp3lame/quantize_pvt.c new file mode 100644 index 0000000..d8d6447 --- /dev/null +++ b/libmp3lame/quantize_pvt.c @@ -0,0 +1,1074 @@ +/* + * quantize_pvt source file + * + * Copyright (c) 1999-2002 Takehiro Tominaga + * Copyright (c) 2000-2012 Robert Hegemann + * Copyright (c) 2001 Naoki Shibata + * Copyright (c) 2002-2005 Gabriel Bouvigne + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* $Id: quantize_pvt.c,v 1.175 2017/09/06 15:07:30 robert Exp $ */ +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + + +#include "lame.h" +#include "machine.h" +#include "encoder.h" +#include "util.h" +#include "quantize_pvt.h" +#include "reservoir.h" +#include "lame-analysis.h" +#include <float.h> + + +#define NSATHSCALE 100 /* Assuming dynamic range=96dB, this value should be 92 */ + +/* + The following table is used to implement the scalefactor + partitioning for MPEG2 as described in section + 2.4.3.2 of the IS. The indexing corresponds to the + way the tables are presented in the IS: + + [table_number][row_in_table][column of nr_of_sfb] +*/ +const int nr_of_sfb_block[6][3][4] = { + { + {6, 5, 5, 5}, + {9, 9, 9, 9}, + {6, 9, 9, 9} + }, + { + {6, 5, 7, 3}, + {9, 9, 12, 6}, + {6, 9, 12, 6} + }, + { + {11, 10, 0, 0}, + {18, 18, 0, 0}, + {15, 18, 0, 0} + }, + { + {7, 7, 7, 0}, + {12, 12, 12, 0}, + {6, 15, 12, 0} + }, + { + {6, 6, 6, 3}, + {12, 9, 9, 6}, + {6, 12, 9, 6} + }, + { + {8, 8, 5, 0}, + {15, 12, 9, 0}, + {6, 18, 9, 0} + } +}; + + +/* Table B.6: layer3 preemphasis */ +const int pretab[SBMAX_l] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0 +}; + +/* + Here are MPEG1 Table B.8 and MPEG2 Table B.1 + -- Layer III scalefactor bands. + Index into this using a method such as: + idx = fr_ps->header->sampling_frequency + + (fr_ps->header->version * 3) +*/ + + +const scalefac_struct sfBandIndex[9] = { + { /* Table B.2.b: 22.05 kHz */ + {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, + 522, 576}, + {0, 4, 8, 12, 18, 24, 32, 42, 56, 74, 100, 132, 174, 192} + , {0, 0, 0, 0, 0, 0, 0} /* sfb21 pseudo sub bands */ + , {0, 0, 0, 0, 0, 0, 0} /* sfb12 pseudo sub bands */ + }, + { /* Table B.2.c: 24 kHz */ /* docs: 332. mpg123(broken): 330 */ + {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 114, 136, 162, 194, 232, 278, 332, 394, 464, + 540, 576}, + {0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 136, 180, 192} + , {0, 0, 0, 0, 0, 0, 0} /* sfb21 pseudo sub bands */ + , {0, 0, 0, 0, 0, 0, 0} /* sfb12 pseudo sub bands */ + }, + { /* Table B.2.a: 16 kHz */ + {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, + 522, 576}, + {0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 134, 174, 192} + , {0, 0, 0, 0, 0, 0, 0} /* sfb21 pseudo sub bands */ + , {0, 0, 0, 0, 0, 0, 0} /* sfb12 pseudo sub bands */ + }, + { /* Table B.8.b: 44.1 kHz */ + {0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 52, 62, 74, 90, 110, 134, 162, 196, 238, 288, 342, 418, + 576}, + {0, 4, 8, 12, 16, 22, 30, 40, 52, 66, 84, 106, 136, 192} + , {0, 0, 0, 0, 0, 0, 0} /* sfb21 pseudo sub bands */ + , {0, 0, 0, 0, 0, 0, 0} /* sfb12 pseudo sub bands */ + }, + { /* Table B.8.c: 48 kHz */ + {0, 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 60, 72, 88, 106, 128, 156, 190, 230, 276, 330, 384, + 576}, + {0, 4, 8, 12, 16, 22, 28, 38, 50, 64, 80, 100, 126, 192} + , {0, 0, 0, 0, 0, 0, 0} /* sfb21 pseudo sub bands */ + , {0, 0, 0, 0, 0, 0, 0} /* sfb12 pseudo sub bands */ + }, + { /* Table B.8.a: 32 kHz */ + {0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 54, 66, 82, 102, 126, 156, 194, 240, 296, 364, 448, 550, + 576}, + {0, 4, 8, 12, 16, 22, 30, 42, 58, 78, 104, 138, 180, 192} + , {0, 0, 0, 0, 0, 0, 0} /* sfb21 pseudo sub bands */ + , {0, 0, 0, 0, 0, 0, 0} /* sfb12 pseudo sub bands */ + }, + { /* MPEG-2.5 11.025 kHz */ + {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, + 522, 576}, + {0 / 3, 12 / 3, 24 / 3, 36 / 3, 54 / 3, 78 / 3, 108 / 3, 144 / 3, 186 / 3, 240 / 3, 312 / 3, + 402 / 3, 522 / 3, 576 / 3} + , {0, 0, 0, 0, 0, 0, 0} /* sfb21 pseudo sub bands */ + , {0, 0, 0, 0, 0, 0, 0} /* sfb12 pseudo sub bands */ + }, + { /* MPEG-2.5 12 kHz */ + {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, + 522, 576}, + {0 / 3, 12 / 3, 24 / 3, 36 / 3, 54 / 3, 78 / 3, 108 / 3, 144 / 3, 186 / 3, 240 / 3, 312 / 3, + 402 / 3, 522 / 3, 576 / 3} + , {0, 0, 0, 0, 0, 0, 0} /* sfb21 pseudo sub bands */ + , {0, 0, 0, 0, 0, 0, 0} /* sfb12 pseudo sub bands */ + }, + { /* MPEG-2.5 8 kHz */ + {0, 12, 24, 36, 48, 60, 72, 88, 108, 132, 160, 192, 232, 280, 336, 400, 476, 566, 568, 570, + 572, 574, 576}, + {0 / 3, 24 / 3, 48 / 3, 72 / 3, 108 / 3, 156 / 3, 216 / 3, 288 / 3, 372 / 3, 480 / 3, 486 / 3, + 492 / 3, 498 / 3, 576 / 3} + , {0, 0, 0, 0, 0, 0, 0} /* sfb21 pseudo sub bands */ + , {0, 0, 0, 0, 0, 0, 0} /* sfb12 pseudo sub bands */ + } +}; + + +/* FIXME: move global variables in some struct */ + +FLOAT pow20[Q_MAX + Q_MAX2 + 1]; +FLOAT ipow20[Q_MAX]; +FLOAT pow43[PRECALC_SIZE]; +/* initialized in first call to iteration_init */ +#ifdef TAKEHIRO_IEEE754_HACK +FLOAT adj43asm[PRECALC_SIZE]; +#else +FLOAT adj43[PRECALC_SIZE]; +#endif + +/* +compute the ATH for each scalefactor band +cd range: 0..96db + +Input: 3.3kHz signal 32767 amplitude (3.3kHz is where ATH is smallest = -5db) +longblocks: sfb=12 en0/bw=-11db max_en0 = 1.3db +shortblocks: sfb=5 -9db 0db + +Input: 1 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 (repeated) +longblocks: amp=1 sfb=12 en0/bw=-103 db max_en0 = -92db + amp=32767 sfb=12 -12 db -1.4db + +Input: 1 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 (repeated) +shortblocks: amp=1 sfb=5 en0/bw= -99 -86 + amp=32767 sfb=5 -9 db 4db + + +MAX energy of largest wave at 3.3kHz = 1db +AVE energy of largest wave at 3.3kHz = -11db +Let's take AVE: -11db = maximum signal in sfb=12. +Dynamic range of CD: 96db. Therefor energy of smallest audible wave +in sfb=12 = -11 - 96 = -107db = ATH at 3.3kHz. + +ATH formula for this wave: -5db. To adjust to LAME scaling, we need +ATH = ATH_formula - 103 (db) +ATH = ATH * 2.5e-10 (ener) + +*/ + +static FLOAT +ATHmdct(SessionConfig_t const *cfg, FLOAT f) +{ + FLOAT ath; + + ath = ATHformula(cfg, f); + + if (cfg->ATHfixpoint > 0) { + ath -= cfg->ATHfixpoint; + } + else { + ath -= NSATHSCALE; + } + ath += cfg->ATH_offset_db; + + /* modify the MDCT scaling for the ATH and convert to energy */ + ath = powf(10.0f, ath * 0.1f); + return ath; +} + +static void +compute_ath(lame_internal_flags const* gfc) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + FLOAT *const ATH_l = gfc->ATH->l; + FLOAT *const ATH_psfb21 = gfc->ATH->psfb21; + FLOAT *const ATH_s = gfc->ATH->s; + FLOAT *const ATH_psfb12 = gfc->ATH->psfb12; + int sfb, i, start, end; + FLOAT ATH_f; + FLOAT const samp_freq = cfg->samplerate_out; + + for (sfb = 0; sfb < SBMAX_l; sfb++) { + start = gfc->scalefac_band.l[sfb]; + end = gfc->scalefac_band.l[sfb + 1]; + ATH_l[sfb] = FLOAT_MAX; + for (i = start; i < end; i++) { + FLOAT const freq = i * samp_freq / (2 * 576); + ATH_f = ATHmdct(cfg, freq); /* freq in kHz */ + ATH_l[sfb] = Min(ATH_l[sfb], ATH_f); + } + } + + for (sfb = 0; sfb < PSFB21; sfb++) { + start = gfc->scalefac_band.psfb21[sfb]; + end = gfc->scalefac_band.psfb21[sfb + 1]; + ATH_psfb21[sfb] = FLOAT_MAX; + for (i = start; i < end; i++) { + FLOAT const freq = i * samp_freq / (2 * 576); + ATH_f = ATHmdct(cfg, freq); /* freq in kHz */ + ATH_psfb21[sfb] = Min(ATH_psfb21[sfb], ATH_f); + } + } + + for (sfb = 0; sfb < SBMAX_s; sfb++) { + start = gfc->scalefac_band.s[sfb]; + end = gfc->scalefac_band.s[sfb + 1]; + ATH_s[sfb] = FLOAT_MAX; + for (i = start; i < end; i++) { + FLOAT const freq = i * samp_freq / (2 * 192); + ATH_f = ATHmdct(cfg, freq); /* freq in kHz */ + ATH_s[sfb] = Min(ATH_s[sfb], ATH_f); + } + ATH_s[sfb] *= (gfc->scalefac_band.s[sfb + 1] - gfc->scalefac_band.s[sfb]); + } + + for (sfb = 0; sfb < PSFB12; sfb++) { + start = gfc->scalefac_band.psfb12[sfb]; + end = gfc->scalefac_band.psfb12[sfb + 1]; + ATH_psfb12[sfb] = FLOAT_MAX; + for (i = start; i < end; i++) { + FLOAT const freq = i * samp_freq / (2 * 192); + ATH_f = ATHmdct(cfg, freq); /* freq in kHz */ + ATH_psfb12[sfb] = Min(ATH_psfb12[sfb], ATH_f); + } + /*not sure about the following */ + ATH_psfb12[sfb] *= (gfc->scalefac_band.s[13] - gfc->scalefac_band.s[12]); + } + + + /* no-ATH mode: + * reduce ATH to -200 dB + */ + + if (cfg->noATH) { + for (sfb = 0; sfb < SBMAX_l; sfb++) { + ATH_l[sfb] = 1E-20; + } + for (sfb = 0; sfb < PSFB21; sfb++) { + ATH_psfb21[sfb] = 1E-20; + } + for (sfb = 0; sfb < SBMAX_s; sfb++) { + ATH_s[sfb] = 1E-20; + } + for (sfb = 0; sfb < PSFB12; sfb++) { + ATH_psfb12[sfb] = 1E-20; + } + } + + /* work in progress, don't rely on it too much + */ + gfc->ATH->floor = 10. * log10(ATHmdct(cfg, -1.)); + + /* + { FLOAT g=10000, t=1e30, x; + for ( f = 100; f < 10000; f++ ) { + x = ATHmdct( cfg, f ); + if ( t > x ) t = x, g = f; + } + printf("min=%g\n", g); + } */ +} + + +static float const payload_long[2][4] = +{ {-0.000f, -0.000f, -0.000f, +0.000f} +, {-0.500f, -0.250f, -0.025f, +0.500f} +}; +static float const payload_short[2][4] = +{ {-0.000f, -0.000f, -0.000f, +0.000f} +, {-2.000f, -1.000f, -0.050f, +0.500f} +}; + +/************************************************************************/ +/* initialization for iteration_loop */ +/************************************************************************/ +void +iteration_init(lame_internal_flags * gfc) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + III_side_info_t *const l3_side = &gfc->l3_side; + FLOAT adjust, db; + int i, sel; + + if (gfc->iteration_init_init == 0) { + gfc->iteration_init_init = 1; + + l3_side->main_data_begin = 0; + compute_ath(gfc); + + pow43[0] = 0.0; + for (i = 1; i < PRECALC_SIZE; i++) + pow43[i] = pow((FLOAT) i, 4.0 / 3.0); + +#ifdef TAKEHIRO_IEEE754_HACK + adj43asm[0] = 0.0; + for (i = 1; i < PRECALC_SIZE; i++) + adj43asm[i] = i - 0.5 - pow(0.5 * (pow43[i - 1] + pow43[i]), 0.75); +#else + for (i = 0; i < PRECALC_SIZE - 1; i++) + adj43[i] = (i + 1) - pow(0.5 * (pow43[i] + pow43[i + 1]), 0.75); + adj43[i] = 0.5; +#endif + for (i = 0; i < Q_MAX; i++) + ipow20[i] = pow(2.0, (double) (i - 210) * -0.1875); + for (i = 0; i <= Q_MAX + Q_MAX2; i++) + pow20[i] = pow(2.0, (double) (i - 210 - Q_MAX2) * 0.25); + + huffman_init(gfc); + init_xrpow_core_init(gfc); + + sel = 1;/* RH: all modes like vbr-new (cfg->vbr == vbr_mt || cfg->vbr == vbr_mtrh) ? 1 : 0;*/ + + /* long */ + db = cfg->adjust_bass_db + payload_long[sel][0]; + adjust = powf(10.f, db * 0.1f); + for (i = 0; i <= 6; ++i) { + gfc->sv_qnt.longfact[i] = adjust; + } + db = cfg->adjust_alto_db + payload_long[sel][1]; + adjust = powf(10.f, db * 0.1f); + for (; i <= 13; ++i) { + gfc->sv_qnt.longfact[i] = adjust; + } + db = cfg->adjust_treble_db + payload_long[sel][2]; + adjust = powf(10.f, db * 0.1f); + for (; i <= 20; ++i) { + gfc->sv_qnt.longfact[i] = adjust; + } + db = cfg->adjust_sfb21_db + payload_long[sel][3]; + adjust = powf(10.f, db * 0.1f); + for (; i < SBMAX_l; ++i) { + gfc->sv_qnt.longfact[i] = adjust; + } + + /* short */ + db = cfg->adjust_bass_db + payload_short[sel][0]; + adjust = powf(10.f, db * 0.1f); + for (i = 0; i <= 2; ++i) { + gfc->sv_qnt.shortfact[i] = adjust; + } + db = cfg->adjust_alto_db + payload_short[sel][1]; + adjust = powf(10.f, db * 0.1f); + for (; i <= 6; ++i) { + gfc->sv_qnt.shortfact[i] = adjust; + } + db = cfg->adjust_treble_db + payload_short[sel][2]; + adjust = powf(10.f, db * 0.1f); + for (; i <= 11; ++i) { + gfc->sv_qnt.shortfact[i] = adjust; + } + db = cfg->adjust_sfb21_db + payload_short[sel][3]; + adjust = powf(10.f, db * 0.1f); + for (; i < SBMAX_s; ++i) { + gfc->sv_qnt.shortfact[i] = adjust; + } + } +} + + + + + +/************************************************************************ + * allocate bits among 2 channels based on PE + * mt 6/99 + * bugfixes rh 8/01: often allocated more than the allowed 4095 bits + ************************************************************************/ +int +on_pe(lame_internal_flags * gfc, const FLOAT pe[][2], int targ_bits[2], int mean_bits, int gr, int cbr) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + int extra_bits = 0, tbits, bits; + int add_bits[2] = {0, 0}; + int max_bits; /* maximum allowed bits for this granule */ + int ch; + + /* allocate targ_bits for granule */ + ResvMaxBits(gfc, mean_bits, &tbits, &extra_bits, cbr); + max_bits = tbits + extra_bits; + if (max_bits > MAX_BITS_PER_GRANULE) /* hard limit per granule */ + max_bits = MAX_BITS_PER_GRANULE; + + for (bits = 0, ch = 0; ch < cfg->channels_out; ++ch) { + /****************************************************************** + * allocate bits for each channel + ******************************************************************/ + targ_bits[ch] = Min(MAX_BITS_PER_CHANNEL, tbits / cfg->channels_out); + + add_bits[ch] = targ_bits[ch] * pe[gr][ch] / 700.0 - targ_bits[ch]; + + /* at most increase bits by 1.5*average */ + if (add_bits[ch] > mean_bits * 3 / 4) + add_bits[ch] = mean_bits * 3 / 4; + if (add_bits[ch] < 0) + add_bits[ch] = 0; + + if (add_bits[ch] + targ_bits[ch] > MAX_BITS_PER_CHANNEL) + add_bits[ch] = Max(0, MAX_BITS_PER_CHANNEL - targ_bits[ch]); + + bits += add_bits[ch]; + } + if (bits > extra_bits && bits > 0) { + for (ch = 0; ch < cfg->channels_out; ++ch) { + add_bits[ch] = extra_bits * add_bits[ch] / bits; + } + } + + for (ch = 0; ch < cfg->channels_out; ++ch) { + targ_bits[ch] += add_bits[ch]; + extra_bits -= add_bits[ch]; + } + + for (bits = 0, ch = 0; ch < cfg->channels_out; ++ch) { + bits += targ_bits[ch]; + } + if (bits > MAX_BITS_PER_GRANULE) { + int sum = 0; + for (ch = 0; ch < cfg->channels_out; ++ch) { + targ_bits[ch] *= MAX_BITS_PER_GRANULE; + targ_bits[ch] /= bits; + sum += targ_bits[ch]; + } + assert(sum <= MAX_BITS_PER_GRANULE); + } + + return max_bits; +} + + + + +void +reduce_side(int targ_bits[2], FLOAT ms_ener_ratio, int mean_bits, int max_bits) +{ + int move_bits; + FLOAT fac; + + assert(max_bits <= MAX_BITS_PER_GRANULE); + assert(targ_bits[0] + targ_bits[1] <= MAX_BITS_PER_GRANULE); + + /* ms_ener_ratio = 0: allocate 66/33 mid/side fac=.33 + * ms_ener_ratio =.5: allocate 50/50 mid/side fac= 0 */ + /* 75/25 split is fac=.5 */ + /* float fac = .50*(.5-ms_ener_ratio[gr])/.5; */ + fac = .33 * (.5 - ms_ener_ratio) / .5; + if (fac < 0) + fac = 0; + if (fac > .5) + fac = .5; + + /* number of bits to move from side channel to mid channel */ + /* move_bits = fac*targ_bits[1]; */ + move_bits = fac * .5 * (targ_bits[0] + targ_bits[1]); + + if (move_bits > MAX_BITS_PER_CHANNEL - targ_bits[0]) { + move_bits = MAX_BITS_PER_CHANNEL - targ_bits[0]; + } + if (move_bits < 0) + move_bits = 0; + + if (targ_bits[1] >= 125) { + /* dont reduce side channel below 125 bits */ + if (targ_bits[1] - move_bits > 125) { + + /* if mid channel already has 2x more than average, dont bother */ + /* mean_bits = bits per granule (for both channels) */ + if (targ_bits[0] < mean_bits) + targ_bits[0] += move_bits; + targ_bits[1] -= move_bits; + } + else { + targ_bits[0] += targ_bits[1] - 125; + targ_bits[1] = 125; + } + } + + move_bits = targ_bits[0] + targ_bits[1]; + if (move_bits > max_bits) { + targ_bits[0] = (max_bits * targ_bits[0]) / move_bits; + targ_bits[1] = (max_bits * targ_bits[1]) / move_bits; + } + assert(targ_bits[0] <= MAX_BITS_PER_CHANNEL); + assert(targ_bits[1] <= MAX_BITS_PER_CHANNEL); + assert(targ_bits[0] + targ_bits[1] <= MAX_BITS_PER_GRANULE); +} + + +/** + * Robert Hegemann 2001-04-27: + * this adjusts the ATH, keeping the original noise floor + * affects the higher frequencies more than the lower ones + */ + +FLOAT +athAdjust(FLOAT a, FLOAT x, FLOAT athFloor, float ATHfixpoint) +{ + /* work in progress + */ + FLOAT const o = 90.30873362f; + FLOAT const p = (ATHfixpoint < 1.f) ? 94.82444863f : ATHfixpoint; + FLOAT u = FAST_LOG10_X(x, 10.0f); + FLOAT const v = a * a; + FLOAT w = 0.0f; + u -= athFloor; /* undo scaling */ + if (v > 1E-20f) + w = 1.f + FAST_LOG10_X(v, 10.0f / o); + if (w < 0) + w = 0.f; + u *= w; + u += athFloor + o - p; /* redo scaling */ + + return powf(10.f, 0.1f * u); +} + + + +/*************************************************************************/ +/* calc_xmin */ +/*************************************************************************/ + +/* + Calculate the allowed distortion for each scalefactor band, + as determined by the psychoacoustic model. + xmin(sb) = ratio(sb) * en(sb) / bw(sb) + + returns number of sfb's with energy > ATH +*/ + +int +calc_xmin(lame_internal_flags const *gfc, + III_psy_ratio const *const ratio, gr_info * const cod_info, FLOAT * pxmin) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + int sfb, gsfb, j = 0, ath_over = 0, k; + ATH_t const *const ATH = gfc->ATH; + const FLOAT *const xr = cod_info->xr; + int max_nonzero; + + for (gsfb = 0; gsfb < cod_info->psy_lmax; gsfb++) { + FLOAT en0, xmin; + FLOAT rh1, rh2, rh3; + int width, l; + + xmin = athAdjust(ATH->adjust_factor, ATH->l[gsfb], ATH->floor, cfg->ATHfixpoint); + xmin *= gfc->sv_qnt.longfact[gsfb]; + + width = cod_info->width[gsfb]; + rh1 = xmin / width; +#ifdef DBL_EPSILON + rh2 = DBL_EPSILON; +#else + rh2 = 2.2204460492503131e-016; +#endif + en0 = 0.0; + for (l = 0; l < width; ++l) { + FLOAT const xa = xr[j++]; + FLOAT const x2 = xa * xa; + en0 += x2; + rh2 += (x2 < rh1) ? x2 : rh1; + } + if (en0 > xmin) + ath_over++; + + if (en0 < xmin) { + rh3 = en0; + } + else if (rh2 < xmin) { + rh3 = xmin; + } + else { + rh3 = rh2; + } + xmin = rh3; + { + FLOAT const e = ratio->en.l[gsfb]; + if (e > 1e-12f) { + FLOAT x; + x = en0 * ratio->thm.l[gsfb] / e; + x *= gfc->sv_qnt.longfact[gsfb]; + if (xmin < x) + xmin = x; + } + } + xmin = Max(xmin, DBL_EPSILON); + cod_info->energy_above_cutoff[gsfb] = (en0 > xmin+1e-14f) ? 1 : 0; + *pxmin++ = xmin; + } /* end of long block loop */ + + + + + /*use this function to determine the highest non-zero coeff */ + max_nonzero = 0; + for (k = 575; k > 0; --k) { + if (fabs(xr[k]) > 1e-12f) { + max_nonzero = k; + break; + } + } + if (cod_info->block_type != SHORT_TYPE) { /* NORM, START or STOP type, but not SHORT */ + max_nonzero |= 1; /* only odd numbers */ + } + else { + max_nonzero /= 6; /* 3 short blocks */ + max_nonzero *= 6; + max_nonzero += 5; + } + + if (gfc->sv_qnt.sfb21_extra == 0 && cfg->samplerate_out < 44000) { + int const sfb_l = (cfg->samplerate_out <= 8000) ? 17 : 21; + int const sfb_s = (cfg->samplerate_out <= 8000) ? 9 : 12; + int limit = 575; + if (cod_info->block_type != SHORT_TYPE) { /* NORM, START or STOP type, but not SHORT */ + limit = gfc->scalefac_band.l[sfb_l]-1; + } + else { + limit = 3*gfc->scalefac_band.s[sfb_s]-1; + } + if (max_nonzero > limit) { + max_nonzero = limit; + } + } + cod_info->max_nonzero_coeff = max_nonzero; + + + + for (sfb = cod_info->sfb_smin; gsfb < cod_info->psymax; sfb++, gsfb += 3) { + int width, b, l; + FLOAT tmpATH; + + tmpATH = athAdjust(ATH->adjust_factor, ATH->s[sfb], ATH->floor, cfg->ATHfixpoint); + tmpATH *= gfc->sv_qnt.shortfact[sfb]; + + width = cod_info->width[gsfb]; + for (b = 0; b < 3; b++) { + FLOAT en0 = 0.0, xmin = tmpATH; + FLOAT rh1, rh2, rh3; + + rh1 = tmpATH / width; +#ifdef DBL_EPSILON + rh2 = DBL_EPSILON; +#else + rh2 = 2.2204460492503131e-016; +#endif + for (l = 0; l < width; ++l) { + FLOAT const xa = xr[j++]; + FLOAT const x2 = xa * xa; + en0 += x2; + rh2 += (x2 < rh1) ? x2 : rh1; + } + if (en0 > tmpATH) + ath_over++; + + if (en0 < tmpATH) { + rh3 = en0; + } + else if (rh2 < tmpATH) { + rh3 = tmpATH; + } + else { + rh3 = rh2; + } + xmin = rh3; + { + FLOAT const e = ratio->en.s[sfb][b]; + if (e > 1e-12f) { + FLOAT x; + x = en0 * ratio->thm.s[sfb][b] / e; + x *= gfc->sv_qnt.shortfact[sfb]; + if (xmin < x) + xmin = x; + } + } + xmin = Max(xmin, DBL_EPSILON); + cod_info->energy_above_cutoff[gsfb+b] = (en0 > xmin+1e-14f) ? 1 : 0; + *pxmin++ = xmin; + } /* b */ + if (cfg->use_temporal_masking_effect) { + if (pxmin[-3] > pxmin[-3 + 1]) + pxmin[-3 + 1] += (pxmin[-3] - pxmin[-3 + 1]) * gfc->cd_psy->decay; + if (pxmin[-3 + 1] > pxmin[-3 + 2]) + pxmin[-3 + 2] += (pxmin[-3 + 1] - pxmin[-3 + 2]) * gfc->cd_psy->decay; + } + } /* end of short block sfb loop */ + + return ath_over; +} + + +static FLOAT +calc_noise_core_c(const gr_info * const cod_info, int *startline, int l, FLOAT step) +{ + FLOAT noise = 0; + int j = *startline; + const int *const ix = cod_info->l3_enc; + + if (j > cod_info->count1) { + while (l--) { + FLOAT temp; + temp = cod_info->xr[j]; + j++; + noise += temp * temp; + temp = cod_info->xr[j]; + j++; + noise += temp * temp; + } + } + else if (j > cod_info->big_values) { + FLOAT ix01[2]; + ix01[0] = 0; + ix01[1] = step; + while (l--) { + FLOAT temp; + temp = fabs(cod_info->xr[j]) - ix01[ix[j]]; + j++; + noise += temp * temp; + temp = fabs(cod_info->xr[j]) - ix01[ix[j]]; + j++; + noise += temp * temp; + } + } + else { + while (l--) { + FLOAT temp; + temp = fabs(cod_info->xr[j]) - pow43[ix[j]] * step; + j++; + noise += temp * temp; + temp = fabs(cod_info->xr[j]) - pow43[ix[j]] * step; + j++; + noise += temp * temp; + } + } + + *startline = j; + return noise; +} + + +/*************************************************************************/ +/* calc_noise */ +/*************************************************************************/ + +/* -oo dB => -1.00 */ +/* - 6 dB => -0.97 */ +/* - 3 dB => -0.80 */ +/* - 2 dB => -0.64 */ +/* - 1 dB => -0.38 */ +/* 0 dB => 0.00 */ +/* + 1 dB => +0.49 */ +/* + 2 dB => +1.06 */ +/* + 3 dB => +1.68 */ +/* + 6 dB => +3.69 */ +/* +10 dB => +6.45 */ + +int +calc_noise(gr_info const *const cod_info, + FLOAT const *l3_xmin, + FLOAT * distort, calc_noise_result * const res, calc_noise_data * prev_noise) +{ + int sfb, l, over = 0; + FLOAT over_noise_db = 0; + FLOAT tot_noise_db = 0; /* 0 dB relative to masking */ + FLOAT max_noise = -20.0; /* -200 dB relative to masking */ + int j = 0; + const int *scalefac = cod_info->scalefac; + + res->over_SSD = 0; + + + for (sfb = 0; sfb < cod_info->psymax; sfb++) { + int const s = + cod_info->global_gain - (((*scalefac++) + (cod_info->preflag ? pretab[sfb] : 0)) + << (cod_info->scalefac_scale + 1)) + - cod_info->subblock_gain[cod_info->window[sfb]] * 8; + FLOAT const r_l3_xmin = 1.f / *l3_xmin++; + FLOAT distort_ = 0.0f; + FLOAT noise = 0.0f; + + if (prev_noise && (prev_noise->step[sfb] == s)) { + + /* use previously computed values */ + j += cod_info->width[sfb]; + distort_ = r_l3_xmin * prev_noise->noise[sfb]; + + noise = prev_noise->noise_log[sfb]; + + } + else { + FLOAT const step = POW20(s); + l = cod_info->width[sfb] >> 1; + + if ((j + cod_info->width[sfb]) > cod_info->max_nonzero_coeff) { + int usefullsize; + usefullsize = cod_info->max_nonzero_coeff - j + 1; + + if (usefullsize > 0) + l = usefullsize >> 1; + else + l = 0; + } + + noise = calc_noise_core_c(cod_info, &j, l, step); + + + if (prev_noise) { + /* save noise values */ + prev_noise->step[sfb] = s; + prev_noise->noise[sfb] = noise; + } + + distort_ = r_l3_xmin * noise; + + /* multiplying here is adding in dB, but can overflow */ + noise = FAST_LOG10(Max(distort_, 1E-20f)); + + if (prev_noise) { + /* save noise values */ + prev_noise->noise_log[sfb] = noise; + } + } + *distort++ = distort_; + + if (prev_noise) { + /* save noise values */ + prev_noise->global_gain = cod_info->global_gain;; + } + + + /*tot_noise *= Max(noise, 1E-20); */ + tot_noise_db += noise; + + if (noise > 0.0) { + int tmp; + + tmp = Max((int) (noise * 10 + .5), 1); + res->over_SSD += tmp * tmp; + + over++; + /* multiplying here is adding in dB -but can overflow */ + /*over_noise *= noise; */ + over_noise_db += noise; + } + max_noise = Max(max_noise, noise); + + } + + res->over_count = over; + res->tot_noise = tot_noise_db; + res->over_noise = over_noise_db; + res->max_noise = max_noise; + + return over; +} + + + + + + + + +/************************************************************************ + * + * set_pinfo() + * + * updates plotting data + * + * Mark Taylor 2000-??-?? + * + * Robert Hegemann: moved noise/distortion calc into it + * + ************************************************************************/ + +static void +set_pinfo(lame_internal_flags const *gfc, + gr_info * const cod_info, const III_psy_ratio * const ratio, const int gr, const int ch) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + int sfb, sfb2; + int j, i, l, start, end, bw; + FLOAT en0, en1; + FLOAT const ifqstep = (cod_info->scalefac_scale == 0) ? .5 : 1.0; + int const *const scalefac = cod_info->scalefac; + + FLOAT l3_xmin[SFBMAX], xfsf[SFBMAX]; + calc_noise_result noise; + + (void) calc_xmin(gfc, ratio, cod_info, l3_xmin); + (void) calc_noise(cod_info, l3_xmin, xfsf, &noise, 0); + + j = 0; + sfb2 = cod_info->sfb_lmax; + if (cod_info->block_type != SHORT_TYPE && !cod_info->mixed_block_flag) + sfb2 = 22; + for (sfb = 0; sfb < sfb2; sfb++) { + start = gfc->scalefac_band.l[sfb]; + end = gfc->scalefac_band.l[sfb + 1]; + bw = end - start; + for (en0 = 0.0; j < end; j++) + en0 += cod_info->xr[j] * cod_info->xr[j]; + en0 /= bw; + /* convert to MDCT units */ + en1 = 1e15; /* scaling so it shows up on FFT plot */ + gfc->pinfo->en[gr][ch][sfb] = en1 * en0; + gfc->pinfo->xfsf[gr][ch][sfb] = en1 * l3_xmin[sfb] * xfsf[sfb] / bw; + + if (ratio->en.l[sfb] > 0 && !cfg->ATHonly) + en0 = en0 / ratio->en.l[sfb]; + else + en0 = 0.0; + + gfc->pinfo->thr[gr][ch][sfb] = en1 * Max(en0 * ratio->thm.l[sfb], gfc->ATH->l[sfb]); + + /* there is no scalefactor bands >= SBPSY_l */ + gfc->pinfo->LAMEsfb[gr][ch][sfb] = 0; + if (cod_info->preflag && sfb >= 11) + gfc->pinfo->LAMEsfb[gr][ch][sfb] = -ifqstep * pretab[sfb]; + + if (sfb < SBPSY_l) { + assert(scalefac[sfb] >= 0); /* scfsi should be decoded by caller side */ + gfc->pinfo->LAMEsfb[gr][ch][sfb] -= ifqstep * scalefac[sfb]; + } + } /* for sfb */ + + if (cod_info->block_type == SHORT_TYPE) { + sfb2 = sfb; + for (sfb = cod_info->sfb_smin; sfb < SBMAX_s; sfb++) { + start = gfc->scalefac_band.s[sfb]; + end = gfc->scalefac_band.s[sfb + 1]; + bw = end - start; + for (i = 0; i < 3; i++) { + for (en0 = 0.0, l = start; l < end; l++) { + en0 += cod_info->xr[j] * cod_info->xr[j]; + j++; + } + en0 = Max(en0 / bw, 1e-20); + /* convert to MDCT units */ + en1 = 1e15; /* scaling so it shows up on FFT plot */ + + gfc->pinfo->en_s[gr][ch][3 * sfb + i] = en1 * en0; + gfc->pinfo->xfsf_s[gr][ch][3 * sfb + i] = en1 * l3_xmin[sfb2] * xfsf[sfb2] / bw; + if (ratio->en.s[sfb][i] > 0) + en0 = en0 / ratio->en.s[sfb][i]; + else + en0 = 0.0; + if (cfg->ATHonly || cfg->ATHshort) + en0 = 0; + + gfc->pinfo->thr_s[gr][ch][3 * sfb + i] = + en1 * Max(en0 * ratio->thm.s[sfb][i], gfc->ATH->s[sfb]); + + /* there is no scalefactor bands >= SBPSY_s */ + gfc->pinfo->LAMEsfb_s[gr][ch][3 * sfb + i] + = -2.0 * cod_info->subblock_gain[i]; + if (sfb < SBPSY_s) { + gfc->pinfo->LAMEsfb_s[gr][ch][3 * sfb + i] -= ifqstep * scalefac[sfb2]; + } + sfb2++; + } + } + } /* block type short */ + gfc->pinfo->LAMEqss[gr][ch] = cod_info->global_gain; + gfc->pinfo->LAMEmainbits[gr][ch] = cod_info->part2_3_length + cod_info->part2_length; + gfc->pinfo->LAMEsfbits[gr][ch] = cod_info->part2_length; + + gfc->pinfo->over[gr][ch] = noise.over_count; + gfc->pinfo->max_noise[gr][ch] = noise.max_noise * 10.0; + gfc->pinfo->over_noise[gr][ch] = noise.over_noise * 10.0; + gfc->pinfo->tot_noise[gr][ch] = noise.tot_noise * 10.0; + gfc->pinfo->over_SSD[gr][ch] = noise.over_SSD; +} + + +/************************************************************************ + * + * set_frame_pinfo() + * + * updates plotting data for a whole frame + * + * Robert Hegemann 2000-10-21 + * + ************************************************************************/ + +void +set_frame_pinfo(lame_internal_flags * gfc, const III_psy_ratio ratio[2][2]) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + int ch; + int gr; + + /* for every granule and channel patch l3_enc and set info + */ + for (gr = 0; gr < cfg->mode_gr; gr++) { + for (ch = 0; ch < cfg->channels_out; ch++) { + gr_info *const cod_info = &gfc->l3_side.tt[gr][ch]; + int scalefac_sav[SFBMAX]; + memcpy(scalefac_sav, cod_info->scalefac, sizeof(scalefac_sav)); + + /* reconstruct the scalefactors in case SCFSI was used + */ + if (gr == 1) { + int sfb; + for (sfb = 0; sfb < cod_info->sfb_lmax; sfb++) { + if (cod_info->scalefac[sfb] < 0) /* scfsi */ + cod_info->scalefac[sfb] = gfc->l3_side.tt[0][ch].scalefac[sfb]; + } + } + + set_pinfo(gfc, cod_info, &ratio[gr][ch], gr, ch); + memcpy(cod_info->scalefac, scalefac_sav, sizeof(scalefac_sav)); + } /* for ch */ + } /* for gr */ +} diff --git a/libmp3lame/quantize_pvt.h b/libmp3lame/quantize_pvt.h new file mode 100644 index 0000000..b8333e7 --- /dev/null +++ b/libmp3lame/quantize_pvt.h @@ -0,0 +1,128 @@ +/* + * quantize_pvt include file + * + * Copyright (c) 1999 Takehiro TOMINAGA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef LAME_QUANTIZE_PVT_H +#define LAME_QUANTIZE_PVT_H + +#define IXMAX_VAL 8206 /* ix always <= 8191+15. see count_bits() */ + +/* buggy Winamp decoder cannot handle values > 8191 */ +/* #define IXMAX_VAL 8191 */ + +#define PRECALC_SIZE (IXMAX_VAL+2) + + +extern const int nr_of_sfb_block[6][3][4]; +extern const int pretab[SBMAX_l]; +extern const int slen1_tab[16]; +extern const int slen2_tab[16]; + +extern const scalefac_struct sfBandIndex[9]; + +extern FLOAT pow43[PRECALC_SIZE]; +#ifdef TAKEHIRO_IEEE754_HACK +extern FLOAT adj43asm[PRECALC_SIZE]; +#else +extern FLOAT adj43[PRECALC_SIZE]; +#endif + +#define Q_MAX (256+1) +#define Q_MAX2 116 /* minimum possible number of + -cod_info->global_gain + + ((scalefac[] + (cod_info->preflag ? pretab[sfb] : 0)) + << (cod_info->scalefac_scale + 1)) + + cod_info->subblock_gain[cod_info->window[sfb]] * 8; + + for long block, 0+((15+3)<<2) = 18*4 = 72 + for short block, 0+(15<<2)+7*8 = 15*4+56 = 116 + */ + +extern FLOAT pow20[Q_MAX + Q_MAX2 + 1]; +extern FLOAT ipow20[Q_MAX]; + +typedef struct calc_noise_result_t { + FLOAT over_noise; /* sum of quantization noise > masking */ + FLOAT tot_noise; /* sum of all quantization noise */ + FLOAT max_noise; /* max quantization noise */ + int over_count; /* number of quantization noise > masking */ + int over_SSD; /* SSD-like cost of distorted bands */ + int bits; +} calc_noise_result; + + +/** +* allows re-use of previously +* computed noise values +*/ +typedef struct calc_noise_data_t { + int global_gain; + int sfb_count1; + int step[39]; + FLOAT noise[39]; + FLOAT noise_log[39]; +} calc_noise_data; + + +int on_pe(lame_internal_flags * gfc, const FLOAT pe[2][2], + int targ_bits[2], int mean_bits, int gr, int cbr); + +void reduce_side(int targ_bits[2], FLOAT ms_ener_ratio, int mean_bits, int max_bits); + + +void iteration_init(lame_internal_flags * gfc); + + +int calc_xmin(lame_internal_flags const *gfc, + III_psy_ratio const *const ratio, gr_info * const cod_info, FLOAT * l3_xmin); + +int calc_noise(const gr_info * const cod_info, + const FLOAT * l3_xmin, + FLOAT * distort, calc_noise_result * const res, calc_noise_data * prev_noise); + +void set_frame_pinfo(lame_internal_flags * gfc, const III_psy_ratio ratio[2][2]); + + + + +/* takehiro.c */ + +int count_bits(lame_internal_flags const *const gfc, const FLOAT * const xr, + gr_info * const cod_info, calc_noise_data * prev_noise); +int noquant_count_bits(lame_internal_flags const *const gfc, + gr_info * const cod_info, calc_noise_data * prev_noise); + + +void best_huffman_divide(const lame_internal_flags * const gfc, gr_info * const cod_info); + +void best_scalefac_store(const lame_internal_flags * gfc, const int gr, const int ch, + III_side_info_t * const l3_side); + +int scale_bitcount(const lame_internal_flags * gfc, gr_info * cod_info); + +void huffman_init(lame_internal_flags * const gfc); + +void init_xrpow_core_init(lame_internal_flags * const gfc); + +FLOAT athAdjust(FLOAT a, FLOAT x, FLOAT athFloor, float ATHfixpoint); + +#define LARGE_BITS 100000 + +#endif /* LAME_QUANTIZE_PVT_H */ diff --git a/libmp3lame/reservoir.c b/libmp3lame/reservoir.c new file mode 100644 index 0000000..4fdaa8d --- /dev/null +++ b/libmp3lame/reservoir.c @@ -0,0 +1,293 @@ +/* + * bit reservoir source file + * + * Copyright (c) 1999-2000 Mark Taylor + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* $Id: reservoir.c,v 1.45 2011/05/07 16:05:17 rbrito Exp $ */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + + +#include "lame.h" +#include "machine.h" +#include "encoder.h" +#include "util.h" +#include "reservoir.h" + +#include "bitstream.h" +#include "lame-analysis.h" +#include "lame_global_flags.h" + + +/* + ResvFrameBegin: + Called (repeatedly) at the beginning of a frame. Updates the maximum + size of the reservoir, and checks to make sure main_data_begin + was set properly by the formatter +*/ + +/* + * Background information: + * + * This is the original text from the ISO standard. Because of + * sooo many bugs and irritations correcting comments are added + * in brackets []. A '^W' means you should remove the last word. + * + * 1) The following rule can be used to calculate the maximum + * number of bits used for one granule [^W frame]: + * At the highest possible bitrate of Layer III (320 kbps + * per stereo signal [^W^W^W], 48 kHz) the frames must be of + * [^W^W^W are designed to have] constant length, i.e. + * one buffer [^W^W the frame] length is: + * + * 320 kbps * 1152/48 kHz = 7680 bit = 960 byte + * + * This value is used as the maximum buffer per channel [^W^W] at + * lower bitrates [than 320 kbps]. At 64 kbps mono or 128 kbps + * stereo the main granule length is 64 kbps * 576/48 kHz = 768 bit + * [per granule and channel] at 48 kHz sampling frequency. + * This means that there is a maximum deviation (short time buffer + * [= reservoir]) of 7680 - 2*2*768 = 4608 bits is allowed at 64 kbps. + * The actual deviation is equal to the number of bytes [with the + * meaning of octets] denoted by the main_data_end offset pointer. + * The actual maximum deviation is (2^9-1)*8 bit = 4088 bits + * [for MPEG-1 and (2^8-1)*8 bit for MPEG-2, both are hard limits]. + * ... The xchange of buffer bits between the left and right channel + * is allowed without restrictions [exception: dual channel]. + * Because of the [constructed] constraint on the buffer size + * main_data_end is always set to 0 in the case of bit_rate_index==14, + * i.e. data rate 320 kbps per stereo signal [^W^W^W]. In this case + * all data are allocated between adjacent header [^W sync] words + * [, i.e. there is no buffering at all]. + */ + +int +ResvFrameBegin(lame_internal_flags * gfc, int *mean_bits) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + EncStateVar_t *const esv = &gfc->sv_enc; + int fullFrameBits; + int resvLimit; + int maxmp3buf; + III_side_info_t *const l3_side = &gfc->l3_side; + int frameLength; + int meanBits; + + frameLength = getframebits(gfc); + meanBits = (frameLength - cfg->sideinfo_len * 8) / cfg->mode_gr; + +/* + * Meaning of the variables: + * resvLimit: (0, 8, ..., 8*255 (MPEG-2), 8*511 (MPEG-1)) + * Number of bits can be stored in previous frame(s) due to + * counter size constaints + * maxmp3buf: ( ??? ... 8*1951 (MPEG-1 and 2), 8*2047 (MPEG-2.5)) + * Number of bits allowed to encode one frame (you can take 8*511 bit + * from the bit reservoir and at most 8*1440 bit from the current + * frame (320 kbps, 32 kHz), so 8*1951 bit is the largest possible + * value for MPEG-1 and -2) + * + * maximum allowed granule/channel size times 4 = 8*2047 bits., + * so this is the absolute maximum supported by the format. + * + * + * fullFrameBits: maximum number of bits available for encoding + * the current frame. + * + * mean_bits: target number of bits per granule. + * + * frameLength: + * + * gfc->ResvMax: maximum allowed reservoir + * + * gfc->ResvSize: current reservoir size + * + * l3_side->resvDrain_pre: + * ancillary data to be added to previous frame: + * (only usefull in VBR modes if it is possible to have + * maxmp3buf < fullFrameBits)). Currently disabled, + * see #define NEW_DRAIN + * 2010-02-13: RH now enabled, it seems to be needed for CBR too, + * as there exists one example, where the FhG decoder + * can't decode a -b320 CBR file anymore. + * + * l3_side->resvDrain_post: + * ancillary data to be added to this frame: + * + */ + + /* main_data_begin has 9 bits in MPEG-1, 8 bits MPEG-2 */ + resvLimit = (8 * 256) * cfg->mode_gr - 8; + + /* maximum allowed frame size. dont use more than this number of + bits, even if the frame has the space for them: */ + maxmp3buf = cfg->buffer_constraint; + esv->ResvMax = maxmp3buf - frameLength; + if (esv->ResvMax > resvLimit) + esv->ResvMax = resvLimit; + if (esv->ResvMax < 0 || cfg->disable_reservoir) + esv->ResvMax = 0; + + fullFrameBits = meanBits * cfg->mode_gr + Min(esv->ResvSize, esv->ResvMax); + + if (fullFrameBits > maxmp3buf) + fullFrameBits = maxmp3buf; + + assert(0 == esv->ResvMax % 8); + assert(esv->ResvMax >= 0); + + l3_side->resvDrain_pre = 0; + + if (gfc->pinfo != NULL) { + gfc->pinfo->mean_bits = meanBits / 2; /* expected bits per channel per granule [is this also right for mono/stereo, MPEG-1/2 ?] */ + gfc->pinfo->resvsize = esv->ResvSize; + } + *mean_bits = meanBits; + return fullFrameBits; +} + + +/* + ResvMaxBits + returns targ_bits: target number of bits to use for 1 granule + extra_bits: amount extra available from reservoir + Mark Taylor 4/99 +*/ +void +ResvMaxBits(lame_internal_flags * gfc, int mean_bits, int *targ_bits, int *extra_bits, int cbr) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + EncStateVar_t *const esv = &gfc->sv_enc; + int add_bits, targBits, extraBits; + int ResvSize = esv->ResvSize, ResvMax = esv->ResvMax; + + /* conpensate the saved bits used in the 1st granule */ + if (cbr) + ResvSize += mean_bits; + + if (gfc->sv_qnt.substep_shaping & 1) + ResvMax *= 0.9; + + targBits = mean_bits; + + /* extra bits if the reservoir is almost full */ + if (ResvSize * 10 > ResvMax * 9) { + add_bits = ResvSize - (ResvMax * 9) / 10; + targBits += add_bits; + gfc->sv_qnt.substep_shaping |= 0x80; + } + else { + add_bits = 0; + gfc->sv_qnt.substep_shaping &= 0x7f; + /* build up reservoir. this builds the reservoir a little slower + * than FhG. It could simple be mean_bits/15, but this was rigged + * to always produce 100 (the old value) at 128kbs */ + /* *targ_bits -= (int) (mean_bits/15.2); */ + if (!cfg->disable_reservoir && !(gfc->sv_qnt.substep_shaping & 1)) + targBits -= .1 * mean_bits; + } + + + /* amount from the reservoir we are allowed to use. ISO says 6/10 */ + extraBits = (ResvSize < (esv->ResvMax * 6) / 10 ? ResvSize : (esv->ResvMax * 6) / 10); + extraBits -= add_bits; + + if (extraBits < 0) + extraBits = 0; + + *targ_bits = targBits; + *extra_bits = extraBits; +} + +/* + ResvAdjust: + Called after a granule's bit allocation. Readjusts the size of + the reservoir to reflect the granule's usage. +*/ +void +ResvAdjust(lame_internal_flags * gfc, gr_info const *gi) +{ + gfc->sv_enc.ResvSize -= gi->part2_3_length + gi->part2_length; +} + + +/* + ResvFrameEnd: + Called after all granules in a frame have been allocated. Makes sure + that the reservoir size is within limits, possibly by adding stuffing + bits. +*/ +void +ResvFrameEnd(lame_internal_flags * gfc, int mean_bits) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + EncStateVar_t *const esv = &gfc->sv_enc; + III_side_info_t *const l3_side = &gfc->l3_side; + int stuffingBits; + int over_bits; + + esv->ResvSize += mean_bits * cfg->mode_gr; + stuffingBits = 0; + l3_side->resvDrain_post = 0; + l3_side->resvDrain_pre = 0; + + /* we must be byte aligned */ + if ((over_bits = esv->ResvSize % 8) != 0) + stuffingBits += over_bits; + + + over_bits = (esv->ResvSize - stuffingBits) - esv->ResvMax; + if (over_bits > 0) { + assert(0 == over_bits % 8); + assert(over_bits >= 0); + stuffingBits += over_bits; + } + + + /* NOTE: enabling the NEW_DRAIN code fixes some problems with FhG decoder + shipped with MS Windows operating systems. Using this, it is even + possible to use Gabriel's lax buffer consideration again, which + assumes, any decoder should have a buffer large enough + for a 320 kbps frame at 32 kHz sample rate. + + old drain code: + lame -b320 BlackBird.wav ---> does not play with GraphEdit.exe using FhG decoder V1.5 Build 50 + + new drain code: + lame -b320 BlackBird.wav ---> plays fine with GraphEdit.exe using FhG decoder V1.5 Build 50 + + Robert Hegemann, 2010-02-13. + */ + /* drain as many bits as possible into previous frame ancillary data + * In particular, in VBR mode ResvMax may have changed, and we have + * to make sure main_data_begin does not create a reservoir bigger + * than ResvMax mt 4/00*/ + { + int mdb_bytes = Min(l3_side->main_data_begin * 8, stuffingBits) / 8; + l3_side->resvDrain_pre += 8 * mdb_bytes; + stuffingBits -= 8 * mdb_bytes; + esv->ResvSize -= 8 * mdb_bytes; + l3_side->main_data_begin -= mdb_bytes; + } + /* drain the rest into this frames ancillary data */ + l3_side->resvDrain_post += stuffingBits; + esv->ResvSize -= stuffingBits; +} diff --git a/libmp3lame/reservoir.h b/libmp3lame/reservoir.h new file mode 100644 index 0000000..7c58593 --- /dev/null +++ b/libmp3lame/reservoir.h @@ -0,0 +1,31 @@ +/* + * bit reservoir include file + * + * Copyright (c) 1999 Mark Taylor + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef LAME_RESERVOIR_H +#define LAME_RESERVOIR_H + +int ResvFrameBegin(lame_internal_flags * gfc, int *mean_bits); +void ResvMaxBits(lame_internal_flags * gfc, int mean_bits, int *targ_bits, int *max_bits, + int cbr); +void ResvAdjust(lame_internal_flags * gfc, gr_info const *gi); +void ResvFrameEnd(lame_internal_flags * gfc, int mean_bits); + +#endif /* LAME_RESERVOIR_H */ diff --git a/libmp3lame/set_get.c b/libmp3lame/set_get.c new file mode 100644 index 0000000..f763900 --- /dev/null +++ b/libmp3lame/set_get.c @@ -0,0 +1,2346 @@ +/* -*- mode: C; mode: fold -*- */ +/* + * set/get functions for lame_global_flags + * + * Copyright (c) 2001-2005 Alexander Leidinger + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* $Id: set_get.c,v 1.104 2017/09/06 15:07:30 robert Exp $ */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include "lame.h" +#include "machine.h" +#include "encoder.h" +#include "util.h" +#include "bitstream.h" /* because of compute_flushbits */ + +#include "set_get.h" +#include "lame_global_flags.h" + +/* + * input stream description + */ + + +/* number of samples */ +/* it's unlikely for this function to return an error */ +int +lame_set_num_samples(lame_global_flags * gfp, unsigned long num_samples) +{ + if (is_lame_global_flags_valid(gfp)) { + /* default = 2^32-1 */ + gfp->num_samples = num_samples; + return 0; + } + return -1; +} + +unsigned long +lame_get_num_samples(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->num_samples; + } + return 0; +} + + +/* input samplerate */ +int +lame_set_in_samplerate(lame_global_flags * gfp, int in_samplerate) +{ + if (is_lame_global_flags_valid(gfp)) { + if (in_samplerate < 1) + return -1; + /* input sample rate in Hz, default = 44100 Hz */ + gfp->samplerate_in = in_samplerate; + return 0; + } + return -1; +} + +int +lame_get_in_samplerate(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->samplerate_in; + } + return 0; +} + + +/* number of channels in input stream */ +int +lame_set_num_channels(lame_global_flags * gfp, int num_channels) +{ + if (is_lame_global_flags_valid(gfp)) { + /* default = 2 */ + if (2 < num_channels || 0 >= num_channels) { + return -1; /* we don't support more than 2 channels */ + } + gfp->num_channels = num_channels; + return 0; + } + return -1; +} + +int +lame_get_num_channels(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->num_channels; + } + return 0; +} + + +/* scale the input by this amount before encoding (not used for decoding) */ +int +lame_set_scale(lame_global_flags * gfp, float scale) +{ + if (is_lame_global_flags_valid(gfp)) { + /* default = 1 */ + gfp->scale = scale; + return 0; + } + return -1; +} + +float +lame_get_scale(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->scale; + } + return 0; +} + + +/* scale the channel 0 (left) input by this amount before + encoding (not used for decoding) */ +int +lame_set_scale_left(lame_global_flags * gfp, float scale) +{ + if (is_lame_global_flags_valid(gfp)) { + /* default = 1 */ + gfp->scale_left = scale; + return 0; + } + return -1; +} + +float +lame_get_scale_left(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->scale_left; + } + return 0; +} + + +/* scale the channel 1 (right) input by this amount before + encoding (not used for decoding) */ +int +lame_set_scale_right(lame_global_flags * gfp, float scale) +{ + if (is_lame_global_flags_valid(gfp)) { + /* default = 1 */ + gfp->scale_right = scale; + return 0; + } + return -1; +} + +float +lame_get_scale_right(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->scale_right; + } + return 0; +} + + +/* output sample rate in Hz */ +int +lame_set_out_samplerate(lame_global_flags * gfp, int out_samplerate) +{ + if (is_lame_global_flags_valid(gfp)) { + /* + * default = 0: LAME picks best value based on the amount + * of compression + * MPEG only allows: + * MPEG1 32, 44.1, 48khz + * MPEG2 16, 22.05, 24 + * MPEG2.5 8, 11.025, 12 + * + * (not used by decoding routines) + */ + if (out_samplerate != 0) { + int v=0; + if (SmpFrqIndex(out_samplerate, &v) < 0) + return -1; + } + gfp->samplerate_out = out_samplerate; + return 0; + } + return -1; +} + +int +lame_get_out_samplerate(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->samplerate_out; + } + return 0; +} + + + + +/* + * general control parameters + */ + +/* collect data for an MP3 frame analzyer */ +int +lame_set_analysis(lame_global_flags * gfp, int analysis) +{ + if (is_lame_global_flags_valid(gfp)) { + /* default = 0 */ + + /* enforce disable/enable meaning, if we need more than two values + we need to switch to an enum to have an apropriate representation + of the possible meanings of the value */ + if (0 > analysis || 1 < analysis) + return -1; + gfp->analysis = analysis; + return 0; + } + return -1; +} + +int +lame_get_analysis(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + assert(0 <= gfp->analysis && 1 >= gfp->analysis); + return gfp->analysis; + } + return 0; +} + + +/* write a Xing VBR header frame */ +int +lame_set_bWriteVbrTag(lame_global_flags * gfp, int bWriteVbrTag) +{ + if (is_lame_global_flags_valid(gfp)) { + /* default = 1 (on) for VBR/ABR modes, 0 (off) for CBR mode */ + + /* enforce disable/enable meaning, if we need more than two values + we need to switch to an enum to have an apropriate representation + of the possible meanings of the value */ + if (0 > bWriteVbrTag || 1 < bWriteVbrTag) + return -1; + gfp->write_lame_tag = bWriteVbrTag; + return 0; + } + return -1; +} + +int +lame_get_bWriteVbrTag(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + assert(0 <= gfp->write_lame_tag && 1 >= gfp->write_lame_tag); + return gfp->write_lame_tag; + } + return 0; +} + + + +/* decode only, use lame/mpglib to convert mp3 to wav */ +int +lame_set_decode_only(lame_global_flags * gfp, int decode_only) +{ + if (is_lame_global_flags_valid(gfp)) { + /* default = 0 (disabled) */ + + /* enforce disable/enable meaning, if we need more than two values + we need to switch to an enum to have an apropriate representation + of the possible meanings of the value */ + if (0 > decode_only || 1 < decode_only) + return -1; + gfp->decode_only = decode_only; + return 0; + } + return -1; +} + +int +lame_get_decode_only(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + assert(0 <= gfp->decode_only && 1 >= gfp->decode_only); + return gfp->decode_only; + } + return 0; +} + + +#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED +/* 1=encode a Vorbis .ogg file. default=0 */ +/* DEPRECATED */ +int CDECL lame_set_ogg(lame_global_flags *, int); +int CDECL lame_get_ogg(const lame_global_flags *); +#else +#endif + +/* encode a Vorbis .ogg file */ +/* DEPRECATED */ +int +lame_set_ogg(lame_global_flags * gfp, int ogg) +{ + (void) gfp; + (void) ogg; + return -1; +} + +int +lame_get_ogg(const lame_global_flags * gfp) +{ + (void) gfp; + return 0; +} + + +/* + * Internal algorithm selection. + * True quality is determined by the bitrate but this variable will effect + * quality by selecting expensive or cheap algorithms. + * quality=0..9. 0=best (very slow). 9=worst. + * recommended: 3 near-best quality, not too slow + * 5 good quality, fast + * 7 ok quality, really fast + */ +int +lame_set_quality(lame_global_flags * gfp, int quality) +{ + if (is_lame_global_flags_valid(gfp)) { + if (quality < 0) { + gfp->quality = 0; + } + else if (quality > 9) { + gfp->quality = 9; + } + else { + gfp->quality = quality; + } + return 0; + } + return -1; +} + +int +lame_get_quality(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->quality; + } + return 0; +} + + +/* mode = STEREO, JOINT_STEREO, DUAL_CHANNEL (not supported), MONO */ +int +lame_set_mode(lame_global_flags * gfp, MPEG_mode mode) +{ + if (is_lame_global_flags_valid(gfp)) { + int mpg_mode = mode; + /* default: lame chooses based on compression ratio and input channels */ + if (mpg_mode < 0 || MAX_INDICATOR <= mpg_mode) + return -1; /* Unknown MPEG mode! */ + gfp->mode = mode; + return 0; + } + return -1; +} + +MPEG_mode +lame_get_mode(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + assert(gfp->mode < MAX_INDICATOR); + return gfp->mode; + } + return NOT_SET; +} + + +#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED +/* + mode_automs. Use a M/S mode with a switching threshold based on + compression ratio + DEPRECATED +*/ +int CDECL lame_set_mode_automs(lame_global_flags *, int); +int CDECL lame_get_mode_automs(const lame_global_flags *); +#else +#endif + +/* Us a M/S mode with a switching threshold based on compression ratio */ +/* DEPRECATED */ +int +lame_set_mode_automs(lame_global_flags * gfp, int mode_automs) +{ + if (is_lame_global_flags_valid(gfp)) { + /* default = 0 (disabled) */ + + /* enforce disable/enable meaning, if we need more than two values + we need to switch to an enum to have an apropriate representation + of the possible meanings of the value */ + if (0 > mode_automs || 1 < mode_automs) + return -1; + lame_set_mode(gfp, JOINT_STEREO); + return 0; + } + return -1; +} + +int +lame_get_mode_automs(const lame_global_flags * gfp) +{ + (void) gfp; + return 1; +} + + +/* + * Force M/S for all frames. For testing only. + * Requires mode = 1. + */ +int +lame_set_force_ms(lame_global_flags * gfp, int force_ms) +{ + if (is_lame_global_flags_valid(gfp)) { + /* default = 0 (disabled) */ + + /* enforce disable/enable meaning, if we need more than two values + we need to switch to an enum to have an apropriate representation + of the possible meanings of the value */ + if (0 > force_ms || 1 < force_ms) + return -1; + gfp->force_ms = force_ms; + return 0; + } + return -1; +} + +int +lame_get_force_ms(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + assert(0 <= gfp->force_ms && 1 >= gfp->force_ms); + return gfp->force_ms; + } + return 0; +} + + +/* Use free_format. */ +int +lame_set_free_format(lame_global_flags * gfp, int free_format) +{ + if (is_lame_global_flags_valid(gfp)) { + /* default = 0 (disabled) */ + + /* enforce disable/enable meaning, if we need more than two values + we need to switch to an enum to have an apropriate representation + of the possible meanings of the value */ + if (0 > free_format || 1 < free_format) + return -1; + gfp->free_format = free_format; + return 0; + } + return -1; +} + +int +lame_get_free_format(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + assert(0 <= gfp->free_format && 1 >= gfp->free_format); + return gfp->free_format; + } + return 0; +} + + + +/* Perform ReplayGain analysis */ +int +lame_set_findReplayGain(lame_global_flags * gfp, int findReplayGain) +{ + if (is_lame_global_flags_valid(gfp)) { + /* default = 0 (disabled) */ + + /* enforce disable/enable meaning, if we need more than two values + we need to switch to an enum to have an apropriate representation + of the possible meanings of the value */ + if (0 > findReplayGain || 1 < findReplayGain) + return -1; + gfp->findReplayGain = findReplayGain; + return 0; + } + return -1; +} + +int +lame_get_findReplayGain(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + assert(0 <= gfp->findReplayGain && 1 >= gfp->findReplayGain); + return gfp->findReplayGain; + } + return 0; +} + + +/* Decode on the fly. Find the peak sample. If ReplayGain analysis is + enabled then perform it on the decoded data. */ +int +lame_set_decode_on_the_fly(lame_global_flags * gfp, int decode_on_the_fly) +{ + if (is_lame_global_flags_valid(gfp)) { +#ifndef DECODE_ON_THE_FLY + return -1; +#else + /* default = 0 (disabled) */ + + /* enforce disable/enable meaning, if we need more than two values + we need to switch to an enum to have an apropriate representation + of the possible meanings of the value */ + if (0 > decode_on_the_fly || 1 < decode_on_the_fly) + return -1; + + gfp->decode_on_the_fly = decode_on_the_fly; + + return 0; +#endif + } + return -1; +} + +int +lame_get_decode_on_the_fly(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + assert(0 <= gfp->decode_on_the_fly && 1 >= gfp->decode_on_the_fly); + return gfp->decode_on_the_fly; + } + return 0; +} + +#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED +/* DEPRECATED: now does the same as lame_set_findReplayGain() + default = 0 (disabled) */ +int CDECL lame_set_ReplayGain_input(lame_global_flags *, int); +int CDECL lame_get_ReplayGain_input(const lame_global_flags *); + +/* DEPRECATED: now does the same as + lame_set_decode_on_the_fly() && lame_set_findReplayGain() + default = 0 (disabled) */ +int CDECL lame_set_ReplayGain_decode(lame_global_flags *, int); +int CDECL lame_get_ReplayGain_decode(const lame_global_flags *); + +/* DEPRECATED: now does the same as lame_set_decode_on_the_fly() + default = 0 (disabled) */ +int CDECL lame_set_findPeakSample(lame_global_flags *, int); +int CDECL lame_get_findPeakSample(const lame_global_flags *); +#else +#endif + +/* DEPRECATED. same as lame_set_decode_on_the_fly() */ +int +lame_set_findPeakSample(lame_global_flags * gfp, int arg) +{ + return lame_set_decode_on_the_fly(gfp, arg); +} + +int +lame_get_findPeakSample(const lame_global_flags * gfp) +{ + return lame_get_decode_on_the_fly(gfp); +} + +/* DEPRECATED. same as lame_set_findReplayGain() */ +int +lame_set_ReplayGain_input(lame_global_flags * gfp, int arg) +{ + return lame_set_findReplayGain(gfp, arg); +} + +int +lame_get_ReplayGain_input(const lame_global_flags * gfp) +{ + return lame_get_findReplayGain(gfp); +} + +/* DEPRECATED. same as lame_set_decode_on_the_fly() && + lame_set_findReplayGain() */ +int +lame_set_ReplayGain_decode(lame_global_flags * gfp, int arg) +{ + if (lame_set_decode_on_the_fly(gfp, arg) < 0 || lame_set_findReplayGain(gfp, arg) < 0) + return -1; + else + return 0; +} + +int +lame_get_ReplayGain_decode(const lame_global_flags * gfp) +{ + if (lame_get_decode_on_the_fly(gfp) > 0 && lame_get_findReplayGain(gfp) > 0) + return 1; + else + return 0; +} + + +/* set and get some gapless encoding flags */ + +int +lame_set_nogap_total(lame_global_flags * gfp, int the_nogap_total) +{ + if (is_lame_global_flags_valid(gfp)) { + gfp->nogap_total = the_nogap_total; + return 0; + } + return -1; +} + +int +lame_get_nogap_total(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->nogap_total; + } + return 0; +} + +int +lame_set_nogap_currentindex(lame_global_flags * gfp, int the_nogap_index) +{ + if (is_lame_global_flags_valid(gfp)) { + gfp->nogap_current = the_nogap_index; + return 0; + } + return -1; +} + +int +lame_get_nogap_currentindex(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->nogap_current; + } + return 0; +} + + +/* message handlers */ +int +lame_set_errorf(lame_global_flags * gfp, void (*func) (const char *, va_list)) +{ + if (is_lame_global_flags_valid(gfp)) { + gfp->report.errorf = func; + return 0; + } + return -1; +} + +int +lame_set_debugf(lame_global_flags * gfp, void (*func) (const char *, va_list)) +{ + if (is_lame_global_flags_valid(gfp)) { + gfp->report.debugf = func; + return 0; + } + return -1; +} + +int +lame_set_msgf(lame_global_flags * gfp, void (*func) (const char *, va_list)) +{ + if (is_lame_global_flags_valid(gfp)) { + gfp->report.msgf = func; + return 0; + } + return -1; +} + + +/* + * Set one of + * - brate + * - compression ratio. + * + * Default is compression ratio of 11. + */ +int +lame_set_brate(lame_global_flags * gfp, int brate) +{ + if (is_lame_global_flags_valid(gfp)) { + gfp->brate = brate; + if (brate > 320) { + gfp->disable_reservoir = 1; + } + return 0; + } + return -1; +} + +int +lame_get_brate(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->brate; + } + return 0; +} + +int +lame_set_compression_ratio(lame_global_flags * gfp, float compression_ratio) +{ + if (is_lame_global_flags_valid(gfp)) { + gfp->compression_ratio = compression_ratio; + return 0; + } + return -1; +} + +float +lame_get_compression_ratio(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->compression_ratio; + } + return 0; +} + + + + +/* + * frame parameters + */ + +/* Mark as copyright protected. */ +int +lame_set_copyright(lame_global_flags * gfp, int copyright) +{ + if (is_lame_global_flags_valid(gfp)) { + /* default = 0 (disabled) */ + + /* enforce disable/enable meaning, if we need more than two values + we need to switch to an enum to have an apropriate representation + of the possible meanings of the value */ + if (0 > copyright || 1 < copyright) + return -1; + gfp->copyright = copyright; + return 0; + } + return -1; +} + +int +lame_get_copyright(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + assert(0 <= gfp->copyright && 1 >= gfp->copyright); + return gfp->copyright; + } + return 0; +} + + +/* Mark as original. */ +int +lame_set_original(lame_global_flags * gfp, int original) +{ + if (is_lame_global_flags_valid(gfp)) { + /* default = 1 (enabled) */ + + /* enforce disable/enable meaning, if we need more than two values + we need to switch to an enum to have an apropriate representation + of the possible meanings of the value */ + if (0 > original || 1 < original) + return -1; + gfp->original = original; + return 0; + } + return -1; +} + +int +lame_get_original(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + assert(0 <= gfp->original && 1 >= gfp->original); + return gfp->original; + } + return 0; +} + + +/* + * error_protection. + * Use 2 bytes from each frame for CRC checksum. + */ +int +lame_set_error_protection(lame_global_flags * gfp, int error_protection) +{ + if (is_lame_global_flags_valid(gfp)) { + /* default = 0 (disabled) */ + + /* enforce disable/enable meaning, if we need more than two values + we need to switch to an enum to have an apropriate representation + of the possible meanings of the value */ + if (0 > error_protection || 1 < error_protection) + return -1; + gfp->error_protection = error_protection; + return 0; + } + return -1; +} + +int +lame_get_error_protection(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + assert(0 <= gfp->error_protection && 1 >= gfp->error_protection); + return gfp->error_protection; + } + return 0; +} + + +#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED +/* padding_type. 0=pad no frames 1=pad all frames 2=adjust padding(default) */ +int CDECL lame_set_padding_type(lame_global_flags *, Padding_type); +Padding_type CDECL lame_get_padding_type(const lame_global_flags *); +#else +#endif + +/* + * padding_type. + * PAD_NO = pad no frames + * PAD_ALL = pad all frames + * PAD_ADJUST = adjust padding + */ +int +lame_set_padding_type(lame_global_flags * gfp, Padding_type padding_type) +{ + (void) gfp; + (void) padding_type; + return 0; +} + +Padding_type +lame_get_padding_type(const lame_global_flags * gfp) +{ + (void) gfp; + return PAD_ADJUST; +} + + +/* MP3 'private extension' bit. Meaningless. */ +int +lame_set_extension(lame_global_flags * gfp, int extension) +{ + if (is_lame_global_flags_valid(gfp)) { + /* default = 0 (disabled) */ + /* enforce disable/enable meaning, if we need more than two values + we need to switch to an enum to have an apropriate representation + of the possible meanings of the value */ + if (0 > extension || 1 < extension) + return -1; + gfp->extension = extension; + return 0; + } + return -1; +} + +int +lame_get_extension(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + assert(0 <= gfp->extension && 1 >= gfp->extension); + return gfp->extension; + } + return 0; +} + + +/* Enforce strict ISO compliance. */ +int +lame_set_strict_ISO(lame_global_flags * gfp, int val) +{ + if (is_lame_global_flags_valid(gfp)) { + /* default = 0 (disabled) */ + /* enforce disable/enable meaning, if we need more than two values + we need to switch to an enum to have an apropriate representation + of the possible meanings of the value */ + if (val < MDB_DEFAULT || MDB_MAXIMUM < val) + return -1; + gfp->strict_ISO = val; + return 0; + } + return -1; +} + +int +lame_get_strict_ISO(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->strict_ISO; + } + return 0; +} + + + + +/******************************************************************** + * quantization/noise shaping + ***********************************************************************/ + +/* Disable the bit reservoir. For testing only. */ +int +lame_set_disable_reservoir(lame_global_flags * gfp, int disable_reservoir) +{ + if (is_lame_global_flags_valid(gfp)) { + /* default = 0 (disabled) */ + + /* enforce disable/enable meaning, if we need more than two values + we need to switch to an enum to have an apropriate representation + of the possible meanings of the value */ + if (0 > disable_reservoir || 1 < disable_reservoir) + return -1; + gfp->disable_reservoir = disable_reservoir; + return 0; + } + return -1; +} + +int +lame_get_disable_reservoir(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + assert(0 <= gfp->disable_reservoir && 1 >= gfp->disable_reservoir); + return gfp->disable_reservoir; + } + return 0; +} + + + + +int +lame_set_experimentalX(lame_global_flags * gfp, int experimentalX) +{ + if (is_lame_global_flags_valid(gfp)) { + lame_set_quant_comp(gfp, experimentalX); + lame_set_quant_comp_short(gfp, experimentalX); + return 0; + } + return -1; +} + +int +lame_get_experimentalX(const lame_global_flags * gfp) +{ + return lame_get_quant_comp(gfp); +} + + +/* Select a different "best quantization" function. default = 0 */ +int +lame_set_quant_comp(lame_global_flags * gfp, int quant_type) +{ + if (is_lame_global_flags_valid(gfp)) { + gfp->quant_comp = quant_type; + return 0; + } + return -1; +} + +int +lame_get_quant_comp(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->quant_comp; + } + return 0; +} + + +/* Select a different "best quantization" function. default = 0 */ +int +lame_set_quant_comp_short(lame_global_flags * gfp, int quant_type) +{ + if (is_lame_global_flags_valid(gfp)) { + gfp->quant_comp_short = quant_type; + return 0; + } + return -1; +} + +int +lame_get_quant_comp_short(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->quant_comp_short; + } + return 0; +} + + +/* Another experimental option. For testing only. */ +int +lame_set_experimentalY(lame_global_flags * gfp, int experimentalY) +{ + if (is_lame_global_flags_valid(gfp)) { + gfp->experimentalY = experimentalY; + return 0; + } + return -1; +} + +int +lame_get_experimentalY(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->experimentalY; + } + return 0; +} + + +int +lame_set_experimentalZ(lame_global_flags * gfp, int experimentalZ) +{ + if (is_lame_global_flags_valid(gfp)) { + gfp->experimentalZ = experimentalZ; + return 0; + } + return -1; +} + +int +lame_get_experimentalZ(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->experimentalZ; + } + return 0; +} + + +/* Naoki's psycho acoustic model. */ +int +lame_set_exp_nspsytune(lame_global_flags * gfp, int exp_nspsytune) +{ + if (is_lame_global_flags_valid(gfp)) { + /* default = 0 (disabled) */ + gfp->exp_nspsytune = exp_nspsytune; + return 0; + } + return -1; +} + +int +lame_get_exp_nspsytune(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->exp_nspsytune; + } + return 0; +} + + + + +/******************************************************************** + * VBR control + ***********************************************************************/ + +/* Types of VBR. default = vbr_off = CBR */ +int +lame_set_VBR(lame_global_flags * gfp, vbr_mode VBR) +{ + if (is_lame_global_flags_valid(gfp)) { + int vbr_q = VBR; + if (0 > vbr_q || vbr_max_indicator <= vbr_q) + return -1; /* Unknown VBR mode! */ + gfp->VBR = VBR; + return 0; + } + return -1; +} + +vbr_mode +lame_get_VBR(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + assert(gfp->VBR < vbr_max_indicator); + return gfp->VBR; + } + return vbr_off; +} + + +/* + * VBR quality level. + * 0 = highest + * 9 = lowest + */ +int +lame_set_VBR_q(lame_global_flags * gfp, int VBR_q) +{ + if (is_lame_global_flags_valid(gfp)) { + int ret = 0; + + if (0 > VBR_q) { + ret = -1; /* Unknown VBR quality level! */ + VBR_q = 0; + } + if (9 < VBR_q) { + ret = -1; + VBR_q = 9; + } + gfp->VBR_q = VBR_q; + gfp->VBR_q_frac = 0; + return ret; + } + return -1; +} + +int +lame_get_VBR_q(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + assert(0 <= gfp->VBR_q && 10 > gfp->VBR_q); + return gfp->VBR_q; + } + return 0; +} + +int +lame_set_VBR_quality(lame_global_flags * gfp, float VBR_q) +{ + if (is_lame_global_flags_valid(gfp)) { + int ret = 0; + + if (0 > VBR_q) { + ret = -1; /* Unknown VBR quality level! */ + VBR_q = 0; + } + if (9.999 < VBR_q) { + ret = -1; + VBR_q = 9.999; + } + + gfp->VBR_q = (int) VBR_q; + gfp->VBR_q_frac = VBR_q - gfp->VBR_q; + + return ret; + } + return -1; +} + +float +lame_get_VBR_quality(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->VBR_q + gfp->VBR_q_frac; + } + return 0; +} + + +/* Ignored except for VBR = vbr_abr (ABR mode) */ +int +lame_set_VBR_mean_bitrate_kbps(lame_global_flags * gfp, int VBR_mean_bitrate_kbps) +{ + if (is_lame_global_flags_valid(gfp)) { + gfp->VBR_mean_bitrate_kbps = VBR_mean_bitrate_kbps; + return 0; + } + return -1; +} + +int +lame_get_VBR_mean_bitrate_kbps(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->VBR_mean_bitrate_kbps; + } + return 0; +} + +int +lame_set_VBR_min_bitrate_kbps(lame_global_flags * gfp, int VBR_min_bitrate_kbps) +{ + if (is_lame_global_flags_valid(gfp)) { + gfp->VBR_min_bitrate_kbps = VBR_min_bitrate_kbps; + return 0; + } + return -1; +} + +int +lame_get_VBR_min_bitrate_kbps(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->VBR_min_bitrate_kbps; + } + return 0; +} + +int +lame_set_VBR_max_bitrate_kbps(lame_global_flags * gfp, int VBR_max_bitrate_kbps) +{ + if (is_lame_global_flags_valid(gfp)) { + gfp->VBR_max_bitrate_kbps = VBR_max_bitrate_kbps; + return 0; + } + return -1; +} + +int +lame_get_VBR_max_bitrate_kbps(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->VBR_max_bitrate_kbps; + } + return 0; +} + + +/* + * Strictly enforce VBR_min_bitrate. + * Normally it will be violated for analog silence. + */ +int +lame_set_VBR_hard_min(lame_global_flags * gfp, int VBR_hard_min) +{ + if (is_lame_global_flags_valid(gfp)) { + /* default = 0 (disabled) */ + + /* enforce disable/enable meaning, if we need more than two values + we need to switch to an enum to have an apropriate representation + of the possible meanings of the value */ + if (0 > VBR_hard_min || 1 < VBR_hard_min) + return -1; + + gfp->VBR_hard_min = VBR_hard_min; + + return 0; + } + return -1; +} + +int +lame_get_VBR_hard_min(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + assert(0 <= gfp->VBR_hard_min && 1 >= gfp->VBR_hard_min); + return gfp->VBR_hard_min; + } + return 0; +} + + +/******************************************************************** + * Filtering control + ***********************************************************************/ + +/* + * Freqency in Hz to apply lowpass. + * 0 = default = lame chooses + * -1 = disabled + */ +int +lame_set_lowpassfreq(lame_global_flags * gfp, int lowpassfreq) +{ + if (is_lame_global_flags_valid(gfp)) { + gfp->lowpassfreq = lowpassfreq; + return 0; + } + return -1; +} + +int +lame_get_lowpassfreq(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->lowpassfreq; + } + return 0; +} + + +/* + * Width of transition band (in Hz). + * default = one polyphase filter band + */ +int +lame_set_lowpasswidth(lame_global_flags * gfp, int lowpasswidth) +{ + if (is_lame_global_flags_valid(gfp)) { + gfp->lowpasswidth = lowpasswidth; + return 0; + } + return -1; +} + +int +lame_get_lowpasswidth(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->lowpasswidth; + } + return 0; +} + + +/* + * Frequency in Hz to apply highpass. + * 0 = default = lame chooses + * -1 = disabled + */ +int +lame_set_highpassfreq(lame_global_flags * gfp, int highpassfreq) +{ + if (is_lame_global_flags_valid(gfp)) { + gfp->highpassfreq = highpassfreq; + return 0; + } + return -1; +} + +int +lame_get_highpassfreq(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->highpassfreq; + } + return 0; +} + + +/* + * Width of transition band (in Hz). + * default = one polyphase filter band + */ +int +lame_set_highpasswidth(lame_global_flags * gfp, int highpasswidth) +{ + if (is_lame_global_flags_valid(gfp)) { + gfp->highpasswidth = highpasswidth; + return 0; + } + return -1; +} + +int +lame_get_highpasswidth(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->highpasswidth; + } + return 0; +} + + + + +/* + * psycho acoustics and other arguments which you should not change + * unless you know what you are doing + */ + + +/* Adjust masking values. */ +int +lame_set_maskingadjust(lame_global_flags * gfp, float adjust) +{ + if (is_lame_global_flags_valid(gfp)) { + gfp->maskingadjust = adjust; + return 0; + } + return -1; +} + +float +lame_get_maskingadjust(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->maskingadjust; + } + return 0; +} + +int +lame_set_maskingadjust_short(lame_global_flags * gfp, float adjust) +{ + if (is_lame_global_flags_valid(gfp)) { + gfp->maskingadjust_short = adjust; + return 0; + } + return -1; +} + +float +lame_get_maskingadjust_short(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->maskingadjust_short; + } + return 0; +} + +/* Only use ATH for masking. */ +int +lame_set_ATHonly(lame_global_flags * gfp, int ATHonly) +{ + if (is_lame_global_flags_valid(gfp)) { + gfp->ATHonly = ATHonly; + return 0; + } + return -1; +} + +int +lame_get_ATHonly(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->ATHonly; + } + return 0; +} + + +/* Only use ATH for short blocks. */ +int +lame_set_ATHshort(lame_global_flags * gfp, int ATHshort) +{ + if (is_lame_global_flags_valid(gfp)) { + gfp->ATHshort = ATHshort; + return 0; + } + return -1; +} + +int +lame_get_ATHshort(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->ATHshort; + } + return 0; +} + + +/* Disable ATH. */ +int +lame_set_noATH(lame_global_flags * gfp, int noATH) +{ + if (is_lame_global_flags_valid(gfp)) { + gfp->noATH = noATH; + return 0; + } + return -1; +} + +int +lame_get_noATH(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->noATH; + } + return 0; +} + + +/* Select ATH formula. */ +int +lame_set_ATHtype(lame_global_flags * gfp, int ATHtype) +{ + if (is_lame_global_flags_valid(gfp)) { + /* XXX: ATHtype should be converted to an enum. */ + gfp->ATHtype = ATHtype; + return 0; + } + return -1; +} + +int +lame_get_ATHtype(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->ATHtype; + } + return 0; +} + + +/* Select ATH formula 4 shape. */ +int +lame_set_ATHcurve(lame_global_flags * gfp, float ATHcurve) +{ + if (is_lame_global_flags_valid(gfp)) { + gfp->ATHcurve = ATHcurve; + return 0; + } + return -1; +} + +float +lame_get_ATHcurve(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->ATHcurve; + } + return 0; +} + + +/* Lower ATH by this many db. */ +int +lame_set_ATHlower(lame_global_flags * gfp, float ATHlower) +{ + if (is_lame_global_flags_valid(gfp)) { + gfp->ATH_lower_db = ATHlower; + return 0; + } + return -1; +} + +float +lame_get_ATHlower(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->ATH_lower_db; + } + return 0; +} + + +/* Select ATH adaptive adjustment scheme. */ +int +lame_set_athaa_type(lame_global_flags * gfp, int athaa_type) +{ + if (is_lame_global_flags_valid(gfp)) { + gfp->athaa_type = athaa_type; + return 0; + } + return -1; +} + +int +lame_get_athaa_type(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->athaa_type; + } + return 0; +} + + +#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED +int CDECL lame_set_athaa_loudapprox(lame_global_flags * gfp, int athaa_loudapprox); +int CDECL lame_get_athaa_loudapprox(const lame_global_flags * gfp); +#else +#endif + +/* Select the loudness approximation used by the ATH adaptive auto-leveling. */ +int +lame_set_athaa_loudapprox(lame_global_flags * gfp, int athaa_loudapprox) +{ + (void) gfp; + (void) athaa_loudapprox; + return 0; +} + +int +lame_get_athaa_loudapprox(const lame_global_flags * gfp) +{ + (void) gfp; + /* obsolete, the type known under number 2 is the only survival */ + return 2; +} + + +/* Adjust (in dB) the point below which adaptive ATH level adjustment occurs. */ +int +lame_set_athaa_sensitivity(lame_global_flags * gfp, float athaa_sensitivity) +{ + if (is_lame_global_flags_valid(gfp)) { + gfp->athaa_sensitivity = athaa_sensitivity; + return 0; + } + return -1; +} + +float +lame_get_athaa_sensitivity(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->athaa_sensitivity; + } + return 0; +} + + +/* Predictability limit (ISO tonality formula) */ +int lame_set_cwlimit(lame_global_flags * gfp, int cwlimit); +int lame_get_cwlimit(const lame_global_flags * gfp); + +int +lame_set_cwlimit(lame_global_flags * gfp, int cwlimit) +{ + (void) gfp; + (void) cwlimit; + return 0; +} + +int +lame_get_cwlimit(const lame_global_flags * gfp) +{ + (void) gfp; + return 0; +} + + + +/* + * Allow blocktypes to differ between channels. + * default: + * 0 for jstereo => block types coupled + * 1 for stereo => block types may differ + */ +int +lame_set_allow_diff_short(lame_global_flags * gfp, int allow_diff_short) +{ + if (is_lame_global_flags_valid(gfp)) { + gfp->short_blocks = allow_diff_short ? short_block_allowed : short_block_coupled; + return 0; + } + return -1; +} + +int +lame_get_allow_diff_short(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + if (gfp->short_blocks == short_block_allowed) + return 1; /* short blocks allowed to differ */ + else + return 0; /* not set, dispensed, forced or coupled */ + } + return 0; +} + + +/* Use temporal masking effect */ +int +lame_set_useTemporal(lame_global_flags * gfp, int useTemporal) +{ + if (is_lame_global_flags_valid(gfp)) { + /* default = 1 (enabled) */ + + /* enforce disable/enable meaning, if we need more than two values + we need to switch to an enum to have an apropriate representation + of the possible meanings of the value */ + if (0 <= useTemporal && useTemporal <= 1) { + gfp->useTemporal = useTemporal; + return 0; + } + } + return -1; +} + +int +lame_get_useTemporal(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + assert(0 <= gfp->useTemporal && 1 >= gfp->useTemporal); + return gfp->useTemporal; + } + return 0; +} + + +/* Use inter-channel masking effect */ +int +lame_set_interChRatio(lame_global_flags * gfp, float ratio) +{ + if (is_lame_global_flags_valid(gfp)) { + /* default = 0.0 (no inter-channel maskin) */ + if (0 <= ratio && ratio <= 1.0) { + gfp->interChRatio = ratio; + return 0; + } + } + return -1; +} + +float +lame_get_interChRatio(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + assert((0 <= gfp->interChRatio && gfp->interChRatio <= 1.0) || EQ(gfp->interChRatio, -1)); + return gfp->interChRatio; + } + return 0; +} + + +/* Use pseudo substep shaping method */ +int +lame_set_substep(lame_global_flags * gfp, int method) +{ + if (is_lame_global_flags_valid(gfp)) { + /* default = 0.0 (no substep noise shaping) */ + if (0 <= method && method <= 7) { + gfp->substep_shaping = method; + return 0; + } + } + return -1; +} + +int +lame_get_substep(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + assert(0 <= gfp->substep_shaping && gfp->substep_shaping <= 7); + return gfp->substep_shaping; + } + return 0; +} + +/* scalefactors scale */ +int +lame_set_sfscale(lame_global_flags * gfp, int val) +{ + if (is_lame_global_flags_valid(gfp)) { + gfp->noise_shaping = (val != 0) ? 2 : 1; + return 0; + } + return -1; +} + +int +lame_get_sfscale(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return (gfp->noise_shaping == 2) ? 1 : 0; + } + return 0; +} + +/* subblock gain */ +int +lame_set_subblock_gain(lame_global_flags * gfp, int sbgain) +{ + if (is_lame_global_flags_valid(gfp)) { + gfp->subblock_gain = sbgain; + return 0; + } + return -1; +} + +int +lame_get_subblock_gain(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->subblock_gain; + } + return 0; +} + + +/* Disable short blocks. */ +int +lame_set_no_short_blocks(lame_global_flags * gfp, int no_short_blocks) +{ + if (is_lame_global_flags_valid(gfp)) { + /* enforce disable/enable meaning, if we need more than two values + we need to switch to an enum to have an apropriate representation + of the possible meanings of the value */ + if (0 <= no_short_blocks && no_short_blocks <= 1) { + gfp->short_blocks = no_short_blocks ? short_block_dispensed : short_block_allowed; + return 0; + } + } + return -1; +} + +int +lame_get_no_short_blocks(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + switch (gfp->short_blocks) { + default: + case short_block_not_set: + return -1; + case short_block_dispensed: + return 1; + case short_block_allowed: + case short_block_coupled: + case short_block_forced: + return 0; + } + } + return -1; +} + + +/* Force short blocks. */ +int +lame_set_force_short_blocks(lame_global_flags * gfp, int short_blocks) +{ + if (is_lame_global_flags_valid(gfp)) { + /* enforce disable/enable meaning, if we need more than two values + we need to switch to an enum to have an apropriate representation + of the possible meanings of the value */ + if (0 > short_blocks || 1 < short_blocks) + return -1; + + if (short_blocks == 1) + gfp->short_blocks = short_block_forced; + else if (gfp->short_blocks == short_block_forced) + gfp->short_blocks = short_block_allowed; + + return 0; + } + return -1; +} + +int +lame_get_force_short_blocks(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + switch (gfp->short_blocks) { + default: + case short_block_not_set: + return -1; + case short_block_dispensed: + case short_block_allowed: + case short_block_coupled: + return 0; + case short_block_forced: + return 1; + } + } + return -1; +} + +int +lame_set_short_threshold_lrm(lame_global_flags * gfp, float lrm) +{ + if (is_lame_global_flags_valid(gfp)) { + gfp->attackthre = lrm; + return 0; + } + return -1; +} + +float +lame_get_short_threshold_lrm(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->attackthre; + } + return 0; +} + +int +lame_set_short_threshold_s(lame_global_flags * gfp, float s) +{ + if (is_lame_global_flags_valid(gfp)) { + gfp->attackthre_s = s; + return 0; + } + return -1; +} + +float +lame_get_short_threshold_s(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->attackthre_s; + } + return 0; +} + +int +lame_set_short_threshold(lame_global_flags * gfp, float lrm, float s) +{ + if (is_lame_global_flags_valid(gfp)) { + lame_set_short_threshold_lrm(gfp, lrm); + lame_set_short_threshold_s(gfp, s); + return 0; + } + return -1; +} + + +/* + * Input PCM is emphased PCM + * (for instance from one of the rarely emphased CDs). + * + * It is STRONGLY not recommended to use this, because psycho does not + * take it into account, and last but not least many decoders + * ignore these bits + */ +int +lame_set_emphasis(lame_global_flags * gfp, int emphasis) +{ + if (is_lame_global_flags_valid(gfp)) { + /* XXX: emphasis should be converted to an enum */ + if (0 <= emphasis && emphasis < 4) { + gfp->emphasis = emphasis; + return 0; + } + } + return -1; +} + +int +lame_get_emphasis(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + assert(0 <= gfp->emphasis && gfp->emphasis < 4); + return gfp->emphasis; + } + return 0; +} + + + + +/***************************************************************/ +/* internal variables, cannot be set... */ +/* provided because they may be of use to calling application */ +/***************************************************************/ + +/* MPEG version. + * 0 = MPEG-2 + * 1 = MPEG-1 + * (2 = MPEG-2.5) + */ +int +lame_get_version(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + lame_internal_flags const *const gfc = gfp->internal_flags; + if (is_lame_internal_flags_valid(gfc)) { + return gfc->cfg.version; + } + } + return 0; +} + + +/* Encoder delay. */ +int +lame_get_encoder_delay(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + lame_internal_flags const *const gfc = gfp->internal_flags; + if (is_lame_internal_flags_valid(gfc)) { + return gfc->ov_enc.encoder_delay; + } + } + return 0; +} + +/* padding added to the end of the input */ +int +lame_get_encoder_padding(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + lame_internal_flags const *const gfc = gfp->internal_flags; + if (is_lame_internal_flags_valid(gfc)) { + return gfc->ov_enc.encoder_padding; + } + } + return 0; +} + + +/* Size of MPEG frame. */ +int +lame_get_framesize(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + lame_internal_flags const *const gfc = gfp->internal_flags; + if (is_lame_internal_flags_valid(gfc)) { + SessionConfig_t const *const cfg = &gfc->cfg; + return 576 * cfg->mode_gr; + } + } + return 0; +} + + +/* Number of frames encoded so far. */ +int +lame_get_frameNum(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + lame_internal_flags const *const gfc = gfp->internal_flags; + if (is_lame_internal_flags_valid(gfc)) { + return gfc->ov_enc.frame_number; + } + } + return 0; +} + +int +lame_get_mf_samples_to_encode(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + lame_internal_flags const *const gfc = gfp->internal_flags; + if (is_lame_internal_flags_valid(gfc)) { + return gfc->sv_enc.mf_samples_to_encode; + } + } + return 0; +} + +int CDECL +lame_get_size_mp3buffer(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + lame_internal_flags const *const gfc = gfp->internal_flags; + if (is_lame_internal_flags_valid(gfc)) { + int size; + compute_flushbits(gfc, &size); + return size; + } + } + return 0; +} + +int +lame_get_RadioGain(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + lame_internal_flags const *const gfc = gfp->internal_flags; + if (is_lame_internal_flags_valid(gfc)) { + return gfc->ov_rpg.RadioGain; + } + } + return 0; +} + +int +lame_get_AudiophileGain(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + lame_internal_flags const *const gfc = gfp->internal_flags; + if (is_lame_internal_flags_valid(gfc)) { + return 0; + } + } + return 0; +} + +float +lame_get_PeakSample(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + lame_internal_flags const *const gfc = gfp->internal_flags; + if (is_lame_internal_flags_valid(gfc)) { + return (float) gfc->ov_rpg.PeakSample; + } + } + return 0; +} + +int +lame_get_noclipGainChange(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + lame_internal_flags const *const gfc = gfp->internal_flags; + if (is_lame_internal_flags_valid(gfc)) { + return gfc->ov_rpg.noclipGainChange; + } + } + return 0; +} + +float +lame_get_noclipScale(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + lame_internal_flags const *const gfc = gfp->internal_flags; + if (is_lame_internal_flags_valid(gfc)) { + return gfc->ov_rpg.noclipScale; + } + } + return 0; +} + + +/* + * LAME's estimate of the total number of frames to be encoded. + * Only valid if calling program set num_samples. + */ +int +lame_get_totalframes(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + lame_internal_flags const *const gfc = gfp->internal_flags; + if (is_lame_internal_flags_valid(gfc)) { + SessionConfig_t const *const cfg = &gfc->cfg; + unsigned long const pcm_samples_per_frame = 576 * cfg->mode_gr; + unsigned long pcm_samples_to_encode = gfp->num_samples; + unsigned long end_padding = 0; + int frames = 0; + + if (pcm_samples_to_encode == (0ul-1ul)) + return 0; /* unknown */ + + /* estimate based on user set num_samples: */ + if (cfg->samplerate_in != cfg->samplerate_out) { + /* resampling, estimate new samples_to_encode */ + double resampled_samples_to_encode = 0.0, frames_f = 0.0; + if (cfg->samplerate_in > 0) { + resampled_samples_to_encode = pcm_samples_to_encode; + resampled_samples_to_encode *= cfg->samplerate_out; + resampled_samples_to_encode /= cfg->samplerate_in; + } + if (resampled_samples_to_encode <= 0.0) + return 0; /* unlikely to happen, so what, no estimate! */ + frames_f = floor(resampled_samples_to_encode / pcm_samples_per_frame); + if (frames_f >= (INT_MAX-2)) + return 0; /* overflow, happens eventually, no estimate! */ + frames = frames_f; + resampled_samples_to_encode -= frames * pcm_samples_per_frame; + pcm_samples_to_encode = ceil(resampled_samples_to_encode); + } + else { + frames = pcm_samples_to_encode / pcm_samples_per_frame; + pcm_samples_to_encode -= frames * pcm_samples_per_frame; + } + pcm_samples_to_encode += 576ul; + end_padding = pcm_samples_per_frame - (pcm_samples_to_encode % pcm_samples_per_frame); + if (end_padding < 576ul) { + end_padding += pcm_samples_per_frame; + } + pcm_samples_to_encode += end_padding; + frames += (pcm_samples_to_encode / pcm_samples_per_frame); + /* check to see if we underestimated totalframes */ + /* if (totalframes < gfp->frameNum) */ + /* totalframes = gfp->frameNum; */ + return frames; + } + } + return 0; +} + + + + + +int +lame_set_preset(lame_global_flags * gfp, int preset) +{ + if (is_lame_global_flags_valid(gfp)) { + gfp->preset = preset; + return apply_preset(gfp, preset, 1); + } + return -1; +} + + + +int +lame_set_asm_optimizations(lame_global_flags * gfp, int optim, int mode) +{ + if (is_lame_global_flags_valid(gfp)) { + mode = (mode == 1 ? 1 : 0); + switch (optim) { + case MMX:{ + gfp->asm_optimizations.mmx = mode; + return optim; + } + case AMD_3DNOW:{ + gfp->asm_optimizations.amd3dnow = mode; + return optim; + } + case SSE:{ + gfp->asm_optimizations.sse = mode; + return optim; + } + default: + return optim; + } + } + return -1; +} + + +void +lame_set_write_id3tag_automatic(lame_global_flags * gfp, int v) +{ + if (is_lame_global_flags_valid(gfp)) { + gfp->write_id3tag_automatic = v; + } +} + + +int +lame_get_write_id3tag_automatic(lame_global_flags const *gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->write_id3tag_automatic; + } + return 1; +} + + +/* + +UNDOCUMENTED, experimental settings. These routines are not prototyped +in lame.h. You should not use them, they are experimental and may +change. + +*/ + + +/* + * just another daily changing developer switch + */ +void CDECL lame_set_tune(lame_global_flags *, float); + +void +lame_set_tune(lame_global_flags * gfp, float val) +{ + if (is_lame_global_flags_valid(gfp)) { + gfp->tune_value_a = val; + gfp->tune = 1; + } +} + +/* Custom msfix hack */ +void +lame_set_msfix(lame_global_flags * gfp, double msfix) +{ + if (is_lame_global_flags_valid(gfp)) { + /* default = 0 */ + gfp->msfix = msfix; + } +} + +float +lame_get_msfix(const lame_global_flags * gfp) +{ + if (is_lame_global_flags_valid(gfp)) { + return gfp->msfix; + } + return 0; +} + +#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED +int CDECL lame_set_preset_expopts(lame_global_flags *, int); +#else +#endif + +int +lame_set_preset_expopts(lame_global_flags * gfp, int preset_expopts) +{ + (void) gfp; + (void) preset_expopts; + return 0; +} + + +int +lame_set_preset_notune(lame_global_flags * gfp, int preset_notune) +{ + (void) gfp; + (void) preset_notune; + return 0; +} + +static int +calc_maximum_input_samples_for_buffer_size(lame_internal_flags const* gfc, size_t buffer_size) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + int const pcm_samples_per_frame = 576 * cfg->mode_gr; + int frames_per_buffer = 0, input_samples_per_buffer = 0; + int kbps = 320; + + if (cfg->samplerate_out < 16000) + kbps = 64; + else if (cfg->samplerate_out < 32000) + kbps = 160; + else + kbps = 320; + if (cfg->free_format) + kbps = cfg->avg_bitrate; + else if (cfg->vbr == vbr_off) { + kbps = cfg->avg_bitrate; + } + { + int const pad = 1; + int const bpf = ((cfg->version + 1) * 72000 * kbps / cfg->samplerate_out + pad); + frames_per_buffer = buffer_size / bpf; + } + { + double ratio = (double) cfg->samplerate_in / cfg->samplerate_out; + input_samples_per_buffer = pcm_samples_per_frame * frames_per_buffer * ratio; + } + return input_samples_per_buffer; +} + +int +lame_get_maximum_number_of_samples(lame_t gfp, size_t buffer_size) +{ + if (is_lame_global_flags_valid(gfp)) { + lame_internal_flags const *const gfc = gfp->internal_flags; + if (is_lame_internal_flags_valid(gfc)) { + return calc_maximum_input_samples_for_buffer_size(gfc, buffer_size); + } + } + return LAME_GENERICERROR; +} diff --git a/libmp3lame/set_get.h b/libmp3lame/set_get.h new file mode 100644 index 0000000..37e4bcd --- /dev/null +++ b/libmp3lame/set_get.h @@ -0,0 +1,76 @@ +/* + * set_get.h -- Internal set/get definitions + * + * Copyright (C) 2003 Gabriel Bouvigne / Lame project + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef __SET_GET_H__ +#define __SET_GET_H__ + +#include <lame.h> + +#if defined(__cplusplus) +extern "C" { +#endif + +/* select psychoacoustic model */ + +/* manage short blocks */ + int CDECL lame_set_short_threshold(lame_global_flags *, float, float); + int CDECL lame_set_short_threshold_lrm(lame_global_flags *, float); + float CDECL lame_get_short_threshold_lrm(const lame_global_flags *); + int CDECL lame_set_short_threshold_s(lame_global_flags *, float); + float CDECL lame_get_short_threshold_s(const lame_global_flags *); + + + int CDECL lame_set_maskingadjust(lame_global_flags *, float); + float CDECL lame_get_maskingadjust(const lame_global_flags *); + + int CDECL lame_set_maskingadjust_short(lame_global_flags *, float); + float CDECL lame_get_maskingadjust_short(const lame_global_flags *); + +/* select ATH formula 4 shape */ + int CDECL lame_set_ATHcurve(lame_global_flags *, float); + float CDECL lame_get_ATHcurve(const lame_global_flags *); + + int CDECL lame_set_preset_notune(lame_global_flags *, int); + +/* substep shaping method */ + int CDECL lame_set_substep(lame_global_flags *, int); + int CDECL lame_get_substep(const lame_global_flags *); + +/* scalefactors scale */ + int CDECL lame_set_sfscale(lame_global_flags *, int); + int CDECL lame_get_sfscale(const lame_global_flags *); + +/* subblock gain */ + int CDECL lame_set_subblock_gain(lame_global_flags *, int); + int CDECL lame_get_subblock_gain(const lame_global_flags *); + + + +/*presets*/ + int apply_preset(lame_global_flags *, int preset, int enforce); + + void CDECL lame_set_tune(lame_t, float); /* FOR INTERNAL USE ONLY */ + void CDECL lame_set_msfix(lame_t gfp, double msfix); + + +#if defined(__cplusplus) +} +#endif +#endif diff --git a/libmp3lame/tables.c b/libmp3lame/tables.c new file mode 100644 index 0000000..a023099 --- /dev/null +++ b/libmp3lame/tables.c @@ -0,0 +1,564 @@ +/* + * MPEG layer 3 tables source file + * + * Copyright (c) 1999 Albert L Faber + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* $Id: tables.c,v 1.29 2011/05/07 16:05:17 rbrito Exp $ */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include "machine.h" + +#include "lame.h" +#include "tables.h" + + +static const uint16_t t1HB[] = { + 1, 1, + 1, 0 +}; + +static const uint16_t t2HB[] = { + 1, 2, 1, + 3, 1, 1, + 3, 2, 0 +}; + +static const uint16_t t3HB[] = { + 3, 2, 1, + 1, 1, 1, + 3, 2, 0 +}; + +static const uint16_t t5HB[] = { + 1, 2, 6, 5, + 3, 1, 4, 4, + 7, 5, 7, 1, + 6, 1, 1, 0 +}; + +static const uint16_t t6HB[] = { + 7, 3, 5, 1, + 6, 2, 3, 2, + 5, 4, 4, 1, + 3, 3, 2, 0 +}; + +static const uint16_t t7HB[] = { + 1, 2, 10, 19, 16, 10, + 3, 3, 7, 10, 5, 3, + 11, 4, 13, 17, 8, 4, + 12, 11, 18, 15, 11, 2, + 7, 6, 9, 14, 3, 1, + 6, 4, 5, 3, 2, 0 +}; + +static const uint16_t t8HB[] = { + 3, 4, 6, 18, 12, 5, + 5, 1, 2, 16, 9, 3, + 7, 3, 5, 14, 7, 3, + 19, 17, 15, 13, 10, 4, + 13, 5, 8, 11, 5, 1, + 12, 4, 4, 1, 1, 0 +}; + +static const uint16_t t9HB[] = { + 7, 5, 9, 14, 15, 7, + 6, 4, 5, 5, 6, 7, + 7, 6, 8, 8, 8, 5, + 15, 6, 9, 10, 5, 1, + 11, 7, 9, 6, 4, 1, + 14, 4, 6, 2, 6, 0 +}; + +static const uint16_t t10HB[] = { + 1, 2, 10, 23, 35, 30, 12, 17, + 3, 3, 8, 12, 18, 21, 12, 7, + 11, 9, 15, 21, 32, 40, 19, 6, + 14, 13, 22, 34, 46, 23, 18, 7, + 20, 19, 33, 47, 27, 22, 9, 3, + 31, 22, 41, 26, 21, 20, 5, 3, + 14, 13, 10, 11, 16, 6, 5, 1, + 9, 8, 7, 8, 4, 4, 2, 0 +}; + +static const uint16_t t11HB[] = { + 3, 4, 10, 24, 34, 33, 21, 15, + 5, 3, 4, 10, 32, 17, 11, 10, + 11, 7, 13, 18, 30, 31, 20, 5, + 25, 11, 19, 59, 27, 18, 12, 5, + 35, 33, 31, 58, 30, 16, 7, 5, + 28, 26, 32, 19, 17, 15, 8, 14, + 14, 12, 9, 13, 14, 9, 4, 1, + 11, 4, 6, 6, 6, 3, 2, 0 +}; + +static const uint16_t t12HB[] = { + 9, 6, 16, 33, 41, 39, 38, 26, + 7, 5, 6, 9, 23, 16, 26, 11, + 17, 7, 11, 14, 21, 30, 10, 7, + 17, 10, 15, 12, 18, 28, 14, 5, + 32, 13, 22, 19, 18, 16, 9, 5, + 40, 17, 31, 29, 17, 13, 4, 2, + 27, 12, 11, 15, 10, 7, 4, 1, + 27, 12, 8, 12, 6, 3, 1, 0 +}; + +static const uint16_t t13HB[] = { + 1, 5, 14, 21, 34, 51, 46, 71, 42, 52, 68, 52, 67, 44, 43, 19, + 3, 4, 12, 19, 31, 26, 44, 33, 31, 24, 32, 24, 31, 35, 22, 14, + 15, 13, 23, 36, 59, 49, 77, 65, 29, 40, 30, 40, 27, 33, 42, 16, + 22, 20, 37, 61, 56, 79, 73, 64, 43, 76, 56, 37, 26, 31, 25, 14, + 35, 16, 60, 57, 97, 75, 114, 91, 54, 73, 55, 41, 48, 53, 23, 24, + 58, 27, 50, 96, 76, 70, 93, 84, 77, 58, 79, 29, 74, 49, 41, 17, + 47, 45, 78, 74, 115, 94, 90, 79, 69, 83, 71, 50, 59, 38, 36, 15, + 72, 34, 56, 95, 92, 85, 91, 90, 86, 73, 77, 65, 51, 44, 43, 42, + 43, 20, 30, 44, 55, 78, 72, 87, 78, 61, 46, 54, 37, 30, 20, 16, + 53, 25, 41, 37, 44, 59, 54, 81, 66, 76, 57, 54, 37, 18, 39, 11, + 35, 33, 31, 57, 42, 82, 72, 80, 47, 58, 55, 21, 22, 26, 38, 22, + 53, 25, 23, 38, 70, 60, 51, 36, 55, 26, 34, 23, 27, 14, 9, 7, + 34, 32, 28, 39, 49, 75, 30, 52, 48, 40, 52, 28, 18, 17, 9, 5, + 45, 21, 34, 64, 56, 50, 49, 45, 31, 19, 12, 15, 10, 7, 6, 3, + 48, 23, 20, 39, 36, 35, 53, 21, 16, 23, 13, 10, 6, 1, 4, 2, + 16, 15, 17, 27, 25, 20, 29, 11, 17, 12, 16, 8, 1, 1, 0, 1 +}; + +static const uint16_t t15HB[] = { + 7, 12, 18, 53, 47, 76, 124, 108, 89, 123, 108, 119, 107, 81, 122, 63, + 13, 5, 16, 27, 46, 36, 61, 51, 42, 70, 52, 83, 65, 41, 59, 36, + 19, 17, 15, 24, 41, 34, 59, 48, 40, 64, 50, 78, 62, 80, 56, 33, + 29, 28, 25, 43, 39, 63, 55, 93, 76, 59, 93, 72, 54, 75, 50, 29, + 52, 22, 42, 40, 67, 57, 95, 79, 72, 57, 89, 69, 49, 66, 46, 27, + 77, 37, 35, 66, 58, 52, 91, 74, 62, 48, 79, 63, 90, 62, 40, 38, + 125, 32, 60, 56, 50, 92, 78, 65, 55, 87, 71, 51, 73, 51, 70, 30, + 109, 53, 49, 94, 88, 75, 66, 122, 91, 73, 56, 42, 64, 44, 21, 25, + 90, 43, 41, 77, 73, 63, 56, 92, 77, 66, 47, 67, 48, 53, 36, 20, + 71, 34, 67, 60, 58, 49, 88, 76, 67, 106, 71, 54, 38, 39, 23, 15, + 109, 53, 51, 47, 90, 82, 58, 57, 48, 72, 57, 41, 23, 27, 62, 9, + 86, 42, 40, 37, 70, 64, 52, 43, 70, 55, 42, 25, 29, 18, 11, 11, + 118, 68, 30, 55, 50, 46, 74, 65, 49, 39, 24, 16, 22, 13, 14, 7, + 91, 44, 39, 38, 34, 63, 52, 45, 31, 52, 28, 19, 14, 8, 9, 3, + 123, 60, 58, 53, 47, 43, 32, 22, 37, 24, 17, 12, 15, 10, 2, 1, + 71, 37, 34, 30, 28, 20, 17, 26, 21, 16, 10, 6, 8, 6, 2, 0 +}; + +static const uint16_t t16HB[] = { + 1, 5, 14, 44, 74, 63, 110, 93, 172, 149, 138, 242, 225, 195, 376, 17, + 3, 4, 12, 20, 35, 62, 53, 47, 83, 75, 68, 119, 201, 107, 207, 9, + 15, 13, 23, 38, 67, 58, 103, 90, 161, 72, 127, 117, 110, 209, 206, 16, + 45, 21, 39, 69, 64, 114, 99, 87, 158, 140, 252, 212, 199, 387, 365, 26, + 75, 36, 68, 65, 115, 101, 179, 164, 155, 264, 246, 226, 395, 382, 362, 9, + 66, 30, 59, 56, 102, 185, 173, 265, 142, 253, 232, 400, 388, 378, 445, 16, + 111, 54, 52, 100, 184, 178, 160, 133, 257, 244, 228, 217, 385, 366, 715, 10, + 98, 48, 91, 88, 165, 157, 148, 261, 248, 407, 397, 372, 380, 889, 884, 8, + 85, 84, 81, 159, 156, 143, 260, 249, 427, 401, 392, 383, 727, 713, 708, 7, + 154, 76, 73, 141, 131, 256, 245, 426, 406, 394, 384, 735, 359, 710, 352, 11, + 139, 129, 67, 125, 247, 233, 229, 219, 393, 743, 737, 720, 885, 882, 439, 4, + 243, 120, 118, 115, 227, 223, 396, 746, 742, 736, 721, 712, 706, 223, 436, 6, + 202, 224, 222, 218, 216, 389, 386, 381, 364, 888, 443, 707, 440, 437, 1728, 4, + 747, 211, 210, 208, 370, 379, 734, 723, 714, 1735, 883, 877, 876, 3459, 865, 2, + 377, 369, 102, 187, 726, 722, 358, 711, 709, 866, 1734, 871, 3458, 870, 434, 0, + 12, 10, 7, 11, 10, 17, 11, 9, 13, 12, 10, 7, 5, 3, 1, 3 +}; + +static const uint16_t t24HB[] = { + 15, 13, 46, 80, 146, 262, 248, 434, 426, 669, 653, 649, 621, 517, 1032, 88, + 14, 12, 21, 38, 71, 130, 122, 216, 209, 198, 327, 345, 319, 297, 279, 42, + 47, 22, 41, 74, 68, 128, 120, 221, 207, 194, 182, 340, 315, 295, 541, 18, + 81, 39, 75, 70, 134, 125, 116, 220, 204, 190, 178, 325, 311, 293, 271, 16, + 147, 72, 69, 135, 127, 118, 112, 210, 200, 188, 352, 323, 306, 285, 540, 14, + 263, 66, 129, 126, 119, 114, 214, 202, 192, 180, 341, 317, 301, 281, 262, 12, + 249, 123, 121, 117, 113, 215, 206, 195, 185, 347, 330, 308, 291, 272, 520, 10, + 435, 115, 111, 109, 211, 203, 196, 187, 353, 332, 313, 298, 283, 531, 381, 17, + 427, 212, 208, 205, 201, 193, 186, 177, 169, 320, 303, 286, 268, 514, 377, 16, + 335, 199, 197, 191, 189, 181, 174, 333, 321, 305, 289, 275, 521, 379, 371, 11, + 668, 184, 183, 179, 175, 344, 331, 314, 304, 290, 277, 530, 383, 373, 366, 10, + 652, 346, 171, 168, 164, 318, 309, 299, 287, 276, 263, 513, 375, 368, 362, 6, + 648, 322, 316, 312, 307, 302, 292, 284, 269, 261, 512, 376, 370, 364, 359, 4, + 620, 300, 296, 294, 288, 282, 273, 266, 515, 380, 374, 369, 365, 361, 357, 2, + 1033, 280, 278, 274, 267, 264, 259, 382, 378, 372, 367, 363, 360, 358, 356, 0, + 43, 20, 19, 17, 15, 13, 11, 9, 7, 6, 4, 7, 5, 3, 1, 3 +}; + +static const uint16_t t32HB[] = { + 1 << 0, 5 << 1, 4 << 1, 5 << 2, 6 << 1, 5 << 2, 4 << 2, 4 << 3, + 7 << 1, 3 << 2, 6 << 2, 0 << 3, 7 << 2, 2 << 3, 3 << 3, 1 << 4 +}; + +static const uint16_t t33HB[] = { + 15 << 0, 14 << 1, 13 << 1, 12 << 2, 11 << 1, 10 << 2, 9 << 2, 8 << 3, + 7 << 1, 6 << 2, 5 << 2, 4 << 3, 3 << 2, 2 << 3, 1 << 3, 0 << 4 +}; + + +const uint8_t t1l[] = { + 1, 4, + 3, 5 +}; + +static const uint8_t t2l[] = { + 1, 4, 7, + 4, 5, 7, + 6, 7, 8 +}; + +static const uint8_t t3l[] = { + 2, 3, 7, + 4, 4, 7, + 6, 7, 8 +}; + +static const uint8_t t5l[] = { + 1, 4, 7, 8, + 4, 5, 8, 9, + 7, 8, 9, 10, + 8, 8, 9, 10 +}; + +static const uint8_t t6l[] = { + 3, 4, 6, 8, + 4, 4, 6, 7, + 5, 6, 7, 8, + 7, 7, 8, 9 +}; + +static const uint8_t t7l[] = { + 1, 4, 7, 9, 9, 10, + 4, 6, 8, 9, 9, 10, + 7, 7, 9, 10, 10, 11, + 8, 9, 10, 11, 11, 11, + 8, 9, 10, 11, 11, 12, + 9, 10, 11, 12, 12, 12 +}; + +static const uint8_t t8l[] = { + 2, 4, 7, 9, 9, 10, + 4, 4, 6, 10, 10, 10, + 7, 6, 8, 10, 10, 11, + 9, 10, 10, 11, 11, 12, + 9, 9, 10, 11, 12, 12, + 10, 10, 11, 11, 13, 13 +}; + +static const uint8_t t9l[] = { + 3, 4, 6, 7, 9, 10, + 4, 5, 6, 7, 8, 10, + 5, 6, 7, 8, 9, 10, + 7, 7, 8, 9, 9, 10, + 8, 8, 9, 9, 10, 11, + 9, 9, 10, 10, 11, 11 +}; + +static const uint8_t t10l[] = { + 1, 4, 7, 9, 10, 10, 10, 11, + 4, 6, 8, 9, 10, 11, 10, 10, + 7, 8, 9, 10, 11, 12, 11, 11, + 8, 9, 10, 11, 12, 12, 11, 12, + 9, 10, 11, 12, 12, 12, 12, 12, + 10, 11, 12, 12, 13, 13, 12, 13, + 9, 10, 11, 12, 12, 12, 13, 13, + 10, 10, 11, 12, 12, 13, 13, 13 +}; + +static const uint8_t t11l[] = { + 2, 4, 6, 8, 9, 10, 9, 10, + 4, 5, 6, 8, 10, 10, 9, 10, + 6, 7, 8, 9, 10, 11, 10, 10, + 8, 8, 9, 11, 10, 12, 10, 11, + 9, 10, 10, 11, 11, 12, 11, 12, + 9, 10, 11, 12, 12, 13, 12, 13, + 9, 9, 9, 10, 11, 12, 12, 12, + 9, 9, 10, 11, 12, 12, 12, 12 +}; + +static const uint8_t t12l[] = { + 4, 4, 6, 8, 9, 10, 10, 10, + 4, 5, 6, 7, 9, 9, 10, 10, + 6, 6, 7, 8, 9, 10, 9, 10, + 7, 7, 8, 8, 9, 10, 10, 10, + 8, 8, 9, 9, 10, 10, 10, 11, + 9, 9, 10, 10, 10, 11, 10, 11, + 9, 9, 9, 10, 10, 11, 11, 12, + 10, 10, 10, 11, 11, 11, 11, 12 +}; + +static const uint8_t t13l[] = { + 1, 5, 7, 8, 9, 10, 10, 11, 10, 11, 12, 12, 13, 13, 14, 14, + 4, 6, 8, 9, 10, 10, 11, 11, 11, 11, 12, 12, 13, 14, 14, 14, + 7, 8, 9, 10, 11, 11, 12, 12, 11, 12, 12, 13, 13, 14, 15, 15, + 8, 9, 10, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 15, 15, + 9, 9, 11, 11, 12, 12, 13, 13, 12, 13, 13, 14, 14, 15, 15, 16, + 10, 10, 11, 12, 12, 12, 13, 13, 13, 13, 14, 13, 15, 15, 16, 16, + 10, 11, 12, 12, 13, 13, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16, + 11, 11, 12, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 16, 18, 18, + 10, 10, 11, 12, 12, 13, 13, 14, 14, 14, 14, 15, 15, 16, 17, 17, + 11, 11, 12, 12, 13, 13, 13, 15, 14, 15, 15, 16, 16, 16, 18, 17, + 11, 12, 12, 13, 13, 14, 14, 15, 14, 15, 16, 15, 16, 17, 18, 19, + 12, 12, 12, 13, 14, 14, 14, 14, 15, 15, 15, 16, 17, 17, 17, 18, + 12, 13, 13, 14, 14, 15, 14, 15, 16, 16, 17, 17, 17, 18, 18, 18, + 13, 13, 14, 15, 15, 15, 16, 16, 16, 16, 16, 17, 18, 17, 18, 18, + 14, 14, 14, 15, 15, 15, 17, 16, 16, 19, 17, 17, 17, 19, 18, 18, + 13, 14, 15, 16, 16, 16, 17, 16, 17, 17, 18, 18, 21, 20, 21, 18 +}; + +static const uint8_t t15l[] = { + 3, 5, 6, 8, 8, 9, 10, 10, 10, 11, 11, 12, 12, 12, 13, 14, + 5, 5, 7, 8, 9, 9, 10, 10, 10, 11, 11, 12, 12, 12, 13, 13, + 6, 7, 7, 8, 9, 9, 10, 10, 10, 11, 11, 12, 12, 13, 13, 13, + 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, + 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 12, 12, 12, 13, 13, 13, + 9, 9, 9, 10, 10, 10, 11, 11, 11, 11, 12, 12, 13, 13, 13, 14, + 10, 9, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 13, 13, 14, 14, + 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 14, + 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 14, 14, 14, + 10, 10, 11, 11, 11, 11, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, + 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 14, 15, 14, + 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 15, + 12, 12, 11, 12, 12, 12, 13, 13, 13, 13, 13, 13, 14, 14, 15, 15, + 12, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 14, 15, 15, + 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 14, 15, + 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 15, 15, 15, 15 +}; + +static const uint8_t t16_5l[] = { + 1, 5, 7, 9, 10, 10, 11, 11, 12, 12, 12, 13, 13, 13, 14, 11, + 4, 6, 8, 9, 10, 11, 11, 11, 12, 12, 12, 13, 14, 13, 14, 11, + 7, 8, 9, 10, 11, 11, 12, 12, 13, 12, 13, 13, 13, 14, 14, 12, + 9, 9, 10, 11, 11, 12, 12, 12, 13, 13, 14, 14, 14, 15, 15, 13, + 10, 10, 11, 11, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 12, + 10, 10, 11, 11, 12, 13, 13, 14, 13, 14, 14, 15, 15, 15, 16, 13, + 11, 11, 11, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 16, 13, + 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 15, 15, 17, 17, 13, + 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 13, + 12, 12, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 15, 16, 15, 14, + 12, 13, 12, 13, 14, 14, 14, 14, 15, 16, 16, 16, 17, 17, 16, 13, + 13, 13, 13, 13, 14, 14, 15, 16, 16, 16, 16, 16, 16, 15, 16, 14, + 13, 14, 14, 14, 14, 15, 15, 15, 15, 17, 16, 16, 16, 16, 18, 14, + 15, 14, 14, 14, 15, 15, 16, 16, 16, 18, 17, 17, 17, 19, 17, 14, + 14, 15, 13, 14, 16, 16, 15, 16, 16, 17, 18, 17, 19, 17, 16, 14, + 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 12 +}; + +static const uint8_t t16l[] = { + 1, 5, 7, 9, 10, 10, 11, 11, 12, 12, 12, 13, 13, 13, 14, 10, + 4, 6, 8, 9, 10, 11, 11, 11, 12, 12, 12, 13, 14, 13, 14, 10, + 7, 8, 9, 10, 11, 11, 12, 12, 13, 12, 13, 13, 13, 14, 14, 11, + 9, 9, 10, 11, 11, 12, 12, 12, 13, 13, 14, 14, 14, 15, 15, 12, + 10, 10, 11, 11, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 11, + 10, 10, 11, 11, 12, 13, 13, 14, 13, 14, 14, 15, 15, 15, 16, 12, + 11, 11, 11, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 16, 12, + 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 15, 15, 17, 17, 12, + 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 12, + 12, 12, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 15, 16, 15, 13, + 12, 13, 12, 13, 14, 14, 14, 14, 15, 16, 16, 16, 17, 17, 16, 12, + 13, 13, 13, 13, 14, 14, 15, 16, 16, 16, 16, 16, 16, 15, 16, 13, + 13, 14, 14, 14, 14, 15, 15, 15, 15, 17, 16, 16, 16, 16, 18, 13, + 15, 14, 14, 14, 15, 15, 16, 16, 16, 18, 17, 17, 17, 19, 17, 13, + 14, 15, 13, 14, 16, 16, 15, 16, 16, 17, 18, 17, 19, 17, 16, 13, + 10, 10, 10, 11, 11, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 10 +}; + +static const uint8_t t24l[] = { + 4, 5, 7, 8, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 13, 10, + 5, 6, 7, 8, 9, 10, 10, 11, 11, 11, 12, 12, 12, 12, 12, 10, + 7, 7, 8, 9, 9, 10, 10, 11, 11, 11, 11, 12, 12, 12, 13, 9, + 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 9, + 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 12, 12, 12, 12, 13, 9, + 10, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 9, + 10, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 9, + 11, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 10, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 10, + 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 10, + 12, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 10, + 12, 12, 11, 11, 11, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 10, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 10, + 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 10, + 13, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 10, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 6 +}; + +const uint8_t t32l[] = { + 1 + 0, 4 + 1, 4 + 1, 5 + 2, 4 + 1, 6 + 2, 5 + 2, 6 + 3, + 4 + 1, 5 + 2, 5 + 2, 6 + 3, 5 + 2, 6 + 3, 6 + 3, 6 + 4 +}; + +const uint8_t t33l[] = { + 4 + 0, 4 + 1, 4 + 1, 4 + 2, 4 + 1, 4 + 2, 4 + 2, 4 + 3, + 4 + 1, 4 + 2, 4 + 2, 4 + 3, 4 + 2, 4 + 3, 4 + 3, 4 + 4 +}; + + +const struct huffcodetab ht[HTN] = { + /* xlen, linmax, table, hlen */ + {0, 0, NULL, NULL}, + {2, 0, t1HB, t1l}, + {3, 0, t2HB, t2l}, + {3, 0, t3HB, t3l}, + {0, 0, NULL, NULL}, /* Apparently not used */ + {4, 0, t5HB, t5l}, + {4, 0, t6HB, t6l}, + {6, 0, t7HB, t7l}, + {6, 0, t8HB, t8l}, + {6, 0, t9HB, t9l}, + {8, 0, t10HB, t10l}, + {8, 0, t11HB, t11l}, + {8, 0, t12HB, t12l}, + {16, 0, t13HB, t13l}, + {0, 0, NULL, t16_5l}, /* Apparently not used */ + {16, 0, t15HB, t15l}, + + {1, 1, t16HB, t16l}, + {2, 3, t16HB, t16l}, + {3, 7, t16HB, t16l}, + {4, 15, t16HB, t16l}, + {6, 63, t16HB, t16l}, + {8, 255, t16HB, t16l}, + {10, 1023, t16HB, t16l}, + {13, 8191, t16HB, t16l}, + + {4, 15, t24HB, t24l}, + {5, 31, t24HB, t24l}, + {6, 63, t24HB, t24l}, + {7, 127, t24HB, t24l}, + {8, 255, t24HB, t24l}, + {9, 511, t24HB, t24l}, + {11, 2047, t24HB, t24l}, + {13, 8191, t24HB, t24l}, + + {0, 0, t32HB, t32l}, + {0, 0, t33HB, t33l}, +}; + + + + + +/* for (i = 0; i < 16*16; i++) { + * largetbl[i] = ((ht[16].hlen[i]) << 16) + ht[24].hlen[i]; + * } + */ +const uint32_t largetbl[16 * 16] = { + 0x010004, 0x050005, 0x070007, 0x090008, 0x0a0009, 0x0a000a, 0x0b000a, 0x0b000b, + 0x0c000b, 0x0c000c, 0x0c000c, 0x0d000c, 0x0d000c, 0x0d000c, 0x0e000d, 0x0a000a, + 0x040005, 0x060006, 0x080007, 0x090008, 0x0a0009, 0x0b000a, 0x0b000a, 0x0b000b, + 0x0c000b, 0x0c000b, 0x0c000c, 0x0d000c, 0x0e000c, 0x0d000c, 0x0e000c, 0x0a000a, + 0x070007, 0x080007, 0x090008, 0x0a0009, 0x0b0009, 0x0b000a, 0x0c000a, 0x0c000b, + 0x0d000b, 0x0c000b, 0x0d000b, 0x0d000c, 0x0d000c, 0x0e000c, 0x0e000d, 0x0b0009, + 0x090008, 0x090008, 0x0a0009, 0x0b0009, 0x0b000a, 0x0c000a, 0x0c000a, 0x0c000b, + 0x0d000b, 0x0d000b, 0x0e000b, 0x0e000c, 0x0e000c, 0x0f000c, 0x0f000c, 0x0c0009, + 0x0a0009, 0x0a0009, 0x0b0009, 0x0b000a, 0x0c000a, 0x0c000a, 0x0d000a, 0x0d000b, + 0x0d000b, 0x0e000b, 0x0e000c, 0x0e000c, 0x0f000c, 0x0f000c, 0x0f000d, 0x0b0009, + 0x0a000a, 0x0a0009, 0x0b000a, 0x0b000a, 0x0c000a, 0x0d000a, 0x0d000b, 0x0e000b, + 0x0d000b, 0x0e000b, 0x0e000c, 0x0f000c, 0x0f000c, 0x0f000c, 0x10000c, 0x0c0009, + 0x0b000a, 0x0b000a, 0x0b000a, 0x0c000a, 0x0d000a, 0x0d000b, 0x0d000b, 0x0d000b, + 0x0e000b, 0x0e000c, 0x0e000c, 0x0e000c, 0x0f000c, 0x0f000c, 0x10000d, 0x0c0009, + 0x0b000b, 0x0b000a, 0x0c000a, 0x0c000a, 0x0d000b, 0x0d000b, 0x0d000b, 0x0e000b, + 0x0e000c, 0x0f000c, 0x0f000c, 0x0f000c, 0x0f000c, 0x11000d, 0x11000d, 0x0c000a, + 0x0b000b, 0x0c000b, 0x0c000b, 0x0d000b, 0x0d000b, 0x0d000b, 0x0e000b, 0x0e000b, + 0x0f000b, 0x0f000c, 0x0f000c, 0x0f000c, 0x10000c, 0x10000d, 0x10000d, 0x0c000a, + 0x0c000b, 0x0c000b, 0x0c000b, 0x0d000b, 0x0d000b, 0x0e000b, 0x0e000b, 0x0f000c, + 0x0f000c, 0x0f000c, 0x0f000c, 0x10000c, 0x0f000d, 0x10000d, 0x0f000d, 0x0d000a, + 0x0c000c, 0x0d000b, 0x0c000b, 0x0d000b, 0x0e000b, 0x0e000c, 0x0e000c, 0x0e000c, + 0x0f000c, 0x10000c, 0x10000c, 0x10000d, 0x11000d, 0x11000d, 0x10000d, 0x0c000a, + 0x0d000c, 0x0d000c, 0x0d000b, 0x0d000b, 0x0e000b, 0x0e000c, 0x0f000c, 0x10000c, + 0x10000c, 0x10000c, 0x10000c, 0x10000d, 0x10000d, 0x0f000d, 0x10000d, 0x0d000a, + 0x0d000c, 0x0e000c, 0x0e000c, 0x0e000c, 0x0e000c, 0x0f000c, 0x0f000c, 0x0f000c, + 0x0f000c, 0x11000c, 0x10000d, 0x10000d, 0x10000d, 0x10000d, 0x12000d, 0x0d000a, + 0x0f000c, 0x0e000c, 0x0e000c, 0x0e000c, 0x0f000c, 0x0f000c, 0x10000c, 0x10000c, + 0x10000d, 0x12000d, 0x11000d, 0x11000d, 0x11000d, 0x13000d, 0x11000d, 0x0d000a, + 0x0e000d, 0x0f000c, 0x0d000c, 0x0e000c, 0x10000c, 0x10000c, 0x0f000c, 0x10000d, + 0x10000d, 0x11000d, 0x12000d, 0x11000d, 0x13000d, 0x11000d, 0x10000d, 0x0d000a, + 0x0a0009, 0x0a0009, 0x0a0009, 0x0b0009, 0x0b0009, 0x0c0009, 0x0c0009, 0x0c0009, + 0x0d0009, 0x0d0009, 0x0d0009, 0x0d000a, 0x0d000a, 0x0d000a, 0x0d000a, 0x0a0006 +}; + +/* for (i = 0; i < 3*3; i++) { + * table23[i] = ((ht[2].hlen[i]) << 16) + ht[3].hlen[i]; + * } + */ +const uint32_t table23[3 * 3] = { + 0x010002, 0x040003, 0x070007, + 0x040004, 0x050004, 0x070007, + 0x060006, 0x070007, 0x080008 +}; + +/* for (i = 0; i < 4*4; i++) { + * table56[i] = ((ht[5].hlen[i]) << 16) + ht[6].hlen[i]; + * } + */ +const uint32_t table56[4 * 4] = { + 0x010003, 0x040004, 0x070006, 0x080008, 0x040004, 0x050004, 0x080006, 0x090007, + 0x070005, 0x080006, 0x090007, 0x0a0008, 0x080007, 0x080007, 0x090008, 0x0a0009 +}; + + + +/* + * 0: MPEG-2 LSF + * 1: MPEG-1 + * 2: MPEG-2.5 LSF FhG extention (1995-07-11 shn) + */ + +typedef enum { + MPEG_2 = 0, + MPEG_1 = 1, + MPEG_25 = 2 +} MPEG_t; + +const int bitrate_table[3][16] = { + {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, -1}, /* MPEG 2 */ + {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, -1}, /* MPEG 1 */ + {0, 8, 16, 24, 32, 40, 48, 56, 64, -1, -1, -1, -1, -1, -1, -1}, /* MPEG 2.5 */ +}; + +const int samplerate_table[3][4] = { + {22050, 24000, 16000, -1}, /* MPEG 2 */ + {44100, 48000, 32000, -1}, /* MPEG 1 */ + {11025, 12000, 8000, -1}, /* MPEG 2.5 */ +}; + +int +lame_get_bitrate(int mpeg_version, int table_index) +{ + if (0 <= mpeg_version && mpeg_version <= 2) { + if (0 <= table_index && table_index <= 15) { + return bitrate_table[mpeg_version][table_index]; + } + } + return -1; +} + +int +lame_get_samplerate(int mpeg_version, int table_index) +{ + if (0 <= mpeg_version && mpeg_version <= 2) { + if (0 <= table_index && table_index <= 3) { + return samplerate_table[mpeg_version][table_index]; + } + } + return -1; +} + + +/* This is the scfsi_band table from 2.4.2.7 of the IS */ +const int scfsi_band[5] = { 0, 6, 11, 16, 21 }; + +/* end of tables.c */ diff --git a/libmp3lame/tables.h b/libmp3lame/tables.h new file mode 100644 index 0000000..0dd7deb --- /dev/null +++ b/libmp3lame/tables.h @@ -0,0 +1,95 @@ +/* + * MPEG layer 3 tables include file + * + * Copyright (c) 1999 Albert L Faber + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef LAME_TABLES_H +#define LAME_TABLES_H + +#if 0 +typedef struct { + unsigned char no; + unsigned char width; + unsigned char minval_2; + float quiet_thr; + float norm; + float bark; +} type1_t; + +typedef struct { + unsigned char no; + unsigned char width; + float quiet_thr; + float norm; + float SNR; + float bark; +} type2_t; + +typedef struct { + unsigned int no:5; + unsigned int cbw:3; + unsigned int bu:6; + unsigned int bo:6; + unsigned int w1_576:10; + unsigned int w2_576:10; +} type34_t; + +typedef struct { + size_t len1; + const type1_t *const tab1; + size_t len2; + const type2_t *const tab2; + size_t len3; + const type34_t *const tab3; + size_t len4; + const type34_t *const tab4; +} type5_t; + +extern const type5_t table5[6]; + +#endif + +#define HTN 34 + +struct huffcodetab { + const unsigned int xlen; /* max. x-index+ */ + const unsigned int linmax; /* max number to be stored in linbits */ + const uint16_t *table; /* pointer to array[xlen][ylen] */ + const uint8_t *hlen; /* pointer to array[xlen][ylen] */ +}; + +extern const struct huffcodetab ht[HTN]; + /* global memory block */ + /* array of all huffcodtable headers */ + /* 0..31 Huffman code table 0..31 */ + /* 32,33 count1-tables */ + +extern const uint8_t t32l[]; +extern const uint8_t t33l[]; + +extern const uint32_t largetbl[16 * 16]; +extern const uint32_t table23[3 * 3]; +extern const uint32_t table56[4 * 4]; + +extern const int scfsi_band[5]; + +extern const int bitrate_table [3][16]; +extern const int samplerate_table [3][ 4]; + +#endif /* LAME_TABLES_H */ diff --git a/libmp3lame/takehiro.c b/libmp3lame/takehiro.c new file mode 100644 index 0000000..67aba1b --- /dev/null +++ b/libmp3lame/takehiro.c @@ -0,0 +1,1375 @@ +/* + * MP3 huffman table selecting and bit counting + * + * Copyright (c) 1999-2005 Takehiro TOMINAGA + * Copyright (c) 2002-2005 Gabriel Bouvigne + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* $Id: takehiro.c,v 1.80 2017/09/06 15:07:30 robert Exp $ */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + + +#include "lame.h" +#include "machine.h" +#include "encoder.h" +#include "util.h" +#include "quantize_pvt.h" +#include "tables.h" + + +static const struct { + const int region0_count; + const int region1_count; +} subdv_table[23] = { + { + 0, 0}, /* 0 bands */ + { + 0, 0}, /* 1 bands */ + { + 0, 0}, /* 2 bands */ + { + 0, 0}, /* 3 bands */ + { + 0, 0}, /* 4 bands */ + { + 0, 1}, /* 5 bands */ + { + 1, 1}, /* 6 bands */ + { + 1, 1}, /* 7 bands */ + { + 1, 2}, /* 8 bands */ + { + 2, 2}, /* 9 bands */ + { + 2, 3}, /* 10 bands */ + { + 2, 3}, /* 11 bands */ + { + 3, 4}, /* 12 bands */ + { + 3, 4}, /* 13 bands */ + { + 3, 4}, /* 14 bands */ + { + 4, 5}, /* 15 bands */ + { + 4, 5}, /* 16 bands */ + { + 4, 6}, /* 17 bands */ + { + 5, 6}, /* 18 bands */ + { + 5, 6}, /* 19 bands */ + { + 5, 7}, /* 20 bands */ + { + 6, 7}, /* 21 bands */ + { + 6, 7}, /* 22 bands */ +}; + + + + + +/********************************************************************* + * nonlinear quantization of xr + * More accurate formula than the ISO formula. Takes into account + * the fact that we are quantizing xr -> ix, but we want ix^4/3 to be + * as close as possible to x^4/3. (taking the nearest int would mean + * ix is as close as possible to xr, which is different.) + * + * From Segher Boessenkool <segher@eastsite.nl> 11/1999 + * + * 09/2000: ASM code removed in favor of IEEE754 hack by Takehiro + * Tominaga. If you need the ASM code, check CVS circa Aug 2000. + * + * 01/2004: Optimizations by Gabriel Bouvigne + *********************************************************************/ + + + + + +static void +quantize_lines_xrpow_01(unsigned int l, FLOAT istep, const FLOAT * xr, int *ix) +{ + const FLOAT compareval0 = (1.0f - 0.4054f) / istep; + unsigned int i; + + assert(l > 0); + assert(l % 2 == 0); + for (i = 0; i < l; i += 2) { + FLOAT const xr_0 = xr[i+0]; + FLOAT const xr_1 = xr[i+1]; + int const ix_0 = (compareval0 > xr_0) ? 0 : 1; + int const ix_1 = (compareval0 > xr_1) ? 0 : 1; + ix[i+0] = ix_0; + ix[i+1] = ix_1; + } +} + + + +#ifdef TAKEHIRO_IEEE754_HACK + +typedef union { + float f; + int i; +} fi_union; + +#define MAGIC_FLOAT (65536*(128)) +#define MAGIC_INT 0x4b000000 + + +static void +quantize_lines_xrpow(unsigned int l, FLOAT istep, const FLOAT * xp, int *pi) +{ + fi_union *fi; + unsigned int remaining; + + assert(l > 0); + + fi = (fi_union *) pi; + + l = l >> 1; + remaining = l % 2; + l = l >> 1; + while (l--) { + double x0 = istep * xp[0]; + double x1 = istep * xp[1]; + double x2 = istep * xp[2]; + double x3 = istep * xp[3]; + + x0 += MAGIC_FLOAT; + fi[0].f = x0; + x1 += MAGIC_FLOAT; + fi[1].f = x1; + x2 += MAGIC_FLOAT; + fi[2].f = x2; + x3 += MAGIC_FLOAT; + fi[3].f = x3; + + fi[0].f = x0 + adj43asm[fi[0].i - MAGIC_INT]; + fi[1].f = x1 + adj43asm[fi[1].i - MAGIC_INT]; + fi[2].f = x2 + adj43asm[fi[2].i - MAGIC_INT]; + fi[3].f = x3 + adj43asm[fi[3].i - MAGIC_INT]; + + fi[0].i -= MAGIC_INT; + fi[1].i -= MAGIC_INT; + fi[2].i -= MAGIC_INT; + fi[3].i -= MAGIC_INT; + fi += 4; + xp += 4; + }; + if (remaining) { + double x0 = istep * xp[0]; + double x1 = istep * xp[1]; + + x0 += MAGIC_FLOAT; + fi[0].f = x0; + x1 += MAGIC_FLOAT; + fi[1].f = x1; + + fi[0].f = x0 + adj43asm[fi[0].i - MAGIC_INT]; + fi[1].f = x1 + adj43asm[fi[1].i - MAGIC_INT]; + + fi[0].i -= MAGIC_INT; + fi[1].i -= MAGIC_INT; + } + +} + + +#else + +/********************************************************************* + * XRPOW_FTOI is a macro to convert floats to ints. + * if XRPOW_FTOI(x) = nearest_int(x), then QUANTFAC(x)=adj43asm[x] + * ROUNDFAC= -0.0946 + * + * if XRPOW_FTOI(x) = floor(x), then QUANTFAC(x)=asj43[x] + * ROUNDFAC=0.4054 + * + * Note: using floor() or (int) is extremely slow. On machines where + * the TAKEHIRO_IEEE754_HACK code above does not work, it is worthwile + * to write some ASM for XRPOW_FTOI(). + *********************************************************************/ +#define XRPOW_FTOI(src,dest) ((dest) = (int)(src)) +#define QUANTFAC(rx) adj43[rx] +#define ROUNDFAC 0.4054 + + +static void +quantize_lines_xrpow(unsigned int l, FLOAT istep, const FLOAT * xr, int *ix) +{ + unsigned int remaining; + + assert(l > 0); + + l = l >> 1; + remaining = l % 2; + l = l >> 1; + while (l--) { + FLOAT x0, x1, x2, x3; + int rx0, rx1, rx2, rx3; + + x0 = *xr++ * istep; + x1 = *xr++ * istep; + XRPOW_FTOI(x0, rx0); + x2 = *xr++ * istep; + XRPOW_FTOI(x1, rx1); + x3 = *xr++ * istep; + XRPOW_FTOI(x2, rx2); + x0 += QUANTFAC(rx0); + XRPOW_FTOI(x3, rx3); + x1 += QUANTFAC(rx1); + XRPOW_FTOI(x0, *ix++); + x2 += QUANTFAC(rx2); + XRPOW_FTOI(x1, *ix++); + x3 += QUANTFAC(rx3); + XRPOW_FTOI(x2, *ix++); + XRPOW_FTOI(x3, *ix++); + }; + if (remaining) { + FLOAT x0, x1; + int rx0, rx1; + + x0 = *xr++ * istep; + x1 = *xr++ * istep; + XRPOW_FTOI(x0, rx0); + XRPOW_FTOI(x1, rx1); + x0 += QUANTFAC(rx0); + x1 += QUANTFAC(rx1); + XRPOW_FTOI(x0, *ix++); + XRPOW_FTOI(x1, *ix++); + } + +} + + + +#endif + + + +/********************************************************************* + * Quantization function + * This function will select which lines to quantize and call the + * proper quantization function + *********************************************************************/ + +static void +quantize_xrpow(const FLOAT * xp, int *pi, FLOAT istep, gr_info const *const cod_info, + calc_noise_data const *prev_noise) +{ + /* quantize on xr^(3/4) instead of xr */ + int sfb; + int sfbmax; + int j = 0; + int prev_data_use; + int *iData; + int accumulate = 0; + int accumulate01 = 0; + int *acc_iData; + const FLOAT *acc_xp; + + iData = pi; + acc_xp = xp; + acc_iData = iData; + + + /* Reusing previously computed data does not seems to work if global gain + is changed. Finding why it behaves this way would allow to use a cache of + previously computed values (let's 10 cached values per sfb) that would + probably provide a noticeable speedup */ + prev_data_use = (prev_noise && (cod_info->global_gain == prev_noise->global_gain)); + + if (cod_info->block_type == SHORT_TYPE) + sfbmax = 38; + else + sfbmax = 21; + + for (sfb = 0; sfb <= sfbmax; sfb++) { + int step = -1; + + if (prev_data_use || cod_info->block_type == NORM_TYPE) { + step = + cod_info->global_gain + - ((cod_info->scalefac[sfb] + (cod_info->preflag ? pretab[sfb] : 0)) + << (cod_info->scalefac_scale + 1)) + - cod_info->subblock_gain[cod_info->window[sfb]] * 8; + } + assert(cod_info->width[sfb] >= 0); + if (prev_data_use && (prev_noise->step[sfb] == step)) { + /* do not recompute this part, + but compute accumulated lines */ + if (accumulate) { + quantize_lines_xrpow(accumulate, istep, acc_xp, acc_iData); + accumulate = 0; + } + if (accumulate01) { + quantize_lines_xrpow_01(accumulate01, istep, acc_xp, acc_iData); + accumulate01 = 0; + } + } + else { /*should compute this part */ + int l; + l = cod_info->width[sfb]; + + if ((j + cod_info->width[sfb]) > cod_info->max_nonzero_coeff) { + /*do not compute upper zero part */ + int usefullsize; + usefullsize = cod_info->max_nonzero_coeff - j + 1; + memset(&pi[cod_info->max_nonzero_coeff], 0, + sizeof(int) * (576 - cod_info->max_nonzero_coeff)); + l = usefullsize; + + if (l < 0) { + l = 0; + } + + /* no need to compute higher sfb values */ + sfb = sfbmax + 1; + } + + /*accumulate lines to quantize */ + if (!accumulate && !accumulate01) { + acc_iData = iData; + acc_xp = xp; + } + if (prev_noise && + prev_noise->sfb_count1 > 0 && + sfb >= prev_noise->sfb_count1 && + prev_noise->step[sfb] > 0 && step >= prev_noise->step[sfb]) { + + if (accumulate) { + quantize_lines_xrpow(accumulate, istep, acc_xp, acc_iData); + accumulate = 0; + acc_iData = iData; + acc_xp = xp; + } + accumulate01 += l; + } + else { + if (accumulate01) { + quantize_lines_xrpow_01(accumulate01, istep, acc_xp, acc_iData); + accumulate01 = 0; + acc_iData = iData; + acc_xp = xp; + } + accumulate += l; + } + + if (l <= 0) { + /* rh: 20040215 + * may happen due to "prev_data_use" optimization + */ + if (accumulate01) { + quantize_lines_xrpow_01(accumulate01, istep, acc_xp, acc_iData); + accumulate01 = 0; + } + if (accumulate) { + quantize_lines_xrpow(accumulate, istep, acc_xp, acc_iData); + accumulate = 0; + } + + break; /* ends for-loop */ + } + } + if (sfb <= sfbmax) { + iData += cod_info->width[sfb]; + xp += cod_info->width[sfb]; + j += cod_info->width[sfb]; + } + } + if (accumulate) { /*last data part */ + quantize_lines_xrpow(accumulate, istep, acc_xp, acc_iData); + accumulate = 0; + } + if (accumulate01) { /*last data part */ + quantize_lines_xrpow_01(accumulate01, istep, acc_xp, acc_iData); + accumulate01 = 0; + } + +} + + + + +/*************************************************************************/ +/* ix_max */ +/*************************************************************************/ + +static int +ix_max(const int *ix, const int *end) +{ + int max1 = 0, max2 = 0; + + do { + int const x1 = *ix++; + int const x2 = *ix++; + if (max1 < x1) + max1 = x1; + + if (max2 < x2) + max2 = x2; + } while (ix < end); + if (max1 < max2) + max1 = max2; + return max1; +} + + + + + + + + +static int +count_bit_ESC(const int *ix, const int *const end, int t1, const int t2, unsigned int *const s) +{ + /* ESC-table is used */ + unsigned int const linbits = ht[t1].xlen * 65536u + ht[t2].xlen; + unsigned int sum = 0, sum2; + + do { + unsigned int x = *ix++; + unsigned int y = *ix++; + + if (x >= 15u) { + x = 15u; + sum += linbits; + } + if (y >= 15u) { + y = 15u; + sum += linbits; + } + x <<= 4u; + x += y; + sum += largetbl[x]; + } while (ix < end); + + sum2 = sum & 0xffffu; + sum >>= 16u; + + if (sum > sum2) { + sum = sum2; + t1 = t2; + } + + *s += sum; + return t1; +} + + +static int +count_bit_noESC(const int *ix, const int *end, int mx, unsigned int *s) +{ + /* No ESC-words */ + unsigned int sum1 = 0; + const uint8_t *const hlen1 = ht[1].hlen; + (void) mx; + + do { + unsigned int const x0 = *ix++; + unsigned int const x1 = *ix++; + sum1 += hlen1[ x0+x0 + x1 ]; + } while (ix < end); + + *s += sum1; + return 1; +} + + +static const int huf_tbl_noESC[] = { + 1, 2, 5, 7, 7, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13 +}; + + +static int +count_bit_noESC_from2(const int *ix, const int *end, int max, unsigned int *s) +{ + int t1 = huf_tbl_noESC[max - 1]; + /* No ESC-words */ + const unsigned int xlen = ht[t1].xlen; + uint32_t const* table = (t1 == 2) ? &table23[0] : &table56[0]; + unsigned int sum = 0, sum2; + + do { + unsigned int const x0 = *ix++; + unsigned int const x1 = *ix++; + sum += table[ x0 * xlen + x1 ]; + } while (ix < end); + + sum2 = sum & 0xffffu; + sum >>= 16u; + + if (sum > sum2) { + sum = sum2; + t1++; + } + + *s += sum; + return t1; +} + + +inline static int +count_bit_noESC_from3(const int *ix, const int *end, int max, unsigned int * s) +{ + int t1 = huf_tbl_noESC[max - 1]; + /* No ESC-words */ + unsigned int sum1 = 0; + unsigned int sum2 = 0; + unsigned int sum3 = 0; + const unsigned int xlen = ht[t1].xlen; + const uint8_t *const hlen1 = ht[t1].hlen; + const uint8_t *const hlen2 = ht[t1 + 1].hlen; + const uint8_t *const hlen3 = ht[t1 + 2].hlen; + int t; + + do { + unsigned int x0 = *ix++; + unsigned int x1 = *ix++; + unsigned int x = x0 * xlen + x1; + sum1 += hlen1[x]; + sum2 += hlen2[x]; + sum3 += hlen3[x]; + } while (ix < end); + + t = t1; + if (sum1 > sum2) { + sum1 = sum2; + t++; + } + if (sum1 > sum3) { + sum1 = sum3; + t = t1 + 2; + } + *s += sum1; + + return t; +} + + +/*************************************************************************/ +/* choose table */ +/*************************************************************************/ + +/* + Choose the Huffman table that will encode ix[begin..end] with + the fewest bits. + + Note: This code contains knowledge about the sizes and characteristics + of the Huffman tables as defined in the IS (Table B.7), and will not work + with any arbitrary tables. +*/ +static int count_bit_null(const int* ix, const int* end, int max, unsigned int* s) +{ + (void) ix; + (void) end; + (void) max; + (void) s; + return 0; +} + +typedef int (*count_fnc)(const int* ix, const int* end, int max, unsigned int* s); + +static const count_fnc count_fncs[] = +{ &count_bit_null +, &count_bit_noESC +, &count_bit_noESC_from2 +, &count_bit_noESC_from2 +, &count_bit_noESC_from3 +, &count_bit_noESC_from3 +, &count_bit_noESC_from3 +, &count_bit_noESC_from3 +, &count_bit_noESC_from3 +, &count_bit_noESC_from3 +, &count_bit_noESC_from3 +, &count_bit_noESC_from3 +, &count_bit_noESC_from3 +, &count_bit_noESC_from3 +, &count_bit_noESC_from3 +, &count_bit_noESC_from3 +}; + +static int +choose_table_nonMMX(const int *ix, const int *const end, int *const _s) +{ + unsigned int* s = (unsigned int*)_s; + unsigned int max; + int choice, choice2; + max = ix_max(ix, end); + + if (max <= 15) { + return count_fncs[max](ix, end, max, s); + } + /* try tables with linbits */ + if (max > IXMAX_VAL) { + *s = LARGE_BITS; + return -1; + } + max -= 15u; + for (choice2 = 24; choice2 < 32; choice2++) { + if (ht[choice2].linmax >= max) { + break; + } + } + + for (choice = choice2 - 8; choice < 24; choice++) { + if (ht[choice].linmax >= max) { + break; + } + } + return count_bit_ESC(ix, end, choice, choice2, s); +} + + + +/*************************************************************************/ +/* count_bit */ +/*************************************************************************/ +int +noquant_count_bits(lame_internal_flags const *const gfc, + gr_info * const gi, calc_noise_data * prev_noise) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + int bits = 0; + int i, a1, a2; + int const *const ix = gi->l3_enc; + + i = Min(576, ((gi->max_nonzero_coeff + 2) >> 1) << 1); + + if (prev_noise) + prev_noise->sfb_count1 = 0; + + /* Determine count1 region */ + for (; i > 1; i -= 2) + if (ix[i - 1] | ix[i - 2]) + break; + gi->count1 = i; + + /* Determines the number of bits to encode the quadruples. */ + a1 = a2 = 0; + for (; i > 3; i -= 4) { + int x4 = ix[i-4]; + int x3 = ix[i-3]; + int x2 = ix[i-2]; + int x1 = ix[i-1]; + int p; + /* hack to check if all values <= 1 */ + if ((unsigned int) (x4 | x3 | x2 | x1) > 1) + break; + + p = ((x4 * 2 + x3) * 2 + x2) * 2 + x1; + a1 += t32l[p]; + a2 += t33l[p]; + } + + bits = a1; + gi->count1table_select = 0; + if (a1 > a2) { + bits = a2; + gi->count1table_select = 1; + } + + gi->count1bits = bits; + gi->big_values = i; + if (i == 0) + return bits; + + if (gi->block_type == SHORT_TYPE) { + a1 = 3 * gfc->scalefac_band.s[3]; + if (a1 > gi->big_values) + a1 = gi->big_values; + a2 = gi->big_values; + + } + else if (gi->block_type == NORM_TYPE) { + assert(i <= 576); /* bv_scf has 576 entries (0..575) */ + a1 = gi->region0_count = gfc->sv_qnt.bv_scf[i - 2]; + a2 = gi->region1_count = gfc->sv_qnt.bv_scf[i - 1]; + + assert(a1 + a2 + 2 < SBPSY_l); + a2 = gfc->scalefac_band.l[a1 + a2 + 2]; + a1 = gfc->scalefac_band.l[a1 + 1]; + if (a2 < i) + gi->table_select[2] = gfc->choose_table(ix + a2, ix + i, &bits); + + } + else { + gi->region0_count = 7; + /*gi->region1_count = SBPSY_l - 7 - 1; */ + gi->region1_count = SBMAX_l - 1 - 7 - 1; + a1 = gfc->scalefac_band.l[7 + 1]; + a2 = i; + if (a1 > a2) { + a1 = a2; + } + } + + + /* have to allow for the case when bigvalues < region0 < region1 */ + /* (and region0, region1 are ignored) */ + a1 = Min(a1, i); + a2 = Min(a2, i); + + assert(a1 >= 0); + assert(a2 >= 0); + + /* Count the number of bits necessary to code the bigvalues region. */ + if (0 < a1) + gi->table_select[0] = gfc->choose_table(ix, ix + a1, &bits); + if (a1 < a2) + gi->table_select[1] = gfc->choose_table(ix + a1, ix + a2, &bits); + if (cfg->use_best_huffman == 2) { + gi->part2_3_length = bits; + best_huffman_divide(gfc, gi); + bits = gi->part2_3_length; + } + + + if (prev_noise) { + if (gi->block_type == NORM_TYPE) { + int sfb = 0; + while (gfc->scalefac_band.l[sfb] < gi->big_values) { + sfb++; + } + prev_noise->sfb_count1 = sfb; + } + } + + return bits; +} + +int +count_bits(lame_internal_flags const *const gfc, + const FLOAT * const xr, gr_info * const gi, calc_noise_data * prev_noise) +{ + int *const ix = gi->l3_enc; + + /* since quantize_xrpow uses table lookup, we need to check this first: */ + FLOAT const w = (IXMAX_VAL) / IPOW20(gi->global_gain); + + if (gi->xrpow_max > w) + return LARGE_BITS; + + quantize_xrpow(xr, ix, IPOW20(gi->global_gain), gi, prev_noise); + + if (gfc->sv_qnt.substep_shaping & 2) { + int sfb, j = 0; + /* 0.634521682242439 = 0.5946*2**(.5*0.1875) */ + int const gain = gi->global_gain + gi->scalefac_scale; + const FLOAT roundfac = 0.634521682242439 / IPOW20(gain); + for (sfb = 0; sfb < gi->sfbmax; sfb++) { + int const width = gi->width[sfb]; + assert(width >= 0); + if (!gfc->sv_qnt.pseudohalf[sfb]) { + j += width; + } + else { + int k; + for (k = j, j += width; k < j; ++k) { + ix[k] = (xr[k] >= roundfac) ? ix[k] : 0; + } + } + } + } + return noquant_count_bits(gfc, gi, prev_noise); +} + +/*********************************************************************** + re-calculate the best scalefac_compress using scfsi + the saved bits are kept in the bit reservoir. + **********************************************************************/ + + +inline static void +recalc_divide_init(const lame_internal_flags * const gfc, + gr_info const *cod_info, + int const *const ix, int r01_bits[], int r01_div[], int r0_tbl[], int r1_tbl[]) +{ + int r0, r1, bigv, r0t, r1t, bits; + + bigv = cod_info->big_values; + + for (r0 = 0; r0 <= 7 + 15; r0++) { + r01_bits[r0] = LARGE_BITS; + } + + for (r0 = 0; r0 < 16; r0++) { + int const a1 = gfc->scalefac_band.l[r0 + 1]; + int r0bits; + if (a1 >= bigv) + break; + r0bits = 0; + r0t = gfc->choose_table(ix, ix + a1, &r0bits); + + for (r1 = 0; r1 < 8; r1++) { + int const a2 = gfc->scalefac_band.l[r0 + r1 + 2]; + if (a2 >= bigv) + break; + + bits = r0bits; + r1t = gfc->choose_table(ix + a1, ix + a2, &bits); + if (r01_bits[r0 + r1] > bits) { + r01_bits[r0 + r1] = bits; + r01_div[r0 + r1] = r0; + r0_tbl[r0 + r1] = r0t; + r1_tbl[r0 + r1] = r1t; + } + } + } +} + +inline static void +recalc_divide_sub(const lame_internal_flags * const gfc, + const gr_info * cod_info2, + gr_info * const gi, + const int *const ix, + const int r01_bits[], const int r01_div[], const int r0_tbl[], const int r1_tbl[]) +{ + int bits, r2, a2, bigv, r2t; + + bigv = cod_info2->big_values; + + for (r2 = 2; r2 < SBMAX_l + 1; r2++) { + a2 = gfc->scalefac_band.l[r2]; + if (a2 >= bigv) + break; + + bits = r01_bits[r2 - 2] + cod_info2->count1bits; + if (gi->part2_3_length <= bits) + break; + + r2t = gfc->choose_table(ix + a2, ix + bigv, &bits); + if (gi->part2_3_length <= bits) + continue; + + memcpy(gi, cod_info2, sizeof(gr_info)); + gi->part2_3_length = bits; + gi->region0_count = r01_div[r2 - 2]; + gi->region1_count = r2 - 2 - r01_div[r2 - 2]; + gi->table_select[0] = r0_tbl[r2 - 2]; + gi->table_select[1] = r1_tbl[r2 - 2]; + gi->table_select[2] = r2t; + } +} + + + + +void +best_huffman_divide(const lame_internal_flags * const gfc, gr_info * const gi) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + int i, a1, a2; + gr_info cod_info2; + int const *const ix = gi->l3_enc; + + int r01_bits[7 + 15 + 1]; + int r01_div[7 + 15 + 1]; + int r0_tbl[7 + 15 + 1]; + int r1_tbl[7 + 15 + 1]; + + + /* SHORT BLOCK stuff fails for MPEG2 */ + if (gi->block_type == SHORT_TYPE && cfg->mode_gr == 1) + return; + + + memcpy(&cod_info2, gi, sizeof(gr_info)); + if (gi->block_type == NORM_TYPE) { + recalc_divide_init(gfc, gi, ix, r01_bits, r01_div, r0_tbl, r1_tbl); + recalc_divide_sub(gfc, &cod_info2, gi, ix, r01_bits, r01_div, r0_tbl, r1_tbl); + } + + i = cod_info2.big_values; + if (i == 0 || (unsigned int) (ix[i - 2] | ix[i - 1]) > 1) + return; + + i = gi->count1 + 2; + if (i > 576) + return; + + /* Determines the number of bits to encode the quadruples. */ + memcpy(&cod_info2, gi, sizeof(gr_info)); + cod_info2.count1 = i; + a1 = a2 = 0; + + assert(i <= 576); + + for (; i > cod_info2.big_values; i -= 4) { + int const p = ((ix[i - 4] * 2 + ix[i - 3]) * 2 + ix[i - 2]) * 2 + ix[i - 1]; + a1 += t32l[p]; + a2 += t33l[p]; + } + cod_info2.big_values = i; + + cod_info2.count1table_select = 0; + if (a1 > a2) { + a1 = a2; + cod_info2.count1table_select = 1; + } + + cod_info2.count1bits = a1; + + if (cod_info2.block_type == NORM_TYPE) + recalc_divide_sub(gfc, &cod_info2, gi, ix, r01_bits, r01_div, r0_tbl, r1_tbl); + else { + /* Count the number of bits necessary to code the bigvalues region. */ + cod_info2.part2_3_length = a1; + a1 = gfc->scalefac_band.l[7 + 1]; + if (a1 > i) { + a1 = i; + } + if (a1 > 0) + cod_info2.table_select[0] = + gfc->choose_table(ix, ix + a1, (int *) &cod_info2.part2_3_length); + if (i > a1) + cod_info2.table_select[1] = + gfc->choose_table(ix + a1, ix + i, (int *) &cod_info2.part2_3_length); + if (gi->part2_3_length > cod_info2.part2_3_length) + memcpy(gi, &cod_info2, sizeof(gr_info)); + } +} + +static const int slen1_n[16] = { 1, 1, 1, 1, 8, 2, 2, 2, 4, 4, 4, 8, 8, 8, 16, 16 }; +static const int slen2_n[16] = { 1, 2, 4, 8, 1, 2, 4, 8, 2, 4, 8, 2, 4, 8, 4, 8 }; +const int slen1_tab[16] = { 0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4 }; +const int slen2_tab[16] = { 0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3 }; + +static void +scfsi_calc(int ch, III_side_info_t * l3_side) +{ + unsigned int i; + int s1, s2, c1, c2; + int sfb; + gr_info *const gi = &l3_side->tt[1][ch]; + gr_info const *const g0 = &l3_side->tt[0][ch]; + + for (i = 0; i < (sizeof(scfsi_band) / sizeof(int)) - 1; i++) { + for (sfb = scfsi_band[i]; sfb < scfsi_band[i + 1]; sfb++) { + if (g0->scalefac[sfb] != gi->scalefac[sfb] + && gi->scalefac[sfb] >= 0) + break; + } + if (sfb == scfsi_band[i + 1]) { + for (sfb = scfsi_band[i]; sfb < scfsi_band[i + 1]; sfb++) { + gi->scalefac[sfb] = -1; + } + l3_side->scfsi[ch][i] = 1; + } + } + + s1 = c1 = 0; + for (sfb = 0; sfb < 11; sfb++) { + if (gi->scalefac[sfb] == -1) + continue; + c1++; + if (s1 < gi->scalefac[sfb]) + s1 = gi->scalefac[sfb]; + } + + s2 = c2 = 0; + for (; sfb < SBPSY_l; sfb++) { + if (gi->scalefac[sfb] == -1) + continue; + c2++; + if (s2 < gi->scalefac[sfb]) + s2 = gi->scalefac[sfb]; + } + + for (i = 0; i < 16; i++) { + if (s1 < slen1_n[i] && s2 < slen2_n[i]) { + int const c = slen1_tab[i] * c1 + slen2_tab[i] * c2; + if (gi->part2_length > c) { + gi->part2_length = c; + gi->scalefac_compress = (int)i; + } + } + } +} + +/* +Find the optimal way to store the scalefactors. +Only call this routine after final scalefactors have been +chosen and the channel/granule will not be re-encoded. + */ +void +best_scalefac_store(const lame_internal_flags * gfc, + const int gr, const int ch, III_side_info_t * const l3_side) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + /* use scalefac_scale if we can */ + gr_info *const gi = &l3_side->tt[gr][ch]; + int sfb, i, j, l; + int recalc = 0; + + /* remove scalefacs from bands with ix=0. This idea comes + * from the AAC ISO docs. added mt 3/00 */ + /* check if l3_enc=0 */ + j = 0; + for (sfb = 0; sfb < gi->sfbmax; sfb++) { + int const width = gi->width[sfb]; + assert(width >= 0); + for (l = j, j += width; l < j; ++l) { + if (gi->l3_enc[l] != 0) + break; + } + if (l == j) + gi->scalefac[sfb] = recalc = -2; /* anything goes. */ + /* only best_scalefac_store and calc_scfsi + * know--and only they should know--about the magic number -2. + */ + } + + if (!gi->scalefac_scale && !gi->preflag) { + int s = 0; + for (sfb = 0; sfb < gi->sfbmax; sfb++) + if (gi->scalefac[sfb] > 0) + s |= gi->scalefac[sfb]; + + if (!(s & 1) && s != 0) { + for (sfb = 0; sfb < gi->sfbmax; sfb++) + if (gi->scalefac[sfb] > 0) + gi->scalefac[sfb] >>= 1; + + gi->scalefac_scale = recalc = 1; + } + } + + if (!gi->preflag && gi->block_type != SHORT_TYPE && cfg->mode_gr == 2) { + for (sfb = 11; sfb < SBPSY_l; sfb++) + if (gi->scalefac[sfb] < pretab[sfb] && gi->scalefac[sfb] != -2) + break; + if (sfb == SBPSY_l) { + for (sfb = 11; sfb < SBPSY_l; sfb++) + if (gi->scalefac[sfb] > 0) + gi->scalefac[sfb] -= pretab[sfb]; + + gi->preflag = recalc = 1; + } + } + + for (i = 0; i < 4; i++) + l3_side->scfsi[ch][i] = 0; + + if (cfg->mode_gr == 2 && gr == 1 + && l3_side->tt[0][ch].block_type != SHORT_TYPE + && l3_side->tt[1][ch].block_type != SHORT_TYPE) { + scfsi_calc(ch, l3_side); + recalc = 0; + } + for (sfb = 0; sfb < gi->sfbmax; sfb++) { + if (gi->scalefac[sfb] == -2) { + gi->scalefac[sfb] = 0; /* if anything goes, then 0 is a good choice */ + } + } + if (recalc) { + (void) scale_bitcount(gfc, gi); + } +} + + +#ifndef NDEBUG +static int +all_scalefactors_not_negative(int const *scalefac, int n) +{ + int i; + for (i = 0; i < n; ++i) { + if (scalefac[i] < 0) + return 0; + } + return 1; +} +#endif + + +/* number of bits used to encode scalefacs */ + +/* 18*slen1_tab[i] + 18*slen2_tab[i] */ +static const int scale_short[16] = { + 0, 18, 36, 54, 54, 36, 54, 72, 54, 72, 90, 72, 90, 108, 108, 126 +}; + +/* 17*slen1_tab[i] + 18*slen2_tab[i] */ +static const int scale_mixed[16] = { + 0, 18, 36, 54, 51, 35, 53, 71, 52, 70, 88, 69, 87, 105, 104, 122 +}; + +/* 11*slen1_tab[i] + 10*slen2_tab[i] */ +static const int scale_long[16] = { + 0, 10, 20, 30, 33, 21, 31, 41, 32, 42, 52, 43, 53, 63, 64, 74 +}; + + +/*************************************************************************/ +/* scale_bitcount */ +/*************************************************************************/ + +/* Also calculates the number of bits necessary to code the scalefactors. */ + +static int +mpeg1_scale_bitcount(const lame_internal_flags * gfc, gr_info * const cod_info) +{ + int k, sfb, max_slen1 = 0, max_slen2 = 0; + + /* maximum values */ + const int *tab; + int *const scalefac = cod_info->scalefac; + + (void) gfc; + assert(all_scalefactors_not_negative(scalefac, cod_info->sfbmax)); + + if (cod_info->block_type == SHORT_TYPE) { + tab = scale_short; + if (cod_info->mixed_block_flag) + tab = scale_mixed; + } + else { /* block_type == 1,2,or 3 */ + tab = scale_long; + if (!cod_info->preflag) { + for (sfb = 11; sfb < SBPSY_l; sfb++) + if (scalefac[sfb] < pretab[sfb]) + break; + + if (sfb == SBPSY_l) { + cod_info->preflag = 1; + for (sfb = 11; sfb < SBPSY_l; sfb++) + scalefac[sfb] -= pretab[sfb]; + } + } + } + + for (sfb = 0; sfb < cod_info->sfbdivide; sfb++) + if (max_slen1 < scalefac[sfb]) + max_slen1 = scalefac[sfb]; + + for (; sfb < cod_info->sfbmax; sfb++) + if (max_slen2 < scalefac[sfb]) + max_slen2 = scalefac[sfb]; + + /* from Takehiro TOMINAGA <tominaga@isoternet.org> 10/99 + * loop over *all* posible values of scalefac_compress to find the + * one which uses the smallest number of bits. ISO would stop + * at first valid index */ + cod_info->part2_length = LARGE_BITS; + for (k = 0; k < 16; k++) { + if (max_slen1 < slen1_n[k] && max_slen2 < slen2_n[k] + && cod_info->part2_length > tab[k]) { + cod_info->part2_length = tab[k]; + cod_info->scalefac_compress = k; + } + } + return cod_info->part2_length == LARGE_BITS; +} + + + +/* + table of largest scalefactor values for MPEG2 +*/ +static const int max_range_sfac_tab[6][4] = { + {15, 15, 7, 7}, + {15, 15, 7, 0}, + {7, 3, 0, 0}, + {15, 31, 31, 0}, + {7, 7, 7, 0}, + {3, 3, 0, 0} +}; + + + + +/*************************************************************************/ +/* scale_bitcount_lsf */ +/*************************************************************************/ + +/* Also counts the number of bits to encode the scalefacs but for MPEG 2 */ +/* Lower sampling frequencies (24, 22.05 and 16 kHz.) */ + +/* This is reverse-engineered from section 2.4.3.2 of the MPEG2 IS, */ +/* "Audio Decoding Layer III" */ + +static int +mpeg2_scale_bitcount(const lame_internal_flags * gfc, gr_info * const cod_info) +{ + int table_number, row_in_table, partition, nr_sfb, window, over; + int i, sfb, max_sfac[4]; + const int *partition_table; + int const *const scalefac = cod_info->scalefac; + + /* + Set partition table. Note that should try to use table one, + but do not yet... + */ + if (cod_info->preflag) + table_number = 2; + else + table_number = 0; + + for (i = 0; i < 4; i++) + max_sfac[i] = 0; + + if (cod_info->block_type == SHORT_TYPE) { + row_in_table = 1; + partition_table = &nr_of_sfb_block[table_number][row_in_table][0]; + for (sfb = 0, partition = 0; partition < 4; partition++) { + nr_sfb = partition_table[partition] / 3; + for (i = 0; i < nr_sfb; i++, sfb++) + for (window = 0; window < 3; window++) + if (scalefac[sfb * 3 + window] > max_sfac[partition]) + max_sfac[partition] = scalefac[sfb * 3 + window]; + } + } + else { + row_in_table = 0; + partition_table = &nr_of_sfb_block[table_number][row_in_table][0]; + for (sfb = 0, partition = 0; partition < 4; partition++) { + nr_sfb = partition_table[partition]; + for (i = 0; i < nr_sfb; i++, sfb++) + if (scalefac[sfb] > max_sfac[partition]) + max_sfac[partition] = scalefac[sfb]; + } + } + + for (over = 0, partition = 0; partition < 4; partition++) { + if (max_sfac[partition] > max_range_sfac_tab[table_number][partition]) + over++; + } + if (!over) { + /* + Since no bands have been over-amplified, we can set scalefac_compress + and slen[] for the formatter + */ + static const int log2tab[] = { 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4 }; + + int slen1, slen2, slen3, slen4; + + cod_info->sfb_partition_table = nr_of_sfb_block[table_number][row_in_table]; + for (partition = 0; partition < 4; partition++) + cod_info->slen[partition] = log2tab[max_sfac[partition]]; + + /* set scalefac_compress */ + slen1 = cod_info->slen[0]; + slen2 = cod_info->slen[1]; + slen3 = cod_info->slen[2]; + slen4 = cod_info->slen[3]; + + switch (table_number) { + case 0: + cod_info->scalefac_compress = (((slen1 * 5) + slen2) << 4) + + (slen3 << 2) + + slen4; + break; + + case 1: + cod_info->scalefac_compress = 400 + (((slen1 * 5) + slen2) << 2) + + slen3; + break; + + case 2: + cod_info->scalefac_compress = 500 + (slen1 * 3) + slen2; + break; + + default: + ERRORF(gfc, "intensity stereo not implemented yet\n"); + break; + } + } +#ifdef DEBUG + if (over) + ERRORF(gfc, "---WARNING !! Amplification of some bands over limits\n"); +#endif + if (!over) { + assert(cod_info->sfb_partition_table); + cod_info->part2_length = 0; + for (partition = 0; partition < 4; partition++) + cod_info->part2_length += + cod_info->slen[partition] * cod_info->sfb_partition_table[partition]; + } + return over; +} + + +int +scale_bitcount(const lame_internal_flags * gfc, gr_info * cod_info) +{ + if (gfc->cfg.mode_gr == 2) { + return mpeg1_scale_bitcount(gfc, cod_info); + } + else { + return mpeg2_scale_bitcount(gfc, cod_info); + } +} + + +#ifdef MMX_choose_table +extern int choose_table_MMX(const int *ix, const int *const end, int *const s); +#endif + +void +huffman_init(lame_internal_flags * const gfc) +{ + int i; + + gfc->choose_table = choose_table_nonMMX; + +#ifdef MMX_choose_table + if (gfc->CPU_features.MMX) { + gfc->choose_table = choose_table_MMX; + } +#endif + + for (i = 2; i <= 576; i += 2) { + int scfb_anz = 0, bv_index; + while (gfc->scalefac_band.l[++scfb_anz] < i); + + bv_index = subdv_table[scfb_anz].region0_count; + while (gfc->scalefac_band.l[bv_index + 1] > i) + bv_index--; + + if (bv_index < 0) { + /* this is an indication that everything is going to + be encoded as region0: bigvalues < region0 < region1 + so lets set region0, region1 to some value larger + than bigvalues */ + bv_index = subdv_table[scfb_anz].region0_count; + } + + gfc->sv_qnt.bv_scf[i - 2] = bv_index; + + bv_index = subdv_table[scfb_anz].region1_count; + while (gfc->scalefac_band.l[bv_index + gfc->sv_qnt.bv_scf[i - 2] + 2] > i) + bv_index--; + + if (bv_index < 0) { + bv_index = subdv_table[scfb_anz].region1_count; + } + + gfc->sv_qnt.bv_scf[i - 1] = bv_index; + } +} diff --git a/libmp3lame/util.c b/libmp3lame/util.c new file mode 100644 index 0000000..43b457c --- /dev/null +++ b/libmp3lame/util.c @@ -0,0 +1,1018 @@ +/* + * lame utility library source file + * + * Copyright (c) 1999 Albert L Faber + * Copyright (c) 2000-2005 Alexander Leidinger + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* $Id: util.c,v 1.159 2017/09/06 15:07:30 robert Exp $ */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <float.h> +#include "lame.h" +#include "machine.h" +#include "encoder.h" +#include "util.h" +#include "tables.h" + +#define PRECOMPUTE +#if defined(__FreeBSD__) && !defined(__alpha__) +# include <machine/floatingpoint.h> +#endif + + +/*********************************************************************** +* +* Global Function Definitions +* +***********************************************************************/ +/*empty and close mallocs in gfc */ + +void +free_id3tag(lame_internal_flags * const gfc) +{ + gfc->tag_spec.language[0] = 0; + if (gfc->tag_spec.title != 0) { + free(gfc->tag_spec.title); + gfc->tag_spec.title = 0; + } + if (gfc->tag_spec.artist != 0) { + free(gfc->tag_spec.artist); + gfc->tag_spec.artist = 0; + } + if (gfc->tag_spec.album != 0) { + free(gfc->tag_spec.album); + gfc->tag_spec.album = 0; + } + if (gfc->tag_spec.comment != 0) { + free(gfc->tag_spec.comment); + gfc->tag_spec.comment = 0; + } + + if (gfc->tag_spec.albumart != 0) { + free(gfc->tag_spec.albumart); + gfc->tag_spec.albumart = 0; + gfc->tag_spec.albumart_size = 0; + gfc->tag_spec.albumart_mimetype = MIMETYPE_NONE; + } + if (gfc->tag_spec.v2_head != 0) { + FrameDataNode *node = gfc->tag_spec.v2_head; + do { + void *p = node->dsc.ptr.b; + void *q = node->txt.ptr.b; + void *r = node; + node = node->nxt; + free(p); + free(q); + free(r); + } while (node != 0); + gfc->tag_spec.v2_head = 0; + gfc->tag_spec.v2_tail = 0; + } +} + + +static void +free_global_data(lame_internal_flags * gfc) +{ + if (gfc && gfc->cd_psy) { + if (gfc->cd_psy->l.s3) { + /* XXX allocated in psymodel_init() */ + free(gfc->cd_psy->l.s3); + } + if (gfc->cd_psy->s.s3) { + /* XXX allocated in psymodel_init() */ + free(gfc->cd_psy->s.s3); + } + free(gfc->cd_psy); + gfc->cd_psy = 0; + } +} + + +void +freegfc(lame_internal_flags * const gfc) +{ /* bit stream structure */ + int i; + + if (gfc == 0) return; + + for (i = 0; i <= 2 * BPC; i++) + if (gfc->sv_enc.blackfilt[i] != NULL) { + free(gfc->sv_enc.blackfilt[i]); + gfc->sv_enc.blackfilt[i] = NULL; + } + if (gfc->sv_enc.inbuf_old[0]) { + free(gfc->sv_enc.inbuf_old[0]); + gfc->sv_enc.inbuf_old[0] = NULL; + } + if (gfc->sv_enc.inbuf_old[1]) { + free(gfc->sv_enc.inbuf_old[1]); + gfc->sv_enc.inbuf_old[1] = NULL; + } + + if (gfc->bs.buf != NULL) { + free(gfc->bs.buf); + gfc->bs.buf = NULL; + } + + if (gfc->VBR_seek_table.bag) { + free(gfc->VBR_seek_table.bag); + gfc->VBR_seek_table.bag = NULL; + gfc->VBR_seek_table.size = 0; + } + if (gfc->ATH) { + free(gfc->ATH); + } + if (gfc->sv_rpg.rgdata) { + free(gfc->sv_rpg.rgdata); + } + if (gfc->sv_enc.in_buffer_0) { + free(gfc->sv_enc.in_buffer_0); + } + if (gfc->sv_enc.in_buffer_1) { + free(gfc->sv_enc.in_buffer_1); + } + free_id3tag(gfc); + +#ifdef DECODE_ON_THE_FLY + if (gfc->hip) { + hip_decode_exit(gfc->hip); + gfc->hip = 0; + } +#endif + + free_global_data(gfc); + + free(gfc); +} + +void +calloc_aligned(aligned_pointer_t * ptr, unsigned int size, unsigned int bytes) +{ + if (ptr) { + if (!ptr->pointer) { + ptr->pointer = malloc(size + bytes); + if (ptr->pointer != 0) { + memset(ptr->pointer, 0, size + bytes); + if (bytes > 0) { + ptr->aligned = (void *) ((((size_t) ptr->pointer + bytes - 1) / bytes) * bytes); + } + else { + ptr->aligned = ptr->pointer; + } + } + else { + ptr->aligned = 0; + } + } + } +} + +void +free_aligned(aligned_pointer_t * ptr) +{ + if (ptr) { + if (ptr->pointer) { + free(ptr->pointer); + ptr->pointer = 0; + ptr->aligned = 0; + } + } +} + +/*those ATH formulas are returning +their minimum value for input = -1*/ + +static FLOAT +ATHformula_GB(FLOAT f, FLOAT value, FLOAT f_min, FLOAT f_max) +{ + /* from Painter & Spanias + modified by Gabriel Bouvigne to better fit the reality + ath = 3.640 * pow(f,-0.8) + - 6.800 * exp(-0.6*pow(f-3.4,2.0)) + + 6.000 * exp(-0.15*pow(f-8.7,2.0)) + + 0.6* 0.001 * pow(f,4.0); + + + In the past LAME was using the Painter &Spanias formula. + But we had some recurrent problems with HF content. + We measured real ATH values, and found the older formula + to be inacurate in the higher part. So we made this new + formula and this solved most of HF problematic testcases. + The tradeoff is that in VBR mode it increases a lot the + bitrate. */ + + +/*this curve can be udjusted according to the VBR scale: +it adjusts from something close to Painter & Spanias +on V9 up to Bouvigne's formula for V0. This way the VBR +bitrate is more balanced according to the -V value.*/ + + FLOAT ath; + + /* the following Hack allows to ask for the lowest value */ + if (f < -.3) + f = 3410; + + f /= 1000; /* convert to khz */ + f = Max(f_min, f); + f = Min(f_max, f); + + ath = 3.640 * pow(f, -0.8) + - 6.800 * exp(-0.6 * pow(f - 3.4, 2.0)) + + 6.000 * exp(-0.15 * pow(f - 8.7, 2.0)) + + (0.6 + 0.04 * value) * 0.001 * pow(f, 4.0); + return ath; +} + + + +FLOAT +ATHformula(SessionConfig_t const *cfg, FLOAT f) +{ + FLOAT ath; + switch (cfg->ATHtype) { + case 0: + ath = ATHformula_GB(f, 9, 0.1f, 24.0f); + break; + case 1: + ath = ATHformula_GB(f, -1, 0.1f, 24.0f); /*over sensitive, should probably be removed */ + break; + case 2: + ath = ATHformula_GB(f, 0, 0.1f, 24.0f); + break; + case 3: + ath = ATHformula_GB(f, 1, 0.1f, 24.0f) + 6; /*modification of GB formula by Roel */ + break; + case 4: + ath = ATHformula_GB(f, cfg->ATHcurve, 0.1f, 24.0f); + break; + case 5: + ath = ATHformula_GB(f, cfg->ATHcurve, 3.41f, 16.1f); + break; + default: + ath = ATHformula_GB(f, 0, 0.1f, 24.0f); + break; + } + return ath; +} + +/* see for example "Zwicker: Psychoakustik, 1982; ISBN 3-540-11401-7 */ +FLOAT +freq2bark(FLOAT freq) +{ + /* input: freq in hz output: barks */ + if (freq < 0) + freq = 0; + freq = freq * 0.001; + return 13.0 * atan(.76 * freq) + 3.5 * atan(freq * freq / (7.5 * 7.5)); +} + +#if 0 +extern FLOAT freq2cbw(FLOAT freq); + +/* see for example "Zwicker: Psychoakustik, 1982; ISBN 3-540-11401-7 */ +FLOAT +freq2cbw(FLOAT freq) +{ + /* input: freq in hz output: critical band width */ + freq = freq * 0.001; + return 25 + 75 * pow(1 + 1.4 * (freq * freq), 0.69); +} + +#endif + + + + +#define ABS(A) (((A)>0) ? (A) : -(A)) + +int +FindNearestBitrate(int bRate, /* legal rates from 8 to 320 */ + int version, int samplerate) +{ /* MPEG-1 or MPEG-2 LSF */ + int bitrate; + int i; + + if (samplerate < 16000) + version = 2; + + bitrate = bitrate_table[version][1]; + + for (i = 2; i <= 14; i++) { + if (bitrate_table[version][i] > 0) { + if (ABS(bitrate_table[version][i] - bRate) < ABS(bitrate - bRate)) + bitrate = bitrate_table[version][i]; + } + } + return bitrate; +} + + + + + +#ifndef Min +#define Min(A, B) ((A) < (B) ? (A) : (B)) +#endif +#ifndef Max +#define Max(A, B) ((A) > (B) ? (A) : (B)) +#endif + + +/* Used to find table index when + * we need bitrate-based values + * determined using tables + * + * bitrate in kbps + * + * Gabriel Bouvigne 2002-11-03 + */ +int +nearestBitrateFullIndex(uint16_t bitrate) +{ + /* borrowed from DM abr presets */ + + const int full_bitrate_table[] = + { 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320 }; + + + int lower_range = 0, lower_range_kbps = 0, upper_range = 0, upper_range_kbps = 0; + + + int b; + + + /* We assume specified bitrate will be 320kbps */ + upper_range_kbps = full_bitrate_table[16]; + upper_range = 16; + lower_range_kbps = full_bitrate_table[16]; + lower_range = 16; + + /* Determine which significant bitrates the value specified falls between, + * if loop ends without breaking then we were correct above that the value was 320 + */ + for (b = 0; b < 16; b++) { + if ((Max(bitrate, full_bitrate_table[b + 1])) != bitrate) { + upper_range_kbps = full_bitrate_table[b + 1]; + upper_range = b + 1; + lower_range_kbps = full_bitrate_table[b]; + lower_range = (b); + break; /* We found upper range */ + } + } + + /* Determine which range the value specified is closer to */ + if ((upper_range_kbps - bitrate) > (bitrate - lower_range_kbps)) { + return lower_range; + } + return upper_range; +} + + + + + +/* map frequency to a valid MP3 sample frequency + * + * Robert Hegemann 2000-07-01 + */ +int +map2MP3Frequency(int freq) +{ + if (freq <= 8000) + return 8000; + if (freq <= 11025) + return 11025; + if (freq <= 12000) + return 12000; + if (freq <= 16000) + return 16000; + if (freq <= 22050) + return 22050; + if (freq <= 24000) + return 24000; + if (freq <= 32000) + return 32000; + if (freq <= 44100) + return 44100; + + return 48000; +} + +int +BitrateIndex(int bRate, /* legal rates from 32 to 448 kbps */ + int version, /* MPEG-1 or MPEG-2/2.5 LSF */ + int samplerate) +{ /* convert bitrate in kbps to index */ + int i; + if (samplerate < 16000) + version = 2; + for (i = 0; i <= 14; i++) { + if (bitrate_table[version][i] > 0) { + if (bitrate_table[version][i] == bRate) { + return i; + } + } + } + return -1; +} + +/* convert samp freq in Hz to index */ + +int +SmpFrqIndex(int sample_freq, int *const version) +{ + switch (sample_freq) { + case 44100: + *version = 1; + return 0; + case 48000: + *version = 1; + return 1; + case 32000: + *version = 1; + return 2; + case 22050: + *version = 0; + return 0; + case 24000: + *version = 0; + return 1; + case 16000: + *version = 0; + return 2; + case 11025: + *version = 0; + return 0; + case 12000: + *version = 0; + return 1; + case 8000: + *version = 0; + return 2; + default: + *version = 0; + return -1; + } +} + + +/***************************************************************************** +* +* End of bit_stream.c package +* +*****************************************************************************/ + + + + + + + + + + +/* resampling via FIR filter, blackman window */ +inline static FLOAT +blackman(FLOAT x, FLOAT fcn, int l) +{ + /* This algorithm from: + SIGNAL PROCESSING ALGORITHMS IN FORTRAN AND C + S.D. Stearns and R.A. David, Prentice-Hall, 1992 + */ + FLOAT bkwn, x2; + FLOAT const wcn = (PI * fcn); + + x /= l; + if (x < 0) + x = 0; + if (x > 1) + x = 1; + x2 = x - .5; + + bkwn = 0.42 - 0.5 * cos(2 * x * PI) + 0.08 * cos(4 * x * PI); + if (fabs(x2) < 1e-9) + return wcn / PI; + else + return (bkwn * sin(l * wcn * x2) / (PI * l * x2)); + + +} + + + + +/* gcd - greatest common divisor */ +/* Joint work of Euclid and M. Hendry */ + +static int +gcd(int i, int j) +{ + /* assert ( i > 0 && j > 0 ); */ + return j ? gcd(j, i % j) : i; +} + + + +static int +fill_buffer_resample(lame_internal_flags * gfc, + sample_t * outbuf, + int desired_len, sample_t const *inbuf, int len, int *num_used, int ch) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + EncStateVar_t *esv = &gfc->sv_enc; + double resample_ratio = (double)cfg->samplerate_in / (double)cfg->samplerate_out; + int BLACKSIZE; + FLOAT offset, xvalue; + int i, j = 0, k; + int filter_l; + FLOAT fcn, intratio; + FLOAT *inbuf_old; + int bpc; /* number of convolution functions to pre-compute */ + bpc = cfg->samplerate_out / gcd(cfg->samplerate_out, cfg->samplerate_in); + if (bpc > BPC) + bpc = BPC; + + intratio = (fabs(resample_ratio - floor(.5 + resample_ratio)) < FLT_EPSILON); + fcn = 1.00 / resample_ratio; + if (fcn > 1.00) + fcn = 1.00; + filter_l = 31; /* must be odd */ + filter_l += intratio; /* unless resample_ratio=int, it must be even */ + + + BLACKSIZE = filter_l + 1; /* size of data needed for FIR */ + + if (gfc->fill_buffer_resample_init == 0) { + esv->inbuf_old[0] = lame_calloc(sample_t, BLACKSIZE); + esv->inbuf_old[1] = lame_calloc(sample_t, BLACKSIZE); + for (i = 0; i <= 2 * bpc; ++i) + esv->blackfilt[i] = lame_calloc(sample_t, BLACKSIZE); + + esv->itime[0] = 0; + esv->itime[1] = 0; + + /* precompute blackman filter coefficients */ + for (j = 0; j <= 2 * bpc; j++) { + FLOAT sum = 0.; + offset = (j - bpc) / (2. * bpc); + for (i = 0; i <= filter_l; i++) + sum += esv->blackfilt[j][i] = blackman(i - offset, fcn, filter_l); + for (i = 0; i <= filter_l; i++) + esv->blackfilt[j][i] /= sum; + } + gfc->fill_buffer_resample_init = 1; + } + + inbuf_old = esv->inbuf_old[ch]; + + /* time of j'th element in inbuf = itime + j/ifreq; */ + /* time of k'th element in outbuf = j/ofreq */ + for (k = 0; k < desired_len; k++) { + double time0 = k * resample_ratio; /* time of k'th output sample */ + int joff; + + j = floor(time0 - esv->itime[ch]); + + /* check if we need more input data */ + if ((filter_l + j - filter_l / 2) >= len) + break; + + /* blackman filter. by default, window centered at j+.5(filter_l%2) */ + /* but we want a window centered at time0. */ + offset = (time0 - esv->itime[ch] - (j + .5 * (filter_l % 2))); + assert(fabs(offset) <= .501); + + /* find the closest precomputed window for this offset: */ + joff = floor((offset * 2 * bpc) + bpc + .5); + + xvalue = 0.; + for (i = 0; i <= filter_l; ++i) { + int const j2 = i + j - filter_l / 2; + sample_t y; + assert(j2 < len); + assert(j2 + BLACKSIZE >= 0); + y = (j2 < 0) ? inbuf_old[BLACKSIZE + j2] : inbuf[j2]; +#ifdef PRECOMPUTE + xvalue += y * esv->blackfilt[joff][i]; +#else + xvalue += y * blackman(i - offset, fcn, filter_l); /* very slow! */ +#endif + } + outbuf[k] = xvalue; + } + + + /* k = number of samples added to outbuf */ + /* last k sample used data from [j-filter_l/2,j+filter_l-filter_l/2] */ + + /* how many samples of input data were used: */ + *num_used = Min(len, filter_l + j - filter_l / 2); + + /* adjust our input time counter. Incriment by the number of samples used, + * then normalize so that next output sample is at time 0, next + * input buffer is at time itime[ch] */ + esv->itime[ch] += *num_used - k * resample_ratio; + + /* save the last BLACKSIZE samples into the inbuf_old buffer */ + if (*num_used >= BLACKSIZE) { + for (i = 0; i < BLACKSIZE; i++) + inbuf_old[i] = inbuf[*num_used + i - BLACKSIZE]; + } + else { + /* shift in *num_used samples into inbuf_old */ + int const n_shift = BLACKSIZE - *num_used; /* number of samples to shift */ + + /* shift n_shift samples by *num_used, to make room for the + * num_used new samples */ + for (i = 0; i < n_shift; ++i) + inbuf_old[i] = inbuf_old[i + *num_used]; + + /* shift in the *num_used samples */ + for (j = 0; i < BLACKSIZE; ++i, ++j) + inbuf_old[i] = inbuf[j]; + + assert(j == *num_used); + } + return k; /* return the number samples created at the new samplerate */ +} + +int +isResamplingNecessary(SessionConfig_t const* cfg) +{ + int const l = cfg->samplerate_out * 0.9995f; + int const h = cfg->samplerate_out * 1.0005f; + return (cfg->samplerate_in < l) || (h < cfg->samplerate_in) ? 1 : 0; +} + +/* copy in new samples from in_buffer into mfbuf, with resampling + if necessary. n_in = number of samples from the input buffer that + were used. n_out = number of samples copied into mfbuf */ + +void +fill_buffer(lame_internal_flags * gfc, + sample_t * const mfbuf[2], sample_t const * const in_buffer[2], int nsamples, int *n_in, int *n_out) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + int mf_size = gfc->sv_enc.mf_size; + int framesize = 576 * cfg->mode_gr; + int nout, ch = 0; + int nch = cfg->channels_out; + + /* copy in new samples into mfbuf, with resampling if necessary */ + if (isResamplingNecessary(cfg)) { + do { + nout = + fill_buffer_resample(gfc, &mfbuf[ch][mf_size], + framesize, in_buffer[ch], nsamples, n_in, ch); + } while (++ch < nch); + *n_out = nout; + } + else { + nout = Min(framesize, nsamples); + do { + memcpy(&mfbuf[ch][mf_size], &in_buffer[ch][0], nout * sizeof(mfbuf[0][0])); + } while (++ch < nch); + *n_out = nout; + *n_in = nout; + } +} + + + + + + + +/*********************************************************************** +* +* Message Output +* +***********************************************************************/ + +void +lame_report_def(const char *format, va_list args) +{ + (void) vfprintf(stderr, format, args); + fflush(stderr); /* an debug function should flush immediately */ +} + +void +lame_report_fnc(lame_report_function print_f, const char *format, ...) +{ + if (print_f) { + va_list args; + va_start(args, format); + print_f(format, args); + va_end(args); + } +} + + +void +lame_debugf(const lame_internal_flags* gfc, const char *format, ...) +{ + if (gfc && gfc->report_dbg) { + va_list args; + va_start(args, format); + gfc->report_dbg(format, args); + va_end(args); + } +} + + +void +lame_msgf(const lame_internal_flags* gfc, const char *format, ...) +{ + if (gfc && gfc->report_msg) { + va_list args; + va_start(args, format); + gfc->report_msg(format, args); + va_end(args); + } +} + + +void +lame_errorf(const lame_internal_flags* gfc, const char *format, ...) +{ + if (gfc && gfc->report_err) { + va_list args; + va_start(args, format); + gfc->report_err(format, args); + va_end(args); + } +} + + + +/*********************************************************************** + * + * routines to detect CPU specific features like 3DNow, MMX, SSE + * + * donated by Frank Klemm + * added Robert Hegemann 2000-10-10 + * + ***********************************************************************/ + +#ifdef HAVE_NASM +extern int has_MMX_nasm(void); +extern int has_3DNow_nasm(void); +extern int has_SSE_nasm(void); +extern int has_SSE2_nasm(void); +#endif + +int +has_MMX(void) +{ +#ifdef HAVE_NASM + return has_MMX_nasm(); +#else + return 0; /* don't know, assume not */ +#endif +} + +int +has_3DNow(void) +{ +#ifdef HAVE_NASM + return has_3DNow_nasm(); +#else + return 0; /* don't know, assume not */ +#endif +} + +int +has_SSE(void) +{ +#ifdef HAVE_NASM + return has_SSE_nasm(); +#else +#if defined( _M_X64 ) || defined( MIN_ARCH_SSE ) + return 1; +#else + return 0; /* don't know, assume not */ +#endif +#endif +} + +int +has_SSE2(void) +{ +#ifdef HAVE_NASM + return has_SSE2_nasm(); +#else +#if defined( _M_X64 ) || defined( MIN_ARCH_SSE ) + return 1; +#else + return 0; /* don't know, assume not */ +#endif +#endif +} + +void +disable_FPE(void) +{ +/* extremly system dependent stuff, move to a lib to make the code readable */ +/*==========================================================================*/ + + + + /* + * Disable floating point exceptions + */ + + + + +#if defined(__FreeBSD__) && !defined(__alpha__) + { + /* seet floating point mask to the Linux default */ + fp_except_t mask; + mask = fpgetmask(); + /* if bit is set, we get SIGFPE on that error! */ + fpsetmask(mask & ~(FP_X_INV | FP_X_DZ)); + /* DEBUGF("FreeBSD mask is 0x%x\n",mask); */ + } +#endif + +#if defined(__riscos__) && !defined(ABORTFP) + /* Disable FPE's under RISC OS */ + /* if bit is set, we disable trapping that error! */ + /* _FPE_IVO : invalid operation */ + /* _FPE_DVZ : divide by zero */ + /* _FPE_OFL : overflow */ + /* _FPE_UFL : underflow */ + /* _FPE_INX : inexact */ + DisableFPETraps(_FPE_IVO | _FPE_DVZ | _FPE_OFL); +#endif + + /* + * Debugging stuff + * The default is to ignore FPE's, unless compiled with -DABORTFP + * so add code below to ENABLE FPE's. + */ + +#if defined(ABORTFP) +#if defined(_MSC_VER) + { +#if 0 + /* rh 061207 + the following fix seems to be a workaround for a problem in the + parent process calling LAME. It would be better to fix the broken + application => code disabled. + */ + + /* set affinity to a single CPU. Fix for EAC/lame on SMP systems from + "Todd Richmond" <todd.richmond@openwave.com> */ + SYSTEM_INFO si; + GetSystemInfo(&si); + SetProcessAffinityMask(GetCurrentProcess(), si.dwActiveProcessorMask); +#endif +#include <float.h> + unsigned int mask; + mask = _controlfp(0, 0); + mask &= ~(_EM_OVERFLOW | _EM_UNDERFLOW | _EM_ZERODIVIDE | _EM_INVALID); + mask = _controlfp(mask, _MCW_EM); + } +#elif defined(__CYGWIN__) +# define _FPU_GETCW(cw) __asm__ ("fnstcw %0" : "=m" (*&cw)) +# define _FPU_SETCW(cw) __asm__ ("fldcw %0" : : "m" (*&cw)) + +# define _EM_INEXACT 0x00000020 /* inexact (precision) */ +# define _EM_UNDERFLOW 0x00000010 /* underflow */ +# define _EM_OVERFLOW 0x00000008 /* overflow */ +# define _EM_ZERODIVIDE 0x00000004 /* zero divide */ +# define _EM_INVALID 0x00000001 /* invalid */ + { + unsigned int mask; + _FPU_GETCW(mask); + /* Set the FPU control word to abort on most FPEs */ + mask &= ~(_EM_OVERFLOW | _EM_ZERODIVIDE | _EM_INVALID); + _FPU_SETCW(mask); + } +# elif defined(__linux__) + { + +# include <fpu_control.h> +# ifndef _FPU_GETCW +# define _FPU_GETCW(cw) __asm__ ("fnstcw %0" : "=m" (*&cw)) +# endif +# ifndef _FPU_SETCW +# define _FPU_SETCW(cw) __asm__ ("fldcw %0" : : "m" (*&cw)) +# endif + + /* + * Set the Linux mask to abort on most FPE's + * if bit is set, we _mask_ SIGFPE on that error! + * mask &= ~( _FPU_MASK_IM | _FPU_MASK_ZM | _FPU_MASK_OM | _FPU_MASK_UM ); + */ + + unsigned int mask; + _FPU_GETCW(mask); + mask &= ~(_FPU_MASK_IM | _FPU_MASK_ZM | _FPU_MASK_OM); + _FPU_SETCW(mask); + } +#endif +#endif /* ABORTFP */ +} + + + + + +#ifdef USE_FAST_LOG +/*********************************************************************** + * + * Fast Log Approximation for log2, used to approximate every other log + * (log10 and log) + * maximum absolute error for log10 is around 10-6 + * maximum *relative* error can be high when x is almost 1 because error/log10(x) tends toward x/e + * + * use it if typical RESULT values are > 1e-5 (for example if x>1.00001 or x<0.99999) + * or if the relative precision in the domain around 1 is not important (result in 1 is exact and 0) + * + ***********************************************************************/ + + +#define LOG2_SIZE (512) +#define LOG2_SIZE_L2 (9) + +static ieee754_float32_t log_table[LOG2_SIZE + 1]; + + + +void +init_log_table(void) +{ + int j; + static int init = 0; + + /* Range for log2(x) over [1,2[ is [0,1[ */ + assert((1 << LOG2_SIZE_L2) == LOG2_SIZE); + + if (!init) { + for (j = 0; j < LOG2_SIZE + 1; j++) + log_table[j] = log(1.0f + j / (ieee754_float32_t) LOG2_SIZE) / log(2.0f); + } + init = 1; +} + + + +ieee754_float32_t +fast_log2(ieee754_float32_t x) +{ + ieee754_float32_t log2val, partial; + union { + ieee754_float32_t f; + int i; + } fi; + int mantisse; + fi.f = x; + mantisse = fi.i & 0x7fffff; + log2val = ((fi.i >> 23) & 0xFF) - 0x7f; + partial = (mantisse & ((1 << (23 - LOG2_SIZE_L2)) - 1)); + partial *= 1.0f / ((1 << (23 - LOG2_SIZE_L2))); + + + mantisse >>= (23 - LOG2_SIZE_L2); + + /* log2val += log_table[mantisse]; without interpolation the results are not good */ + log2val += log_table[mantisse] * (1.0f - partial) + log_table[mantisse + 1] * partial; + + return log2val; +} + +#else /* Don't use FAST_LOG */ + + +void +init_log_table(void) +{ +} + + +#endif + +/* end of util.c */ diff --git a/libmp3lame/util.h b/libmp3lame/util.h new file mode 100644 index 0000000..13f0cd4 --- /dev/null +++ b/libmp3lame/util.h @@ -0,0 +1,616 @@ +/* + * lame utility library include file + * + * Copyright (c) 1999 Albert L Faber + * Copyright (c) 2008 Robert Hegemann + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef LAME_UTIL_H +#define LAME_UTIL_H + +#include "l3side.h" +#include "id3tag.h" +#include "lame_global_flags.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*********************************************************************** +* +* Global Definitions +* +***********************************************************************/ + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef TRUE +#define TRUE (!FALSE) +#endif + +#ifdef UINT_MAX +# define MAX_U_32_NUM UINT_MAX +#else +# define MAX_U_32_NUM 0xFFFFFFFF +#endif + +#ifndef PI +# ifdef M_PI +# define PI M_PI +# else +# define PI 3.14159265358979323846 +# endif +#endif + + +#ifdef M_LN2 +# define LOG2 M_LN2 +#else +# define LOG2 0.69314718055994530942 +#endif + +#ifdef M_LN10 +# define LOG10 M_LN10 +#else +# define LOG10 2.30258509299404568402 +#endif + + +#ifdef M_SQRT2 +# define SQRT2 M_SQRT2 +#else +# define SQRT2 1.41421356237309504880 +#endif + + +#define CRC16_POLYNOMIAL 0x8005 + +#define MAX_BITS_PER_CHANNEL 4095 +#define MAX_BITS_PER_GRANULE 7680 + +/* "bit_stream.h" Definitions */ +#define BUFFER_SIZE LAME_MAXMP3BUFFER + +#define Min(A, B) ((A) < (B) ? (A) : (B)) +#define Max(A, B) ((A) > (B) ? (A) : (B)) + +/* log/log10 approximations */ +#ifdef USE_FAST_LOG +#define FAST_LOG10(x) (fast_log2(x)*(LOG2/LOG10)) +#define FAST_LOG(x) (fast_log2(x)*LOG2) +#define FAST_LOG10_X(x,y) (fast_log2(x)*(LOG2/LOG10*(y))) +#define FAST_LOG_X(x,y) (fast_log2(x)*(LOG2*(y))) +#else +#define FAST_LOG10(x) log10(x) +#define FAST_LOG(x) log(x) +#define FAST_LOG10_X(x,y) (log10(x)*(y)) +#define FAST_LOG_X(x,y) (log(x)*(y)) +#endif + + + struct replaygain_data; +#ifndef replaygain_data_defined +#define replaygain_data_defined + typedef struct replaygain_data replaygain_t; +#endif + struct plotting_data; +#ifndef plotting_data_defined +#define plotting_data_defined + typedef struct plotting_data plotting_data; +#endif + +/*********************************************************************** +* +* Global Type Definitions +* +***********************************************************************/ + + typedef struct { + void *aligned; /* pointer to ie. 128 bit aligned memory */ + void *pointer; /* to use with malloc/free */ + } aligned_pointer_t; + + void calloc_aligned(aligned_pointer_t * ptr, unsigned int size, unsigned int bytes); + void free_aligned(aligned_pointer_t * ptr); + + + /* "bit_stream.h" Type Definitions */ + + typedef struct bit_stream_struc { + unsigned char *buf; /* bit stream buffer */ + int buf_size; /* size of buffer (in number of bytes) */ + int totbit; /* bit counter of bit stream */ + int buf_byte_idx; /* pointer to top byte in buffer */ + int buf_bit_idx; /* pointer to top bit of top byte in buffer */ + + /* format of file in rd mode (BINARY/ASCII) */ + } Bit_stream_struc; + + + + typedef struct { + int sum; /* what we have seen so far */ + int seen; /* how many frames we have seen in this chunk */ + int want; /* how many frames we want to collect into one chunk */ + int pos; /* actual position in our bag */ + int size; /* size of our bag */ + int *bag; /* pointer to our bag */ + unsigned int nVbrNumFrames; + unsigned long nBytesWritten; + /* VBR tag data */ + unsigned int TotalFrameSize; + } VBR_seek_info_t; + + + /** + * ATH related stuff, if something new ATH related has to be added, + * please plugg it here into the ATH_t struct + */ + typedef struct { + int use_adjust; /* method for the auto adjustment */ + FLOAT aa_sensitivity_p; /* factor for tuning the (sample power) + point below which adaptive threshold + of hearing adjustment occurs */ + FLOAT adjust_factor; /* lowering based on peak volume, 1 = no lowering */ + FLOAT adjust_limit; /* limit for dynamic ATH adjust */ + FLOAT decay; /* determined to lower x dB each second */ + FLOAT floor; /* lowest ATH value */ + FLOAT l[SBMAX_l]; /* ATH for sfbs in long blocks */ + FLOAT s[SBMAX_s]; /* ATH for sfbs in short blocks */ + FLOAT psfb21[PSFB21]; /* ATH for partitionned sfb21 in long blocks */ + FLOAT psfb12[PSFB12]; /* ATH for partitionned sfb12 in short blocks */ + FLOAT cb_l[CBANDS]; /* ATH for long block convolution bands */ + FLOAT cb_s[CBANDS]; /* ATH for short block convolution bands */ + FLOAT eql_w[BLKSIZE / 2]; /* equal loudness weights (based on ATH) */ + } ATH_t; + + /** + * PSY Model related stuff + */ + + typedef struct { + FLOAT masking_lower[CBANDS]; + FLOAT minval[CBANDS]; + FLOAT rnumlines[CBANDS]; + FLOAT mld_cb[CBANDS]; + FLOAT mld[Max(SBMAX_l,SBMAX_s)]; + FLOAT bo_weight[Max(SBMAX_l,SBMAX_s)]; /* band weight long scalefactor bands, at transition */ + FLOAT attack_threshold; /* short block tuning */ + int s3ind[CBANDS][2]; + int numlines[CBANDS]; + int bm[Max(SBMAX_l,SBMAX_s)]; + int bo[Max(SBMAX_l,SBMAX_s)]; + int npart; + int n_sb; /* SBMAX_l or SBMAX_s */ + FLOAT *s3; + } PsyConst_CB2SB_t; + + + /** + * global data constants + */ + typedef struct { + FLOAT window[BLKSIZE], window_s[BLKSIZE_s / 2]; + PsyConst_CB2SB_t l; + PsyConst_CB2SB_t s; + PsyConst_CB2SB_t l_to_s; + FLOAT attack_threshold[4]; + FLOAT decay; + int force_short_block_calc; + } PsyConst_t; + + + typedef struct { + + FLOAT nb_l1[4][CBANDS], nb_l2[4][CBANDS]; + FLOAT nb_s1[4][CBANDS], nb_s2[4][CBANDS]; + + III_psy_xmin thm[4]; + III_psy_xmin en[4]; + + /* loudness calculation (for adaptive threshold of hearing) */ + FLOAT loudness_sq_save[2]; /* account for granule delay of L3psycho_anal */ + + FLOAT tot_ener[4]; + + FLOAT last_en_subshort[4][9]; + int last_attacks[4]; + + int blocktype_old[2]; + } PsyStateVar_t; + + + typedef struct { + /* loudness calculation (for adaptive threshold of hearing) */ + FLOAT loudness_sq[2][2]; /* loudness^2 approx. per granule and channel */ + } PsyResult_t; + + + /* variables used by encoder.c */ + typedef struct { + /* variables for newmdct.c */ + FLOAT sb_sample[2][2][18][SBLIMIT]; + FLOAT amp_filter[32]; + + /* variables used by util.c */ + /* BPC = maximum number of filter convolution windows to precompute */ +#define BPC 320 + double itime[2]; /* float precision seems to be not enough */ + sample_t *inbuf_old[2]; + sample_t *blackfilt[2 * BPC + 1]; + + FLOAT pefirbuf[19]; + + /* used for padding */ + int frac_SpF; + int slot_lag; + + /* variables for bitstream.c */ + /* mpeg1: buffer=511 bytes smallest frame: 96-38(sideinfo)=58 + * max number of frames in reservoir: 8 + * mpeg2: buffer=255 bytes. smallest frame: 24-23bytes=1 + * with VBR, if you are encoding all silence, it is possible to + * have 8kbs/24khz frames with 1byte of data each, which means we need + * to buffer up to 255 headers! */ + /* also, max_header_buf has to be a power of two */ +#define MAX_HEADER_BUF 256 +#define MAX_HEADER_LEN 40 /* max size of header is 38 */ + struct { + int write_timing; + int ptr; + char buf[MAX_HEADER_LEN]; + } header[MAX_HEADER_BUF]; + + int h_ptr; + int w_ptr; + int ancillary_flag; + + /* variables for reservoir.c */ + int ResvSize; /* in bits */ + int ResvMax; /* in bits */ + + int in_buffer_nsamples; + sample_t *in_buffer_0; + sample_t *in_buffer_1; + +#ifndef MFSIZE +# define MFSIZE ( 3*1152 + ENCDELAY - MDCTDELAY ) +#endif + sample_t mfbuf[2][MFSIZE]; + + int mf_samples_to_encode; + int mf_size; + + } EncStateVar_t; + + + typedef struct { + /* simple statistics */ + int bitrate_channelmode_hist[16][4 + 1]; + int bitrate_blocktype_hist[16][4 + 1 + 1]; /*norm/start/short/stop/mixed(short)/sum */ + + int bitrate_index; + int frame_number; /* number of frames encoded */ + int padding; /* padding for the current frame? */ + int mode_ext; + int encoder_delay; + int encoder_padding; /* number of samples of padding appended to input */ + } EncResult_t; + + + /* variables used by quantize.c */ + typedef struct { + /* variables for nspsytune */ + FLOAT longfact[SBMAX_l]; + FLOAT shortfact[SBMAX_s]; + FLOAT masking_lower; + FLOAT mask_adjust; /* the dbQ stuff */ + FLOAT mask_adjust_short; /* the dbQ stuff */ + int OldValue[2]; + int CurrentStep[2]; + int pseudohalf[SFBMAX]; + int sfb21_extra; /* will be set in lame_init_params */ + int substep_shaping; /* 0 = no substep + 1 = use substep shaping at last step(VBR only) + (not implemented yet) + 2 = use substep inside loop + 3 = use substep inside loop and last step + */ + + + char bv_scf[576]; + } QntStateVar_t; + + + typedef struct { + replaygain_t *rgdata; + /* ReplayGain */ + } RpgStateVar_t; + + + typedef struct { + FLOAT noclipScale; /* user-specified scale factor required for preventing clipping */ + sample_t PeakSample; + int RadioGain; + int noclipGainChange; /* gain change required for preventing clipping */ + } RpgResult_t; + + + typedef struct { + int version; /* 0=MPEG-2/2.5 1=MPEG-1 */ + int samplerate_index; + int sideinfo_len; + + int noise_shaping; /* 0 = none + 1 = ISO AAC model + 2 = allow scalefac_select=1 + */ + + int subblock_gain; /* 0 = no, 1 = yes */ + int use_best_huffman; /* 0 = no. 1=outside loop 2=inside loop(slow) */ + int noise_shaping_amp; /* 0 = ISO model: amplify all distorted bands + 1 = amplify within 50% of max (on db scale) + 2 = amplify only most distorted band + 3 = method 1 and refine with method 2 + */ + + int noise_shaping_stop; /* 0 = stop at over=0, all scalefacs amplified or + a scalefac has reached max value + 1 = stop when all scalefacs amplified or + a scalefac has reached max value + 2 = stop when all scalefacs amplified + */ + + + int full_outer_loop; /* 0 = stop early after 0 distortion found. 1 = full search */ + + int lowpassfreq; + int highpassfreq; + int samplerate_in; /* input_samp_rate in Hz. default=44.1 kHz */ + int samplerate_out; /* output_samp_rate. */ + int channels_in; /* number of channels in the input data stream (PCM or decoded PCM) */ + int channels_out; /* number of channels in the output data stream (not used for decoding) */ + int mode_gr; /* granules per frame */ + int force_ms; /* force M/S mode. requires mode=1 */ + + int quant_comp; + int quant_comp_short; + + int use_temporal_masking_effect; + int use_safe_joint_stereo; + + int preset; + + vbr_mode vbr; + int vbr_avg_bitrate_kbps; + int vbr_min_bitrate_index; /* min bitrate index */ + int vbr_max_bitrate_index; /* max bitrate index */ + int avg_bitrate; + int enforce_min_bitrate; /* strictly enforce VBR_min_bitrate normaly, it will be violated for analog silence */ + + int findReplayGain; /* find the RG value? default=0 */ + int findPeakSample; + int decode_on_the_fly; /* decode on the fly? default=0 */ + int analysis; + int disable_reservoir; + int buffer_constraint; /* enforce ISO spec as much as possible */ + int free_format; + int write_lame_tag; /* add Xing VBR tag? */ + + int error_protection; /* use 2 bytes per frame for a CRC checksum. default=0 */ + int copyright; /* mark as copyright. default=0 */ + int original; /* mark as original. default=1 */ + int extension; /* the MP3 'private extension' bit. Meaningless */ + int emphasis; /* Input PCM is emphased PCM (for + instance from one of the rarely + emphased CDs), it is STRONGLY not + recommended to use this, because + psycho does not take it into account, + and last but not least many decoders + don't care about these bits */ + + + MPEG_mode mode; + short_block_t short_blocks; + + float interChRatio; + float msfix; /* Naoki's adjustment of Mid/Side maskings */ + float ATH_offset_db;/* add to ATH this many db */ + float ATH_offset_factor;/* change ATH by this factor, derived from ATH_offset_db */ + float ATHcurve; /* change ATH formula 4 shape */ + int ATHtype; + int ATHonly; /* only use ATH */ + int ATHshort; /* only use ATH for short blocks */ + int noATH; /* disable ATH */ + + float ATHfixpoint; + + float adjust_alto_db; + float adjust_bass_db; + float adjust_treble_db; + float adjust_sfb21_db; + + float compression_ratio; /* sizeof(wav file)/sizeof(mp3 file) */ + + /* lowpass and highpass filter control */ + FLOAT lowpass1, lowpass2; /* normalized frequency bounds of passband */ + FLOAT highpass1, highpass2; /* normalized frequency bounds of passband */ + + /* scale input by this amount before encoding at least not used for MP3 decoding */ + FLOAT pcm_transform[2][2]; + + FLOAT minval; + } SessionConfig_t; + + + struct lame_internal_flags { + + /******************************************************************** + * internal variables NOT set by calling program, and should not be * + * modified by the calling program * + ********************************************************************/ + + /* + * Some remarks to the Class_ID field: + * The Class ID is an Identifier for a pointer to this struct. + * It is very unlikely that a pointer to lame_global_flags has the same 32 bits + * in it's structure (large and other special properties, for instance prime). + * + * To test that the structure is right and initialized, use: + * if ( gfc -> Class_ID == LAME_ID ) ... + * Other remark: + * If you set a flag to 0 for uninit data and 1 for init data, the right test + * should be "if (flag == 1)" and NOT "if (flag)". Unintended modification + * of this element will be otherwise misinterpreted as an init. + */ +# define LAME_ID 0xFFF88E3B + unsigned long class_id; + + int lame_init_params_successful; + int lame_encode_frame_init; + int iteration_init_init; + int fill_buffer_resample_init; + + SessionConfig_t cfg; + + /* variables used by lame.c */ + Bit_stream_struc bs; + III_side_info_t l3_side; + + scalefac_struct scalefac_band; + + PsyStateVar_t sv_psy; /* DATA FROM PSYMODEL.C */ + PsyResult_t ov_psy; + EncStateVar_t sv_enc; /* DATA FROM ENCODER.C */ + EncResult_t ov_enc; + QntStateVar_t sv_qnt; /* DATA FROM QUANTIZE.C */ + + RpgStateVar_t sv_rpg; + RpgResult_t ov_rpg; + + /* optional ID3 tags, used in id3tag.c */ + struct id3tag_spec tag_spec; + uint16_t nMusicCRC; + + uint16_t _unused; + + /* CPU features */ + struct { + unsigned int MMX:1; /* Pentium MMX, Pentium II...IV, K6, K6-2, + K6-III, Athlon */ + unsigned int AMD_3DNow:1; /* K6-2, K6-III, Athlon */ + unsigned int SSE:1; /* Pentium III, Pentium 4 */ + unsigned int SSE2:1; /* Pentium 4, K8 */ + unsigned int _unused:28; + } CPU_features; + + + VBR_seek_info_t VBR_seek_table; /* used for Xing VBR header */ + + ATH_t *ATH; /* all ATH related stuff */ + + PsyConst_t *cd_psy; + + /* used by the frame analyzer */ + plotting_data *pinfo; + hip_t hip; + + /* functions to replace with CPU feature optimized versions in takehiro.c */ + int (*choose_table) (const int *ix, const int *const end, int *const s); + void (*fft_fht) (FLOAT *, int); + void (*init_xrpow_core) (gr_info * const cod_info, FLOAT xrpow[576], int upper, + FLOAT * sum); + + lame_report_function report_msg; + lame_report_function report_dbg; + lame_report_function report_err; + }; + +#ifndef lame_internal_flags_defined +#define lame_internal_flags_defined + typedef struct lame_internal_flags lame_internal_flags; +#endif + + +/*********************************************************************** +* +* Global Function Prototype Declarations +* +***********************************************************************/ + void freegfc(lame_internal_flags * const gfc); + void free_id3tag(lame_internal_flags * const gfc); + extern int BitrateIndex(int, int, int); + extern int FindNearestBitrate(int, int, int); + extern int map2MP3Frequency(int freq); + extern int SmpFrqIndex(int, int *const); + extern int nearestBitrateFullIndex(uint16_t brate); + extern FLOAT ATHformula(SessionConfig_t const *cfg, FLOAT freq); + extern FLOAT freq2bark(FLOAT freq); + void disable_FPE(void); + +/* log/log10 approximations */ + extern void init_log_table(void); + extern ieee754_float32_t fast_log2(ieee754_float32_t x); + + int isResamplingNecessary(SessionConfig_t const* cfg); + + void fill_buffer(lame_internal_flags * gfc, + sample_t *const mfbuf[2], + sample_t const *const in_buffer[2], int nsamples, int *n_in, int *n_out); + +/* same as lame_decode1 (look in lame.h), but returns + unclipped raw floating-point samples. It is declared + here, not in lame.h, because it returns LAME's + internal type sample_t. No more than 1152 samples + per channel are allowed. */ + int hip_decode1_unclipped(hip_t hip, unsigned char *mp3buf, + size_t len, sample_t pcm_l[], sample_t pcm_r[]); + + + extern int has_MMX(void); + extern int has_3DNow(void); + extern int has_SSE(void); + extern int has_SSE2(void); + + + +/*********************************************************************** +* +* Macros about Message Printing and Exit +* +***********************************************************************/ + + extern void lame_report_def(const char* format, va_list args); + extern void lame_report_fnc(lame_report_function print_f, const char *, ...); + extern void lame_errorf(const lame_internal_flags * gfc, const char *, ...); + extern void lame_debugf(const lame_internal_flags * gfc, const char *, ...); + extern void lame_msgf(const lame_internal_flags * gfc, const char *, ...); +#define DEBUGF lame_debugf +#define ERRORF lame_errorf +#define MSGF lame_msgf + + int is_lame_internal_flags_valid(const lame_internal_flags * gfp); + + extern void hip_set_pinfo(hip_t hip, plotting_data* pinfo); + +#ifdef __cplusplus +} +#endif +#endif /* LAME_UTIL_H */ diff --git a/libmp3lame/vbrquantize.c b/libmp3lame/vbrquantize.c new file mode 100644 index 0000000..0f703b7 --- /dev/null +++ b/libmp3lame/vbrquantize.c @@ -0,0 +1,1580 @@ +/* + * MP3 quantization + * + * Copyright (c) 1999-2000 Mark Taylor + * Copyright (c) 2000-2012 Robert Hegemann + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* $Id: vbrquantize.c,v 1.142 2012/02/07 13:36:35 robert Exp $ */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + + +#include "lame.h" +#include "machine.h" +#include "encoder.h" +#include "util.h" +#include "vbrquantize.h" +#include "quantize_pvt.h" + + + + +struct algo_s; +typedef struct algo_s algo_t; + +typedef void (*alloc_sf_f) (const algo_t *, const int *, const int *, int); +typedef uint8_t (*find_sf_f) (const FLOAT *, const FLOAT *, FLOAT, unsigned int, uint8_t); + +struct algo_s { + alloc_sf_f alloc; + find_sf_f find; + const FLOAT *xr34orig; + lame_internal_flags *gfc; + gr_info *cod_info; + int mingain_l; + int mingain_s[3]; +}; + + + +/* Remarks on optimizing compilers: + * + * the MSVC compiler may get into aliasing problems when accessing + * memory through the fi_union. declaring it volatile does the trick here + * + * the calc_sfb_noise_* functions are not inlined because the intel compiler + * optimized executeables won't work as expected anymore + */ + +#ifdef _MSC_VER +# if _MSC_VER < 1400 +# define VOLATILE volatile +# else +# define VOLATILE +# endif +#else +# define VOLATILE +#endif + +typedef VOLATILE union { + float f; + int i; +} fi_union; + + + +#ifdef TAKEHIRO_IEEE754_HACK +#define DOUBLEX double +#else +#define DOUBLEX FLOAT +#endif + +#define MAGIC_FLOAT_def (65536*(128)) +#define MAGIC_INT_def 0x4b000000 + +#ifdef TAKEHIRO_IEEE754_HACK +#else +/********************************************************************* + * XRPOW_FTOI is a macro to convert floats to ints. + * if XRPOW_FTOI(x) = nearest_int(x), then QUANTFAC(x)=adj43asm[x] + * ROUNDFAC= -0.0946 + * + * if XRPOW_FTOI(x) = floor(x), then QUANTFAC(x)=asj43[x] + * ROUNDFAC=0.4054 + *********************************************************************/ +# define QUANTFAC(rx) adj43[rx] +# define ROUNDFAC_def 0.4054f +# define XRPOW_FTOI(src,dest) ((dest) = (int)(src)) +#endif + +static int const MAGIC_INT = MAGIC_INT_def; +#ifndef TAKEHIRO_IEEE754_HACK +static DOUBLEX const ROUNDFAC = ROUNDFAC_def; +#endif +static DOUBLEX const MAGIC_FLOAT = MAGIC_FLOAT_def; + + +inline static float +vec_max_c(const float * xr34, unsigned int bw) +{ + float xfsf = 0; + unsigned int i = bw >> 2u; + unsigned int const remaining = (bw & 0x03u); + + while (i-- > 0) { + if (xfsf < xr34[0]) { + xfsf = xr34[0]; + } + if (xfsf < xr34[1]) { + xfsf = xr34[1]; + } + if (xfsf < xr34[2]) { + xfsf = xr34[2]; + } + if (xfsf < xr34[3]) { + xfsf = xr34[3]; + } + xr34 += 4; + } + switch( remaining ) { + case 3: if (xfsf < xr34[2]) xfsf = xr34[2]; + case 2: if (xfsf < xr34[1]) xfsf = xr34[1]; + case 1: if (xfsf < xr34[0]) xfsf = xr34[0]; + default: break; + } + return xfsf; +} + + +inline static uint8_t +find_lowest_scalefac(const FLOAT xr34) +{ + uint8_t sf_ok = 255; + uint8_t sf = 128, delsf = 64; + uint8_t i; + FLOAT const ixmax_val = IXMAX_VAL; + for (i = 0; i < 8; ++i) { + FLOAT const xfsf = ipow20[sf] * xr34; + if (xfsf <= ixmax_val) { + sf_ok = sf; + sf -= delsf; + } + else { + sf += delsf; + } + delsf >>= 1; + } + return sf_ok; +} + + +inline static void +k_34_4(DOUBLEX x[4], int l3[4]) +{ +#ifdef TAKEHIRO_IEEE754_HACK + fi_union fi[4]; + + assert(x[0] <= IXMAX_VAL && x[1] <= IXMAX_VAL && x[2] <= IXMAX_VAL && x[3] <= IXMAX_VAL); + x[0] += MAGIC_FLOAT; + fi[0].f = x[0]; + x[1] += MAGIC_FLOAT; + fi[1].f = x[1]; + x[2] += MAGIC_FLOAT; + fi[2].f = x[2]; + x[3] += MAGIC_FLOAT; + fi[3].f = x[3]; + fi[0].f = x[0] + adj43asm[fi[0].i - MAGIC_INT]; + fi[1].f = x[1] + adj43asm[fi[1].i - MAGIC_INT]; + fi[2].f = x[2] + adj43asm[fi[2].i - MAGIC_INT]; + fi[3].f = x[3] + adj43asm[fi[3].i - MAGIC_INT]; + l3[0] = fi[0].i - MAGIC_INT; + l3[1] = fi[1].i - MAGIC_INT; + l3[2] = fi[2].i - MAGIC_INT; + l3[3] = fi[3].i - MAGIC_INT; +#else + assert(x[0] <= IXMAX_VAL && x[1] <= IXMAX_VAL && x[2] <= IXMAX_VAL && x[3] <= IXMAX_VAL); + XRPOW_FTOI(x[0], l3[0]); + XRPOW_FTOI(x[1], l3[1]); + XRPOW_FTOI(x[2], l3[2]); + XRPOW_FTOI(x[3], l3[3]); + x[0] += QUANTFAC(l3[0]); + x[1] += QUANTFAC(l3[1]); + x[2] += QUANTFAC(l3[2]); + x[3] += QUANTFAC(l3[3]); + XRPOW_FTOI(x[0], l3[0]); + XRPOW_FTOI(x[1], l3[1]); + XRPOW_FTOI(x[2], l3[2]); + XRPOW_FTOI(x[3], l3[3]); +#endif +} + + + + + +/* do call the calc_sfb_noise_* functions only with sf values + * for which holds: sfpow34*xr34 <= IXMAX_VAL + */ + +static FLOAT +calc_sfb_noise_x34(const FLOAT * xr, const FLOAT * xr34, unsigned int bw, uint8_t sf) +{ + DOUBLEX x[4]; + int l3[4]; + const FLOAT sfpow = pow20[sf + Q_MAX2]; /*pow(2.0,sf/4.0); */ + const FLOAT sfpow34 = ipow20[sf]; /*pow(sfpow,-3.0/4.0); */ + + FLOAT xfsf = 0; + unsigned int i = bw >> 2u; + unsigned int const remaining = (bw & 0x03u); + + while (i-- > 0) { + x[0] = sfpow34 * xr34[0]; + x[1] = sfpow34 * xr34[1]; + x[2] = sfpow34 * xr34[2]; + x[3] = sfpow34 * xr34[3]; + + k_34_4(x, l3); + + x[0] = fabsf(xr[0]) - sfpow * pow43[l3[0]]; + x[1] = fabsf(xr[1]) - sfpow * pow43[l3[1]]; + x[2] = fabsf(xr[2]) - sfpow * pow43[l3[2]]; + x[3] = fabsf(xr[3]) - sfpow * pow43[l3[3]]; + xfsf += (x[0] * x[0] + x[1] * x[1]) + (x[2] * x[2] + x[3] * x[3]); + + xr += 4; + xr34 += 4; + } + if (remaining) { + x[0] = x[1] = x[2] = x[3] = 0; + switch( remaining ) { + case 3: x[2] = sfpow34 * xr34[2]; + case 2: x[1] = sfpow34 * xr34[1]; + case 1: x[0] = sfpow34 * xr34[0]; + } + + k_34_4(x, l3); + x[0] = x[1] = x[2] = x[3] = 0; + + switch( remaining ) { + case 3: x[2] = fabsf(xr[2]) - sfpow * pow43[l3[2]]; + case 2: x[1] = fabsf(xr[1]) - sfpow * pow43[l3[1]]; + case 1: x[0] = fabsf(xr[0]) - sfpow * pow43[l3[0]]; + } + xfsf += (x[0] * x[0] + x[1] * x[1]) + (x[2] * x[2] + x[3] * x[3]); + } + return xfsf; +} + + + +struct calc_noise_cache { + int valid; + FLOAT value; +}; + +typedef struct calc_noise_cache calc_noise_cache_t; + + +static uint8_t +tri_calc_sfb_noise_x34(const FLOAT * xr, const FLOAT * xr34, FLOAT l3_xmin, unsigned int bw, + uint8_t sf, calc_noise_cache_t * did_it) +{ + if (did_it[sf].valid == 0) { + did_it[sf].valid = 1; + did_it[sf].value = calc_sfb_noise_x34(xr, xr34, bw, sf); + } + if (l3_xmin < did_it[sf].value) { + return 1; + } + if (sf < 255) { + uint8_t const sf_x = sf + 1; + if (did_it[sf_x].valid == 0) { + did_it[sf_x].valid = 1; + did_it[sf_x].value = calc_sfb_noise_x34(xr, xr34, bw, sf_x); + } + if (l3_xmin < did_it[sf_x].value) { + return 1; + } + } + if (sf > 0) { + uint8_t const sf_x = sf - 1; + if (did_it[sf_x].valid == 0) { + did_it[sf_x].valid = 1; + did_it[sf_x].value = calc_sfb_noise_x34(xr, xr34, bw, sf_x); + } + if (l3_xmin < did_it[sf_x].value) { + return 1; + } + } + return 0; +} + + +/** + * Robert Hegemann 2001-05-01 + * calculates quantization step size determined by allowed masking + */ +static int +calc_scalefac(FLOAT l3_xmin, int bw) +{ + FLOAT const c = 5.799142446; /* 10 * 10^(2/3) * log10(4/3) */ + return 210 + (int) (c * log10f(l3_xmin / bw) - .5f); +} + +static uint8_t +guess_scalefac_x34(const FLOAT * xr, const FLOAT * xr34, FLOAT l3_xmin, unsigned int bw, uint8_t sf_min) +{ + int const guess = calc_scalefac(l3_xmin, bw); + if (guess < sf_min) return sf_min; + if (guess >= 255) return 255; + (void) xr; + (void) xr34; + return guess; +} + + +/* the find_scalefac* routines calculate + * a quantization step size which would + * introduce as much noise as is allowed. + * The larger the step size the more + * quantization noise we'll get. The + * scalefactors are there to lower the + * global step size, allowing limited + * differences in quantization step sizes + * per band (shaping the noise). + */ + +static uint8_t +find_scalefac_x34(const FLOAT * xr, const FLOAT * xr34, FLOAT l3_xmin, unsigned int bw, + uint8_t sf_min) +{ + calc_noise_cache_t did_it[256]; + uint8_t sf = 128, sf_ok = 255, delsf = 128, seen_good_one = 0, i; + memset(did_it, 0, sizeof(did_it)); + for (i = 0; i < 8; ++i) { + delsf >>= 1; + if (sf <= sf_min) { + sf += delsf; + } + else { + uint8_t const bad = tri_calc_sfb_noise_x34(xr, xr34, l3_xmin, bw, sf, did_it); + if (bad) { /* distortion. try a smaller scalefactor */ + sf -= delsf; + } + else { + sf_ok = sf; + sf += delsf; + seen_good_one = 1; + } + } + } + /* returning a scalefac without distortion, if possible + */ + if (seen_good_one > 0) { + sf = sf_ok; + } + if (sf <= sf_min) { + sf = sf_min; + } + return sf; +} + + + +/*********************************************************************** + * + * calc_short_block_vbr_sf() + * calc_long_block_vbr_sf() + * + * Mark Taylor 2000-??-?? + * Robert Hegemann 2000-10-25 made functions of it + * + ***********************************************************************/ + +/* a variation for vbr-mtrh */ +static int +block_sf(algo_t * that, const FLOAT l3_xmin[SFBMAX], int vbrsf[SFBMAX], int vbrsfmin[SFBMAX]) +{ + FLOAT max_xr34; + const FLOAT *const xr = &that->cod_info->xr[0]; + const FLOAT *const xr34_orig = &that->xr34orig[0]; + const int *const width = &that->cod_info->width[0]; + const char *const energy_above_cutoff = &that->cod_info->energy_above_cutoff[0]; + unsigned int const max_nonzero_coeff = (unsigned int) that->cod_info->max_nonzero_coeff; + uint8_t maxsf = 0; + int sfb = 0, m_o = -1; + unsigned int j = 0, i = 0; + int const psymax = that->cod_info->psymax; + + assert(that->cod_info->max_nonzero_coeff >= 0); + + that->mingain_l = 0; + that->mingain_s[0] = 0; + that->mingain_s[1] = 0; + that->mingain_s[2] = 0; + while (j <= max_nonzero_coeff) { + unsigned int const w = (unsigned int) width[sfb]; + unsigned int const m = (unsigned int) (max_nonzero_coeff - j + 1); + unsigned int l = w; + uint8_t m1, m2; + if (l > m) { + l = m; + } + max_xr34 = vec_max_c(&xr34_orig[j], l); + + m1 = find_lowest_scalefac(max_xr34); + vbrsfmin[sfb] = m1; + if (that->mingain_l < m1) { + that->mingain_l = m1; + } + if (that->mingain_s[i] < m1) { + that->mingain_s[i] = m1; + } + if (++i > 2) { + i = 0; + } + if (sfb < psymax && w > 2) { /* mpeg2.5 at 8 kHz doesn't use all scalefactors, unused have width 2 */ + if (energy_above_cutoff[sfb]) { + m2 = that->find(&xr[j], &xr34_orig[j], l3_xmin[sfb], l, m1); +#if 0 + if (0) { + /** Robert Hegemann 2007-09-29: + * It seems here is some more potential for speed improvements. + * Current find method does 11-18 quantization calculations. + * Using a "good guess" may help to reduce this amount. + */ + uint8_t guess = calc_scalefac(l3_xmin[sfb], l); + DEBUGF(that->gfc, "sfb=%3d guess=%3d found=%3d diff=%3d\n", sfb, guess, m2, + m2 - guess); + } +#endif + if (maxsf < m2) { + maxsf = m2; + } + if (m_o < m2 && m2 < 255) { + m_o = m2; + } + } + else { + m2 = 255; + maxsf = 255; + } + } + else { + if (maxsf < m1) { + maxsf = m1; + } + m2 = maxsf; + } + vbrsf[sfb] = m2; + ++sfb; + j += w; + } + for (; sfb < SFBMAX; ++sfb) { + vbrsf[sfb] = maxsf; + vbrsfmin[sfb] = 0; + } + if (m_o > -1) { + maxsf = m_o; + for (sfb = 0; sfb < SFBMAX; ++sfb) { + if (vbrsf[sfb] == 255) { + vbrsf[sfb] = m_o; + } + } + } + return maxsf; +} + + + +/*********************************************************************** + * + * quantize xr34 based on scalefactors + * + * block_xr34 + * + * Mark Taylor 2000-??-?? + * Robert Hegemann 2000-10-20 made functions of them + * + ***********************************************************************/ + +static void +quantize_x34(const algo_t * that) +{ + DOUBLEX x[4]; + const FLOAT *xr34_orig = that->xr34orig; + gr_info *const cod_info = that->cod_info; + int const ifqstep = (cod_info->scalefac_scale == 0) ? 2 : 4; + int *l3 = cod_info->l3_enc; + unsigned int j = 0, sfb = 0; + unsigned int const max_nonzero_coeff = (unsigned int) cod_info->max_nonzero_coeff; + + assert(cod_info->max_nonzero_coeff >= 0); + assert(cod_info->max_nonzero_coeff < 576); + + while (j <= max_nonzero_coeff) { + int const s = + (cod_info->scalefac[sfb] + (cod_info->preflag ? pretab[sfb] : 0)) * ifqstep + + cod_info->subblock_gain[cod_info->window[sfb]] * 8; + uint8_t const sfac = (uint8_t) (cod_info->global_gain - s); + FLOAT const sfpow34 = ipow20[sfac]; + unsigned int const w = (unsigned int) cod_info->width[sfb]; + unsigned int const m = (unsigned int) (max_nonzero_coeff - j + 1); + unsigned int i, remaining; + + assert((cod_info->global_gain - s) >= 0); + assert(cod_info->width[sfb] >= 0); + j += w; + ++sfb; + + i = (w <= m) ? w : m; + remaining = (i & 0x03u); + i >>= 2u; + + while (i-- > 0) { + x[0] = sfpow34 * xr34_orig[0]; + x[1] = sfpow34 * xr34_orig[1]; + x[2] = sfpow34 * xr34_orig[2]; + x[3] = sfpow34 * xr34_orig[3]; + + k_34_4(x, l3); + + l3 += 4; + xr34_orig += 4; + } + if (remaining) { + int tmp_l3[4]; + x[0] = x[1] = x[2] = x[3] = 0; + switch( remaining ) { + case 3: x[2] = sfpow34 * xr34_orig[2]; + case 2: x[1] = sfpow34 * xr34_orig[1]; + case 1: x[0] = sfpow34 * xr34_orig[0]; + } + + k_34_4(x, tmp_l3); + + switch( remaining ) { + case 3: l3[2] = tmp_l3[2]; + case 2: l3[1] = tmp_l3[1]; + case 1: l3[0] = tmp_l3[0]; + } + + l3 += remaining; + xr34_orig += remaining; + } + } +} + + + +static const uint8_t max_range_short[SBMAX_s * 3] = { + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 0, 0, 0 +}; + +static const uint8_t max_range_long[SBMAX_l] = { + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0 +}; + +static const uint8_t max_range_long_lsf_pretab[SBMAX_l] = { + 7, 7, 7, 7, 7, 7, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + + + +/* + sfb=0..5 scalefac < 16 + sfb>5 scalefac < 8 + + ifqstep = ( cod_info->scalefac_scale == 0 ) ? 2 : 4; + ol_sf = (cod_info->global_gain-210.0); + ol_sf -= 8*cod_info->subblock_gain[i]; + ol_sf -= ifqstep*scalefac[gr][ch].s[sfb][i]; +*/ + +static void +set_subblock_gain(gr_info * cod_info, const int mingain_s[3], int sf[]) +{ + const int maxrange1 = 15, maxrange2 = 7; + const int ifqstepShift = (cod_info->scalefac_scale == 0) ? 1 : 2; + int *const sbg = cod_info->subblock_gain; + unsigned int const psymax = (unsigned int) cod_info->psymax; + unsigned int psydiv = 18; + int sbg0, sbg1, sbg2; + unsigned int sfb, i; + int min_sbg = 7; + + if (psydiv > psymax) { + psydiv = psymax; + } + for (i = 0; i < 3; ++i) { + int maxsf1 = 0, maxsf2 = 0, minsf = 1000; + /* see if we should use subblock gain */ + for (sfb = i; sfb < psydiv; sfb += 3) { /* part 1 */ + int const v = -sf[sfb]; + if (maxsf1 < v) { + maxsf1 = v; + } + if (minsf > v) { + minsf = v; + } + } + for (; sfb < SFBMAX; sfb += 3) { /* part 2 */ + int const v = -sf[sfb]; + if (maxsf2 < v) { + maxsf2 = v; + } + if (minsf > v) { + minsf = v; + } + } + + /* boost subblock gain as little as possible so we can + * reach maxsf1 with scalefactors + * 8*sbg >= maxsf1 + */ + { + int const m1 = maxsf1 - (maxrange1 << ifqstepShift); + int const m2 = maxsf2 - (maxrange2 << ifqstepShift); + + maxsf1 = Max(m1, m2); + } + if (minsf > 0) { + sbg[i] = minsf >> 3; + } + else { + sbg[i] = 0; + } + if (maxsf1 > 0) { + int const m1 = sbg[i]; + int const m2 = (maxsf1 + 7) >> 3; + sbg[i] = Max(m1, m2); + } + if (sbg[i] > 0 && mingain_s[i] > (cod_info->global_gain - sbg[i] * 8)) { + sbg[i] = (cod_info->global_gain - mingain_s[i]) >> 3; + } + if (sbg[i] > 7) { + sbg[i] = 7; + } + if (min_sbg > sbg[i]) { + min_sbg = sbg[i]; + } + } + sbg0 = sbg[0] * 8; + sbg1 = sbg[1] * 8; + sbg2 = sbg[2] * 8; + for (sfb = 0; sfb < SFBMAX; sfb += 3) { + sf[sfb + 0] += sbg0; + sf[sfb + 1] += sbg1; + sf[sfb + 2] += sbg2; + } + if (min_sbg > 0) { + for (i = 0; i < 3; ++i) { + sbg[i] -= min_sbg; + } + cod_info->global_gain -= min_sbg * 8; + } +} + + + +/* + ifqstep = ( cod_info->scalefac_scale == 0 ) ? 2 : 4; + ol_sf = (cod_info->global_gain-210.0); + ol_sf -= ifqstep*scalefac[gr][ch].l[sfb]; + if (cod_info->preflag && sfb>=11) + ol_sf -= ifqstep*pretab[sfb]; +*/ +static void +set_scalefacs(gr_info * cod_info, const int *vbrsfmin, int sf[], const uint8_t * max_range) +{ + const int ifqstep = (cod_info->scalefac_scale == 0) ? 2 : 4; + const int ifqstepShift = (cod_info->scalefac_scale == 0) ? 1 : 2; + int *const scalefac = cod_info->scalefac; + int const sfbmax = cod_info->sfbmax; + int sfb; + int const *const sbg = cod_info->subblock_gain; + int const *const window = cod_info->window; + int const preflag = cod_info->preflag; + + if (preflag) { + for (sfb = 11; sfb < sfbmax; ++sfb) { + sf[sfb] += pretab[sfb] * ifqstep; + } + } + for (sfb = 0; sfb < sfbmax; ++sfb) { + int const gain = cod_info->global_gain - (sbg[window[sfb]] * 8) + - ((preflag ? pretab[sfb] : 0) * ifqstep); + + if (sf[sfb] < 0) { + int const m = gain - vbrsfmin[sfb]; + /* ifqstep*scalefac >= -sf[sfb], so round UP */ + scalefac[sfb] = (ifqstep - 1 - sf[sfb]) >> ifqstepShift; + + if (scalefac[sfb] > max_range[sfb]) { + scalefac[sfb] = max_range[sfb]; + } + if (scalefac[sfb] > 0 && (scalefac[sfb] << ifqstepShift) > m) { + scalefac[sfb] = m >> ifqstepShift; + } + } + else { + scalefac[sfb] = 0; + } + } + for (; sfb < SFBMAX; ++sfb) { + scalefac[sfb] = 0; /* sfb21 */ + } +} + + +#ifndef NDEBUG +static int +checkScalefactor(const gr_info * cod_info, const int vbrsfmin[SFBMAX]) +{ + int const ifqstep = cod_info->scalefac_scale == 0 ? 2 : 4; + int sfb; + for (sfb = 0; sfb < cod_info->psymax; ++sfb) { + const int s = + ((cod_info->scalefac[sfb] + + (cod_info->preflag ? pretab[sfb] : 0)) * ifqstep) + + cod_info->subblock_gain[cod_info->window[sfb]] * 8; + + if ((cod_info->global_gain - s) < vbrsfmin[sfb]) { + /* + fprintf( stdout, "sf %d\n", sfb ); + fprintf( stdout, "min %d\n", vbrsfmin[sfb] ); + fprintf( stdout, "ggain %d\n", cod_info->global_gain ); + fprintf( stdout, "scalefac %d\n", cod_info->scalefac[sfb] ); + fprintf( stdout, "pretab %d\n", (cod_info->preflag ? pretab[sfb] : 0) ); + fprintf( stdout, "scale %d\n", (cod_info->scalefac_scale + 1) ); + fprintf( stdout, "subgain %d\n", cod_info->subblock_gain[cod_info->window[sfb]] * 8 ); + fflush( stdout ); + exit(-1); + */ + return 0; + } + } + return 1; +} +#endif + + +/****************************************************************** + * + * short block scalefacs + * + ******************************************************************/ + +static void +short_block_constrain(const algo_t * that, const int vbrsf[SFBMAX], + const int vbrsfmin[SFBMAX], int vbrmax) +{ + gr_info *const cod_info = that->cod_info; + lame_internal_flags const *const gfc = that->gfc; + SessionConfig_t const *const cfg = &gfc->cfg; + int const maxminsfb = that->mingain_l; + int mover, maxover0 = 0, maxover1 = 0, delta = 0; + int v, v0, v1; + int sfb; + int const psymax = cod_info->psymax; + + for (sfb = 0; sfb < psymax; ++sfb) { + assert(vbrsf[sfb] >= vbrsfmin[sfb]); + v = vbrmax - vbrsf[sfb]; + if (delta < v) { + delta = v; + } + v0 = v - (4 * 14 + 2 * max_range_short[sfb]); + v1 = v - (4 * 14 + 4 * max_range_short[sfb]); + if (maxover0 < v0) { + maxover0 = v0; + } + if (maxover1 < v1) { + maxover1 = v1; + } + } + if (cfg->noise_shaping == 2) { + /* allow scalefac_scale=1 */ + mover = Min(maxover0, maxover1); + } + else { + mover = maxover0; + } + if (delta > mover) { + delta = mover; + } + vbrmax -= delta; + maxover0 -= mover; + maxover1 -= mover; + + if (maxover0 == 0) { + cod_info->scalefac_scale = 0; + } + else if (maxover1 == 0) { + cod_info->scalefac_scale = 1; + } + if (vbrmax < maxminsfb) { + vbrmax = maxminsfb; + } + cod_info->global_gain = vbrmax; + + if (cod_info->global_gain < 0) { + cod_info->global_gain = 0; + } + else if (cod_info->global_gain > 255) { + cod_info->global_gain = 255; + } + { + int sf_temp[SFBMAX]; + for (sfb = 0; sfb < SFBMAX; ++sfb) { + sf_temp[sfb] = vbrsf[sfb] - vbrmax; + } + set_subblock_gain(cod_info, &that->mingain_s[0], sf_temp); + set_scalefacs(cod_info, vbrsfmin, sf_temp, max_range_short); + } + assert(checkScalefactor(cod_info, vbrsfmin)); +} + + + +/****************************************************************** + * + * long block scalefacs + * + ******************************************************************/ + +static void +long_block_constrain(const algo_t * that, const int vbrsf[SFBMAX], const int vbrsfmin[SFBMAX], + int vbrmax) +{ + gr_info *const cod_info = that->cod_info; + lame_internal_flags const *const gfc = that->gfc; + SessionConfig_t const *const cfg = &gfc->cfg; + uint8_t const *max_rangep; + int const maxminsfb = that->mingain_l; + int sfb; + int maxover0, maxover1, maxover0p, maxover1p, mover, delta = 0; + int v, v0, v1, v0p, v1p, vm0p = 1, vm1p = 1; + int const psymax = cod_info->psymax; + + max_rangep = cfg->mode_gr == 2 ? max_range_long : max_range_long_lsf_pretab; + + maxover0 = 0; + maxover1 = 0; + maxover0p = 0; /* pretab */ + maxover1p = 0; /* pretab */ + + for (sfb = 0; sfb < psymax; ++sfb) { + assert(vbrsf[sfb] >= vbrsfmin[sfb]); + v = vbrmax - vbrsf[sfb]; + if (delta < v) { + delta = v; + } + v0 = v - 2 * max_range_long[sfb]; + v1 = v - 4 * max_range_long[sfb]; + v0p = v - 2 * (max_rangep[sfb] + pretab[sfb]); + v1p = v - 4 * (max_rangep[sfb] + pretab[sfb]); + if (maxover0 < v0) { + maxover0 = v0; + } + if (maxover1 < v1) { + maxover1 = v1; + } + if (maxover0p < v0p) { + maxover0p = v0p; + } + if (maxover1p < v1p) { + maxover1p = v1p; + } + } + if (vm0p == 1) { + int gain = vbrmax - maxover0p; + if (gain < maxminsfb) { + gain = maxminsfb; + } + for (sfb = 0; sfb < psymax; ++sfb) { + int const a = (gain - vbrsfmin[sfb]) - 2 * pretab[sfb]; + if (a <= 0) { + vm0p = 0; + vm1p = 0; + break; + } + } + } + if (vm1p == 1) { + int gain = vbrmax - maxover1p; + if (gain < maxminsfb) { + gain = maxminsfb; + } + for (sfb = 0; sfb < psymax; ++sfb) { + int const b = (gain - vbrsfmin[sfb]) - 4 * pretab[sfb]; + if (b <= 0) { + vm1p = 0; + break; + } + } + } + if (vm0p == 0) { + maxover0p = maxover0; + } + if (vm1p == 0) { + maxover1p = maxover1; + } + if (cfg->noise_shaping != 2) { + maxover1 = maxover0; + maxover1p = maxover0p; + } + mover = Min(maxover0, maxover0p); + mover = Min(mover, maxover1); + mover = Min(mover, maxover1p); + + if (delta > mover) { + delta = mover; + } + vbrmax -= delta; + if (vbrmax < maxminsfb) { + vbrmax = maxminsfb; + } + maxover0 -= mover; + maxover0p -= mover; + maxover1 -= mover; + maxover1p -= mover; + + if (maxover0 == 0) { + cod_info->scalefac_scale = 0; + cod_info->preflag = 0; + max_rangep = max_range_long; + } + else if (maxover0p == 0) { + cod_info->scalefac_scale = 0; + cod_info->preflag = 1; + } + else if (maxover1 == 0) { + cod_info->scalefac_scale = 1; + cod_info->preflag = 0; + max_rangep = max_range_long; + } + else if (maxover1p == 0) { + cod_info->scalefac_scale = 1; + cod_info->preflag = 1; + } + else { + assert(0); /* this should not happen */ + } + cod_info->global_gain = vbrmax; + if (cod_info->global_gain < 0) { + cod_info->global_gain = 0; + } + else if (cod_info->global_gain > 255) { + cod_info->global_gain = 255; + } + { + int sf_temp[SFBMAX]; + for (sfb = 0; sfb < SFBMAX; ++sfb) { + sf_temp[sfb] = vbrsf[sfb] - vbrmax; + } + set_scalefacs(cod_info, vbrsfmin, sf_temp, max_rangep); + } + assert(checkScalefactor(cod_info, vbrsfmin)); +} + + + +static void +bitcount(const algo_t * that) +{ + int rc = scale_bitcount(that->gfc, that->cod_info); + + if (rc == 0) { + return; + } + /* this should not happen due to the way the scalefactors are selected */ + ERRORF(that->gfc, "INTERNAL ERROR IN VBR NEW CODE (986), please send bug report\n"); + exit(-1); +} + + + +static int +quantizeAndCountBits(const algo_t * that) +{ + quantize_x34(that); + that->cod_info->part2_3_length = noquant_count_bits(that->gfc, that->cod_info, 0); + return that->cod_info->part2_3_length; +} + + + + + +static int +tryGlobalStepsize(const algo_t * that, const int sfwork[SFBMAX], + const int vbrsfmin[SFBMAX], int delta) +{ + FLOAT const xrpow_max = that->cod_info->xrpow_max; + int sftemp[SFBMAX], i, nbits; + int gain, vbrmax = 0; + for (i = 0; i < SFBMAX; ++i) { + gain = sfwork[i] + delta; + if (gain < vbrsfmin[i]) { + gain = vbrsfmin[i]; + } + if (gain > 255) { + gain = 255; + } + if (vbrmax < gain) { + vbrmax = gain; + } + sftemp[i] = gain; + } + that->alloc(that, sftemp, vbrsfmin, vbrmax); + bitcount(that); + nbits = quantizeAndCountBits(that); + that->cod_info->xrpow_max = xrpow_max; + return nbits; +} + + + +static void +searchGlobalStepsizeMax(const algo_t * that, const int sfwork[SFBMAX], + const int vbrsfmin[SFBMAX], int target) +{ + gr_info const *const cod_info = that->cod_info; + const int gain = cod_info->global_gain; + int curr = gain; + int gain_ok = 1024; + int nbits = LARGE_BITS; + int l = gain, r = 512; + + assert(gain >= 0); + while (l <= r) { + curr = (l + r) >> 1; + nbits = tryGlobalStepsize(that, sfwork, vbrsfmin, curr - gain); + if (nbits == 0 || (nbits + cod_info->part2_length) < target) { + r = curr - 1; + gain_ok = curr; + } + else { + l = curr + 1; + if (gain_ok == 1024) { + gain_ok = curr; + } + } + } + if (gain_ok != curr) { + curr = gain_ok; + nbits = tryGlobalStepsize(that, sfwork, vbrsfmin, curr - gain); + } +} + + + +static int +sfDepth(const int sfwork[SFBMAX]) +{ + int m = 0; + unsigned int i, j; + for (j = SFBMAX, i = 0; j > 0; --j, ++i) { + int const di = 255 - sfwork[i]; + if (m < di) { + m = di; + } + assert(sfwork[i] >= 0); + assert(sfwork[i] <= 255); + } + assert(m >= 0); + assert(m <= 255); + return m; +} + + +static void +cutDistribution(const int sfwork[SFBMAX], int sf_out[SFBMAX], int cut) +{ + unsigned int i, j; + for (j = SFBMAX, i = 0; j > 0; --j, ++i) { + int const x = sfwork[i]; + sf_out[i] = x < cut ? x : cut; + } +} + + +static int +flattenDistribution(const int sfwork[SFBMAX], int sf_out[SFBMAX], int dm, int k, int p) +{ + unsigned int i, j; + int x, sfmax = 0; + if (dm > 0) { + for (j = SFBMAX, i = 0; j > 0; --j, ++i) { + int const di = p - sfwork[i]; + x = sfwork[i] + (k * di) / dm; + if (x < 0) { + x = 0; + } + else { + if (x > 255) { + x = 255; + } + } + sf_out[i] = x; + if (sfmax < x) { + sfmax = x; + } + } + } + else { + for (j = SFBMAX, i = 0; j > 0u; --j, ++i) { + x = sfwork[i]; + sf_out[i] = x; + if (sfmax < x) { + sfmax = x; + } + } + } + return sfmax; +} + + +static int +tryThatOne(algo_t const* that, const int sftemp[SFBMAX], const int vbrsfmin[SFBMAX], int vbrmax) +{ + FLOAT const xrpow_max = that->cod_info->xrpow_max; + int nbits = LARGE_BITS; + that->alloc(that, sftemp, vbrsfmin, vbrmax); + bitcount(that); + nbits = quantizeAndCountBits(that); + nbits += that->cod_info->part2_length; + that->cod_info->xrpow_max = xrpow_max; + return nbits; +} + + +static void +outOfBitsStrategy(algo_t const* that, const int sfwork[SFBMAX], const int vbrsfmin[SFBMAX], int target) +{ + int wrk[SFBMAX]; + int const dm = sfDepth(sfwork); + int const p = that->cod_info->global_gain; + int nbits; + + /* PART 1 */ + { + int bi = dm / 2; + int bi_ok = -1; + int bu = 0; + int bo = dm; + for (;;) { + int const sfmax = flattenDistribution(sfwork, wrk, dm, bi, p); + nbits = tryThatOne(that, wrk, vbrsfmin, sfmax); + if (nbits <= target) { + bi_ok = bi; + bo = bi - 1; + } + else { + bu = bi + 1; + } + if (bu <= bo) { + bi = (bu + bo) / 2; + } + else { + break; + } + } + if (bi_ok >= 0) { + if (bi != bi_ok) { + int const sfmax = flattenDistribution(sfwork, wrk, dm, bi_ok, p); + nbits = tryThatOne(that, wrk, vbrsfmin, sfmax); + } + return; + } + } + + /* PART 2: */ + { + int bi = (255 + p) / 2; + int bi_ok = -1; + int bu = p; + int bo = 255; + for (;;) { + int const sfmax = flattenDistribution(sfwork, wrk, dm, dm, bi); + nbits = tryThatOne(that, wrk, vbrsfmin, sfmax); + if (nbits <= target) { + bi_ok = bi; + bo = bi - 1; + } + else { + bu = bi + 1; + } + if (bu <= bo) { + bi = (bu + bo) / 2; + } + else { + break; + } + } + if (bi_ok >= 0) { + if (bi != bi_ok) { + int const sfmax = flattenDistribution(sfwork, wrk, dm, dm, bi_ok); + nbits = tryThatOne(that, wrk, vbrsfmin, sfmax); + } + return; + } + } + + /* fall back to old code, likely to be never called */ + searchGlobalStepsizeMax(that, wrk, vbrsfmin, target); +} + + +static int +reduce_bit_usage(lame_internal_flags * gfc, int gr, int ch +#if 0 + , const FLOAT xr34orig[576], const FLOAT l3_xmin[SFBMAX], int maxbits +#endif + ) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + gr_info *const cod_info = &gfc->l3_side.tt[gr][ch]; + /* try some better scalefac storage + */ + best_scalefac_store(gfc, gr, ch, &gfc->l3_side); + + /* best huffman_divide may save some bits too + */ + if (cfg->use_best_huffman == 1) + best_huffman_divide(gfc, cod_info); + return cod_info->part2_3_length + cod_info->part2_length; +} + + + + +int +VBR_encode_frame(lame_internal_flags * gfc, const FLOAT xr34orig[2][2][576], + const FLOAT l3_xmin[2][2][SFBMAX], const int max_bits[2][2]) +{ + SessionConfig_t const *const cfg = &gfc->cfg; + int sfwork_[2][2][SFBMAX]; + int vbrsfmin_[2][2][SFBMAX]; + algo_t that_[2][2]; + int const ngr = cfg->mode_gr; + int const nch = cfg->channels_out; + int max_nbits_ch[2][2] = {{0, 0}, {0 ,0}}; + int max_nbits_gr[2] = {0, 0}; + int max_nbits_fr = 0; + int use_nbits_ch[2][2] = {{MAX_BITS_PER_CHANNEL+1, MAX_BITS_PER_CHANNEL+1} + ,{MAX_BITS_PER_CHANNEL+1, MAX_BITS_PER_CHANNEL+1}}; + int use_nbits_gr[2] = { MAX_BITS_PER_GRANULE+1, MAX_BITS_PER_GRANULE+1 }; + int use_nbits_fr = MAX_BITS_PER_GRANULE+MAX_BITS_PER_GRANULE; + int gr, ch; + int ok, sum_fr; + + /* set up some encoding parameters + */ + for (gr = 0; gr < ngr; ++gr) { + max_nbits_gr[gr] = 0; + for (ch = 0; ch < nch; ++ch) { + max_nbits_ch[gr][ch] = max_bits[gr][ch]; + use_nbits_ch[gr][ch] = 0; + max_nbits_gr[gr] += max_bits[gr][ch]; + max_nbits_fr += max_bits[gr][ch]; + that_[gr][ch].find = (cfg->full_outer_loop < 0) ? guess_scalefac_x34 : find_scalefac_x34; + that_[gr][ch].gfc = gfc; + that_[gr][ch].cod_info = &gfc->l3_side.tt[gr][ch]; + that_[gr][ch].xr34orig = xr34orig[gr][ch]; + if (that_[gr][ch].cod_info->block_type == SHORT_TYPE) { + that_[gr][ch].alloc = short_block_constrain; + } + else { + that_[gr][ch].alloc = long_block_constrain; + } + } /* for ch */ + } + /* searches scalefactors + */ + for (gr = 0; gr < ngr; ++gr) { + for (ch = 0; ch < nch; ++ch) { + if (max_bits[gr][ch] > 0) { + algo_t *that = &that_[gr][ch]; + int *sfwork = sfwork_[gr][ch]; + int *vbrsfmin = vbrsfmin_[gr][ch]; + int vbrmax; + + vbrmax = block_sf(that, l3_xmin[gr][ch], sfwork, vbrsfmin); + that->alloc(that, sfwork, vbrsfmin, vbrmax); + bitcount(that); + } + else { + /* xr contains no energy + * l3_enc, our encoding data, will be quantized to zero + * continue with next channel + */ + } + } /* for ch */ + } + /* encode 'as is' + */ + use_nbits_fr = 0; + for (gr = 0; gr < ngr; ++gr) { + use_nbits_gr[gr] = 0; + for (ch = 0; ch < nch; ++ch) { + algo_t const *that = &that_[gr][ch]; + if (max_bits[gr][ch] > 0) { + memset(&that->cod_info->l3_enc[0], 0, sizeof(that->cod_info->l3_enc)); + (void) quantizeAndCountBits(that); + } + else { + /* xr contains no energy + * l3_enc, our encoding data, will be quantized to zero + * continue with next channel + */ + } + use_nbits_ch[gr][ch] = reduce_bit_usage(gfc, gr, ch); + use_nbits_gr[gr] += use_nbits_ch[gr][ch]; + } /* for ch */ + use_nbits_fr += use_nbits_gr[gr]; + } + + /* check bit constrains + */ + if (use_nbits_fr <= max_nbits_fr) { + ok = 1; + for (gr = 0; gr < ngr; ++gr) { + if (use_nbits_gr[gr] > MAX_BITS_PER_GRANULE) { + /* violates the rule that every granule has to use no more + * bits than MAX_BITS_PER_GRANULE + */ + ok = 0; + } + for (ch = 0; ch < nch; ++ch) { + if (use_nbits_ch[gr][ch] > MAX_BITS_PER_CHANNEL) { + /* violates the rule that every gr_ch has to use no more + * bits than MAX_BITS_PER_CHANNEL + * + * This isn't explicitly stated in the ISO docs, but the + * part2_3_length field has only 12 bits, that makes it + * up to a maximum size of 4095 bits!!! + */ + ok = 0; + } + } + } + if (ok) { + return use_nbits_fr; + } + } + + /* OK, we are in trouble and have to define how many bits are + * to be used for each granule + */ + { + ok = 1; + sum_fr = 0; + + for (gr = 0; gr < ngr; ++gr) { + max_nbits_gr[gr] = 0; + for (ch = 0; ch < nch; ++ch) { + if (use_nbits_ch[gr][ch] > MAX_BITS_PER_CHANNEL) { + max_nbits_ch[gr][ch] = MAX_BITS_PER_CHANNEL; + } + else { + max_nbits_ch[gr][ch] = use_nbits_ch[gr][ch]; + } + max_nbits_gr[gr] += max_nbits_ch[gr][ch]; + } + if (max_nbits_gr[gr] > MAX_BITS_PER_GRANULE) { + float f[2] = {0.0f, 0.0f}, s = 0.0f; + for (ch = 0; ch < nch; ++ch) { + if (max_nbits_ch[gr][ch] > 0) { + f[ch] = sqrt(sqrt(max_nbits_ch[gr][ch])); + s += f[ch]; + } + else { + f[ch] = 0; + } + } + for (ch = 0; ch < nch; ++ch) { + if (s > 0) { + max_nbits_ch[gr][ch] = MAX_BITS_PER_GRANULE * f[ch] / s; + } + else { + max_nbits_ch[gr][ch] = 0; + } + } + if (nch > 1) { + if (max_nbits_ch[gr][0] > use_nbits_ch[gr][0] + 32) { + max_nbits_ch[gr][1] += max_nbits_ch[gr][0]; + max_nbits_ch[gr][1] -= use_nbits_ch[gr][0] + 32; + max_nbits_ch[gr][0] = use_nbits_ch[gr][0] + 32; + } + if (max_nbits_ch[gr][1] > use_nbits_ch[gr][1] + 32) { + max_nbits_ch[gr][0] += max_nbits_ch[gr][1]; + max_nbits_ch[gr][0] -= use_nbits_ch[gr][1] + 32; + max_nbits_ch[gr][1] = use_nbits_ch[gr][1] + 32; + } + if (max_nbits_ch[gr][0] > MAX_BITS_PER_CHANNEL) { + max_nbits_ch[gr][0] = MAX_BITS_PER_CHANNEL; + } + if (max_nbits_ch[gr][1] > MAX_BITS_PER_CHANNEL) { + max_nbits_ch[gr][1] = MAX_BITS_PER_CHANNEL; + } + } + max_nbits_gr[gr] = 0; + for (ch = 0; ch < nch; ++ch) { + max_nbits_gr[gr] += max_nbits_ch[gr][ch]; + } + } + sum_fr += max_nbits_gr[gr]; + } + if (sum_fr > max_nbits_fr) { + { + float f[2] = {0.0f, 0.0f}, s = 0.0f; + for (gr = 0; gr < ngr; ++gr) { + if (max_nbits_gr[gr] > 0) { + f[gr] = sqrt(max_nbits_gr[gr]); + s += f[gr]; + } + else { + f[gr] = 0; + } + } + for (gr = 0; gr < ngr; ++gr) { + if (s > 0) { + max_nbits_gr[gr] = max_nbits_fr * f[gr] / s; + } + else { + max_nbits_gr[gr] = 0; + } + } + } + if (ngr > 1) { + if (max_nbits_gr[0] > use_nbits_gr[0] + 125) { + max_nbits_gr[1] += max_nbits_gr[0]; + max_nbits_gr[1] -= use_nbits_gr[0] + 125; + max_nbits_gr[0] = use_nbits_gr[0] + 125; + } + if (max_nbits_gr[1] > use_nbits_gr[1] + 125) { + max_nbits_gr[0] += max_nbits_gr[1]; + max_nbits_gr[0] -= use_nbits_gr[1] + 125; + max_nbits_gr[1] = use_nbits_gr[1] + 125; + } + for (gr = 0; gr < ngr; ++gr) { + if (max_nbits_gr[gr] > MAX_BITS_PER_GRANULE) { + max_nbits_gr[gr] = MAX_BITS_PER_GRANULE; + } + } + } + for (gr = 0; gr < ngr; ++gr) { + float f[2] = {0.0f, 0.0f}, s = 0.0f; + for (ch = 0; ch < nch; ++ch) { + if (max_nbits_ch[gr][ch] > 0) { + f[ch] = sqrt(max_nbits_ch[gr][ch]); + s += f[ch]; + } + else { + f[ch] = 0; + } + } + for (ch = 0; ch < nch; ++ch) { + if (s > 0) { + max_nbits_ch[gr][ch] = max_nbits_gr[gr] * f[ch] / s; + } + else { + max_nbits_ch[gr][ch] = 0; + } + } + if (nch > 1) { + if (max_nbits_ch[gr][0] > use_nbits_ch[gr][0] + 32) { + max_nbits_ch[gr][1] += max_nbits_ch[gr][0]; + max_nbits_ch[gr][1] -= use_nbits_ch[gr][0] + 32; + max_nbits_ch[gr][0] = use_nbits_ch[gr][0] + 32; + } + if (max_nbits_ch[gr][1] > use_nbits_ch[gr][1] + 32) { + max_nbits_ch[gr][0] += max_nbits_ch[gr][1]; + max_nbits_ch[gr][0] -= use_nbits_ch[gr][1] + 32; + max_nbits_ch[gr][1] = use_nbits_ch[gr][1] + 32; + } + for (ch = 0; ch < nch; ++ch) { + if (max_nbits_ch[gr][ch] > MAX_BITS_PER_CHANNEL) { + max_nbits_ch[gr][ch] = MAX_BITS_PER_CHANNEL; + } + } + } + } + } + /* sanity check */ + sum_fr = 0; + for (gr = 0; gr < ngr; ++gr) { + int sum_gr = 0; + for (ch = 0; ch < nch; ++ch) { + sum_gr += max_nbits_ch[gr][ch]; + if (max_nbits_ch[gr][ch] > MAX_BITS_PER_CHANNEL) { + ok = 0; + } + } + sum_fr += sum_gr; + if (sum_gr > MAX_BITS_PER_GRANULE) { + ok = 0; + } + } + if (sum_fr > max_nbits_fr) { + ok = 0; + } + if (!ok) { + /* we must have done something wrong, fallback to 'on_pe' based constrain */ + for (gr = 0; gr < ngr; ++gr) { + for (ch = 0; ch < nch; ++ch) { + max_nbits_ch[gr][ch] = max_bits[gr][ch]; + } + } + } + } + + /* we already called the 'best_scalefac_store' function, so we need to reset some + * variables before we can do it again. + */ + for (ch = 0; ch < nch; ++ch) { + gfc->l3_side.scfsi[ch][0] = 0; + gfc->l3_side.scfsi[ch][1] = 0; + gfc->l3_side.scfsi[ch][2] = 0; + gfc->l3_side.scfsi[ch][3] = 0; + } + for (gr = 0; gr < ngr; ++gr) { + for (ch = 0; ch < nch; ++ch) { + gfc->l3_side.tt[gr][ch].scalefac_compress = 0; + } + } + + /* alter our encoded data, until it fits into the target bitrate + */ + use_nbits_fr = 0; + for (gr = 0; gr < ngr; ++gr) { + use_nbits_gr[gr] = 0; + for (ch = 0; ch < nch; ++ch) { + algo_t const *that = &that_[gr][ch]; + use_nbits_ch[gr][ch] = 0; + if (max_bits[gr][ch] > 0) { + int *sfwork = sfwork_[gr][ch]; + int const *vbrsfmin = vbrsfmin_[gr][ch]; + cutDistribution(sfwork, sfwork, that->cod_info->global_gain); + outOfBitsStrategy(that, sfwork, vbrsfmin, max_nbits_ch[gr][ch]); + } + use_nbits_ch[gr][ch] = reduce_bit_usage(gfc, gr, ch); + assert(use_nbits_ch[gr][ch] <= max_nbits_ch[gr][ch]); + use_nbits_gr[gr] += use_nbits_ch[gr][ch]; + } /* for ch */ + use_nbits_fr += use_nbits_gr[gr]; + } + + /* check bit constrains, but it should always be ok, iff there are no bugs ;-) + */ + if (use_nbits_fr <= max_nbits_fr) { + return use_nbits_fr; + } + + ERRORF(gfc, "INTERNAL ERROR IN VBR NEW CODE (1313), please send bug report\n" + "maxbits=%d usedbits=%d\n", max_nbits_fr, use_nbits_fr); + exit(-1); +} diff --git a/libmp3lame/vbrquantize.h b/libmp3lame/vbrquantize.h new file mode 100644 index 0000000..1c0d18f --- /dev/null +++ b/libmp3lame/vbrquantize.h @@ -0,0 +1,28 @@ +/* + * MP3 VBR quantization + * + * Copyright (c) 1999 Mark Taylor + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef LAME_VBRQUANTIZE_H +#define LAME_VBRQUANTIZE_H + +int VBR_encode_frame(lame_internal_flags * gfc, const FLOAT xr34orig[2][2][576], + const FLOAT l3_xmin[2][2][SFBMAX], const int maxbits[2][2]); + +#endif /* LAME_VBRQUANTIZE_H */ diff --git a/libmp3lame/vector/Makefile.am b/libmp3lame/vector/Makefile.am new file mode 100644 index 0000000..ac595b1 --- /dev/null +++ b/libmp3lame/vector/Makefile.am @@ -0,0 +1,49 @@ +## $Id: Makefile.am,v 1.1 2007/01/09 10:15:53 aleidinger Exp $ + +include $(top_srcdir)/Makefile.am.global + +if WITH_XMM +noinst_LTLIBRARIES = liblamevectorroutines.la +endif + +##liblamecpuroutines_la_LIBADD = +##liblamecpuroutines_la_LDFLAGS = + +INCLUDES = @INCLUDES@ \ + -I$(top_srcdir)/libmp3lame \ + -I$(top_srcdir)/mpglib \ + -I$(top_builddir) + +DEFS = @DEFS@ @CONFIG_DEFS@ + +xmm_sources = xmm_quantize_sub.c + +if WITH_XMM +liblamevectorroutines_la_SOURCES = $(xmm_sources) +endif + +noinst_HEADERS = lame_intrin.h + +EXTRA_liblamevectorroutines_la_SOURCES = $(xmm_sources) + +CLEANFILES = lclint.txt + +LCLINTFLAGS= \ + +posixlib \ + +showsummary \ + +showalluses \ + +whichlib \ + +forcehints \ + -fixedformalarray \ + +matchanyintegral \ + -Dlint + +lclint.txt: ${liblamecpuroutines_la_SOURCES} ${noinst_HEADERS} + @lclint ${LCLINTFLAGS} ${INCLUDES} ${DEFS} ${liblamecpuroutines_la_SOURCES} 2>&1 >lclint.txt || true + +lclint: lclint.txt + more lclint.txt + +#$(OBJECTS): libtool +#libtool: $(LIBTOOL_DEPS) +# $(SHELL) $(top_builddir)/config.status --recheck diff --git a/libmp3lame/vector/Makefile.in b/libmp3lame/vector/Makefile.in new file mode 100644 index 0000000..c15a0cf --- /dev/null +++ b/libmp3lame/vector/Makefile.in @@ -0,0 +1,656 @@ +# Makefile.in generated by automake 1.15.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2017 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# global section for every Makefile.am + + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = libmp3lame/vector +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ + $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +liblamevectorroutines_la_LIBADD = +am__liblamevectorroutines_la_SOURCES_DIST = xmm_quantize_sub.c +am__objects_1 = xmm_quantize_sub.lo +@WITH_XMM_TRUE@am_liblamevectorroutines_la_OBJECTS = $(am__objects_1) +liblamevectorroutines_la_OBJECTS = \ + $(am_liblamevectorroutines_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +@WITH_XMM_TRUE@am_liblamevectorroutines_la_rpath = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(liblamevectorroutines_la_SOURCES) \ + $(EXTRA_liblamevectorroutines_la_SOURCES) +DIST_SOURCES = $(am__liblamevectorroutines_la_SOURCES_DIST) \ + $(EXTRA_liblamevectorroutines_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +HEADERS = $(noinst_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.global $(top_srcdir)/depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_DEFS = @CONFIG_DEFS@ +CONFIG_MATH_LIB = @CONFIG_MATH_LIB@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CPUCCODE = @CPUCCODE@ +CPUTYPE = @CPUTYPE@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ @CONFIG_DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FRONTEND_CFLAGS = @FRONTEND_CFLAGS@ +FRONTEND_LDADD = @FRONTEND_LDADD@ +FRONTEND_LDFLAGS = @FRONTEND_LDFLAGS@ +GREP = @GREP@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_CONFIG = @GTK_CONFIG@ +GTK_LIBS = @GTK_LIBS@ +INCLUDES = @INCLUDES@ \ + -I$(top_srcdir)/libmp3lame \ + -I$(top_srcdir)/mpglib \ + -I$(top_builddir) + +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDADD = @LDADD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_MAJOR_VERSION = @LIB_MAJOR_VERSION@ +LIB_MINOR_VERSION = @LIB_MINOR_VERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEDEP = @MAKEDEP@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NASM = @NASM@ +NASM_FORMAT = @NASM_FORMAT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM_F = @RM_F@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_FRONTEND = @WITH_FRONTEND@ +WITH_MP3RTP = @WITH_MP3RTP@ +WITH_MP3X = @WITH_MP3X@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = 1.15 foreign +@WITH_XMM_TRUE@noinst_LTLIBRARIES = liblamevectorroutines.la +xmm_sources = xmm_quantize_sub.c +@WITH_XMM_TRUE@liblamevectorroutines_la_SOURCES = $(xmm_sources) +noinst_HEADERS = lame_intrin.h +EXTRA_liblamevectorroutines_la_SOURCES = $(xmm_sources) +CLEANFILES = lclint.txt +LCLINTFLAGS = \ + +posixlib \ + +showsummary \ + +showalluses \ + +whichlib \ + +forcehints \ + -fixedformalarray \ + +matchanyintegral \ + -Dlint + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.global $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign libmp3lame/vector/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign libmp3lame/vector/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/Makefile.am.global $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +liblamevectorroutines.la: $(liblamevectorroutines_la_OBJECTS) $(liblamevectorroutines_la_DEPENDENCIES) $(EXTRA_liblamevectorroutines_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(am_liblamevectorroutines_la_rpath) $(liblamevectorroutines_la_OBJECTS) $(liblamevectorroutines_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmm_quantize_sub.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# end global section + +lclint.txt: ${liblamecpuroutines_la_SOURCES} ${noinst_HEADERS} + @lclint ${LCLINTFLAGS} ${INCLUDES} ${DEFS} ${liblamecpuroutines_la_SOURCES} 2>&1 >lclint.txt || true + +lclint: lclint.txt + more lclint.txt + +#$(OBJECTS): libtool +#libtool: $(LIBTOOL_DEPS) +# $(SHELL) $(top_builddir)/config.status --recheck + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/libmp3lame/vector/lame_intrin.h b/libmp3lame/vector/lame_intrin.h new file mode 100644 index 0000000..bc4c189 --- /dev/null +++ b/libmp3lame/vector/lame_intrin.h @@ -0,0 +1,33 @@ +/* + * lame_intrin.h include file + * + * Copyright (c) 2006 Gabriel Bouvigne + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + + +#ifndef LAME_INTRIN_H +#define LAME_INTRIN_H + + +void +init_xrpow_core_sse(gr_info * const cod_info, FLOAT xrpow[576], int upper, FLOAT * sum); + +void +fht_SSE2(FLOAT* , int); + +#endif diff --git a/libmp3lame/vector/xmm_quantize_sub.c b/libmp3lame/vector/xmm_quantize_sub.c new file mode 100644 index 0000000..d68f761 --- /dev/null +++ b/libmp3lame/vector/xmm_quantize_sub.c @@ -0,0 +1,240 @@ +/* + * MP3 quantization, intrinsics functions + * + * Copyright (c) 2005-2006 Gabriel Bouvigne + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include "lame.h" +#include "machine.h" +#include "encoder.h" +#include "util.h" +#include "lame_intrin.h" + + + +#ifdef HAVE_XMMINTRIN_H + +#include <xmmintrin.h> + +typedef union { + int32_t _i_32[4]; /* unions are initialized by its first member */ + float _float[4]; + __m128 _m128; +} vecfloat_union; + +#define TRI_SIZE (5-1) /* 1024 = 4**5 */ +static const FLOAT costab[TRI_SIZE * 2] = { + 9.238795325112867e-01, 3.826834323650898e-01, + 9.951847266721969e-01, 9.801714032956060e-02, + 9.996988186962042e-01, 2.454122852291229e-02, + 9.999811752826011e-01, 6.135884649154475e-03 +}; + + +/* make sure functions with SSE instructions maintain their own properly aligned stack */ +#if defined (__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 2))) +#define SSE_FUNCTION __attribute__((force_align_arg_pointer)) +#else +#define SSE_FUNCTION +#endif + + +SSE_FUNCTION void +init_xrpow_core_sse(gr_info * const cod_info, FLOAT xrpow[576], int upper, FLOAT * sum) +{ + int i; + float tmp_max = 0; + float tmp_sum = 0; + int upper4 = (upper / 4) * 4; + int rest = upper-upper4; + + const vecfloat_union fabs_mask = {{ 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF }}; + const __m128 vec_fabs_mask = _mm_loadu_ps(&fabs_mask._float[0]); + vecfloat_union vec_xrpow_max; + vecfloat_union vec_sum; + vecfloat_union vec_tmp; + + _mm_prefetch((char *) cod_info->xr, _MM_HINT_T0); + _mm_prefetch((char *) xrpow, _MM_HINT_T0); + + vec_xrpow_max._m128 = _mm_set_ps1(0); + vec_sum._m128 = _mm_set_ps1(0); + + for (i = 0; i < upper4; i += 4) { + vec_tmp._m128 = _mm_loadu_ps(&(cod_info->xr[i])); /* load */ + vec_tmp._m128 = _mm_and_ps(vec_tmp._m128, vec_fabs_mask); /* fabs */ + vec_sum._m128 = _mm_add_ps(vec_sum._m128, vec_tmp._m128); + vec_tmp._m128 = _mm_sqrt_ps(_mm_mul_ps(vec_tmp._m128, _mm_sqrt_ps(vec_tmp._m128))); + vec_xrpow_max._m128 = _mm_max_ps(vec_xrpow_max._m128, vec_tmp._m128); /* retrieve max */ + _mm_storeu_ps(&(xrpow[i]), vec_tmp._m128); /* store into xrpow[] */ + } + vec_tmp._m128 = _mm_set_ps1(0); + switch (rest) { + case 3: vec_tmp._float[2] = cod_info->xr[upper4+2]; + case 2: vec_tmp._float[1] = cod_info->xr[upper4+1]; + case 1: vec_tmp._float[0] = cod_info->xr[upper4+0]; + vec_tmp._m128 = _mm_and_ps(vec_tmp._m128, vec_fabs_mask); /* fabs */ + vec_sum._m128 = _mm_add_ps(vec_sum._m128, vec_tmp._m128); + vec_tmp._m128 = _mm_sqrt_ps(_mm_mul_ps(vec_tmp._m128, _mm_sqrt_ps(vec_tmp._m128))); + vec_xrpow_max._m128 = _mm_max_ps(vec_xrpow_max._m128, vec_tmp._m128); /* retrieve max */ + switch (rest) { + case 3: xrpow[upper4+2] = vec_tmp._float[2]; + case 2: xrpow[upper4+1] = vec_tmp._float[1]; + case 1: xrpow[upper4+0] = vec_tmp._float[0]; + default: + break; + } + default: + break; + } + tmp_sum = vec_sum._float[0] + vec_sum._float[1] + vec_sum._float[2] + vec_sum._float[3]; + { + float ma = vec_xrpow_max._float[0] > vec_xrpow_max._float[1] + ? vec_xrpow_max._float[0] : vec_xrpow_max._float[1]; + float mb = vec_xrpow_max._float[2] > vec_xrpow_max._float[3] + ? vec_xrpow_max._float[2] : vec_xrpow_max._float[3]; + tmp_max = ma > mb ? ma : mb; + } + cod_info->xrpow_max = tmp_max; + *sum = tmp_sum; +} + + +SSE_FUNCTION static void +store4(__m128 v, float* f0, float* f1, float* f2, float* f3) +{ + vecfloat_union r; + r._m128 = v; + *f0 = r._float[0]; + *f1 = r._float[1]; + *f2 = r._float[2]; + *f3 = r._float[3]; +} + + +SSE_FUNCTION void +fht_SSE2(FLOAT * fz, int n) +{ + const FLOAT *tri = costab; + int k4; + FLOAT *fi, *gi; + FLOAT const *fn; + + n <<= 1; /* to get BLKSIZE, because of 3DNow! ASM routine */ + fn = fz + n; + k4 = 4; + do { + FLOAT s1, c1; + int i, k1, k2, k3, kx; + kx = k4 >> 1; + k1 = k4; + k2 = k4 << 1; + k3 = k2 + k1; + k4 = k2 << 1; + fi = fz; + gi = fi + kx; + do { + FLOAT f0, f1, f2, f3; + f1 = fi[0] - fi[k1]; + f0 = fi[0] + fi[k1]; + f3 = fi[k2] - fi[k3]; + f2 = fi[k2] + fi[k3]; + fi[k2] = f0 - f2; + fi[0] = f0 + f2; + fi[k3] = f1 - f3; + fi[k1] = f1 + f3; + f1 = gi[0] - gi[k1]; + f0 = gi[0] + gi[k1]; + f3 = SQRT2 * gi[k3]; + f2 = SQRT2 * gi[k2]; + gi[k2] = f0 - f2; + gi[0] = f0 + f2; + gi[k3] = f1 - f3; + gi[k1] = f1 + f3; + gi += k4; + fi += k4; + } while (fi < fn); + c1 = tri[0]; + s1 = tri[1]; + for (i = 1; i < kx; i++) { + __m128 v_s2; + __m128 v_c2; + __m128 v_c1; + __m128 v_s1; + FLOAT c2, s2, s1_2 = s1+s1; + c2 = 1 - s1_2 * s1; + s2 = s1_2 * c1; + fi = fz + i; + gi = fz + k1 - i; + v_c1 = _mm_set_ps1(c1); + v_s1 = _mm_set_ps1(s1); + v_c2 = _mm_set_ps1(c2); + v_s2 = _mm_set_ps1(s2); + { + static const vecfloat_union sign_mask = {{0x80000000,0,0,0}}; + v_c1 = _mm_xor_ps(sign_mask._m128, v_c1); /* v_c1 := {-c1, +c1, +c1, +c1} */ + } + { + static const vecfloat_union sign_mask = {{0,0x80000000,0,0}}; + v_s1 = _mm_xor_ps(sign_mask._m128, v_s1); /* v_s1 := {+s1, -s1, +s1, +s1} */ + } + { + static const vecfloat_union sign_mask = {{0,0,0x80000000,0x80000000}}; + v_c2 = _mm_xor_ps(sign_mask._m128, v_c2); /* v_c2 := {+c2, +c2, -c2, -c2} */ + } + do { + __m128 p, q, r; + + q = _mm_setr_ps(fi[k1], fi[k3], gi[k1], gi[k3]); /* Q := {fi_k1,fi_k3,gi_k1,gi_k3}*/ + p = _mm_mul_ps(_mm_set_ps1(s2), q); /* P := s2 * Q */ + q = _mm_mul_ps(v_c2, q); /* Q := c2 * Q */ + q = _mm_shuffle_ps(q, q, _MM_SHUFFLE(1,0,3,2)); /* Q := {-c2*gi_k1,-c2*gi_k3,c2*fi_k1,c2*fi_k3} */ + p = _mm_add_ps(p, q); + + r = _mm_setr_ps(gi[0], gi[k2], fi[0], fi[k2]); /* R := {gi_0,gi_k2,fi_0,fi_k2} */ + q = _mm_sub_ps(r, p); /* Q := {gi_0-p0,gi_k2-p1,fi_0-p2,fi_k2-p3} */ + r = _mm_add_ps(r, p); /* R := {gi_0+p0,gi_k2+p1,fi_0+p2,fi_k2+p3} */ + p = _mm_shuffle_ps(q, r, _MM_SHUFFLE(2,0,2,0)); /* P := {q0,q2,r0,r2} */ + p = _mm_shuffle_ps(p, p, _MM_SHUFFLE(3,1,2,0)); /* P := {q0,r0,q2,r2} */ + q = _mm_shuffle_ps(q, r, _MM_SHUFFLE(3,1,3,1)); /* Q := {q1,q3,r1,r3} */ + r = _mm_mul_ps(v_c1, q); + q = _mm_mul_ps(v_s1, q); + q = _mm_shuffle_ps(q, q, _MM_SHUFFLE(0,1,2,3)); /* Q := {q3,q2,q1,q0} */ + q = _mm_add_ps(q, r); + + store4(_mm_sub_ps(p, q), &gi[k3], &gi[k2], &fi[k3], &fi[k2]); + store4(_mm_add_ps(p, q), &gi[k1], &gi[ 0], &fi[k1], &fi[ 0]); + + gi += k4; + fi += k4; + } while (fi < fn); + c2 = c1; + c1 = c2 * tri[0] - s1 * tri[1]; + s1 = c2 * tri[1] + s1 * tri[0]; + } + tri += 2; + } while (k4 < n); +} + +#endif /* HAVE_XMMINTRIN_H */ + diff --git a/libmp3lame/version.c b/libmp3lame/version.c new file mode 100644 index 0000000..2943406 --- /dev/null +++ b/libmp3lame/version.c @@ -0,0 +1,254 @@ +/* + * Version numbering for LAME. + * + * Copyright (c) 1999 A.L. Faber + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/*! + \file version.c + \brief Version numbering for LAME. + + Contains functions which describe the version of LAME. + + \author A.L. Faber + \version \$Id: version.c,v 1.34 2011/11/18 09:51:02 robert Exp $ + \ingroup libmp3lame +*/ + + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + + +#include "lame.h" +#include "machine.h" + +#include "version.h" /* macros of version numbers */ + + + + + +/*! Get the LAME version string. */ +/*! + \param void + \return a pointer to a string which describes the version of LAME. +*/ +const char * +get_lame_version(void) +{ /* primary to write screen reports */ + /* Here we can also add informations about compile time configurations */ + +#if LAME_ALPHA_VERSION + static /*@observer@ */ const char *const str = + STR(LAME_MAJOR_VERSION) "." STR(LAME_MINOR_VERSION) " " + "(alpha " STR(LAME_PATCH_VERSION) ", " __DATE__ " " __TIME__ ")"; +#elif LAME_BETA_VERSION + static /*@observer@ */ const char *const str = + STR(LAME_MAJOR_VERSION) "." STR(LAME_MINOR_VERSION) " " + "(beta " STR(LAME_PATCH_VERSION) ", " __DATE__ ")"; +#elif LAME_RELEASE_VERSION && (LAME_PATCH_VERSION > 0) + static /*@observer@ */ const char *const str = + STR(LAME_MAJOR_VERSION) "." STR(LAME_MINOR_VERSION) "." STR(LAME_PATCH_VERSION); +#else + static /*@observer@ */ const char *const str = + STR(LAME_MAJOR_VERSION) "." STR(LAME_MINOR_VERSION); +#endif + + return str; +} + + +/*! Get the short LAME version string. */ +/*! + It's mainly for inclusion into the MP3 stream. + + \param void + \return a pointer to the short version of the LAME version string. +*/ +const char * +get_lame_short_version(void) +{ + /* adding date and time to version string makes it harder for output + validation */ + +#if LAME_ALPHA_VERSION + static /*@observer@ */ const char *const str = + STR(LAME_MAJOR_VERSION) "." STR(LAME_MINOR_VERSION) " (alpha " STR(LAME_PATCH_VERSION) ")"; +#elif LAME_BETA_VERSION + static /*@observer@ */ const char *const str = + STR(LAME_MAJOR_VERSION) "." STR(LAME_MINOR_VERSION) " (beta " STR(LAME_PATCH_VERSION) ")"; +#elif LAME_RELEASE_VERSION && (LAME_PATCH_VERSION > 0) + static /*@observer@ */ const char *const str = + STR(LAME_MAJOR_VERSION) "." STR(LAME_MINOR_VERSION) "." STR(LAME_PATCH_VERSION); +#else + static /*@observer@ */ const char *const str = + STR(LAME_MAJOR_VERSION) "." STR(LAME_MINOR_VERSION); +#endif + + return str; +} + +/*! Get the _very_ short LAME version string. */ +/*! + It's used in the LAME VBR tag only. + + \param void + \return a pointer to the short version of the LAME version string. +*/ +const char * +get_lame_very_short_version(void) +{ + /* adding date and time to version string makes it harder for output + validation */ +#if LAME_ALPHA_VERSION +#define P "a" +#elif LAME_BETA_VERSION +#define P "b" +#elif LAME_RELEASE_VERSION && (LAME_PATCH_VERSION > 0) +#define P "r" +#else +#define P " " +#endif + static /*@observer@ */ const char *const str = +#if (LAME_PATCH_VERSION > 0) + "LAME" STR(LAME_MAJOR_VERSION) "." STR(LAME_MINOR_VERSION) P STR(LAME_PATCH_VERSION) +#else + "LAME" STR(LAME_MAJOR_VERSION) "." STR(LAME_MINOR_VERSION) P +#endif + ; + return str; +} + +/*! Get the _very_ short LAME version string. */ +/*! + It's used in the LAME VBR tag only, limited to 9 characters max. + Due to some 3rd party HW/SW decoders, it has to start with LAME. + + \param void + \return a pointer to the short version of the LAME version string. + */ +const char* +get_lame_tag_encoder_short_version(void) +{ + static /*@observer@ */ const char *const str = + /* FIXME: new scheme / new version counting / drop versioning here ? */ + "LAME" STR(LAME_MAJOR_VERSION) "." STR(LAME_MINOR_VERSION) P + ; + return str; +} + +/*! Get the version string for GPSYCHO. */ +/*! + \param void + \return a pointer to a string which describes the version of GPSYCHO. +*/ +const char * +get_psy_version(void) +{ +#if PSY_ALPHA_VERSION > 0 + static /*@observer@ */ const char *const str = + STR(PSY_MAJOR_VERSION) "." STR(PSY_MINOR_VERSION) + " (alpha " STR(PSY_ALPHA_VERSION) ", " __DATE__ " " __TIME__ ")"; +#elif PSY_BETA_VERSION > 0 + static /*@observer@ */ const char *const str = + STR(PSY_MAJOR_VERSION) "." STR(PSY_MINOR_VERSION) + " (beta " STR(PSY_BETA_VERSION) ", " __DATE__ ")"; +#else + static /*@observer@ */ const char *const str = + STR(PSY_MAJOR_VERSION) "." STR(PSY_MINOR_VERSION); +#endif + + return str; +} + + +/*! Get the URL for the LAME website. */ +/*! + \param void + \return a pointer to a string which is a URL for the LAME website. +*/ +const char * +get_lame_url(void) +{ + static /*@observer@ */ const char *const str = LAME_URL; + + return str; +} + + +/*! Get the numerical representation of the version. */ +/*! + Writes the numerical representation of the version of LAME and + GPSYCHO into lvp. + + \param lvp +*/ +void +get_lame_version_numerical(lame_version_t * lvp) +{ + static /*@observer@ */ const char *const features = ""; /* obsolete */ + + /* generic version */ + lvp->major = LAME_MAJOR_VERSION; + lvp->minor = LAME_MINOR_VERSION; +#if LAME_ALPHA_VERSION + lvp->alpha = LAME_PATCH_VERSION; + lvp->beta = 0; +#elif LAME_BETA_VERSION + lvp->alpha = 0; + lvp->beta = LAME_PATCH_VERSION; +#else + lvp->alpha = 0; + lvp->beta = 0; +#endif + + /* psy version */ + lvp->psy_major = PSY_MAJOR_VERSION; + lvp->psy_minor = PSY_MINOR_VERSION; + lvp->psy_alpha = PSY_ALPHA_VERSION; + lvp->psy_beta = PSY_BETA_VERSION; + + /* compile time features */ + /*@-mustfree@ */ + lvp->features = features; + /*@=mustfree@ */ +} + + +const char * +get_lame_os_bitness(void) +{ + static /*@observer@ */ const char *const strXX = ""; + static /*@observer@ */ const char *const str32 = "32bits"; + static /*@observer@ */ const char *const str64 = "64bits"; + + switch (sizeof(void *)) { + case 4: + return str32; + + case 8: + return str64; + + default: + return strXX; + } +} + +/* end of version.c */ diff --git a/libmp3lame/version.h b/libmp3lame/version.h new file mode 100644 index 0000000..f5fef50 --- /dev/null +++ b/libmp3lame/version.h @@ -0,0 +1,68 @@ +/* + * Version numbering for LAME. + * + * Copyright (c) 1999 A.L. Faber + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef LAME_VERSION_H +#define LAME_VERSION_H + + +/* + * To make a string from a token, use the # operator: + */ +#ifndef STR +# define __STR(x) #x +# define STR(x) __STR(x) +#endif + +# define LAME_URL "http://lame.sf.net" + + +# define LAME_MAJOR_VERSION 3 /* Major version number */ +# define LAME_MINOR_VERSION 100 /* Minor version number */ +# define LAME_TYPE_VERSION 2 /* 0:alpha 1:beta 2:release */ +# define LAME_PATCH_VERSION 0 /* Patch level */ +# define LAME_ALPHA_VERSION (LAME_TYPE_VERSION==0) +# define LAME_BETA_VERSION (LAME_TYPE_VERSION==1) +# define LAME_RELEASE_VERSION (LAME_TYPE_VERSION==2) + +# define PSY_MAJOR_VERSION 1 /* Major version number */ +# define PSY_MINOR_VERSION 0 /* Minor version number */ +# define PSY_ALPHA_VERSION 0 /* Set number if this is an alpha version, otherwise zero */ +# define PSY_BETA_VERSION 0 /* Set number if this is a beta version, otherwise zero */ + +#if LAME_ALPHA_VERSION +#define LAME_PATCH_LEVEL_STRING " alpha " STR(LAME_PATCH_VERSION) +#endif +#if LAME_BETA_VERSION +#define LAME_PATCH_LEVEL_STRING " beta " STR(LAME_PATCH_VERSION) +#endif +#if LAME_RELEASE_VERSION +#if LAME_PATCH_VERSION +#define LAME_PATCH_LEVEL_STRING " release " STR(LAME_PATCH_VERSION) +#else +#define LAME_PATCH_LEVEL_STRING "" +#endif +#endif + +# define LAME_VERSION_STRING STR(LAME_MAJOR_VERSION) "." STR(LAME_MINOR_VERSION) LAME_PATCH_LEVEL_STRING + +#endif /* LAME_VERSION_H */ + +/* End of version.h */ diff --git a/ltmain.sh b/ltmain.sh new file mode 100644 index 0000000..0f0a2da --- /dev/null +++ b/ltmain.sh @@ -0,0 +1,11147 @@ +#! /bin/sh +## DO NOT EDIT - This file generated from ./build-aux/ltmain.in +## by inline-source v2014-01-03.01 + +# libtool (GNU libtool) 2.4.6 +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996 + +# Copyright (C) 1996-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool 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 2 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool 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 this program. If not, see <http://www.gnu.org/licenses/>. + + +PROGRAM=libtool +PACKAGE=libtool +VERSION=2.4.6 +package_revision=2.4.6 + + +## ------ ## +## Usage. ## +## ------ ## + +# Run './libtool --help' for help with using this script from the +# command line. + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# After configure completes, it has a better idea of some of the +# shell tools we need than the defaults used by the functions shared +# with bootstrap, so set those here where they can still be over- +# ridden by the user, but otherwise take precedence. + +: ${AUTOCONF="autoconf"} +: ${AUTOMAKE="automake"} + + +## -------------------------- ## +## Source external libraries. ## +## -------------------------- ## + +# Much of our low-level functionality needs to be sourced from external +# libraries, which are installed to $pkgauxdir. + +# Set a version string for this script. +scriptversion=2015-01-20.17; # UTC + +# General shell script boiler plate, and helper functions. +# Written by Gary V. Vaughan, 2004 + +# Copyright (C) 2004-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# This program 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. + +# As a special exception to the GNU General Public License, if you distribute +# this file as part of a program or library that is built using GNU Libtool, +# you may include this file under the same distribution terms that you use +# for the rest of that program. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNES 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 this program. If not, see <http://www.gnu.org/licenses/>. + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# Evaluate this file near the top of your script to gain access to +# the functions and variables defined here: +# +# . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh +# +# If you need to override any of the default environment variable +# settings, do that before evaluating this file. + + +## -------------------- ## +## Shell normalisation. ## +## -------------------- ## + +# Some shells need a little help to be as Bourne compatible as possible. +# Before doing anything else, make sure all that help has been provided! + +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac +fi + +# NLS nuisances: We save the old values in case they are required later. +_G_user_locale= +_G_safe_locale= +for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test set = \"\${$_G_var+set}\"; then + save_$_G_var=\$$_G_var + $_G_var=C + export $_G_var + _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" + _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" + fi" +done + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Make sure IFS has a sensible default +sp=' ' +nl=' +' +IFS="$sp $nl" + +# There are apparently some retarded systems that use ';' as a PATH separator! +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + + +## ------------------------- ## +## Locate command utilities. ## +## ------------------------- ## + + +# func_executable_p FILE +# ---------------------- +# Check that FILE is an executable regular file. +func_executable_p () +{ + test -f "$1" && test -x "$1" +} + + +# func_path_progs PROGS_LIST CHECK_FUNC [PATH] +# -------------------------------------------- +# Search for either a program that responds to --version with output +# containing "GNU", or else returned by CHECK_FUNC otherwise, by +# trying all the directories in PATH with each of the elements of +# PROGS_LIST. +# +# CHECK_FUNC should accept the path to a candidate program, and +# set $func_check_prog_result if it truncates its output less than +# $_G_path_prog_max characters. +func_path_progs () +{ + _G_progs_list=$1 + _G_check_func=$2 + _G_PATH=${3-"$PATH"} + + _G_path_prog_max=0 + _G_path_prog_found=false + _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} + for _G_dir in $_G_PATH; do + IFS=$_G_save_IFS + test -z "$_G_dir" && _G_dir=. + for _G_prog_name in $_G_progs_list; do + for _exeext in '' .EXE; do + _G_path_prog=$_G_dir/$_G_prog_name$_exeext + func_executable_p "$_G_path_prog" || continue + case `"$_G_path_prog" --version 2>&1` in + *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; + *) $_G_check_func $_G_path_prog + func_path_progs_result=$func_check_prog_result + ;; + esac + $_G_path_prog_found && break 3 + done + done + done + IFS=$_G_save_IFS + test -z "$func_path_progs_result" && { + echo "no acceptable sed could be found in \$PATH" >&2 + exit 1 + } +} + + +# We want to be able to use the functions in this file before configure +# has figured out where the best binaries are kept, which means we have +# to search for them ourselves - except when the results are already set +# where we skip the searches. + +# Unless the user overrides by setting SED, search the path for either GNU +# sed, or the sed that truncates its output the least. +test -z "$SED" && { + _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for _G_i in 1 2 3 4 5 6 7; do + _G_sed_script=$_G_sed_script$nl$_G_sed_script + done + echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed + _G_sed_script= + + func_check_prog_sed () + { + _G_path_prog=$1 + + _G_count=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo '' >> conftest.nl + "$_G_path_prog" -f conftest.sed <conftest.nl >conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin + rm -f conftest.sed + SED=$func_path_progs_result +} + + +# Unless the user overrides by setting GREP, search the path for either GNU +# grep, or the grep that truncates its output the least. +test -z "$GREP" && { + func_check_prog_grep () + { + _G_path_prog=$1 + + _G_count=0 + _G_path_prog_max=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo 'GREP' >> conftest.nl + "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' <conftest.nl >conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin + GREP=$func_path_progs_result +} + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# All uppercase variable names are used for environment variables. These +# variables can be overridden by the user before calling a script that +# uses them if a suitable command of that name is not already available +# in the command search PATH. + +: ${CP="cp -f"} +: ${ECHO="printf %s\n"} +: ${EGREP="$GREP -E"} +: ${FGREP="$GREP -F"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} + + +## -------------------- ## +## Useful sed snippets. ## +## -------------------- ## + +sed_dirname='s|/[^/]*$||' +sed_basename='s|^.*/||' + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='s|\([`"$\\]\)|\\\1|g' + +# Same as above, but do not quote variable references. +sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' + +# Sed substitution that converts a w32 file name or path +# that contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-'\' parameter expansions in output of sed_double_quote_subst that +# were '\'-ed in input to the same. If an odd number of '\' preceded a +# '$' in input to sed_double_quote_subst, that '$' was protected from +# expansion. Since each input '\' is now two '\'s, look for any number +# of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. +_G_bs='\\' +_G_bs2='\\\\' +_G_bs4='\\\\\\\\' +_G_dollar='\$' +sed_double_backslash="\ + s/$_G_bs4/&\\ +/g + s/^$_G_bs2$_G_dollar/$_G_bs&/ + s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g + s/\n//g" + + +## ----------------- ## +## Global variables. ## +## ----------------- ## + +# Except for the global variables explicitly listed below, the following +# functions in the '^func_' namespace, and the '^require_' namespace +# variables initialised in the 'Resource management' section, sourcing +# this file will not pollute your global namespace with anything +# else. There's no portable way to scope variables in Bourne shell +# though, so actually running these functions will sometimes place +# results into a variable named after the function, and often use +# temporary variables in the '^_G_' namespace. If you are careful to +# avoid using those namespaces casually in your sourcing script, things +# should continue to work as you expect. And, of course, you can freely +# overwrite any of the functions or variables defined here before +# calling anything to customize them. + +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +# Allow overriding, eg assuming that you follow the convention of +# putting '$debug_cmd' at the start of all your functions, you can get +# bash to show function call trace with: +# +# debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name +debug_cmd=${debug_cmd-":"} +exit_cmd=: + +# By convention, finish your script with: +# +# exit $exit_status +# +# so that you can set exit_status to non-zero if you want to indicate +# something went wrong during execution without actually bailing out at +# the point of failure. +exit_status=$EXIT_SUCCESS + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath=$0 + +# The name of this program. +progname=`$ECHO "$progpath" |$SED "$sed_basename"` + +# Make sure we have an absolute progpath for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` + progdir=`cd "$progdir" && pwd` + progpath=$progdir/$progname + ;; + *) + _G_IFS=$IFS + IFS=${PATH_SEPARATOR-:} + for progdir in $PATH; do + IFS=$_G_IFS + test -x "$progdir/$progname" && break + done + IFS=$_G_IFS + test -n "$progdir" || progdir=`pwd` + progpath=$progdir/$progname + ;; +esac + + +## ----------------- ## +## Standard options. ## +## ----------------- ## + +# The following options affect the operation of the functions defined +# below, and should be set appropriately depending on run-time para- +# meters passed on the command line. + +opt_dry_run=false +opt_quiet=false +opt_verbose=false + +# Categories 'all' and 'none' are always available. Append any others +# you will pass as the first argument to func_warning from your own +# code. +warning_categories= + +# By default, display warnings according to 'opt_warning_types'. Set +# 'warning_func' to ':' to elide all warnings, or func_fatal_error to +# treat the next displayed warning as a fatal error. +warning_func=func_warn_and_continue + +# Set to 'all' to display all warnings, 'none' to suppress all +# warnings, or a space delimited list of some subset of +# 'warning_categories' to display only the listed warnings. +opt_warning_types=all + + +## -------------------- ## +## Resource management. ## +## -------------------- ## + +# This section contains definitions for functions that each ensure a +# particular resource (a file, or a non-empty configuration variable for +# example) is available, and if appropriate to extract default values +# from pertinent package files. Call them using their associated +# 'require_*' variable to ensure that they are executed, at most, once. +# +# It's entirely deliberate that calling these functions can set +# variables that don't obey the namespace limitations obeyed by the rest +# of this file, in order that that they be as useful as possible to +# callers. + + +# require_term_colors +# ------------------- +# Allow display of bold text on terminals that support it. +require_term_colors=func_require_term_colors +func_require_term_colors () +{ + $debug_cmd + + test -t 1 && { + # COLORTERM and USE_ANSI_COLORS environment variables take + # precedence, because most terminfo databases neglect to describe + # whether color sequences are supported. + test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} + + if test 1 = "$USE_ANSI_COLORS"; then + # Standard ANSI escape sequences + tc_reset='' + tc_bold=''; tc_standout='' + tc_red=''; tc_green='' + tc_blue=''; tc_cyan='' + else + # Otherwise trust the terminfo database after all. + test -n "`tput sgr0 2>/dev/null`" && { + tc_reset=`tput sgr0` + test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` + tc_standout=$tc_bold + test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` + test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` + test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` + test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` + test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` + } + fi + } + + require_term_colors=: +} + + +## ----------------- ## +## Function library. ## +## ----------------- ## + +# This section contains a variety of useful functions to call in your +# scripts. Take note of the portable wrappers for features provided by +# some modern shells, which will fall back to slower equivalents on +# less featureful shells. + + +# func_append VAR VALUE +# --------------------- +# Append VALUE onto the existing contents of VAR. + + # We should try to minimise forks, especially on Windows where they are + # unreasonably slow, so skip the feature probes when bash or zsh are + # being used: + if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then + : ${_G_HAVE_ARITH_OP="yes"} + : ${_G_HAVE_XSI_OPS="yes"} + # The += operator was introduced in bash 3.1 + case $BASH_VERSION in + [12].* | 3.0 | 3.0*) ;; + *) + : ${_G_HAVE_PLUSEQ_OP="yes"} + ;; + esac + fi + + # _G_HAVE_PLUSEQ_OP + # Can be empty, in which case the shell is probed, "yes" if += is + # useable or anything else if it does not work. + test -z "$_G_HAVE_PLUSEQ_OP" \ + && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ + && _G_HAVE_PLUSEQ_OP=yes + +if test yes = "$_G_HAVE_PLUSEQ_OP" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_append () + { + $debug_cmd + + eval "$1+=\$2" + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_append () + { + $debug_cmd + + eval "$1=\$$1\$2" + } +fi + + +# func_append_quoted VAR VALUE +# ---------------------------- +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +if test yes = "$_G_HAVE_PLUSEQ_OP"; then + eval 'func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1+=\\ \$func_quote_for_eval_result" + }' +else + func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1=\$$1\\ \$func_quote_for_eval_result" + } +fi + + +# func_append_uniq VAR VALUE +# -------------------------- +# Append unique VALUE onto the existing contents of VAR, assuming +# entries are delimited by the first character of VALUE. For example: +# +# func_append_uniq options " --another-option option-argument" +# +# will only append to $options if " --another-option option-argument " +# is not already present somewhere in $options already (note spaces at +# each end implied by leading space in second argument). +func_append_uniq () +{ + $debug_cmd + + eval _G_current_value='`$ECHO $'$1'`' + _G_delim=`expr "$2" : '\(.\)'` + + case $_G_delim$_G_current_value$_G_delim in + *"$2$_G_delim"*) ;; + *) func_append "$@" ;; + esac +} + + +# func_arith TERM... +# ------------------ +# Set func_arith_result to the result of evaluating TERMs. + test -z "$_G_HAVE_ARITH_OP" \ + && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ + && _G_HAVE_ARITH_OP=yes + +if test yes = "$_G_HAVE_ARITH_OP"; then + eval 'func_arith () + { + $debug_cmd + + func_arith_result=$(( $* )) + }' +else + func_arith () + { + $debug_cmd + + func_arith_result=`expr "$@"` + } +fi + + +# func_basename FILE +# ------------------ +# Set func_basename_result to FILE with everything up to and including +# the last / stripped. +if test yes = "$_G_HAVE_XSI_OPS"; then + # If this shell supports suffix pattern removal, then use it to avoid + # forking. Hide the definitions single quotes in case the shell chokes + # on unsupported syntax... + _b='func_basename_result=${1##*/}' + _d='case $1 in + */*) func_dirname_result=${1%/*}$2 ;; + * ) func_dirname_result=$3 ;; + esac' + +else + # ...otherwise fall back to using sed. + _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' + _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` + if test "X$func_dirname_result" = "X$1"; then + func_dirname_result=$3 + else + func_append func_dirname_result "$2" + fi' +fi + +eval 'func_basename () +{ + $debug_cmd + + '"$_b"' +}' + + +# func_dirname FILE APPEND NONDIR_REPLACEMENT +# ------------------------------------------- +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +eval 'func_dirname () +{ + $debug_cmd + + '"$_d"' +}' + + +# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT +# -------------------------------------------------------- +# Perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# For efficiency, we do not delegate to the functions above but instead +# duplicate the functionality here. +eval 'func_dirname_and_basename () +{ + $debug_cmd + + '"$_b"' + '"$_d"' +}' + + +# func_echo ARG... +# ---------------- +# Echo program name prefixed message. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_echo_all ARG... +# -------------------- +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + + +# func_echo_infix_1 INFIX ARG... +# ------------------------------ +# Echo program name, followed by INFIX on the first line, with any +# additional lines not showing INFIX. +func_echo_infix_1 () +{ + $debug_cmd + + $require_term_colors + + _G_infix=$1; shift + _G_indent=$_G_infix + _G_prefix="$progname: $_G_infix: " + _G_message=$* + + # Strip color escape sequences before counting printable length + for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" + do + test -n "$_G_tc" && { + _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` + _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` + } + done + _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes + + func_echo_infix_1_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_infix_1_IFS + $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 + _G_prefix=$_G_indent + done + IFS=$func_echo_infix_1_IFS +} + + +# func_error ARG... +# ----------------- +# Echo program name prefixed message to standard error. +func_error () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 +} + + +# func_fatal_error ARG... +# ----------------------- +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + $debug_cmd + + func_error "$*" + exit $EXIT_FAILURE +} + + +# func_grep EXPRESSION FILENAME +# ----------------------------- +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $debug_cmd + + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_len STRING +# --------------- +# Set func_len_result to the length of STRING. STRING may not +# start with a hyphen. + test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_len () + { + $debug_cmd + + func_len_result=${#1} + }' +else + func_len () + { + $debug_cmd + + func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` + } +fi + + +# func_mkdir_p DIRECTORY-PATH +# --------------------------- +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + $debug_cmd + + _G_directory_path=$1 + _G_dir_list= + + if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then + + # Protect directory names starting with '-' + case $_G_directory_path in + -*) _G_directory_path=./$_G_directory_path ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$_G_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + _G_dir_list=$_G_directory_path:$_G_dir_list + + # If the last portion added has no slash in it, the list is done + case $_G_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` + done + _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` + + func_mkdir_p_IFS=$IFS; IFS=: + for _G_dir in $_G_dir_list; do + IFS=$func_mkdir_p_IFS + # mkdir can fail with a 'File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$_G_dir" 2>/dev/null || : + done + IFS=$func_mkdir_p_IFS + + # Bail out if we (or some other process) failed to create a directory. + test -d "$_G_directory_path" || \ + func_fatal_error "Failed to create '$1'" + fi +} + + +# func_mktempdir [BASENAME] +# ------------------------- +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, BASENAME is the basename for that directory. +func_mktempdir () +{ + $debug_cmd + + _G_template=${TMPDIR-/tmp}/${1-$progname} + + if test : = "$opt_dry_run"; then + # Return a directory name, but don't create it in dry-run mode + _G_tmpdir=$_G_template-$$ + else + + # If mktemp works, use that first and foremost + _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` + + if test ! -d "$_G_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + _G_tmpdir=$_G_template-${RANDOM-0}$$ + + func_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$_G_tmpdir" + umask $func_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$_G_tmpdir" || \ + func_fatal_error "cannot create temporary directory '$_G_tmpdir'" + fi + + $ECHO "$_G_tmpdir" +} + + +# func_normal_abspath PATH +# ------------------------ +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +func_normal_abspath () +{ + $debug_cmd + + # These SED scripts presuppose an absolute path with a trailing slash. + _G_pathcar='s|^/\([^/]*\).*$|\1|' + _G_pathcdr='s|^/[^/]*||' + _G_removedotparts=':dotsl + s|/\./|/|g + t dotsl + s|/\.$|/|' + _G_collapseslashes='s|/\{1,\}|/|g' + _G_finalslash='s|/*$|/|' + + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` + while :; do + # Processed it all yet? + if test / = "$func_normal_abspath_tpath"; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result"; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + + +# func_notquiet ARG... +# -------------------- +# Echo program name prefixed message only when not in quiet mode. +func_notquiet () +{ + $debug_cmd + + $opt_quiet || func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + + +# func_relative_path SRCDIR DSTDIR +# -------------------------------- +# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. +func_relative_path () +{ + $debug_cmd + + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=$func_dirname_result + if test -z "$func_relative_path_tlibdir"; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test -n "$func_stripname_result"; then + func_append func_relative_path_result "/$func_stripname_result" + fi + + # Normalisation. If bindir is libdir, return '.' else relative path. + if test -n "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + fi + + test -n "$func_relative_path_result" || func_relative_path_result=. + + : +} + + +# func_quote_for_eval ARG... +# -------------------------- +# Aesthetically quote ARGs to be evaled later. +# This function returns two values: +# i) func_quote_for_eval_result +# double-quoted, suitable for a subsequent eval +# ii) func_quote_for_eval_unquoted_result +# has all characters that are still active within double +# quotes backslashified. +func_quote_for_eval () +{ + $debug_cmd + + func_quote_for_eval_unquoted_result= + func_quote_for_eval_result= + while test 0 -lt $#; do + case $1 in + *[\\\`\"\$]*) + _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;; + *) + _G_unquoted_arg=$1 ;; + esac + if test -n "$func_quote_for_eval_unquoted_result"; then + func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg" + else + func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg" + fi + + case $_G_unquoted_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and variable expansion + # for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_quoted_arg=\"$_G_unquoted_arg\" + ;; + *) + _G_quoted_arg=$_G_unquoted_arg + ;; + esac + + if test -n "$func_quote_for_eval_result"; then + func_append func_quote_for_eval_result " $_G_quoted_arg" + else + func_append func_quote_for_eval_result "$_G_quoted_arg" + fi + shift + done +} + + +# func_quote_for_expand ARG +# ------------------------- +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + $debug_cmd + + case $1 in + *[\\\`\"]*) + _G_arg=`$ECHO "$1" | $SED \ + -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;; + *) + _G_arg=$1 ;; + esac + + case $_G_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_arg=\"$_G_arg\" + ;; + esac + + func_quote_for_expand_result=$_G_arg +} + + +# func_stripname PREFIX SUFFIX NAME +# --------------------------------- +# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_stripname () + { + $debug_cmd + + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary variable first. + func_stripname_result=$3 + func_stripname_result=${func_stripname_result#"$1"} + func_stripname_result=${func_stripname_result%"$2"} + }' +else + func_stripname () + { + $debug_cmd + + case $2 in + .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; + *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; + esac + } +fi + + +# func_show_eval CMD [FAIL_EXP] +# ----------------------------- +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + func_quote_for_expand "$_G_cmd" + eval "func_notquiet $func_quote_for_expand_result" + + $opt_dry_run || { + eval "$_G_cmd" + _G_status=$? + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_show_eval_locale CMD [FAIL_EXP] +# ------------------------------------ +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + $opt_quiet || { + func_quote_for_expand "$_G_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + $opt_dry_run || { + eval "$_G_user_locale + $_G_cmd" + _G_status=$? + eval "$_G_safe_locale" + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_tr_sh +# ---------- +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + $debug_cmd + + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_verbose ARG... +# ------------------- +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $debug_cmd + + $opt_verbose && func_echo "$*" + + : +} + + +# func_warn_and_continue ARG... +# ----------------------------- +# Echo program name prefixed warning message to standard error. +func_warn_and_continue () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 +} + + +# func_warning CATEGORY ARG... +# ---------------------------- +# Echo program name prefixed warning message to standard error. Warning +# messages can be filtered according to CATEGORY, where this function +# elides messages where CATEGORY is not listed in the global variable +# 'opt_warning_types'. +func_warning () +{ + $debug_cmd + + # CATEGORY must be in the warning_categories list! + case " $warning_categories " in + *" $1 "*) ;; + *) func_internal_error "invalid warning category '$1'" ;; + esac + + _G_category=$1 + shift + + case " $opt_warning_types " in + *" $_G_category "*) $warning_func ${1+"$@"} ;; + esac +} + + +# func_sort_ver VER1 VER2 +# ----------------------- +# 'sort -V' is not generally available. +# Note this deviates from the version comparison in automake +# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a +# but this should suffice as we won't be specifying old +# version formats or redundant trailing .0 in bootstrap.conf. +# If we did want full compatibility then we should probably +# use m4_version_compare from autoconf. +func_sort_ver () +{ + $debug_cmd + + printf '%s\n%s\n' "$1" "$2" \ + | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n +} + +# func_lt_ver PREV CURR +# --------------------- +# Return true if PREV and CURR are in the correct order according to +# func_sort_ver, otherwise false. Use it like this: +# +# func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." +func_lt_ver () +{ + $debug_cmd + + test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: +#! /bin/sh + +# Set a version string for this script. +scriptversion=2014-01-07.03; # UTC + +# A portable, pluggable option parser for Bourne shell. +# Written by Gary V. Vaughan, 2010 + +# Copyright (C) 2010-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# This program 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. + +# This program 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 this program. If not, see <http://www.gnu.org/licenses/>. + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# This file is a library for parsing options in your shell scripts along +# with assorted other useful supporting features that you can make use +# of too. +# +# For the simplest scripts you might need only: +# +# #!/bin/sh +# . relative/path/to/funclib.sh +# . relative/path/to/options-parser +# scriptversion=1.0 +# func_options ${1+"$@"} +# eval set dummy "$func_options_result"; shift +# ...rest of your script... +# +# In order for the '--version' option to work, you will need to have a +# suitably formatted comment like the one at the top of this file +# starting with '# Written by ' and ending with '# warranty; '. +# +# For '-h' and '--help' to work, you will also need a one line +# description of your script's purpose in a comment directly above the +# '# Written by ' line, like the one at the top of this file. +# +# The default options also support '--debug', which will turn on shell +# execution tracing (see the comment above debug_cmd below for another +# use), and '--verbose' and the func_verbose function to allow your script +# to display verbose messages only when your user has specified +# '--verbose'. +# +# After sourcing this file, you can plug processing for additional +# options by amending the variables from the 'Configuration' section +# below, and following the instructions in the 'Option parsing' +# section further down. + +## -------------- ## +## Configuration. ## +## -------------- ## + +# You should override these variables in your script after sourcing this +# file so that they reflect the customisations you have added to the +# option parser. + +# The usage line for option parsing errors and the start of '-h' and +# '--help' output messages. You can embed shell variables for delayed +# expansion at the time the message is displayed, but you will need to +# quote other shell meta-characters carefully to prevent them being +# expanded when the contents are evaled. +usage='$progpath [OPTION]...' + +# Short help message in response to '-h' and '--help'. Add to this or +# override it after sourcing this library to reflect the full set of +# options your script accepts. +usage_message="\ + --debug enable verbose shell tracing + -W, --warnings=CATEGORY + report the warnings falling in CATEGORY [all] + -v, --verbose verbosely report processing + --version print version information and exit + -h, --help print short or long help message and exit +" + +# Additional text appended to 'usage_message' in response to '--help'. +long_help_message=" +Warning categories include: + 'all' show all warnings + 'none' turn off all the warnings + 'error' warnings are treated as fatal errors" + +# Help message printed before fatal option parsing errors. +fatal_help="Try '\$progname --help' for more information." + + + +## ------------------------- ## +## Hook function management. ## +## ------------------------- ## + +# This section contains functions for adding, removing, and running hooks +# to the main code. A hook is just a named list of of function, that can +# be run in order later on. + +# func_hookable FUNC_NAME +# ----------------------- +# Declare that FUNC_NAME will run hooks added with +# 'func_add_hook FUNC_NAME ...'. +func_hookable () +{ + $debug_cmd + + func_append hookable_fns " $1" +} + + +# func_add_hook FUNC_NAME HOOK_FUNC +# --------------------------------- +# Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must +# first have been declared "hookable" by a call to 'func_hookable'. +func_add_hook () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not accept hook functions." ;; + esac + + eval func_append ${1}_hooks '" $2"' +} + + +# func_remove_hook FUNC_NAME HOOK_FUNC +# ------------------------------------ +# Remove HOOK_FUNC from the list of functions called by FUNC_NAME. +func_remove_hook () +{ + $debug_cmd + + eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' +} + + +# func_run_hooks FUNC_NAME [ARG]... +# --------------------------------- +# Run all hook functions registered to FUNC_NAME. +# It is assumed that the list of hook functions contains nothing more +# than a whitespace-delimited list of legal shell function names, and +# no effort is wasted trying to catch shell meta-characters or preserve +# whitespace. +func_run_hooks () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not support hook funcions.n" ;; + esac + + eval _G_hook_fns=\$$1_hooks; shift + + for _G_hook in $_G_hook_fns; do + eval $_G_hook '"$@"' + + # store returned options list back into positional + # parameters for next 'cmd' execution. + eval _G_hook_result=\$${_G_hook}_result + eval set dummy "$_G_hook_result"; shift + done + + func_quote_for_eval ${1+"$@"} + func_run_hooks_result=$func_quote_for_eval_result +} + + + +## --------------- ## +## Option parsing. ## +## --------------- ## + +# In order to add your own option parsing hooks, you must accept the +# full positional parameter list in your hook function, remove any +# options that you action, and then pass back the remaining unprocessed +# options in '<hooked_function_name>_result', escaped suitably for +# 'eval'. Like this: +# +# my_options_prep () +# { +# $debug_cmd +# +# # Extend the existing usage message. +# usage_message=$usage_message' +# -s, --silent don'\''t print informational messages +# ' +# +# func_quote_for_eval ${1+"$@"} +# my_options_prep_result=$func_quote_for_eval_result +# } +# func_add_hook func_options_prep my_options_prep +# +# +# my_silent_option () +# { +# $debug_cmd +# +# # Note that for efficiency, we parse as many options as we can +# # recognise in a loop before passing the remainder back to the +# # caller on the first unrecognised argument we encounter. +# while test $# -gt 0; do +# opt=$1; shift +# case $opt in +# --silent|-s) opt_silent=: ;; +# # Separate non-argument short options: +# -s*) func_split_short_opt "$_G_opt" +# set dummy "$func_split_short_opt_name" \ +# "-$func_split_short_opt_arg" ${1+"$@"} +# shift +# ;; +# *) set dummy "$_G_opt" "$*"; shift; break ;; +# esac +# done +# +# func_quote_for_eval ${1+"$@"} +# my_silent_option_result=$func_quote_for_eval_result +# } +# func_add_hook func_parse_options my_silent_option +# +# +# my_option_validation () +# { +# $debug_cmd +# +# $opt_silent && $opt_verbose && func_fatal_help "\ +# '--silent' and '--verbose' options are mutually exclusive." +# +# func_quote_for_eval ${1+"$@"} +# my_option_validation_result=$func_quote_for_eval_result +# } +# func_add_hook func_validate_options my_option_validation +# +# You'll alse need to manually amend $usage_message to reflect the extra +# options you parse. It's preferable to append if you can, so that +# multiple option parsing hooks can be added safely. + + +# func_options [ARG]... +# --------------------- +# All the functions called inside func_options are hookable. See the +# individual implementations for details. +func_hookable func_options +func_options () +{ + $debug_cmd + + func_options_prep ${1+"$@"} + eval func_parse_options \ + ${func_options_prep_result+"$func_options_prep_result"} + eval func_validate_options \ + ${func_parse_options_result+"$func_parse_options_result"} + + eval func_run_hooks func_options \ + ${func_validate_options_result+"$func_validate_options_result"} + + # save modified positional parameters for caller + func_options_result=$func_run_hooks_result +} + + +# func_options_prep [ARG]... +# -------------------------- +# All initialisations required before starting the option parse loop. +# Note that when calling hook functions, we pass through the list of +# positional parameters. If a hook function modifies that list, and +# needs to propogate that back to rest of this script, then the complete +# modified list must be put in 'func_run_hooks_result' before +# returning. +func_hookable func_options_prep +func_options_prep () +{ + $debug_cmd + + # Option defaults: + opt_verbose=false + opt_warning_types= + + func_run_hooks func_options_prep ${1+"$@"} + + # save modified positional parameters for caller + func_options_prep_result=$func_run_hooks_result +} + + +# func_parse_options [ARG]... +# --------------------------- +# The main option parsing loop. +func_hookable func_parse_options +func_parse_options () +{ + $debug_cmd + + func_parse_options_result= + + # this just eases exit handling + while test $# -gt 0; do + # Defer to hook functions for initial option parsing, so they + # get priority in the event of reusing an option name. + func_run_hooks func_parse_options ${1+"$@"} + + # Adjust func_parse_options positional parameters to match + eval set dummy "$func_run_hooks_result"; shift + + # Break out of the loop if we already parsed every option. + test $# -gt 0 || break + + _G_opt=$1 + shift + case $_G_opt in + --debug|-x) debug_cmd='set -x' + func_echo "enabling shell trace mode" + $debug_cmd + ;; + + --no-warnings|--no-warning|--no-warn) + set dummy --warnings none ${1+"$@"} + shift + ;; + + --warnings|--warning|-W) + test $# = 0 && func_missing_arg $_G_opt && break + case " $warning_categories $1" in + *" $1 "*) + # trailing space prevents matching last $1 above + func_append_uniq opt_warning_types " $1" + ;; + *all) + opt_warning_types=$warning_categories + ;; + *none) + opt_warning_types=none + warning_func=: + ;; + *error) + opt_warning_types=$warning_categories + warning_func=func_fatal_error + ;; + *) + func_fatal_error \ + "unsupported warning category: '$1'" + ;; + esac + shift + ;; + + --verbose|-v) opt_verbose=: ;; + --version) func_version ;; + -\?|-h) func_usage ;; + --help) func_help ;; + + # Separate optargs to long options (plugins may need this): + --*=*) func_split_equals "$_G_opt" + set dummy "$func_split_equals_lhs" \ + "$func_split_equals_rhs" ${1+"$@"} + shift + ;; + + # Separate optargs to short options: + -W*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-v*|-x*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) break ;; + -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; + *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + esac + done + + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + func_parse_options_result=$func_quote_for_eval_result +} + + +# func_validate_options [ARG]... +# ------------------------------ +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +func_hookable func_validate_options +func_validate_options () +{ + $debug_cmd + + # Display all warnings if -W was not given. + test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" + + func_run_hooks func_validate_options ${1+"$@"} + + # Bail if the options were screwed! + $exit_cmd $EXIT_FAILURE + + # save modified positional parameters for caller + func_validate_options_result=$func_run_hooks_result +} + + + +## ----------------- ## +## Helper functions. ## +## ----------------- ## + +# This section contains the helper functions used by the rest of the +# hookable option parser framework in ascii-betical order. + + +# func_fatal_help ARG... +# ---------------------- +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + eval \$ECHO \""$fatal_help"\" + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + + +# func_help +# --------- +# Echo long help message to standard output and exit. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message" + exit 0 +} + + +# func_missing_arg ARGNAME +# ------------------------ +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $debug_cmd + + func_error "Missing argument for '$1'." + exit_cmd=exit +} + + +# func_split_equals STRING +# ------------------------ +# Set func_split_equals_lhs and func_split_equals_rhs shell variables after +# splitting STRING at the '=' sign. +test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=${1%%=*} + func_split_equals_rhs=${1#*=} + test "x$func_split_equals_lhs" = "x$1" \ + && func_split_equals_rhs= + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` + func_split_equals_rhs= + test "x$func_split_equals_lhs" = "x$1" \ + || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` + } +fi #func_split_equals + + +# func_split_short_opt SHORTOPT +# ----------------------------- +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"} + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'` + func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` + } +fi #func_split_short_opt + + +# func_usage +# ---------- +# Echo short help message to standard output and exit. +func_usage () +{ + $debug_cmd + + func_usage_message + $ECHO "Run '$progname --help |${PAGER-more}' for full usage" + exit 0 +} + + +# func_usage_message +# ------------------ +# Echo short help message to standard output. +func_usage_message () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + echo + $SED -n 's|^# || + /^Written by/{ + x;p;x + } + h + /^Written by/q' < "$progpath" + echo + eval \$ECHO \""$usage_message"\" +} + + +# func_version +# ------------ +# Echo version message to standard output and exit. +func_version () +{ + $debug_cmd + + printf '%s\n' "$progname $scriptversion" + $SED -n ' + /(C)/!b go + :more + /\./!{ + N + s|\n# | | + b more + } + :go + /^# Written by /,/# warranty; / { + s|^# || + s|^# *$|| + s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| + p + } + /^# Written by / { + s|^# || + p + } + /^warranty; /q' < "$progpath" + + exit $? +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: + +# Set a version string. +scriptversion='(GNU libtool) 2.4.6' + + +# func_echo ARG... +# ---------------- +# Libtool also displays the current mode in messages, so override +# funclib.sh func_echo with this custom definition. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_warning ARG... +# ------------------- +# Libtool warnings are not categorized, so override funclib.sh +# func_warning with this simpler definition. +func_warning () +{ + $debug_cmd + + $warning_func ${1+"$@"} +} + + +## ---------------- ## +## Options parsing. ## +## ---------------- ## + +# Hook in the functions to make sure our own options are parsed during +# the option parsing loop. + +usage='$progpath [OPTION]... [MODE-ARG]...' + +# Short help message in response to '-h'. +usage_message="Options: + --config show all configuration variables + --debug enable verbose shell tracing + -n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --mode=MODE use operation mode MODE + --no-warnings equivalent to '-Wnone' + --preserve-dup-deps don't remove duplicate dependency libraries + --quiet, --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + -v, --verbose print more informational messages than default + --version print version information + -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] + -h, --help, --help-all print short, long, or detailed help message +" + +# Additional text appended to 'usage_message' in response to '--help'. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message + +MODE must be one of the following: + + clean remove files from the build directory + compile compile a source file into a libtool object + execute automatically set library path, then run a program + finish complete the installation of libtool libraries + install install libraries or executables + link create a library or an executable + uninstall remove libraries from an installed directory + +MODE-ARGS vary depending on the MODE. When passed as first option, +'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. +Try '$progname --help --mode=MODE' for a more detailed description of MODE. + +When reporting a bug, please describe a test case to reproduce it and +include the following information: + + host-triplet: $host + shell: $SHELL + compiler: $LTCC + compiler flags: $LTCFLAGS + linker: $LD (gnu? $with_gnu_ld) + version: $progname (GNU libtool) 2.4.6 + automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` + autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` + +Report bugs to <bug-libtool@gnu.org>. +GNU libtool home page: <http://www.gnu.org/software/libtool/>. +General help using GNU software: <http://www.gnu.org/gethelp/>." + exit 0 +} + + +# func_lo2o OBJECT-NAME +# --------------------- +# Transform OBJECT-NAME from a '.lo' suffix to the platform specific +# object suffix. + +lo2o=s/\\.lo\$/.$objext/ +o2lo=s/\\.$objext\$/.lo/ + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_lo2o () + { + case $1 in + *.lo) func_lo2o_result=${1%.lo}.$objext ;; + * ) func_lo2o_result=$1 ;; + esac + }' + + # func_xform LIBOBJ-OR-SOURCE + # --------------------------- + # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) + # suffix to a '.lo' libtool-object suffix. + eval 'func_xform () + { + func_xform_result=${1%.*}.lo + }' +else + # ...otherwise fall back to using sed. + func_lo2o () + { + func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` + } + + func_xform () + { + func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` + } +fi + + +# func_fatal_configuration ARG... +# ------------------------------- +# Echo program name prefixed message to standard error, followed by +# a configuration failure hint, and exit. +func_fatal_configuration () +{ + func__fatal_error ${1+"$@"} \ + "See the $PACKAGE documentation for more information." \ + "Fatal configuration error." +} + + +# func_config +# ----------- +# Display the configuration for all the tags in this script. +func_config () +{ + re_begincf='^# ### BEGIN LIBTOOL' + re_endcf='^# ### END LIBTOOL' + + # Default configuration. + $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" + + # Now print the configurations for the tags. + for tagname in $taglist; do + $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" + done + + exit $? +} + + +# func_features +# ------------- +# Display the features supported by this script. +func_features () +{ + echo "host: $host" + if test yes = "$build_libtool_libs"; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test yes = "$build_old_libs"; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + + exit $? +} + + +# func_enable_tag TAGNAME +# ----------------------- +# Verify that TAGNAME is valid, and either flag an error and exit, or +# enable the TAGNAME tag. We also add TAGNAME to the global $taglist +# variable here. +func_enable_tag () +{ + # Global variable: + tagname=$1 + + re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" + re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" + sed_extractcf=/$re_begincf/,/$re_endcf/p + + # Validate tagname. + case $tagname in + *[!-_A-Za-z0-9,/]*) + func_fatal_error "invalid tag name: $tagname" + ;; + esac + + # Don't test for the "default" C tag, as we know it's + # there but not specially marked. + case $tagname in + CC) ;; + *) + if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + + +# func_check_version_match +# ------------------------ +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +# libtool_options_prep [ARG]... +# ----------------------------- +# Preparation for options parsed by libtool. +libtool_options_prep () +{ + $debug_mode + + # Option defaults: + opt_config=false + opt_dlopen= + opt_dry_run=false + opt_help=false + opt_mode= + opt_preserve_dup_deps=false + opt_quiet=false + + nonopt= + preserve_args= + + # Shorthand for --mode=foo, only valid as the first argument + case $1 in + clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; + compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; + execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; + finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; + install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; + link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; + uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; + esac + + # Pass back the list of options. + func_quote_for_eval ${1+"$@"} + libtool_options_prep_result=$func_quote_for_eval_result +} +func_add_hook func_options_prep libtool_options_prep + + +# libtool_parse_options [ARG]... +# --------------------------------- +# Provide handling for libtool specific options. +libtool_parse_options () +{ + $debug_cmd + + # Perform our own loop to consume as many options as possible in + # each iteration. + while test $# -gt 0; do + _G_opt=$1 + shift + case $_G_opt in + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + + --config) func_config ;; + + --dlopen|-dlopen) + opt_dlopen="${opt_dlopen+$opt_dlopen +}$1" + shift + ;; + + --preserve-dup-deps) + opt_preserve_dup_deps=: ;; + + --features) func_features ;; + + --finish) set dummy --mode finish ${1+"$@"}; shift ;; + + --help) opt_help=: ;; + + --help-all) opt_help=': help-all' ;; + + --mode) test $# = 0 && func_missing_arg $_G_opt && break + opt_mode=$1 + case $1 in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $_G_opt" + exit_cmd=exit + break + ;; + esac + shift + ;; + + --no-silent|--no-quiet) + opt_quiet=false + func_append preserve_args " $_G_opt" + ;; + + --no-warnings|--no-warning|--no-warn) + opt_warning=false + func_append preserve_args " $_G_opt" + ;; + + --no-verbose) + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --silent|--quiet) + opt_quiet=: + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --tag) test $# = 0 && func_missing_arg $_G_opt && break + opt_tag=$1 + func_append preserve_args " $_G_opt $1" + func_enable_tag "$1" + shift + ;; + + --verbose|-v) opt_quiet=false + opt_verbose=: + func_append preserve_args " $_G_opt" + ;; + + # An option not handled by this hook function: + *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + esac + done + + + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + libtool_parse_options_result=$func_quote_for_eval_result +} +func_add_hook func_parse_options libtool_parse_options + + + +# libtool_validate_options [ARG]... +# --------------------------------- +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +libtool_validate_options () +{ + # save first non-option argument + if test 0 -lt $#; then + nonopt=$1 + shift + fi + + # preserve --debug + test : = "$debug_cmd" || func_append preserve_args " --debug" + + case $host in + # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 + # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 + *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps + ;; + esac + + $opt_help || { + # Sanity checks first: + func_check_version_match + + test yes != "$build_libtool_libs" \ + && test yes != "$build_old_libs" \ + && func_fatal_configuration "not configured to build any kind of library" + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test execute != "$opt_mode"; then + func_error "unrecognized option '-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help=$help + help="Try '$progname --help --mode=$opt_mode' for more information." + } + + # Pass back the unparsed argument list + func_quote_for_eval ${1+"$@"} + libtool_validate_options_result=$func_quote_for_eval_result +} +func_add_hook func_validate_options libtool_validate_options + + +# Process options as early as possible so that --help and --version +# can return quickly. +func_options ${1+"$@"} +eval set dummy "$func_options_result"; shift + + + +## ----------- ## +## Main. ## +## ----------- ## + +magic='%%%MAGIC variable%%%' +magic_exe='%%%MAGIC EXE variable%%%' + +# Global variables. +extracted_archives= +extracted_serial=0 + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# func_generated_by_libtool +# True iff stdin has been generated by Libtool. This function is only +# a basic sanity check; it will hardly flush out determined imposters. +func_generated_by_libtool_p () +{ + $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if 'file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case $lalib_p_line in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test yes = "$lalib_p" +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + test -f "$1" && + $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $debug_cmd + + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# 'FILE.' does not work on cygwin managed mounts. +func_source () +{ + $debug_cmd + + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_resolve_sysroot PATH +# Replace a leading = in PATH with a sysroot. Store the result into +# func_resolve_sysroot_result +func_resolve_sysroot () +{ + func_resolve_sysroot_result=$1 + case $func_resolve_sysroot_result in + =*) + func_stripname '=' '' "$func_resolve_sysroot_result" + func_resolve_sysroot_result=$lt_sysroot$func_stripname_result + ;; + esac +} + +# func_replace_sysroot PATH +# If PATH begins with the sysroot, replace it with = and +# store the result into func_replace_sysroot_result. +func_replace_sysroot () +{ + case $lt_sysroot:$1 in + ?*:"$lt_sysroot"*) + func_stripname "$lt_sysroot" '' "$1" + func_replace_sysroot_result='='$func_stripname_result + ;; + *) + # Including no sysroot. + func_replace_sysroot_result=$1 + ;; + esac +} + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $debug_cmd + + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case "$@ " in + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with '--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=$1 + if test yes = "$build_libtool_libs"; then + write_lobj=\'$2\' + else + write_lobj=none + fi + + if test yes = "$build_old_libs"; then + write_oldobj=\'$3\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T <<EOF +# $write_libobj - a libtool object file +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object=$write_lobj + +# Name of the non-PIC object +non_pic_object=$write_oldobj + +EOF + $MV "${write_libobj}T" "$write_libobj" + } +} + + +################################################## +# FILE NAME AND PATH CONVERSION HELPER FUNCTIONS # +################################################## + +# func_convert_core_file_wine_to_w32 ARG +# Helper function used by file name conversion functions when $build is *nix, +# and $host is mingw, cygwin, or some other w32 environment. Relies on a +# correctly configured wine environment available, with the winepath program +# in $build's $PATH. +# +# ARG is the $build file name to be converted to w32 format. +# Result is available in $func_convert_core_file_wine_to_w32_result, and will +# be empty on error (or when ARG is empty) +func_convert_core_file_wine_to_w32 () +{ + $debug_cmd + + func_convert_core_file_wine_to_w32_result=$1 + if test -n "$1"; then + # Unfortunately, winepath does not exit with a non-zero error code, so we + # are forced to check the contents of stdout. On the other hand, if the + # command is not found, the shell will set an exit code of 127 and print + # *an error message* to stdout. So we must check for both error code of + # zero AND non-empty stdout, which explains the odd construction: + func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null` + if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then + func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | + $SED -e "$sed_naive_backslashify"` + else + func_convert_core_file_wine_to_w32_result= + fi + fi +} +# end: func_convert_core_file_wine_to_w32 + + +# func_convert_core_path_wine_to_w32 ARG +# Helper function used by path conversion functions when $build is *nix, and +# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly +# configured wine environment available, with the winepath program in $build's +# $PATH. Assumes ARG has no leading or trailing path separator characters. +# +# ARG is path to be converted from $build format to win32. +# Result is available in $func_convert_core_path_wine_to_w32_result. +# Unconvertible file (directory) names in ARG are skipped; if no directory names +# are convertible, then the result may be empty. +func_convert_core_path_wine_to_w32 () +{ + $debug_cmd + + # unfortunately, winepath doesn't convert paths, only file names + func_convert_core_path_wine_to_w32_result= + if test -n "$1"; then + oldIFS=$IFS + IFS=: + for func_convert_core_path_wine_to_w32_f in $1; do + IFS=$oldIFS + func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" + if test -n "$func_convert_core_file_wine_to_w32_result"; then + if test -z "$func_convert_core_path_wine_to_w32_result"; then + func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result + else + func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" + fi + fi + done + IFS=$oldIFS + fi +} +# end: func_convert_core_path_wine_to_w32 + + +# func_cygpath ARGS... +# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when +# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) +# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or +# (2), returns the Cygwin file name or path in func_cygpath_result (input +# file name or path is assumed to be in w32 format, as previously converted +# from $build's *nix or MSYS format). In case (3), returns the w32 file name +# or path in func_cygpath_result (input file name or path is assumed to be in +# Cygwin format). Returns an empty string on error. +# +# ARGS are passed to cygpath, with the last one being the file name or path to +# be converted. +# +# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH +# environment variable; do not put it in $PATH. +func_cygpath () +{ + $debug_cmd + + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then + func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` + if test "$?" -ne 0; then + # on failure, ensure result is empty + func_cygpath_result= + fi + else + func_cygpath_result= + func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" + fi +} +#end: func_cygpath + + +# func_convert_core_msys_to_w32 ARG +# Convert file name or path ARG from MSYS format to w32 format. Return +# result in func_convert_core_msys_to_w32_result. +func_convert_core_msys_to_w32 () +{ + $debug_cmd + + # awkward: cmd appends spaces to result + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` +} +#end: func_convert_core_msys_to_w32 + + +# func_convert_file_check ARG1 ARG2 +# Verify that ARG1 (a file name in $build format) was converted to $host +# format in ARG2. Otherwise, emit an error message, but continue (resetting +# func_to_host_file_result to ARG1). +func_convert_file_check () +{ + $debug_cmd + + if test -z "$2" && test -n "$1"; then + func_error "Could not determine host file name corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_file_result=$1 + fi +} +# end func_convert_file_check + + +# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH +# Verify that FROM_PATH (a path in $build format) was converted to $host +# format in TO_PATH. Otherwise, emit an error message, but continue, resetting +# func_to_host_file_result to a simplistic fallback value (see below). +func_convert_path_check () +{ + $debug_cmd + + if test -z "$4" && test -n "$3"; then + func_error "Could not determine the host path corresponding to" + func_error " '$3'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This is a deliberately simplistic "conversion" and + # should not be "improved". See libtool.info. + if test "x$1" != "x$2"; then + lt_replace_pathsep_chars="s|$1|$2|g" + func_to_host_path_result=`echo "$3" | + $SED -e "$lt_replace_pathsep_chars"` + else + func_to_host_path_result=$3 + fi + fi +} +# end func_convert_path_check + + +# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG +# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT +# and appending REPL if ORIG matches BACKPAT. +func_convert_path_front_back_pathsep () +{ + $debug_cmd + + case $4 in + $1 ) func_to_host_path_result=$3$func_to_host_path_result + ;; + esac + case $4 in + $2 ) func_append func_to_host_path_result "$3" + ;; + esac +} +# end func_convert_path_front_back_pathsep + + +################################################## +# $build to $host FILE NAME CONVERSION FUNCTIONS # +################################################## +# invoked via '$to_host_file_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# Result will be available in $func_to_host_file_result. + + +# func_to_host_file ARG +# Converts the file name ARG from $build format to $host format. Return result +# in func_to_host_file_result. +func_to_host_file () +{ + $debug_cmd + + $to_host_file_cmd "$1" +} +# end func_to_host_file + + +# func_to_tool_file ARG LAZY +# converts the file name ARG from $build format to toolchain format. Return +# result in func_to_tool_file_result. If the conversion in use is listed +# in (the comma separated) LAZY, no conversion takes place. +func_to_tool_file () +{ + $debug_cmd + + case ,$2, in + *,"$to_tool_file_cmd",*) + func_to_tool_file_result=$1 + ;; + *) + $to_tool_file_cmd "$1" + func_to_tool_file_result=$func_to_host_file_result + ;; + esac +} +# end func_to_tool_file + + +# func_convert_file_noop ARG +# Copy ARG to func_to_host_file_result. +func_convert_file_noop () +{ + func_to_host_file_result=$1 +} +# end func_convert_file_noop + + +# func_convert_file_msys_to_w32 ARG +# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_file_result. +func_convert_file_msys_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_to_host_file_result=$func_convert_core_msys_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_w32 + + +# func_convert_file_cygwin_to_w32 ARG +# Convert file name ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_file_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # because $build is cygwin, we call "the" cygpath in $PATH; no need to use + # LT_CYGPATH in this case. + func_to_host_file_result=`cygpath -m "$1"` + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_cygwin_to_w32 + + +# func_convert_file_nix_to_w32 ARG +# Convert file name ARG from *nix to w32 format. Requires a wine environment +# and a working winepath. Returns result in func_to_host_file_result. +func_convert_file_nix_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_file_wine_to_w32 "$1" + func_to_host_file_result=$func_convert_core_file_wine_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_w32 + + +# func_convert_file_msys_to_cygwin ARG +# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_file_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_cygpath -u "$func_convert_core_msys_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_cygwin + + +# func_convert_file_nix_to_cygwin ARG +# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed +# in a wine environment, working winepath, and LT_CYGPATH set. Returns result +# in func_to_host_file_result. +func_convert_file_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. + func_convert_core_file_wine_to_w32 "$1" + func_cygpath -u "$func_convert_core_file_wine_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_cygwin + + +############################################# +# $build to $host PATH CONVERSION FUNCTIONS # +############################################# +# invoked via '$to_host_path_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# The result will be available in $func_to_host_path_result. +# +# Path separators are also converted from $build format to $host format. If +# ARG begins or ends with a path separator character, it is preserved (but +# converted to $host format) on output. +# +# All path conversion functions are named using the following convention: +# file name conversion function : func_convert_file_X_to_Y () +# path conversion function : func_convert_path_X_to_Y () +# where, for any given $build/$host combination the 'X_to_Y' value is the +# same. If conversion functions are added for new $build/$host combinations, +# the two new functions must follow this pattern, or func_init_to_host_path_cmd +# will break. + + +# func_init_to_host_path_cmd +# Ensures that function "pointer" variable $to_host_path_cmd is set to the +# appropriate value, based on the value of $to_host_file_cmd. +to_host_path_cmd= +func_init_to_host_path_cmd () +{ + $debug_cmd + + if test -z "$to_host_path_cmd"; then + func_stripname 'func_convert_file_' '' "$to_host_file_cmd" + to_host_path_cmd=func_convert_path_$func_stripname_result + fi +} + + +# func_to_host_path ARG +# Converts the path ARG from $build format to $host format. Return result +# in func_to_host_path_result. +func_to_host_path () +{ + $debug_cmd + + func_init_to_host_path_cmd + $to_host_path_cmd "$1" +} +# end func_to_host_path + + +# func_convert_path_noop ARG +# Copy ARG to func_to_host_path_result. +func_convert_path_noop () +{ + func_to_host_path_result=$1 +} +# end func_convert_path_noop + + +# func_convert_path_msys_to_w32 ARG +# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_path_result. +func_convert_path_msys_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from ARG. MSYS + # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; + # and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_msys_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_msys_to_w32 + + +# func_convert_path_cygwin_to_w32 ARG +# Convert path ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_path_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_cygwin_to_w32 + + +# func_convert_path_nix_to_w32 ARG +# Convert path ARG from *nix to w32 format. Requires a wine environment and +# a working winepath. Returns result in func_to_host_file_result. +func_convert_path_nix_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_path_wine_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_nix_to_w32 + + +# func_convert_path_msys_to_cygwin ARG +# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_path_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_msys_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_msys_to_cygwin + + +# func_convert_path_nix_to_cygwin ARG +# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a +# a wine environment, working winepath, and LT_CYGPATH set. Returns result in +# func_to_host_file_result. +func_convert_path_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_nix_to_cygwin + + +# func_dll_def_p FILE +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with _LT_DLL_DEF_P in libtool.m4 +func_dll_def_p () +{ + $debug_cmd + + func_dll_def_p_tmp=`$SED -n \ + -e 's/^[ ]*//' \ + -e '/^\(;.*\)*$/d' \ + -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ + -e q \ + "$1"` + test DEF = "$func_dll_def_p_tmp" +} + + +# func_mode_compile arg... +func_mode_compile () +{ + $debug_cmd + + # Get the compilation command and the source file. + base_compile= + srcfile=$nonopt # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + pie_flag= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg=$arg + arg_mode=normal + ;; + + target ) + libobj=$arg + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + test -n "$libobj" && \ + func_fatal_error "you cannot specify '-o' more than once" + arg_mode=target + continue + ;; + + -pie | -fpie | -fPIE) + func_append pie_flag " $arg" + continue + ;; + + -shared | -static | -prefer-pic | -prefer-non-pic) + func_append later " $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + lastarg= + save_ifs=$IFS; IFS=, + for arg in $args; do + IFS=$save_ifs + func_append_quoted lastarg "$arg" + done + IFS=$save_ifs + func_stripname ' ' '' "$lastarg" + lastarg=$func_stripname_result + + # Add the arguments to base_compile. + func_append base_compile " $lastarg" + continue + ;; + + *) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg=$srcfile + srcfile=$arg + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + func_append_quoted base_compile "$lastarg" + done # for arg + + case $arg_mode in + arg) + func_fatal_error "you must specify an argument for -Xcompile" + ;; + target) + func_fatal_error "you must specify a target with '-o'" + ;; + *) + # Get the name of the library object. + test -z "$libobj" && { + func_basename "$srcfile" + libobj=$func_basename_result + } + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + case $libobj in + *.[cCFSifmso] | \ + *.ada | *.adb | *.ads | *.asm | \ + *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ + *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) + func_xform "$libobj" + libobj=$func_xform_result + ;; + esac + + case $libobj in + *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; + *) + func_fatal_error "cannot determine name of library object from '$libobj'" + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -shared) + test yes = "$build_libtool_libs" \ + || func_fatal_configuration "cannot build a shared library" + build_old_libs=no + continue + ;; + + -static) + build_libtool_libs=no + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + func_quote_for_eval "$libobj" + test "X$libobj" != "X$func_quote_for_eval_result" \ + && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && func_warning "libobj name '$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname=$func_basename_result + xdir=$func_dirname_result + lobj=$xdir$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test yes = "$build_old_libs"; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test no = "$compiler_c_o"; then + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext + lockfile=$output_obj.lock + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test yes = "$need_locks"; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test warn = "$need_locks"; then + if test -f "$lockfile"; then + $ECHO "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + func_append removelist " $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + func_append removelist " $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 + srcfile=$func_to_tool_file_result + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test yes = "$build_libtool_libs"; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test no != "$pic_mode"; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + func_append command " -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test yes = "$suppress_opt"; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test yes = "$build_old_libs"; then + if test yes != "$pic_mode"; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test yes = "$compiler_c_o"; then + func_append command " -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + func_append command "$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test no != "$need_locks"; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { + test compile = "$opt_mode" && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $opt_mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to build PIC objects only + -prefer-non-pic try to build non-PIC objects only + -shared do not build a '.o' file suitable for static linking + -static only build a '.o' file suitable for static linking + -Wc,FLAG pass FLAG directly to the compiler + +COMPILE-COMMAND is a command to be used in creating a 'standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix '.c' with the +library object suffix, '.lo'." + ;; + + execute) + $ECHO \ +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to '-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $ECHO \ +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the '--dry-run' option if you just want to see what would be executed." + ;; + + install) + $ECHO \ +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the 'install' or 'cp' program. + +The following components of INSTALL-COMMAND are treated specially: + + -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -bindir BINDIR specify path to binaries directory (for systems where + libraries must be found in the PATH setting at runtime) + -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE use a list of object files found in FILE to specify objects + -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + -Wc,FLAG + -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wl,FLAG + -Xlinker FLAG pass linker-specific FLAG directly to the linker + -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) + +All other options (arguments beginning with '-') are ignored. + +Every other argument is treated as a filename. Files ending in '.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in '.la', then a libtool library is created, +only library objects ('.lo' files) may be specified, and '-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created +using 'ar' and 'ranlib', or on Windows using 'lib'. + +If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file +is created, otherwise an executable program is created." + ;; + + uninstall) + $ECHO \ +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + + *) + func_fatal_help "invalid operation mode '$opt_mode'" + ;; + esac + + echo + $ECHO "Try '$progname --help' for more information about other modes." +} + +# Now that we've collected a possible --mode arg, show help if necessary +if $opt_help; then + if test : = "$opt_help"; then + func_mode_help + else + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + func_mode_help + done + } | $SED -n '1p; 2,$s/^Usage:/ or: /p' + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + echo + func_mode_help + done + } | + $SED '1d + /^When reporting/,/^Report/{ + H + d + } + $x + /information about other modes/d + /more detailed .*MODE/d + s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' + fi + exit $? +fi + + +# func_mode_execute arg... +func_mode_execute () +{ + $debug_cmd + + # The first argument is the command name. + cmd=$nonopt + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $opt_dlopen; do + test -f "$file" \ + || func_fatal_help "'$file' is not a file" + + dir= + case $file in + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "'$file' was not linked with '-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir=$func_dirname_result + + if test -f "$dir/$objdir/$dlname"; then + func_append dir "/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir=$func_dirname_result + ;; + + *) + func_warning "'-dlopen' is ignored for non-libtool libraries and objects" + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir=$absdir + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic=$magic + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -* | *.la | *.lo ) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file=$progdir/$program + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file=$progdir/$program + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_append_quoted args "$file" + done + + if $opt_dry_run; then + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + echo "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + else + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd=\$cmd$args + fi +} + +test execute = "$opt_mode" && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $debug_cmd + + libs= + libdirs= + admincmds= + + for opt in "$nonopt" ${1+"$@"} + do + if test -d "$opt"; then + func_append libdirs " $opt" + + elif test -f "$opt"; then + if func_lalib_unsafe_p "$opt"; then + func_append libs " $opt" + else + func_warning "'$opt' is not a valid libtool archive" + fi + + else + func_fatal_error "invalid argument '$opt'" + fi + done + + if test -n "$libs"; then + if test -n "$lt_sysroot"; then + sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` + sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" + else + sysroot_cmd= + fi + + # Remove sysroot references + if $opt_dry_run; then + for lib in $libs; do + echo "removing references to $lt_sysroot and '=' prefixes from $lib" + done + else + tmpdir=`func_mktempdir` + for lib in $libs; do + $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ + > $tmpdir/tmp-la + mv -f $tmpdir/tmp-la $lib + done + ${RM}r "$tmpdir" + fi + fi + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || func_append admincmds " + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_quiet && exit $EXIT_SUCCESS + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use the '-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the '$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the '$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the '$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'" + fi + echo + + echo "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" + echo "pages." + ;; + *) + echo "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + echo "----------------------------------------------------------------------" + fi + exit $EXIT_SUCCESS +} + +test finish = "$opt_mode" && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $debug_cmd + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || + # Allow the use of GNU shtool's install command. + case $nonopt in *shtool*) :;; *) false;; esac + then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" + func_append install_prog "$func_quote_for_eval_result" + install_shared_prog=$install_prog + case " $install_prog " in + *[\\\ /]cp\ *) install_cp=: ;; + *) install_cp=false ;; + esac + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=false + stripme= + no_mode=: + for arg + do + arg2= + if test -n "$dest"; then + func_append files " $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=: ;; + -f) + if $install_cp; then :; else + prev=$arg + fi + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + if test X-m = "X$prev" && test -n "$install_override_mode"; then + arg2=$install_override_mode + no_mode=false + fi + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + func_append install_prog " $func_quote_for_eval_result" + if test -n "$arg2"; then + func_quote_for_eval "$arg2" + fi + func_append install_shared_prog " $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the '$prev' option requires an argument" + + if test -n "$install_override_mode" && $no_mode; then + if $install_cp; then :; else + func_quote_for_eval "$install_override_mode" + func_append install_shared_prog " -m $func_quote_for_eval_result" + fi + fi + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=: + if $isdir; then + destdir=$dest + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir=$func_dirname_result + destname=$func_basename_result + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "'$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "'$destdir' must be an absolute directory name" + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic=$magic + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + func_append staticlibs " $file" + ;; + + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) func_append current_libdirs " $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) func_append future_libdirs " $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir=$func_dirname_result + func_append dir "$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking '$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname=$1 + shift + + srcname=$realname + test -n "$relink_command" && srcname=${realname}T + + # Install the shared library and build the symlinks. + func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme=$stripme + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme= + ;; + esac + ;; + os2*) + case $realname in + *_dll.a) + tstripme= + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try 'ln -sf' first, because the 'ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib=$destdir/$realname + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name=$func_basename_result + instname=$dir/${name}i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && func_append staticlibs " $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile=$destdir/$destname + else + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest=$destfile + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to '$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test yes = "$build_old_libs"; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile=$destdir/$destname + else + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext= + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=.exe + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script '$wrapper'" + + finalize=: + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "'$lib' has not been installed in '$libdir'" + finalize=false + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test no = "$fast_install" && test -n "$relink_command"; then + $opt_dry_run || { + if $finalize; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file=$func_basename_result + outputname=$tmpdir/$file + # Replace the output file specification. + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_quiet || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink '$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file=$outputname + else + func_warning "cannot relink '$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name=$func_basename_result + + # Set up the ranlib parameters. + oldlib=$destdir/$name + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $tool_oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run '$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test install = "$opt_mode" && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $debug_cmd + + my_outputname=$1 + my_originator=$2 + my_pic_p=${3-false} + my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms=${my_outputname}S.c + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist=$output_objdir/$my_outputname.nm + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" +#endif + +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* External symbol declarations for the compiler. */\ +" + + if test yes = "$dlself"; then + func_verbose "generating symbol list for '$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_to_tool_file "$progfile" func_convert_file_msys_to_w32 + func_verbose "extracting global C symbols from '$func_to_tool_file_result'" + $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols=$output_objdir/$outputname.exp + $opt_dry_run || { + $RM $export_symbols + eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from '$dlprefile'" + func_basename "$dlprefile" + name=$func_basename_result + case $host in + *cygwin* | *mingw* | *cegcc* ) + # if an import library, we need to obtain dlname + if func_win32_import_lib_p "$dlprefile"; then + func_tr_sh "$dlprefile" + eval "curr_lafile=\$libfile_$func_tr_sh_result" + dlprefile_dlbasename= + if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then + # Use subshell, to avoid clobbering current variable values + dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` + if test -n "$dlprefile_dlname"; then + func_basename "$dlprefile_dlname" + dlprefile_dlbasename=$func_basename_result + else + # no lafile. user explicitly requested -dlpreopen <import library>. + $sharedlib_from_linklib_cmd "$dlprefile" + dlprefile_dlbasename=$sharedlib_from_linklib_result + fi + fi + $opt_dry_run || { + if test -n "$dlprefile_dlbasename"; then + eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' + else + func_warning "Could not compute DLL name from $name" + eval '$ECHO ": $name " >> "$nlist"' + fi + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + } + else # not an import lib + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + fi + ;; + *) + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + ;; + esac + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $MV "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if $GREP -v "^: " < "$nlist" | + if sort -k 3 </dev/null >/dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + func_show_eval '$RM "${nlist}I"' + if test -n "$global_symbol_to_import"; then + eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' + fi + + echo >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +extern LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[];\ +" + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ +static void lt_syminit(void) +{ + LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; + for (; symbol->name; ++symbol) + {" + $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" + echo >> "$output_objdir/$my_dlsyms" "\ + } +}" + fi + echo >> "$output_objdir/$my_dlsyms" "\ +LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{ {\"$my_originator\", (void *) 0}," + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ + {\"@INIT@\", (void *) <_syminit}," + fi + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + echo >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + $my_pic_p && pic_flag_for_symtable=" $pic_flag" + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) func_append symtab_cflags " $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' + + # Transform the symbol file into the correct name. + symfileobj=$output_objdir/${my_outputname}S.$objext + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for '$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` + fi +} + +# func_cygming_gnu_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is a GNU/binutils-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_gnu_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` + test -n "$func_cygming_gnu_implib_tmp" +} + +# func_cygming_ms_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is an MS-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_ms_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` + test -n "$func_cygming_ms_implib_tmp" +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +# Despite the name, also deal with 64 bit binaries. +func_win32_libid () +{ + $debug_cmd + + win32_libid_type=unknown + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then + case $nm_interface in + "MS dumpbin") + if func_cygming_ms_implib_p "$1" || + func_cygming_gnu_implib_p "$1" + then + win32_nmres=import + else + win32_nmres= + fi + ;; + *) + func_to_tool_file "$1" func_convert_file_msys_to_w32 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + $SED -n -e ' + 1,100{ + / I /{ + s|.*|import| + p + q + } + }'` + ;; + esac + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + +# func_cygming_dll_for_implib ARG +# +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib () +{ + $debug_cmd + + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` +} + +# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs +# +# The is the core of a fallback implementation of a +# platform-specific function to extract the name of the +# DLL associated with the specified import library LIBNAME. +# +# SECTION_NAME is either .idata$6 or .idata$7, depending +# on the platform and compiler that created the implib. +# +# Echos the name of the DLL associated with the +# specified import library. +func_cygming_dll_for_implib_fallback_core () +{ + $debug_cmd + + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` + $OBJDUMP -s --section "$1" "$2" 2>/dev/null | + $SED '/^Contents of section '"$match_literal"':/{ + # Place marker at beginning of archive member dllname section + s/.*/====MARK====/ + p + d + } + # These lines can sometimes be longer than 43 characters, but + # are always uninteresting + /:[ ]*file format pe[i]\{,1\}-/d + /^In archive [^:]*:/d + # Ensure marker is printed + /^====MARK====/p + # Remove all lines with less than 43 characters + /^.\{43\}/!d + # From remaining lines, remove first 43 characters + s/^.\{43\}//' | + $SED -n ' + # Join marker and all lines until next marker into a single line + /^====MARK====/ b para + H + $ b para + b + :para + x + s/\n//g + # Remove the marker + s/^====MARK====// + # Remove trailing dots and whitespace + s/[\. \t]*$// + # Print + /./p' | + # we now have a list, one entry per line, of the stringified + # contents of the appropriate section of all members of the + # archive that possess that section. Heuristic: eliminate + # all those that have a first or second character that is + # a '.' (that is, objdump's representation of an unprintable + # character.) This should work for all archives with less than + # 0x302f exports -- but will fail for DLLs whose name actually + # begins with a literal '.' or a single character followed by + # a '.'. + # + # Of those that remain, print the first one. + $SED -e '/^\./d;/^.\./d;q' +} + +# func_cygming_dll_for_implib_fallback ARG +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# +# This fallback implementation is for use when $DLLTOOL +# does not support the --identify-strict option. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib_fallback () +{ + $debug_cmd + + if func_cygming_gnu_implib_p "$1"; then + # binutils import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` + elif func_cygming_ms_implib_p "$1"; then + # ms-generated import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` + else + # unknown + sharedlib_from_linklib_result= + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $debug_cmd + + f_ex_an_ar_dir=$1; shift + f_ex_an_ar_oldlib=$1 + if test yes = "$lock_old_archive_extraction"; then + lockfile=$f_ex_an_ar_oldlib.lock + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + fi + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ + 'stat=$?; rm -f "$lockfile"; exit $stat' + if test yes = "$lock_old_archive_extraction"; then + $opt_dry_run || rm -f "$lockfile" + fi + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $debug_cmd + + my_gentop=$1; shift + my_oldlibs=${1+"$@"} + my_oldobjs= + my_xlib= + my_xabs= + my_xdir= + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib=$func_basename_result + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir=$my_gentop/$my_xlib_u + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + func_basename "$darwin_archive" + darwin_base_archive=$func_basename_result + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches; do + func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch" + $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive" + cd "unfat-$$/$darwin_base_archive-$darwin_arch" + func_extract_an_archive "`pwd`" "$darwin_base_archive" + cd "$darwin_curdir" + $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` + done + + func_extract_archives_result=$my_oldobjs +} + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory where it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=${1-no} + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + file=\"\$0\"" + + qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` + $ECHO "\ + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + ECHO=\"$qECHO\" + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ that is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options that match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + case \" \$* \" in + *\\ --lt-*) + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done ;; + esac + func_exec_program_core \${1+\"\$@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\$@\"} + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` + done + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test yes = "$fast_install"; then + $ECHO "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $MKDIR \"\$progdir\" + else + $RM \"\$progdir/\$file\" + fi" + + $ECHO "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + \$ECHO \"\$relink_command_output\" >&2 + $RM \"\$progdir/\$file\" + exit 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # fixup the dll searchpath if we need to. + # + # Fix the DLL searchpath if we need to. Do this before prepending + # to shlibpath, because on Windows, both are PATH and uninstalled + # libraries must come first. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + # Export our shlibpath_var if we have one. + if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` + + export $shlibpath_var +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + func_exec_program \${1+\"\$@\"} + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} + + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat <<EOF + +/* $cwrappersource - temporary wrapper executable for $objdir/$outputname + Generated by $PROGRAM (GNU $PACKAGE) $VERSION + + The $output program cannot be directly executed until all the libtool + libraries that it depends on are installed. + + This wrapper executable should never be moved out of the build directory. + If it is, it will not operate correctly. +*/ +EOF + cat <<"EOF" +#ifdef _MSC_VER +# define _CRT_SECURE_NO_DEPRECATE 1 +#endif +#include <stdio.h> +#include <stdlib.h> +#ifdef _MSC_VER +# include <direct.h> +# include <process.h> +# include <io.h> +#else +# include <unistd.h> +# include <stdint.h> +# ifdef __CYGWIN__ +# include <io.h> +# endif +#endif +#include <malloc.h> +#include <stdarg.h> +#include <assert.h> +#include <string.h> +#include <ctype.h> +#include <errno.h> +#include <fcntl.h> +#include <sys/stat.h> + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* declarations of non-ANSI functions */ +#if defined __MINGW32__ +# ifdef __STRICT_ANSI__ +int _putenv (const char *); +# endif +#elif defined __CYGWIN__ +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +/* #elif defined other_platform || defined ... */ +#endif + +/* portability defines, excluding path handling macros */ +#if defined _MSC_VER +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +# define S_IXUSR _S_IEXEC +#elif defined __MINGW32__ +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +#elif defined __CYGWIN__ +# define HAVE_SETENV +# define FOPEN_WB "wb" +/* #elif defined other platforms ... */ +#endif + +#if defined PATH_MAX +# define LT_PATHMAX PATH_MAX +#elif defined MAXPATHLEN +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +/* path handling portability macros */ +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ + defined __OS2__ +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free (stale); stale = 0; } \ +} while (0) + +#if defined LT_DEBUGWRAPPER +static int lt_debug = 1; +#else +static int lt_debug = 0; +#endif + +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); +static const char *nonnull (const char *s); +static const char *nonempty (const char *s); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); +char **prepare_spawn (char **argv); +void lt_dump_script (FILE *f); +EOF + + cat <<EOF +#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 5) +# define externally_visible volatile +#else +# define externally_visible __attribute__((externally_visible)) volatile +#endif +externally_visible const char * MAGIC_EXE = "$magic_exe"; +const char * LIB_PATH_VARNAME = "$shlibpath_var"; +EOF + + if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + func_to_host_path "$temp_rpath" + cat <<EOF +const char * LIB_PATH_VALUE = "$func_to_host_path_result"; +EOF + else + cat <<"EOF" +const char * LIB_PATH_VALUE = ""; +EOF + fi + + if test -n "$dllsearchpath"; then + func_to_host_path "$dllsearchpath:" + cat <<EOF +const char * EXE_PATH_VARNAME = "PATH"; +const char * EXE_PATH_VALUE = "$func_to_host_path_result"; +EOF + else + cat <<"EOF" +const char * EXE_PATH_VARNAME = ""; +const char * EXE_PATH_VALUE = ""; +EOF + fi + + if test yes = "$fast_install"; then + cat <<EOF +const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */ +EOF + else + cat <<EOF +const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */ +EOF + fi + + + cat <<"EOF" + +#define LTWRAPPER_OPTION_PREFIX "--lt-" + +static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX; +static const char *dumpscript_opt = LTWRAPPER_OPTION_PREFIX "dump-script"; +static const char *debug_opt = LTWRAPPER_OPTION_PREFIX "debug"; + +int +main (int argc, char *argv[]) +{ + char **newargz; + int newargc; + char *tmp_pathspec; + char *actual_cwrapper_path; + char *actual_cwrapper_name; + char *target_name; + char *lt_argv_zero; + int rval = 127; + + int i; + + program_name = (char *) xstrdup (base_name (argv[0])); + newargz = XMALLOC (char *, (size_t) argc + 1); + + /* very simple arg parsing; don't want to rely on getopt + * also, copy all non cwrapper options to newargz, except + * argz[0], which is handled differently + */ + newargc=0; + for (i = 1; i < argc; i++) + { + if (STREQ (argv[i], dumpscript_opt)) + { +EOF + case $host in + *mingw* | *cygwin* ) + # make stdout use "unix" line endings + echo " setmode(1,_O_BINARY);" + ;; + esac + + cat <<"EOF" + lt_dump_script (stdout); + return 0; + } + if (STREQ (argv[i], debug_opt)) + { + lt_debug = 1; + continue; + } + if (STREQ (argv[i], ltwrapper_option_prefix)) + { + /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX + namespace, but it is not one of the ones we know about and + have already dealt with, above (inluding dump-script), then + report an error. Otherwise, targets might begin to believe + they are allowed to use options in the LTWRAPPER_OPTION_PREFIX + namespace. The first time any user complains about this, we'll + need to make LTWRAPPER_OPTION_PREFIX a configure-time option + or a configure.ac-settable value. + */ + lt_fatal (__FILE__, __LINE__, + "unrecognized %s option: '%s'", + ltwrapper_option_prefix, argv[i]); + } + /* otherwise ... */ + newargz[++newargc] = xstrdup (argv[i]); + } + newargz[++newargc] = NULL; + +EOF + cat <<EOF + /* The GNU banner must be the first non-error debug message */ + lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE) $VERSION\n"); +EOF + cat <<"EOF" + lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]); + lt_debugprintf (__FILE__, __LINE__, "(main) program_name: %s\n", program_name); + + tmp_pathspec = find_executable (argv[0]); + if (tmp_pathspec == NULL) + lt_fatal (__FILE__, __LINE__, "couldn't find %s", argv[0]); + lt_debugprintf (__FILE__, __LINE__, + "(main) found exe (before symlink chase) at: %s\n", + tmp_pathspec); + + actual_cwrapper_path = chase_symlinks (tmp_pathspec); + lt_debugprintf (__FILE__, __LINE__, + "(main) found exe (after symlink chase) at: %s\n", + actual_cwrapper_path); + XFREE (tmp_pathspec); + + actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path)); + strendzap (actual_cwrapper_path, actual_cwrapper_name); + + /* wrapper name transforms */ + strendzap (actual_cwrapper_name, ".exe"); + tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1); + XFREE (actual_cwrapper_name); + actual_cwrapper_name = tmp_pathspec; + tmp_pathspec = 0; + + /* target_name transforms -- use actual target program name; might have lt- prefix */ + target_name = xstrdup (base_name (TARGET_PROGRAM_NAME)); + strendzap (target_name, ".exe"); + tmp_pathspec = lt_extend_str (target_name, ".exe", 1); + XFREE (target_name); + target_name = tmp_pathspec; + tmp_pathspec = 0; + + lt_debugprintf (__FILE__, __LINE__, + "(main) libtool target name: %s\n", + target_name); +EOF + + cat <<EOF + newargz[0] = + XMALLOC (char, (strlen (actual_cwrapper_path) + + strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1)); + strcpy (newargz[0], actual_cwrapper_path); + strcat (newargz[0], "$objdir"); + strcat (newargz[0], "/"); +EOF + + cat <<"EOF" + /* stop here, and copy so we don't have to do this twice */ + tmp_pathspec = xstrdup (newargz[0]); + + /* do NOT want the lt- prefix here, so use actual_cwrapper_name */ + strcat (newargz[0], actual_cwrapper_name); + + /* DO want the lt- prefix here if it exists, so use target_name */ + lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1); + XFREE (tmp_pathspec); + tmp_pathspec = NULL; +EOF + + case $host_os in + mingw*) + cat <<"EOF" + { + char* p; + while ((p = strchr (newargz[0], '\\')) != NULL) + { + *p = '/'; + } + while ((p = strchr (lt_argv_zero, '\\')) != NULL) + { + *p = '/'; + } + } +EOF + ;; + esac + + cat <<"EOF" + XFREE (target_name); + XFREE (actual_cwrapper_path); + XFREE (actual_cwrapper_name); + + lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */ + lt_setenv ("DUALCASE", "1"); /* for MSK sh */ + /* Update the DLL searchpath. EXE_PATH_VALUE ($dllsearchpath) must + be prepended before (that is, appear after) LIB_PATH_VALUE ($temp_rpath) + because on Windows, both *_VARNAMEs are PATH but uninstalled + libraries must come first. */ + lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE); + lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE); + + lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n", + nonnull (lt_argv_zero)); + for (i = 0; i < newargc; i++) + { + lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n", + i, nonnull (newargz[i])); + } + +EOF + + case $host_os in + mingw*) + cat <<"EOF" + /* execv doesn't actually work on mingw as expected on unix */ + newargz = prepare_spawn (newargz); + rval = (int) _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz); + if (rval == -1) + { + /* failed to start process */ + lt_debugprintf (__FILE__, __LINE__, + "(main) failed to launch target \"%s\": %s\n", + lt_argv_zero, nonnull (strerror (errno))); + return 127; + } + return rval; +EOF + ;; + *) + cat <<"EOF" + execv (lt_argv_zero, newargz); + return rval; /* =127, but avoids unused variable warning */ +EOF + ;; + esac + + cat <<"EOF" +} + +void * +xmalloc (size_t num) +{ + void *p = (void *) malloc (num); + if (!p) + lt_fatal (__FILE__, __LINE__, "memory exhausted"); + + return p; +} + +char * +xstrdup (const char *string) +{ + return string ? strcpy ((char *) xmalloc (strlen (string) + 1), + string) : NULL; +} + +const char * +base_name (const char *name) +{ + const char *base; + +#if defined HAVE_DOS_BASED_FILE_SYSTEM + /* Skip over the disk name in MSDOS pathnames. */ + if (isalpha ((unsigned char) name[0]) && name[1] == ':') + name += 2; +#endif + + for (base = name; *name; name++) + if (IS_DIR_SEPARATOR (*name)) + base = name + 1; + return base; +} + +int +check_executable (const char *path) +{ + struct stat st; + + lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n", + nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if ((stat (path, &st) >= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", + nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + size_t tmp_len; + char *concat_name; + + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", + nonempty (wrapper)); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined HAVE_DOS_BASED_FILE_SYSTEM + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined HAVE_DOS_BASED_FILE_SYSTEM + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = (size_t) (q - p); + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + lt_debugprintf (__FILE__, __LINE__, + "checking path component for symlinks: %s\n", + tmp_pathspec); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + lt_fatal (__FILE__, __LINE__, + "error accessing file \"%s\": %s", + tmp_pathspec, nonnull (strerror (errno))); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal (__FILE__, __LINE__, + "could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (STREQ (str, pat)) + *str = '\0'; + } + return str; +} + +void +lt_debugprintf (const char *file, int line, const char *fmt, ...) +{ + va_list args; + if (lt_debug) + { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); + } +} + +static void +lt_error_core (int exit_status, const char *file, + int line, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *file, int line, const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); + va_end (ap); +} + +static const char * +nonnull (const char *s) +{ + return s ? s : "(null)"; +} + +static const char * +nonempty (const char *s) +{ + return (s && !*s) ? "(empty)" : nonnull (s); +} + +void +lt_setenv (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", + nonnull (name), nonnull (value)); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + size_t len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + size_t orig_value_len = strlen (orig_value); + size_t add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + size_t len = strlen (new_value); + while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[--len] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +EOF + case $host_os in + mingw*) + cat <<"EOF" + +/* Prepares an argument vector before calling spawn(). + Note that spawn() does not by itself call the command interpreter + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&v); + v.dwPlatformId == VER_PLATFORM_WIN32_NT; + }) ? "cmd.exe" : "command.com"). + Instead it simply concatenates the arguments, separated by ' ', and calls + CreateProcess(). We must quote the arguments since Win32 CreateProcess() + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a + special way: + - Space and tab are interpreted as delimiters. They are not treated as + delimiters if they are surrounded by double quotes: "...". + - Unescaped double quotes are removed from the input. Their only effect is + that within double quotes, space and tab are treated like normal + characters. + - Backslashes not followed by double quotes are not special. + - But 2*n+1 backslashes followed by a double quote become + n backslashes followed by a double quote (n >= 0): + \" -> " + \\\" -> \" + \\\\\" -> \\" + */ +#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +char ** +prepare_spawn (char **argv) +{ + size_t argc; + char **new_argv; + size_t i; + + /* Count number of arguments. */ + for (argc = 0; argv[argc] != NULL; argc++) + ; + + /* Allocate new argument vector. */ + new_argv = XMALLOC (char *, argc + 1); + + /* Put quoted arguments into the new argument vector. */ + for (i = 0; i < argc; i++) + { + const char *string = argv[i]; + + if (string[0] == '\0') + new_argv[i] = xstrdup ("\"\""); + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) + { + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); + size_t length; + unsigned int backslashes; + const char *s; + char *quoted_string; + char *p; + + length = 0; + backslashes = 0; + if (quote_around) + length++; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + length += backslashes + 1; + length++; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + length += backslashes + 1; + + quoted_string = XMALLOC (char, length + 1); + + p = quoted_string; + backslashes = 0; + if (quote_around) + *p++ = '"'; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + { + unsigned int j; + for (j = backslashes + 1; j > 0; j--) + *p++ = '\\'; + } + *p++ = c; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + { + unsigned int j; + for (j = backslashes; j > 0; j--) + *p++ = '\\'; + *p++ = '"'; + } + *p = '\0'; + + new_argv[i] = quoted_string; + } + else + new_argv[i] = (char *) string; + } + new_argv[argc] = NULL; + + return new_argv; +} +EOF + ;; + esac + + cat <<"EOF" +void lt_dump_script (FILE* f) +{ +EOF + func_emit_wrapper yes | + $SED -n -e ' +s/^\(.\{79\}\)\(..*\)/\1\ +\2/ +h +s/\([\\"]\)/\\\1/g +s/$/\\n/ +s/\([^\n]*\).*/ fputs ("\1", f);/p +g +D' + cat <<"EOF" +} +EOF +} +# end: func_emit_cwrapperexe_src + +# func_win32_import_lib_p ARG +# True if ARG is an import lib, as indicated by $file_magic_cmd +func_win32_import_lib_p () +{ + $debug_cmd + + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + +# func_suncc_cstd_abi +# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! +# Several compiler flags select an ABI that is incompatible with the +# Cstd library. Avoid specifying it if any are in CXXFLAGS. +func_suncc_cstd_abi () +{ + $debug_cmd + + case " $compile_command " in + *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) + suncc_use_cstd_abi=no + ;; + *) + suncc_use_cstd_abi=yes + ;; + esac +} + +# func_mode_link arg... +func_mode_link () +{ + $debug_cmd + + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # what system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll that has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + bindir= + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + os2dllname= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=false + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module=$wl-single_module + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test yes != "$build_libtool_libs" \ + && func_fatal_configuration "cannot build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg=$1 + shift + func_quote_for_eval "$arg" + qarg=$func_quote_for_eval_unquoted_result + func_append libtool_args " $func_quote_for_eval_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in + bindir) + bindir=$arg + prev= + continue + ;; + dlfiles|dlprefiles) + $preload || { + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=: + } + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test no = "$dlself"; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test dlprefiles = "$prev"; then + dlself=yes + elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test dlfiles = "$prev"; then + func_append dlfiles " $arg" + else + func_append dlprefiles " $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols=$arg + test -f "$arg" \ + || func_fatal_error "symbol file '$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex=$arg + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) func_append deplibs " $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir=$arg + prev= + continue + ;; + mllvm) + # Clang does not use LLVM to link, so we can simply discard any + # '-mllvm $arg' options when doing the link step. + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# func_append moreargs " $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + if test none != "$pic_object"; then + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + fi + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object=$pic_object + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file '$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + os2dllname) + os2dllname=$arg + prev= + continue + ;; + precious_regex) + precious_files_regex=$arg + prev= + continue + ;; + release) + release=-$arg + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test rpath = "$prev"; then + case "$rpath " in + *" $arg "*) ;; + *) func_append rpath " $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) func_append xrpath " $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds=$arg + prev= + continue + ;; + weak) + func_append weak_libs " $arg" + prev= + continue + ;; + xcclinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg=$arg + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "'-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -bindir) + prev=bindir + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test X-export-symbols = "X$arg"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname "-L" '' "$arg" + if test -z "$func_stripname_result"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between '-L' and '$1'" + else + func_fatal_error "need path for '-L' option" + fi + fi + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of '$dir'" + dir=$absdir + ;; + esac + case "$deplibs " in + *" -L$dir "* | *" $arg "*) + # Will only happen for absolute or sysroot arguments + ;; + *) + # Preserve sysroot, but never include relative directories + case $dir in + [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; + *) func_append deplibs " -L$dir" ;; + esac + func_append lib_search_path " $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) func_append dllsearchpath ":$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test X-lc = "X$arg" || test X-lm = "X$arg"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test X-lc = "X$arg" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc due to us having libc/libc_r. + test X-lc = "X$arg" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + func_append deplibs " System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test X-lc = "X$arg" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test X-lc = "X$arg" && continue + ;; + esac + elif test X-lc_r = "X$arg"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + func_append deplibs " $arg" + continue + ;; + + -mllvm) + prev=mllvm + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot|--sysroot) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) func_append new_inherited_linker_flags " $arg" ;; + esac + continue + ;; + + -multi_module) + single_module=$wl-multi_module + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "'-no-install' is ignored for $host" + func_warning "assuming '-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -os2dllname) + prev=os2dllname + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + =*) + func_stripname '=' '' "$dir" + dir=$lt_sysroot$func_stripname_result + ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_for_eval "$flag" + func_append arg " $func_quote_for_eval_result" + func_append compiler_flags " $func_quote_for_eval_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_for_eval "$flag" + func_append arg " $wl$func_quote_for_eval_result" + func_append compiler_flags " $wl$func_quote_for_eval_result" + func_append linker_flags " $func_quote_for_eval_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + + # Flags to be passed through unchanged, with rationale: + # -64, -mips[0-9] enable 64-bit mode for the SGI compiler + # -r[0-9][0-9]* specify processor for the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler + # +DA*, +DD* enable 64-bit mode for the HP compiler + # -q* compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* architecture-specific flags for GCC + # -F/path path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* profiling flags for GCC + # -fstack-protector* stack protector flags for GCC + # @file GCC response files + # -tp=* Portland pgcc target processor selection + # --sysroot=* for sysroot support + # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + # -stdlib=* select c++ std lib with clang + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ + -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + func_append compile_command " $arg" + func_append finalize_command " $arg" + func_append compiler_flags " $arg" + continue + ;; + + -Z*) + if test os2 = "`expr $host : '.*\(os2\)'`"; then + # OS/2 uses -Zxxx to specify OS/2-specific options + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case $arg in + -Zlinker | -Zstack) + prev=xcompiler + ;; + esac + continue + else + # Otherwise treat like 'Some other compiler flag' below + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + fi + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + + *.$objext) + # A standard object. + func_append objs " $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + test none = "$pic_object" || { + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + } + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object=$pic_object + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + func_append deplibs " $arg" + func_append old_deplibs " $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + func_resolve_sysroot "$arg" + if test dlfiles = "$prev"; then + # This library was specified with -dlopen. + func_append dlfiles " $func_resolve_sysroot_result" + prev= + elif test dlprefiles = "$prev"; then + # The library was specified with -dlpreopen. + func_append dlprefiles " $func_resolve_sysroot_result" + prev= + else + func_append deplibs " $func_resolve_sysroot_result" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the '$prevarg' option requires an argument" + + if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname=$func_basename_result + libobjs_save=$libobjs + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + # Definition is injected by LT_CONFIG during libtool generation. + func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" + + func_dirname "$output" "/" "" + output_objdir=$func_dirname_result$objdir + func_to_tool_file "$output_objdir/" + tool_output_objdir=$func_to_tool_file_result + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if $opt_preserve_dup_deps; then + case "$libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append libs " $deplib" + done + + if test lib = "$linkmode"; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; + esac + func_append pre_post_deps " $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can '-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=false + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test lib,link = "$linkmode,$pass"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs=$tmp_deplibs + fi + + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass"; then + libs=$deplibs + deplibs= + fi + if test prog = "$linkmode"; then + case $pass in + dlopen) libs=$dlfiles ;; + dlpreopen) libs=$dlprefiles ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test lib,dlpreopen = "$linkmode,$pass"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + func_resolve_sysroot "$lib" + case $lib in + *.la) func_source "$func_resolve_sysroot_result" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + func_basename "$deplib" + deplib_base=$func_basename_result + case " $weak_libs " in + *" $deplib_base "*) ;; + *) func_append deplibs " $deplib" ;; + esac + done + done + libs=$dlprefiles + fi + if test dlopen = "$pass"; then + # Collect dlpreopened libraries + save_deplibs=$deplibs + deplibs= + fi + + for deplib in $libs; do + lib= + found=false + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append compiler_flags " $deplib" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test lib != "$linkmode" && test prog != "$linkmode"; then + func_warning "'-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test lib = "$linkmode"; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib=$searchdir/lib$name$search_ext + if test -f "$lib"; then + if test .la = "$search_ext"; then + found=: + else + found=false + fi + break 2 + fi + done + done + if $found; then + # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll=$l + done + if test "X$ll" = "X$old_library"; then # only static version available + found=false + func_dirname "$lib" "" "." + ladir=$func_dirname_result + lib=$ladir/$old_library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + else + # deplib doesn't seem to be a libtool library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + ;; # -l + *.ltframework) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test conv = "$pass" && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + prog) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + if test scan = "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + *) + func_warning "'-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test link = "$pass"; then + func_stripname '-R' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) + func_resolve_sysroot "$deplib" + lib=$func_resolve_sysroot_result + ;; + *.$libext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=false + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=: + fi + ;; + pass_all) + valid_a_lib=: + ;; + esac + if $valid_a_lib; then + echo + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + else + echo + $ECHO "*** Warning: Trying to link with static lib archive $deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because the file extensions .$libext of this argument makes me believe" + echo "*** that it is just a static archive that I should not use here." + fi + ;; + esac + continue + ;; + prog) + if test link != "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + elif test prog = "$linkmode"; then + if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + func_append newdlprefiles " $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append newdlfiles " $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=: + continue + ;; + esac # case $deplib + + $found || test -f "$lib" \ + || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "'$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir=$func_dirname_result + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass" || + { test prog != "$linkmode" && test lib != "$linkmode"; }; then + test -n "$dlopen" && func_append dlfiles " $dlopen" + test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" + fi + + if test conv = "$pass"; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + # It is a libtool convenience library, so add in its objects. + func_append convenience " $ladir/$objdir/$old_library" + func_append old_convenience " $ladir/$objdir/$old_library" + elif test prog != "$linkmode" && test lib != "$linkmode"; then + func_fatal_error "'$lib' is not a convenience library" + fi + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + if test -n "$old_library" && + { test yes = "$prefer_static_libs" || + test built,no = "$prefer_static_libs,$installed"; }; then + linklib=$old_library + else + for l in $old_library $library_names; do + linklib=$l + done + fi + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + + # This library was specified with -dlopen. + if test dlopen = "$pass"; then + test -z "$libdir" \ + && func_fatal_error "cannot -dlopen a convenience library: '$lib'" + if test -z "$dlname" || + test yes != "$dlopen_support" || + test no = "$build_libtool_libs" + then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + func_append dlprefiles " $lib $dependency_libs" + else + func_append newdlfiles " $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + func_warning "cannot determine absolute directory name of '$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir=$ladir + fi + ;; + esac + func_basename "$lib" + laname=$func_basename_result + + # Find the relevant object directory and library name. + if test yes = "$installed"; then + if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library '$lib' was moved." + dir=$ladir + absdir=$abs_ladir + libdir=$abs_ladir + else + dir=$lt_sysroot$libdir + absdir=$lt_sysroot$libdir + fi + test yes = "$hardcode_automatic" && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir=$ladir + absdir=$abs_ladir + # Remove this search path later + func_append notinst_path " $abs_ladir" + else + dir=$ladir/$objdir + absdir=$abs_ladir/$objdir + # Remove this search path later + func_append notinst_path " $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test dlpreopen = "$pass"; then + if test -z "$libdir" && test prog = "$linkmode"; then + func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'" + fi + case $host in + # special handling for platforms with PE-DLLs. + *cygwin* | *mingw* | *cegcc* ) + # Linker will automatically link against shared library if both + # static and shared are present. Therefore, ensure we extract + # symbols from the import library if a shared library is present + # (otherwise, the dlopen module name will be incorrect). We do + # this by putting the import library name into $newdlprefiles. + # We recover the dlopen module name by 'saving' the la file + # name in a special purpose variable, and (later) extracting the + # dlname from the la file. + if test -n "$dlname"; then + func_tr_sh "$dir/$linklib" + eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" + func_append newdlprefiles " $dir/$linklib" + else + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + fi + ;; + * ) + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + func_append newdlprefiles " $dir/$dlname" + else + func_append newdlprefiles " $dir/$linklib" + fi + ;; + esac + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test lib = "$linkmode"; then + deplibs="$dir/$old_library $deplibs" + elif test prog,link = "$linkmode,$pass"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test prog = "$linkmode" && test link != "$pass"; then + func_append newlib_search_path " $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=false + if test no != "$link_all_deplibs" || test -z "$library_names" || + test no = "$build_libtool_libs"; then + linkalldeplibs=: + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + esac + # Need to link against all dependency_libs? + if $linkalldeplibs; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test prog,link = "$linkmode,$pass"; then + if test -n "$library_names" && + { { test no = "$prefer_static_libs" || + test built,yes = "$prefer_static_libs,$installed"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then + # Make sure the rpath contains only unique directories. + case $temp_rpath: in + *"$absdir:"*) ;; + *) func_append temp_rpath "$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if $alldeplibs && + { test pass_all = "$deplibs_check_method" || + { test yes = "$build_libtool_libs" && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test built = "$use_static_libs" && test yes = "$installed"; then + use_static_libs=no + fi + if test -n "$library_names" && + { test no = "$use_static_libs" || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc* | *os2*) + # No point in relinking DLLs because paths are not encoded + func_append notinst_deplibs " $lib" + need_relink=no + ;; + *) + if test no = "$installed"; then + func_append notinst_deplibs " $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule= + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule=$dlpremoduletest + break + fi + done + if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then + echo + if test prog = "$linkmode"; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if test lib = "$linkmode" && + test yes = "$hardcode_into_libs"; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname=$1 + shift + libname=`eval "\\$ECHO \"$libname_spec\""` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname=$dlname + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw* | *cegcc* | *os2*) + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + esac + eval soname=\"$soname_spec\" + else + soname=$realname + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot=$soname + func_basename "$soroot" + soname=$func_basename_result + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from '$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for '$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test prog = "$linkmode" || test relink != "$opt_mode"; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test no = "$hardcode_direct"; then + add=$dir/$linklib + case $host in + *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;; + *-*-sysv4*uw2*) add_dir=-L$dir ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir=-L$dir ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we cannot + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library"; then + echo + echo "*** And there doesn't seem to be a static archive available" + echo "*** The link will probably fail, sorry" + else + add=$dir/$old_library + fi + elif test -n "$old_library"; then + add=$dir/$old_library + fi + fi + esac + elif test no = "$hardcode_minus_L"; then + case $host in + *-*-sunos*) add_shlibpath=$dir ;; + esac + add_dir=-L$dir + add=-l$name + elif test no = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + relink) + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$dir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$absdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test yes != "$lib_linked"; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) func_append compile_shlibpath "$add_shlibpath:" ;; + esac + fi + if test prog = "$linkmode"; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test yes != "$hardcode_direct" && + test yes != "$hardcode_minus_L" && + test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + fi + fi + fi + + if test prog = "$linkmode" || test relink = "$opt_mode"; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$libdir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$libdir + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + add=-l$name + elif test yes = "$hardcode_automatic"; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib"; then + add=$inst_prefix_dir$libdir/$linklib + else + add=$libdir/$linklib + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir=-L$libdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + fi + + if test prog = "$linkmode"; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test prog = "$linkmode"; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test unsupported != "$hardcode_direct"; then + test -n "$old_library" && linklib=$old_library + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test yes = "$build_libtool_libs"; then + # Not a shared library + if test pass_all != "$deplibs_check_method"; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + echo + $ECHO "*** Warning: This system cannot link to static lib archive $lib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + if test yes = "$module"; then + echo "*** But as you try to build a module library, libtool will still create " + echo "*** a static module, that should work as long as the dlopening application" + echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using 'nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** 'nm' from GNU binutils and a full rebuild may help." + fi + if test no = "$build_old_libs"; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test lib = "$linkmode"; then + if test -n "$dependency_libs" && + { test yes != "$hardcode_into_libs" || + test yes = "$build_old_libs" || + test yes = "$link_static"; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) func_append xrpath " $temp_xrpath";; + esac;; + *) func_append temp_deplibs " $libdir";; + esac + done + dependency_libs=$temp_deplibs + fi + + func_append newlib_search_path " $absdir" + # Link against this library + test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result";; + *) func_resolve_sysroot "$deplib" ;; + esac + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $func_resolve_sysroot_result "*) + func_append specialdeplibs " $func_resolve_sysroot_result" ;; + esac + fi + func_append tmp_libs " $func_resolve_sysroot_result" + done + + if test no != "$link_all_deplibs"; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + path= + case $deplib in + -L*) path=$deplib ;; + *.la) + func_resolve_sysroot "$deplib" + deplib=$func_resolve_sysroot_result + func_dirname "$deplib" "" "." + dir=$func_dirname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of '$dir'" + absdir=$dir + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names"; then + for tmp in $deplibrary_names; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl"; then + depdepl=$absdir/$objdir/$depdepl + darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`$OTOOL64 -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl" + func_append linker_flags " -dylib_file $darwin_install_name:$depdepl" + path= + fi + fi + ;; + *) + path=-L$absdir/$objdir + ;; + esac + else + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "'$deplib' seems to be moved" + + path=-L$absdir + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test link = "$pass"; then + if test prog = "$linkmode"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs=$newdependency_libs + if test dlpreopen = "$pass"; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test dlopen != "$pass"; then + test conv = "$pass" || { + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) func_append lib_search_path " $dir" ;; + esac + done + newlib_search_path= + } + + if test prog,link = "$linkmode,$pass"; then + vars="compile_deplibs finalize_deplibs" + else + vars=deplibs + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) func_append tmp_libs " $deplib" ;; + esac + ;; + *) func_append tmp_libs " $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + + # Add Sun CC postdeps if required: + test CXX = "$tagname" && { + case $host_os in + linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C++ 5.9 + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + + solaris*) + func_cc_basename "$CC" + case $func_cc_basename_result in + CC* | sunCC*) + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + esac + } + + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i= + ;; + esac + if test -n "$i"; then + func_append tmp_libs " $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test prog = "$linkmode"; then + dlfiles=$newdlfiles + fi + if test prog = "$linkmode" || test lib = "$linkmode"; then + dlprefiles=$newdlprefiles + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "'-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "'-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs=$output + func_append objs "$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form 'libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test no = "$module" \ + && func_fatal_help "libtool library '$output' must begin with 'lib'" + + if test no != "$need_lib_prefix"; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test pass_all != "$deplibs_check_method"; then + func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs" + else + echo + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + func_append libobjs " $objs" + fi + fi + + test no = "$dlself" \ + || func_warning "'-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test 1 -lt "$#" \ + && func_warning "ignoring multiple '-rpath's for a libtool library" + + install_libdir=$1 + + oldlibs= + if test -z "$rpath"; then + if test yes = "$build_libtool_libs"; then + # Building a libtool convenience library. + # Some compilers have problems with a '.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "'-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs=$IFS; IFS=: + set dummy $vinfo 0 0 0 + shift + IFS=$save_ifs + + test -n "$7" && \ + func_fatal_help "too many parameters to '-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major=$1 + number_minor=$2 + number_revision=$3 + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # that has an extra 1 added just for fun + # + case $version_type in + # correct linux to gnu/linux during the next big refactor + darwin|freebsd-elf|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_revision + ;; + freebsd-aout|qnx|sunos) + current=$number_major + revision=$number_minor + age=0 + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_minor + lt_irix_increment=no + ;; + esac + ;; + no) + current=$1 + revision=$2 + age=$3 + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT '$current' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION '$revision' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE '$age' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE '$age' is greater than the current interface number '$current'" + func_fatal_error "'$vinfo' is not valid version information" + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + # On Darwin other compilers + case $CC in + nagfor*) + verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + ;; + *) + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + esac + ;; + + freebsd-aout) + major=.$current + versuffix=.$current.$revision + ;; + + freebsd-elf) + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + irix | nonstopux) + if test no = "$lt_irix_increment"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring=$verstring_prefix$major.$revision + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test 0 -ne "$loop"; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring_prefix$major.$iface:$verstring + done + + # Before this point, $major must not contain '.'. + major=.$major + versuffix=$major.$revision + ;; + + linux) # correct to gnu/linux during the next big refactor + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=.$current.$age.$revision + verstring=$current.$age.$revision + + # Add in all the interfaces that we are compatible with. + loop=$age + while test 0 -ne "$loop"; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring:$iface.0 + done + + # Make executables depend on our current version. + func_append verstring ":$current.0" + ;; + + qnx) + major=.$current + versuffix=.$current + ;; + + sco) + major=.$current + versuffix=.$current + ;; + + sunos) + major=.$current + versuffix=.$current.$revision + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 file systems. + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + + *) + func_fatal_configuration "unknown library version type '$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring=0.0 + ;; + esac + if test no = "$need_version"; then + versuffix= + else + versuffix=.0.0 + fi + fi + + # Remove version info from name if versioning should be avoided + if test yes,no = "$avoid_version,$need_version"; then + major= + versuffix= + verstring= + fi + + # Check to see if the archive will have undefined symbols. + if test yes = "$allow_undefined"; then + if test unsupported = "$allow_undefined_flag"; then + if test yes = "$build_old_libs"; then + func_warning "undefined symbols not allowed in $host shared libraries; building static only" + build_libtool_libs=no + else + func_fatal_error "can't build $host shared library unless -no-undefined is specified" + fi + fi + else + # Don't allow undefined symbols. + allow_undefined_flag=$no_undefined_flag + fi + + fi + + func_generate_dlsyms "$libname" "$libname" : + func_append libobjs " $symfileobj" + test " " = "$libobjs" && libobjs= + + if test relink != "$opt_mode"; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*) + if test -n "$precious_files_regex"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + func_append removelist " $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then + func_append oldlibs " $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` + # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` + # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + func_replace_sysroot "$libdir" + func_append temp_xrpath " -R$func_replace_sysroot_result" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles=$dlfiles + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) func_append dlfiles " $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles=$dlprefiles + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) func_append dlprefiles " $lib" ;; + esac + done + + if test yes = "$build_libtool_libs"; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + func_append deplibs " System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test yes = "$build_libtool_need_lc"; then + func_append deplibs " -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release= + versuffix= + major= + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c <<EOF + int main() { return 0; } +EOF + $opt_dry_run || $RM conftest + if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then + ldd_output=`ldd conftest` + for i in $deplibs; do + case $i in + -l*) + func_stripname -l '' "$i" + name=$func_stripname_result + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $i "*) + func_append newdeplibs " $i" + i= + ;; + esac + fi + if test -n "$i"; then + libname=`eval "\\$ECHO \"$libname_spec\""` + deplib_matches=`eval "\\$ECHO \"$library_names_spec\""` + set dummy $deplib_matches; shift + deplib_match=$1 + if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then + func_append newdeplibs " $i" + else + droppeddeps=yes + echo + $ECHO "*** Warning: dynamic linker does not accept needed library $i." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which I believe you do not have" + echo "*** because a test_compile did reveal that the linker did not use it for" + echo "*** its dynamic dependency list that programs get resolved with at runtime." + fi + fi + ;; + *) + func_append newdeplibs " $i" + ;; + esac + done + else + # Error occurred in the first compile. Let's try to salvage + # the situation: Compile a separate program for each library. + for i in $deplibs; do + case $i in + -l*) + func_stripname -l '' "$i" + name=$func_stripname_result + $opt_dry_run || $RM conftest + if $LTCC $LTCFLAGS -o conftest conftest.c $i; then + ldd_output=`ldd conftest` + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $i "*) + func_append newdeplibs " $i" + i= + ;; + esac + fi + if test -n "$i"; then + libname=`eval "\\$ECHO \"$libname_spec\""` + deplib_matches=`eval "\\$ECHO \"$library_names_spec\""` + set dummy $deplib_matches; shift + deplib_match=$1 + if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then + func_append newdeplibs " $i" + else + droppeddeps=yes + echo + $ECHO "*** Warning: dynamic linker does not accept needed library $i." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because a test_compile did reveal that the linker did not use this one" + echo "*** as a dynamic dependency that programs can get resolved with at runtime." + fi + fi + else + droppeddeps=yes + echo + $ECHO "*** Warning! Library $i is needed by this library but I was not able to" + echo "*** make it link in! You will probably need to install it or some" + echo "*** library that it depends on before this library will be fully" + echo "*** functional. Installing it before continuing would be even better." + fi + ;; + *) + func_append newdeplibs " $i" + ;; + esac + done + fi + ;; + file_magic*) + set dummy $deplibs_check_method; shift + file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $a_deplib "*) + func_append newdeplibs " $a_deplib" + a_deplib= + ;; + esac + fi + if test -n "$a_deplib"; then + libname=`eval "\\$ECHO \"$libname_spec\""` + if test -n "$file_magic_glob"; then + libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob` + else + libnameglob=$libname + fi + test yes = "$want_nocaseglob" && nocaseglob=`shopt -p nocaseglob` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + if test yes = "$want_nocaseglob"; then + shopt -s nocaseglob + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + $nocaseglob + else + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + fi + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib=$potent_lib + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | $SED 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;; + *) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib= + break 2 + fi + done + done + fi + if test -n "$a_deplib"; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib"; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $a_deplib "*) + func_append newdeplibs " $a_deplib" + a_deplib= + ;; + esac + fi + if test -n "$a_deplib"; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib=$potent_lib # see symlink-check above in file_magic test + if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib= + break 2 + fi + done + done + fi + if test -n "$a_deplib"; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib"; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs= + tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + for i in $predeps $postdeps; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"` + done + fi + case $tmp_deplibs in + *[!\ \ ]*) + echo + if test none = "$deplibs_check_method"; then + echo "*** Warning: inter-library dependencies are not supported in this platform." + else + echo "*** Warning: inter-library dependencies are not known to be supported." + fi + echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + ;; + esac + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + if test yes = "$droppeddeps"; then + if test yes = "$module"; then + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using 'nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** 'nm' from GNU binutils and a full rebuild may help." + fi + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." + + if test no = "$allow_undefined"; then + echo + echo "*** Since this library must not contain undefined symbols," + echo "*** because either the platform does not support them or" + echo "*** it was explicitly requested with -no-undefined," + echo "*** libtool will only create a static version of it." + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + deplibs=$new_libs + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test yes = "$build_libtool_libs"; then + # Remove $wl instances when linking with ld. + # FIXME: should test the right _cmds variable. + case $archive_cmds in + *\$LD\ *) wl= ;; + esac + if test yes = "$hardcode_into_libs"; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath=$finalize_rpath + test relink = "$opt_mode" || rpath=$compile_rpath$rpath + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + func_replace_sysroot "$libdir" + libdir=$func_replace_sysroot_result + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append dep_rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath=$finalize_shlibpath + test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname=$1 + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname=$realname + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib=$output_objdir/$realname + linknames= + for link + do + func_append linknames " $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols=$output_objdir/$libname.uexp + func_append delfiles " $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + func_dll_def_p "$export_symbols" || { + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols=$export_symbols + export_symbols= + always_export_symbols=yes + } + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs=$IFS; IFS='~' + for cmd1 in $cmds; do + IFS=$save_ifs + # Take the normal branch if the nm_file_list_spec branch + # doesn't work or if tool conversion is not needed. + case $nm_file_list_spec~$to_tool_file_cmd in + *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) + try_normal_branch=yes + eval cmd=\"$cmd1\" + func_len " $cmd" + len=$func_len_result + ;; + *) + try_normal_branch=no + ;; + esac + if test yes = "$try_normal_branch" \ + && { test "$len" -lt "$max_cmd_len" \ + || test "$max_cmd_len" -le -1; } + then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + elif test -n "$nm_file_list_spec"; then + func_basename "$output" + output_la=$func_basename_result + save_libobjs=$libobjs + save_output=$output + output=$output_objdir/$output_la.nm + func_to_tool_file "$output" + libobjs=$nm_file_list_spec$func_to_tool_file_result + func_append delfiles " $output" + func_verbose "creating $NM input file list: $output" + for obj in $save_libobjs; do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > "$output" + eval cmd=\"$cmd1\" + func_show_eval "$cmd" 'exit $?' + output=$save_output + libobjs=$save_libobjs + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS=$save_ifs + if test -n "$export_symbols_regex" && test : != "$skipped_export"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test : != "$skipped_export" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + func_append tmp_deplibs " $test_deplib" + ;; + esac + done + deplibs=$tmp_deplibs + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test yes = "$compiler_needs_object" && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + func_append linker_flags " $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test relink = "$opt_mode"; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test yes = "$module" && test -n "$module_cmds"; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test : != "$skipped_export" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + func_basename "$output" + output_la=$func_basename_result + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then + output=$output_objdir/$output_la.lnkscript + func_verbose "creating GNU ld script: $output" + echo 'INPUT (' > $output + for obj in $save_libobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + echo ')' >> $output + func_append delfiles " $output" + func_to_tool_file "$output" + output=$func_to_tool_file_result + elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then + output=$output_objdir/$output_la.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test yes = "$compiler_needs_object"; then + firstobj="$1 " + shift + fi + for obj + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + func_append delfiles " $output" + func_to_tool_file "$output" + output=$firstobj\"$file_list_spec$func_to_tool_file_result\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-$k.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test -z "$objlist" || + test "$len" -lt "$max_cmd_len"; then + func_append objlist " $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test 1 -eq "$k"; then + # The first file doesn't have a previous command to add. + reload_objs=$objlist + eval concat_cmds=\"$reload_cmds\" + else + # All subsequent reloadable object files will link in + # the last one created. + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-$k.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-$k.$objext + objlist=" $obj" + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds$reload_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + func_append delfiles " $output" + + else + output= + fi + + ${skipped_export-false} && { + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + } + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs=$IFS; IFS='~' + for cmd in $concat_cmds; do + IFS=$save_ifs + $opt_quiet || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS=$save_ifs + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + ${skipped_export-false} && { + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + } + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test yes = "$module" && test -n "$module_cmds"; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs=$IFS; IFS='~' + for cmd in $cmds; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + $opt_quiet || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS=$save_ifs + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test yes = "$module" || test yes = "$export_dynamic"; then + # On all known operating systems, these are identical. + dlname=$soname + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "'-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object '$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj=$output + ;; + esac + + # Delete the old objects. + $opt_dry_run || $RM $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # if reload_cmds runs $LD directly, get rid of -Wl from + # whole_archive_flag_spec and hope we can get by with turning comma + # into space. + case $reload_cmds in + *\$LD[\ \$]*) wl= ;; + esac + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags + else + gentop=$output_objdir/${obj}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # If we're not building shared, we need to use non_pic_objs + test yes = "$build_libtool_libs" || libobjs=$non_pic_objects + + # Create the old-style object. + reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs + + output=$obj + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + test yes = "$build_libtool_libs" || { + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + } + + if test -n "$pic_flag" || test default != "$pic_mode"; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output=$libobj + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "'-release' is ignored for programs" + + $preload \ + && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ + && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test CXX = "$tagname"; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + func_append compile_command " $wl-bind_at_load" + func_append finalize_command " $wl-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + compile_deplibs=$new_libs + + + func_append compile_command " $compile_deplibs" + func_append finalize_command " $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) func_append dllsearchpath ":$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath=$rpath + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) func_append finalize_perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath=$rpath + + if test -n "$libobjs" && test yes = "$build_old_libs"; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" false + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=: + case $host in + *cegcc* | *mingw32ce*) + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. + wrappers_required=false + ;; + *cygwin* | *mingw* ) + test yes = "$build_libtool_libs" || wrappers_required=false + ;; + *) + if test no = "$need_relink" || test yes != "$build_libtool_libs"; then + wrappers_required=false + fi + ;; + esac + $wrappers_required || { + # Replace the output file specification. + compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + link_command=$compile_command$compile_rpath + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.$objext"; then + func_show_eval '$RM "$output_objdir/${outputname}S.$objext"' + fi + + exit $exit_status + } + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + func_append rpath "$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test yes = "$no_install"; then + # We don't need to create a wrapper script. + link_command=$compile_var$compile_command$compile_rpath + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + exit $EXIT_SUCCESS + fi + + case $hardcode_action,$fast_install in + relink,*) + # Fast installation is not supported + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "'$output' will be relinked during installation" + ;; + *,yes) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + ;; + *,no) + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + ;; + *,needless) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command= + ;; + esac + + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output_objdir/$outputname" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource=$output_path/$objdir/lt-$output_name.c + cwrapper=$output_path/$output_name.exe + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host"; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + case $build_libtool_libs in + convenience) + oldobjs="$libobjs_save $symfileobj" + addlibs=$convenience + build_libtool_libs=no + ;; + module) + oldobjs=$libobjs_save + addlibs=$old_convenience + build_libtool_libs=no + ;; + *) + oldobjs="$old_deplibs $non_pic_objects" + $preload && test -f "$symfileobj" \ + && func_append oldobjs " $symfileobj" + addlibs=$old_convenience + ;; + esac + + if test -n "$addlibs"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $addlibs + func_append oldobjs " $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append oldobjs " $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + echo "copying selected object files to avoid basename conflicts..." + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase=$func_basename_result + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + func_append oldobjs " $gentop/$newobj" + ;; + *) func_append oldobjs " $obj" ;; + esac + done + fi + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + elif test -n "$archiver_list_spec"; then + func_verbose "using command file archive linking..." + for obj in $oldobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > $output_objdir/$libname.libcmd + func_to_tool_file "$output_objdir/$libname.libcmd" + oldobjs=" $archiver_list_spec$func_to_tool_file_result" + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + func_append objlist " $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj"; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test -z "$oldobjs"; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test yes = "$build_old_libs" && old_library=$libname.$libext + func_verbose "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + if test yes = "$hardcode_automatic"; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test yes = "$installed"; then + if test -z "$install_libdir"; then + break + fi + output=$output_objdir/${outputname}i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name=$func_basename_result + func_resolve_sysroot "$deplib" + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" + ;; + -L*) + func_stripname -L '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -L$func_replace_sysroot_result" + ;; + -R*) + func_stripname -R '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -R$func_replace_sysroot_result" + ;; + *) func_append newdependency_libs " $deplib" ;; + esac + done + dependency_libs=$newdependency_libs + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" + ;; + *) func_append newdlfiles " $lib" ;; + esac + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" + ;; + esac + done + dlprefiles=$newdlprefiles + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlfiles " $abs" + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlprefiles " $abs" + done + dlprefiles=$newdlprefiles + fi + $RM $output + # place dlname in correct position for cygwin + # In fact, it would be nice if we could use this code for all target + # systems that can't hard-code library paths into their executables + # and that have no shared library path variable independent of PATH, + # but it turns out we can't easily determine that from inspecting + # libtool variables, so we have to hard-code the OSs to which it + # applies here; at the moment, that means platforms that use the PE + # object format with DLL files. See the long comment at the top of + # tests/bindir.at for full details. + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) + # If a -bindir argument was supplied, place the dll there. + if test -n "$bindir"; then + func_relative_path "$install_libdir" "$bindir" + tdlname=$func_relative_path_result/$dlname + else + # Otherwise fall back on heuristic. + tdlname=../bin/$dlname + fi + ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Linker flags that cannot go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test no,yes = "$installed,$need_relink"; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +if test link = "$opt_mode" || test relink = "$opt_mode"; then + func_mode_link ${1+"$@"} +fi + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $debug_cmd + + RM=$nonopt + files= + rmforce=false + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic=$magic + + for arg + do + case $arg in + -f) func_append RM " $arg"; rmforce=: ;; + -*) func_append RM " $arg" ;; + *) func_append files " $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + for file in $files; do + func_dirname "$file" "" "." + dir=$func_dirname_result + if test . = "$dir"; then + odir=$objdir + else + odir=$dir/$objdir + fi + func_basename "$file" + name=$func_basename_result + test uninstall = "$opt_mode" && odir=$dir + + # Remember odir for removal later, being careful to avoid duplicates + if test clean = "$opt_mode"; then + case " $rmdirs " in + *" $odir "*) ;; + *) func_append rmdirs " $odir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif $rmforce; then + continue + fi + + rmfiles=$file + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + func_append rmfiles " $odir/$n" + done + test -n "$old_library" && func_append rmfiles " $odir/$old_library" + + case $opt_mode in + clean) + case " $library_names " in + *" $dlname "*) ;; + *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; + esac + test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && test none != "$pic_object"; then + func_append rmfiles " $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && test none != "$non_pic_object"; then + func_append rmfiles " $dir/$non_pic_object" + fi + fi + ;; + + *) + if test clean = "$opt_mode"; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + func_append rmfiles " $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + func_append rmfiles " $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + func_append rmfiles " $odir/$name $odir/${name}S.$objext" + if test yes = "$fast_install" && test -n "$relink_command"; then + func_append rmfiles " $odir/lt-$name" + fi + if test "X$noexename" != "X$name"; then + func_append rmfiles " $odir/lt-$noexename.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + + # Try to remove the $objdir's in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then + func_mode_uninstall ${1+"$@"} +fi + +test -z "$opt_mode" && { + help=$generic_help + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode '$opt_mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# where we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: diff --git a/mac/.DS_Store b/mac/.DS_Store new file mode 100644 index 0000000..721cae2 Binary files /dev/null and b/mac/.DS_Store differ diff --git a/mac/LAME.mcp b/mac/LAME.mcp new file mode 100755 index 0000000..cfe1c2c Binary files /dev/null and b/mac/LAME.mcp differ diff --git a/mac/LAME_Carbon_Debug.pch b/mac/LAME_Carbon_Debug.pch new file mode 100755 index 0000000..3e9dc29 --- /dev/null +++ b/mac/LAME_Carbon_Debug.pch @@ -0,0 +1 @@ +/* LAME Carbon Debug.pch Precompiled header sources for Carbon debug build of LAME on Macintosh */ #pragma precompile_target "LAME Carbon Debug Headers" #define TARGET_API_MAC_CARBON 1 #include "Precompile_Common.h" #define LAME_LIBRARY_BUILD 1 // Building library #undef LIBSNDFILE // Build with LIBSNDFILE #define NOANALYSIS 1 // Build without frame-analyzer hooks #undef HAVE_MPGLIB // Build without MPGLIB decoder (forces GPL) #undef USE_LAYER_1 // Build without layer-1 decoding (needs MPGLIB) #undef USE_LAYER_2 // Build without layer-2 decoding (needs MPGLIB) #undef HAVE_VORBIS // Build without Ogg Vorbis #undef BRHIST // Build without histogram (not CLI encoder) #define NDEBUG 1 // Build debug version \ No newline at end of file diff --git a/mac/LAME_Carbon_Final.pch b/mac/LAME_Carbon_Final.pch new file mode 100755 index 0000000..78650cb --- /dev/null +++ b/mac/LAME_Carbon_Final.pch @@ -0,0 +1 @@ +/* LAME Carbon Debug.pch Precompiled header sources for Carbon non-debug build of LAME on Macintosh */ #pragma precompile_target "LAME Carbon Final Headers" #define TARGET_API_MAC_CARBON 1 #include "Precompile_Common.h" #define LAME_LIBRARY_BUILD 1 // Building library #undef LIBSNDFILE // Build with LIBSNDFILE #define NOANALYSIS 1 // Build without frame-analyzer hooks #undef HAVE_MPGLIB // Build without MPGLIB decoder (forces GPL) #undef USE_LAYER_1 // Build without layer-1 decoding (needs MPGLIB) #undef USE_LAYER_2 // Build without layer-2 decoding (needs MPGLIB) #undef HAVE_VORBIS // Build without Ogg Vorbis #undef BRHIST // Build without histogram (not CLI encoder) #undef NDEBUG // Build final (non-debug) version \ No newline at end of file diff --git a/mac/LAME_Classic_Debug.pch b/mac/LAME_Classic_Debug.pch new file mode 100755 index 0000000..c400d3f --- /dev/null +++ b/mac/LAME_Classic_Debug.pch @@ -0,0 +1 @@ +/* LAME Classic Debug.pch Precompiled header sources for Classic debug build of LAME on Macintosh */ #pragma precompile_target "LAME Classic Debug Headers" #define TARGET_API_MAC_OS8 1 #include "Precompile_Common.h" #define LAME_LIBRARY_BUILD 1 // Building library #undef LIBSNDFILE // Build with LIBSNDFILE #define NOANALYSIS 1 // Build without frame-analyzer hooks #undef HAVE_MPGLIB // Build without MPGLIB decoder (forces GPL) #undef USE_LAYER_1 // Build without layer-1 decoding (needs MPGLIB) #undef USE_LAYER_2 // Build without layer-2 decoding (needs MPGLIB) #undef HAVE_VORBIS // Build without Ogg Vorbis #undef BRHIST // Build without histogram (not CLI encoder) #define NDEBUG 1 // Build debug version \ No newline at end of file diff --git a/mac/LAME_Classic_Final.pch b/mac/LAME_Classic_Final.pch new file mode 100755 index 0000000..326285e --- /dev/null +++ b/mac/LAME_Classic_Final.pch @@ -0,0 +1 @@ +/* LAME Classic Final.pch Precompiled header sources for Classic non-debug build of LAME on Macintosh */ #pragma precompile_target "LAME Classic Final Headers" #define TARGET_API_MAC_OS8 1 #include "Precompile_Common.h" #define LAME_LIBRARY_BUILD 1 // Building library #undef LIBSNDFILE // Build with LIBSNDFILE #define NOANALYSIS 1 // Build without frame-analyzer hooks #undef HAVE_MPGLIB // Build without MPGLIB decoder (forces GPL) #undef USE_LAYER_1 // Build without layer-1 decoding (needs MPGLIB) #undef USE_LAYER_2 // Build without layer-2 decoding (needs MPGLIB) #undef HAVE_VORBIS // Build without Ogg Vorbis #undef BRHIST // Build without histogram (not CLI encoder) #undef NDEBUG // Build final (non-debug) version \ No newline at end of file diff --git a/mac/MacDLLMain.c b/mac/MacDLLMain.c new file mode 100755 index 0000000..8654265 --- /dev/null +++ b/mac/MacDLLMain.c @@ -0,0 +1 @@ +/* MacDLLMain.c */ int main() { return 0; } \ No newline at end of file diff --git a/mac/Makefile.am b/mac/Makefile.am new file mode 100644 index 0000000..e1382cd --- /dev/null +++ b/mac/Makefile.am @@ -0,0 +1,13 @@ +## $Id: Makefile.am,v 1.1 2002/05/28 07:52:10 aleidinger Exp $ + +include $(top_srcdir)/Makefile.am.global + +EXTRA_DIST = \ + .DS_Store \ + LAME.mcp \ + LAME_Carbon_Debug.pch \ + LAME_Carbon_Final.pch \ + LAME_Classic_Debug.pch \ + LAME_Classic_Final.pch \ + MacDLLMain.c \ + Precompile_Common.h diff --git a/mac/Makefile.in b/mac/Makefile.in new file mode 100644 index 0000000..5c5b98d --- /dev/null +++ b/mac/Makefile.in @@ -0,0 +1,480 @@ +# Makefile.in generated by automake 1.15.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2017 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# global section for every Makefile.am +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = mac +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.global +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_DEFS = @CONFIG_DEFS@ +CONFIG_MATH_LIB = @CONFIG_MATH_LIB@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CPUCCODE = @CPUCCODE@ +CPUTYPE = @CPUTYPE@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FRONTEND_CFLAGS = @FRONTEND_CFLAGS@ +FRONTEND_LDADD = @FRONTEND_LDADD@ +FRONTEND_LDFLAGS = @FRONTEND_LDFLAGS@ +GREP = @GREP@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_CONFIG = @GTK_CONFIG@ +GTK_LIBS = @GTK_LIBS@ +INCLUDES = @INCLUDES@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDADD = @LDADD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_MAJOR_VERSION = @LIB_MAJOR_VERSION@ +LIB_MINOR_VERSION = @LIB_MINOR_VERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEDEP = @MAKEDEP@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NASM = @NASM@ +NASM_FORMAT = @NASM_FORMAT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM_F = @RM_F@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_FRONTEND = @WITH_FRONTEND@ +WITH_MP3RTP = @WITH_MP3RTP@ +WITH_MP3X = @WITH_MP3X@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = 1.15 foreign +EXTRA_DIST = \ + .DS_Store \ + LAME.mcp \ + LAME_Carbon_Debug.pch \ + LAME_Carbon_Final.pch \ + LAME_Classic_Debug.pch \ + LAME_Classic_Final.pch \ + MacDLLMain.c \ + Precompile_Common.h + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.global $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign mac/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign mac/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/Makefile.am.global $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# end global section + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/mac/Precompile_Common.h b/mac/Precompile_Common.h new file mode 100755 index 0000000..5d5bf2e --- /dev/null +++ b/mac/Precompile_Common.h @@ -0,0 +1 @@ +/* Common Precompiled headers for LAME on Macintosh Precompiled header source for building LAME on Macintosh using CodeWarrior. Includes most definitions normally generated by configure in config.h, except for the ones that vary from subproject to subproject */ #define TARGET_MAC_DLL 1 #ifndef _ALL_SOURCE /* #undef _ALL_SOURCE */ #endif #define HAVE_ALLOCA 1 #define HAVE_LONG_DOUBLE 1 #define STDC_HEADERS 1 #define TIME_WITH_SYS_TIME 1 #define WORDS_BIGENDIAN 1 #define uint8_t UInt8 #define uint16_t UInt16 #define uint32_t UInt32 #define uint64_t unsigned long long #define ieee854_float80_t long double #define ieee754_float64_t double #define ieee754_float32_t float #define SIZEOF_DOUBLE 8 #define SIZEOF_FLOAT 4 #define SIZEOF_INT 4 #define SIZEOF_LONG 4 #define SIZEOF_LONG_LONG 8 #define SIZEOF_SHORT 2 #define SIZEOF_UNSIGNED_INT 4 #define SIZEOF_UNSIGNED_LONG 4 #define SIZEOF_UNSIGNED_LONG_LONG 8 #define SIZEOF_UNSIGNED_SHORT 2 #define HAVE_GETTIMEOFDAY 1 #define HAVE_SOCKET 1 #define HAVE_STRTOL 1 #define HAVE_ERRNO_H 1 #define HAVE_FCNTL_H 1 #define HAVE_LIMITS_H 1 #define HAVE_STRING_H 1 #define HAVE_SYS_TIME_H 1 #define HAVE_UNISTD_H 1 #define PACKAGE "lame" #define VERSION "3.91" #define PROTOTYPES 1 #define HAVE_IEEE854_FLOAT80 1 #define LIMIT_STACK_USAGE 1 // The following definitions have been pulled out to specific targets' // pch files: // LAME_LIBRARY_BUILD 1 for building the DLL // LIBSNDFILE 1 for building with LibSndFile, applies // only to CLI encoder // NOANALYSIS 1 for building without hooks for the // MP3 frame analyzer // HAVE_MPGLIB 1 for building with MP3 decoding library. // Note MPGLIB, unlike LAME itself, is // GPL as opposed to LGPL and thus unsuitable // for compilation into a DLL that would be used // from a closed-source app. // USE_LAYER_1 1 for building layer-1 decoding into MPGLIB // USE_LAYER_2 1 for building layer-2 decoding into MPGLIB // HAVE_VORBIS 1 for building vorbis support // NDEBUG 1 for building with debug info // BRHIST 1 for histogram display in CLI encoder #define HAVE_TERMCAP 1 #include <MacTypes.h> \ No newline at end of file diff --git a/macosx/English.lproj/InfoPlist.strings b/macosx/English.lproj/InfoPlist.strings new file mode 100644 index 0000000..f8ed77a Binary files /dev/null and b/macosx/English.lproj/InfoPlist.strings differ diff --git a/macosx/English.lproj/Makefile.am b/macosx/English.lproj/Makefile.am new file mode 100644 index 0000000..a08152e --- /dev/null +++ b/macosx/English.lproj/Makefile.am @@ -0,0 +1,7 @@ +## $Id: Makefile.am,v 1.1 2008/05/24 08:28:58 aleidinger Exp $ + +include $(top_srcdir)/Makefile.am.global + +EXTRA_DIST = \ + InfoPlist.strings + diff --git a/macosx/English.lproj/Makefile.in b/macosx/English.lproj/Makefile.in new file mode 100644 index 0000000..bbc8bfd --- /dev/null +++ b/macosx/English.lproj/Makefile.in @@ -0,0 +1,473 @@ +# Makefile.in generated by automake 1.15.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2017 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# global section for every Makefile.am +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = macosx/English.lproj +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.global +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_DEFS = @CONFIG_DEFS@ +CONFIG_MATH_LIB = @CONFIG_MATH_LIB@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CPUCCODE = @CPUCCODE@ +CPUTYPE = @CPUTYPE@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FRONTEND_CFLAGS = @FRONTEND_CFLAGS@ +FRONTEND_LDADD = @FRONTEND_LDADD@ +FRONTEND_LDFLAGS = @FRONTEND_LDFLAGS@ +GREP = @GREP@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_CONFIG = @GTK_CONFIG@ +GTK_LIBS = @GTK_LIBS@ +INCLUDES = @INCLUDES@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDADD = @LDADD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_MAJOR_VERSION = @LIB_MAJOR_VERSION@ +LIB_MINOR_VERSION = @LIB_MINOR_VERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEDEP = @MAKEDEP@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NASM = @NASM@ +NASM_FORMAT = @NASM_FORMAT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM_F = @RM_F@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_FRONTEND = @WITH_FRONTEND@ +WITH_MP3RTP = @WITH_MP3RTP@ +WITH_MP3X = @WITH_MP3X@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = 1.15 foreign +EXTRA_DIST = \ + InfoPlist.strings + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.global $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign macosx/English.lproj/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign macosx/English.lproj/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/Makefile.am.global $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# end global section + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/macosx/Info.plist b/macosx/Info.plist new file mode 100644 index 0000000..1a18a9b --- /dev/null +++ b/macosx/Info.plist @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleExecutable</key> + <string>LAME</string> + <key>CFBundleIdentifier</key> + <string>net.sourceforge.LAMEframework</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundlePackageType</key> + <string>FMWK</string> + <key>CFBundleSignature</key> + <string>LAMh</string> + <key>CFBundleVersion</key> + <string>1.0</string> +</dict> +</plist> diff --git a/macosx/LAME.xcodeproj/Makefile.am b/macosx/LAME.xcodeproj/Makefile.am new file mode 100644 index 0000000..509529c --- /dev/null +++ b/macosx/LAME.xcodeproj/Makefile.am @@ -0,0 +1,7 @@ +## $Id: Makefile.am,v 1.1 2008/05/24 08:28:58 aleidinger Exp $ + +include $(top_srcdir)/Makefile.am.global + +EXTRA_DIST = \ + project.pbxproj + diff --git a/macosx/LAME.xcodeproj/Makefile.in b/macosx/LAME.xcodeproj/Makefile.in new file mode 100644 index 0000000..95cbf03 --- /dev/null +++ b/macosx/LAME.xcodeproj/Makefile.in @@ -0,0 +1,473 @@ +# Makefile.in generated by automake 1.15.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2017 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# global section for every Makefile.am +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = macosx/LAME.xcodeproj +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.global +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_DEFS = @CONFIG_DEFS@ +CONFIG_MATH_LIB = @CONFIG_MATH_LIB@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CPUCCODE = @CPUCCODE@ +CPUTYPE = @CPUTYPE@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FRONTEND_CFLAGS = @FRONTEND_CFLAGS@ +FRONTEND_LDADD = @FRONTEND_LDADD@ +FRONTEND_LDFLAGS = @FRONTEND_LDFLAGS@ +GREP = @GREP@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_CONFIG = @GTK_CONFIG@ +GTK_LIBS = @GTK_LIBS@ +INCLUDES = @INCLUDES@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDADD = @LDADD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_MAJOR_VERSION = @LIB_MAJOR_VERSION@ +LIB_MINOR_VERSION = @LIB_MINOR_VERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEDEP = @MAKEDEP@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NASM = @NASM@ +NASM_FORMAT = @NASM_FORMAT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM_F = @RM_F@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_FRONTEND = @WITH_FRONTEND@ +WITH_MP3RTP = @WITH_MP3RTP@ +WITH_MP3X = @WITH_MP3X@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = 1.15 foreign +EXTRA_DIST = \ + project.pbxproj + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.global $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign macosx/LAME.xcodeproj/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign macosx/LAME.xcodeproj/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/Makefile.am.global $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# end global section + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/macosx/LAME.xcodeproj/project.pbxproj b/macosx/LAME.xcodeproj/project.pbxproj new file mode 100644 index 0000000..d234d19 --- /dev/null +++ b/macosx/LAME.xcodeproj/project.pbxproj @@ -0,0 +1,520 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 42; + objects = { + +/* Begin PBXBuildFile section */ + 8D07F2BE0486CC7A007CD1D0 /* LAME_Prefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = 32BAE0B70371A74B00C91783 /* LAME_Prefix.pch */; }; + 8D07F2C00486CC7A007CD1D0 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C1666FE841158C02AAC07 /* InfoPlist.strings */; }; + EA0A6AD40BB84E38003C87B1 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA0A6AC20BB84D93003C87B1 /* Cocoa.framework */; }; + EA498C8D0DE5E37B00250F0E /* config.h in Headers */ = {isa = PBXBuildFile; fileRef = EA498C8C0DE5E37B00250F0E /* config.h */; }; + EA8CC08809A39A49001379B8 /* lame.h in Headers */ = {isa = PBXBuildFile; fileRef = EA8CC08709A39A49001379B8 /* lame.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EA8CC0A509A39A55001379B8 /* common.c in Sources */ = {isa = PBXBuildFile; fileRef = EA8CC08A09A39A55001379B8 /* common.c */; }; + EA8CC0A609A39A55001379B8 /* common.h in Headers */ = {isa = PBXBuildFile; fileRef = EA8CC08B09A39A55001379B8 /* common.h */; }; + EA8CC0A709A39A55001379B8 /* dct64_i386.c in Sources */ = {isa = PBXBuildFile; fileRef = EA8CC08C09A39A55001379B8 /* dct64_i386.c */; }; + EA8CC0A809A39A55001379B8 /* dct64_i386.h in Headers */ = {isa = PBXBuildFile; fileRef = EA8CC08D09A39A55001379B8 /* dct64_i386.h */; }; + EA8CC0A909A39A55001379B8 /* decode_i386.c in Sources */ = {isa = PBXBuildFile; fileRef = EA8CC08E09A39A55001379B8 /* decode_i386.c */; }; + EA8CC0AA09A39A55001379B8 /* decode_i386.h in Headers */ = {isa = PBXBuildFile; fileRef = EA8CC08F09A39A55001379B8 /* decode_i386.h */; }; + EA8CC0AC09A39A55001379B8 /* huffman.h in Headers */ = {isa = PBXBuildFile; fileRef = EA8CC09109A39A55001379B8 /* huffman.h */; }; + EA8CC0AD09A39A55001379B8 /* interface.c in Sources */ = {isa = PBXBuildFile; fileRef = EA8CC09209A39A55001379B8 /* interface.c */; }; + EA8CC0AE09A39A55001379B8 /* interface.h in Headers */ = {isa = PBXBuildFile; fileRef = EA8CC09309A39A55001379B8 /* interface.h */; }; + EA8CC0AF09A39A55001379B8 /* l2tables.h in Headers */ = {isa = PBXBuildFile; fileRef = EA8CC09409A39A55001379B8 /* l2tables.h */; }; + EA8CC0B009A39A55001379B8 /* layer1.c in Sources */ = {isa = PBXBuildFile; fileRef = EA8CC09509A39A55001379B8 /* layer1.c */; }; + EA8CC0B109A39A55001379B8 /* layer1.h in Headers */ = {isa = PBXBuildFile; fileRef = EA8CC09609A39A55001379B8 /* layer1.h */; }; + EA8CC0B209A39A55001379B8 /* layer2.c in Sources */ = {isa = PBXBuildFile; fileRef = EA8CC09709A39A55001379B8 /* layer2.c */; }; + EA8CC0B309A39A55001379B8 /* layer2.h in Headers */ = {isa = PBXBuildFile; fileRef = EA8CC09809A39A55001379B8 /* layer2.h */; }; + EA8CC0B409A39A55001379B8 /* layer3.c in Sources */ = {isa = PBXBuildFile; fileRef = EA8CC09909A39A55001379B8 /* layer3.c */; }; + EA8CC0B509A39A55001379B8 /* layer3.h in Headers */ = {isa = PBXBuildFile; fileRef = EA8CC09A09A39A55001379B8 /* layer3.h */; }; + EA8CC0B809A39A55001379B8 /* mpg123.h in Headers */ = {isa = PBXBuildFile; fileRef = EA8CC09D09A39A55001379B8 /* mpg123.h */; }; + EA8CC0B909A39A55001379B8 /* mpglib.h in Headers */ = {isa = PBXBuildFile; fileRef = EA8CC09E09A39A55001379B8 /* mpglib.h */; }; + EA8CC0BD09A39A55001379B8 /* tabinit.c in Sources */ = {isa = PBXBuildFile; fileRef = EA8CC0A209A39A55001379B8 /* tabinit.c */; }; + EA8CC0BE09A39A55001379B8 /* tabinit.h in Headers */ = {isa = PBXBuildFile; fileRef = EA8CC0A309A39A55001379B8 /* tabinit.h */; }; + EA8CC0F909A39A5E001379B8 /* bitstream.c in Sources */ = {isa = PBXBuildFile; fileRef = EA8CC0C109A39A5E001379B8 /* bitstream.c */; }; + EA8CC0FA09A39A5E001379B8 /* bitstream.h in Headers */ = {isa = PBXBuildFile; fileRef = EA8CC0C209A39A5E001379B8 /* bitstream.h */; }; + EA8CC0FC09A39A5E001379B8 /* encoder.c in Sources */ = {isa = PBXBuildFile; fileRef = EA8CC0C409A39A5E001379B8 /* encoder.c */; }; + EA8CC0FD09A39A5E001379B8 /* encoder.h in Headers */ = {isa = PBXBuildFile; fileRef = EA8CC0C509A39A5E001379B8 /* encoder.h */; }; + EA8CC0FE09A39A5E001379B8 /* fft.c in Sources */ = {isa = PBXBuildFile; fileRef = EA8CC0C609A39A5E001379B8 /* fft.c */; }; + EA8CC0FF09A39A5E001379B8 /* fft.h in Headers */ = {isa = PBXBuildFile; fileRef = EA8CC0C709A39A5E001379B8 /* fft.h */; }; + EA8CC10009A39A5E001379B8 /* gain_analysis.c in Sources */ = {isa = PBXBuildFile; fileRef = EA8CC0C809A39A5E001379B8 /* gain_analysis.c */; }; + EA8CC10109A39A5E001379B8 /* gain_analysis.h in Headers */ = {isa = PBXBuildFile; fileRef = EA8CC0C909A39A5E001379B8 /* gain_analysis.h */; }; + EA8CC10C09A39A5E001379B8 /* id3tag.c in Sources */ = {isa = PBXBuildFile; fileRef = EA8CC0D509A39A5E001379B8 /* id3tag.c */; }; + EA8CC10D09A39A5E001379B8 /* id3tag.h in Headers */ = {isa = PBXBuildFile; fileRef = EA8CC0D609A39A5E001379B8 /* id3tag.h */; }; + EA8CC10E09A39A5E001379B8 /* l3side.h in Headers */ = {isa = PBXBuildFile; fileRef = EA8CC0D709A39A5E001379B8 /* l3side.h */; }; + EA8CC10F09A39A5E001379B8 /* lame-analysis.h in Headers */ = {isa = PBXBuildFile; fileRef = EA8CC0D809A39A5E001379B8 /* lame-analysis.h */; }; + EA8CC11009A39A5E001379B8 /* lame.c in Sources */ = {isa = PBXBuildFile; fileRef = EA8CC0D909A39A5E001379B8 /* lame.c */; }; + EA8CC11109A39A5E001379B8 /* lame_global_flags.h in Headers */ = {isa = PBXBuildFile; fileRef = EA8CC0DA09A39A5E001379B8 /* lame_global_flags.h */; }; + EA8CC11409A39A5E001379B8 /* machine.h in Headers */ = {isa = PBXBuildFile; fileRef = EA8CC0DD09A39A5E001379B8 /* machine.h */; }; + EA8CC11709A39A5E001379B8 /* mpglib_interface.c in Sources */ = {isa = PBXBuildFile; fileRef = EA8CC0E009A39A5E001379B8 /* mpglib_interface.c */; }; + EA8CC11809A39A5E001379B8 /* newmdct.c in Sources */ = {isa = PBXBuildFile; fileRef = EA8CC0E109A39A5E001379B8 /* newmdct.c */; }; + EA8CC11909A39A5E001379B8 /* newmdct.h in Headers */ = {isa = PBXBuildFile; fileRef = EA8CC0E209A39A5E001379B8 /* newmdct.h */; }; + EA8CC11A09A39A5E001379B8 /* presets.c in Sources */ = {isa = PBXBuildFile; fileRef = EA8CC0E309A39A5E001379B8 /* presets.c */; }; + EA8CC11B09A39A5E001379B8 /* psymodel.c in Sources */ = {isa = PBXBuildFile; fileRef = EA8CC0E409A39A5E001379B8 /* psymodel.c */; }; + EA8CC11C09A39A5E001379B8 /* psymodel.h in Headers */ = {isa = PBXBuildFile; fileRef = EA8CC0E509A39A5E001379B8 /* psymodel.h */; }; + EA8CC11D09A39A5E001379B8 /* quantize.c in Sources */ = {isa = PBXBuildFile; fileRef = EA8CC0E609A39A5E001379B8 /* quantize.c */; }; + EA8CC11E09A39A5E001379B8 /* quantize.h in Headers */ = {isa = PBXBuildFile; fileRef = EA8CC0E709A39A5E001379B8 /* quantize.h */; }; + EA8CC11F09A39A5E001379B8 /* quantize_pvt.c in Sources */ = {isa = PBXBuildFile; fileRef = EA8CC0E809A39A5E001379B8 /* quantize_pvt.c */; }; + EA8CC12009A39A5E001379B8 /* quantize_pvt.h in Headers */ = {isa = PBXBuildFile; fileRef = EA8CC0E909A39A5E001379B8 /* quantize_pvt.h */; }; + EA8CC12109A39A5E001379B8 /* reservoir.c in Sources */ = {isa = PBXBuildFile; fileRef = EA8CC0EA09A39A5E001379B8 /* reservoir.c */; }; + EA8CC12209A39A5E001379B8 /* reservoir.h in Headers */ = {isa = PBXBuildFile; fileRef = EA8CC0EB09A39A5E001379B8 /* reservoir.h */; }; + EA8CC12309A39A5E001379B8 /* set_get.c in Sources */ = {isa = PBXBuildFile; fileRef = EA8CC0EC09A39A5E001379B8 /* set_get.c */; }; + EA8CC12409A39A5E001379B8 /* set_get.h in Headers */ = {isa = PBXBuildFile; fileRef = EA8CC0ED09A39A5E001379B8 /* set_get.h */; }; + EA8CC12509A39A5E001379B8 /* tables.c in Sources */ = {isa = PBXBuildFile; fileRef = EA8CC0EE09A39A5E001379B8 /* tables.c */; }; + EA8CC12609A39A5E001379B8 /* tables.h in Headers */ = {isa = PBXBuildFile; fileRef = EA8CC0EF09A39A5E001379B8 /* tables.h */; }; + EA8CC12709A39A5E001379B8 /* takehiro.c in Sources */ = {isa = PBXBuildFile; fileRef = EA8CC0F009A39A5E001379B8 /* takehiro.c */; }; + EA8CC12809A39A5E001379B8 /* util.c in Sources */ = {isa = PBXBuildFile; fileRef = EA8CC0F109A39A5E001379B8 /* util.c */; }; + EA8CC12909A39A5E001379B8 /* util.h in Headers */ = {isa = PBXBuildFile; fileRef = EA8CC0F209A39A5E001379B8 /* util.h */; }; + EA8CC12A09A39A5E001379B8 /* vbrquantize.c in Sources */ = {isa = PBXBuildFile; fileRef = EA8CC0F309A39A5E001379B8 /* vbrquantize.c */; }; + EA8CC12B09A39A5E001379B8 /* vbrquantize.h in Headers */ = {isa = PBXBuildFile; fileRef = EA8CC0F409A39A5E001379B8 /* vbrquantize.h */; }; + EA8CC12C09A39A5E001379B8 /* VbrTag.c in Sources */ = {isa = PBXBuildFile; fileRef = EA8CC0F509A39A5E001379B8 /* VbrTag.c */; }; + EA8CC12D09A39A5E001379B8 /* VbrTag.h in Headers */ = {isa = PBXBuildFile; fileRef = EA8CC0F609A39A5E001379B8 /* VbrTag.h */; }; + EA8CC12E09A39A5E001379B8 /* version.c in Sources */ = {isa = PBXBuildFile; fileRef = EA8CC0F709A39A5E001379B8 /* version.c */; }; + EA8CC12F09A39A5E001379B8 /* version.h in Headers */ = {isa = PBXBuildFile; fileRef = EA8CC0F809A39A5E001379B8 /* version.h */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 089C1667FE841158C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; }; + 32BAE0B70371A74B00C91783 /* LAME_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LAME_Prefix.pch; sourceTree = "<group>"; }; + 8D07F2C70486CC7A007CD1D0 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; }; + 8D07F2C80486CC7A007CD1D0 /* LAME.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = LAME.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EA0A6AC20BB84D93003C87B1 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; }; + EA498C8C0DE5E37B00250F0E /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = "<group>"; }; + EA8CC08709A39A49001379B8 /* lame.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = lame.h; path = ../include/lame.h; sourceTree = "<group>"; }; + EA8CC08A09A39A55001379B8 /* common.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = common.c; sourceTree = "<group>"; }; + EA8CC08B09A39A55001379B8 /* common.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = "<group>"; }; + EA8CC08C09A39A55001379B8 /* dct64_i386.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = dct64_i386.c; sourceTree = "<group>"; }; + EA8CC08D09A39A55001379B8 /* dct64_i386.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = dct64_i386.h; sourceTree = "<group>"; }; + EA8CC08E09A39A55001379B8 /* decode_i386.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = decode_i386.c; sourceTree = "<group>"; }; + EA8CC08F09A39A55001379B8 /* decode_i386.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = decode_i386.h; sourceTree = "<group>"; }; + EA8CC09109A39A55001379B8 /* huffman.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = huffman.h; sourceTree = "<group>"; }; + EA8CC09209A39A55001379B8 /* interface.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = interface.c; sourceTree = "<group>"; }; + EA8CC09309A39A55001379B8 /* interface.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = interface.h; sourceTree = "<group>"; }; + EA8CC09409A39A55001379B8 /* l2tables.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = l2tables.h; sourceTree = "<group>"; }; + EA8CC09509A39A55001379B8 /* layer1.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = layer1.c; sourceTree = "<group>"; }; + EA8CC09609A39A55001379B8 /* layer1.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = layer1.h; sourceTree = "<group>"; }; + EA8CC09709A39A55001379B8 /* layer2.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = layer2.c; sourceTree = "<group>"; }; + EA8CC09809A39A55001379B8 /* layer2.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = layer2.h; sourceTree = "<group>"; }; + EA8CC09909A39A55001379B8 /* layer3.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = layer3.c; sourceTree = "<group>"; }; + EA8CC09A09A39A55001379B8 /* layer3.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = layer3.h; sourceTree = "<group>"; }; + EA8CC09D09A39A55001379B8 /* mpg123.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = mpg123.h; sourceTree = "<group>"; }; + EA8CC09E09A39A55001379B8 /* mpglib.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = mpglib.h; sourceTree = "<group>"; }; + EA8CC0A209A39A55001379B8 /* tabinit.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = tabinit.c; sourceTree = "<group>"; }; + EA8CC0A309A39A55001379B8 /* tabinit.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = tabinit.h; sourceTree = "<group>"; }; + EA8CC0C109A39A5E001379B8 /* bitstream.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = bitstream.c; sourceTree = "<group>"; }; + EA8CC0C209A39A5E001379B8 /* bitstream.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = bitstream.h; sourceTree = "<group>"; }; + EA8CC0C409A39A5E001379B8 /* encoder.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = encoder.c; sourceTree = "<group>"; }; + EA8CC0C509A39A5E001379B8 /* encoder.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = encoder.h; sourceTree = "<group>"; }; + EA8CC0C609A39A5E001379B8 /* fft.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = fft.c; sourceTree = "<group>"; }; + EA8CC0C709A39A5E001379B8 /* fft.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = fft.h; sourceTree = "<group>"; }; + EA8CC0C809A39A5E001379B8 /* gain_analysis.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = gain_analysis.c; sourceTree = "<group>"; }; + EA8CC0C909A39A5E001379B8 /* gain_analysis.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = gain_analysis.h; sourceTree = "<group>"; }; + EA8CC0D509A39A5E001379B8 /* id3tag.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = id3tag.c; sourceTree = "<group>"; }; + EA8CC0D609A39A5E001379B8 /* id3tag.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = id3tag.h; sourceTree = "<group>"; }; + EA8CC0D709A39A5E001379B8 /* l3side.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = l3side.h; sourceTree = "<group>"; }; + EA8CC0D809A39A5E001379B8 /* lame-analysis.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = "lame-analysis.h"; sourceTree = "<group>"; }; + EA8CC0D909A39A5E001379B8 /* lame.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = lame.c; sourceTree = "<group>"; }; + EA8CC0DA09A39A5E001379B8 /* lame_global_flags.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = lame_global_flags.h; sourceTree = "<group>"; }; + EA8CC0DD09A39A5E001379B8 /* machine.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = machine.h; sourceTree = "<group>"; }; + EA8CC0E009A39A5E001379B8 /* mpglib_interface.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = mpglib_interface.c; sourceTree = "<group>"; }; + EA8CC0E109A39A5E001379B8 /* newmdct.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = newmdct.c; sourceTree = "<group>"; }; + EA8CC0E209A39A5E001379B8 /* newmdct.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = newmdct.h; sourceTree = "<group>"; }; + EA8CC0E309A39A5E001379B8 /* presets.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = presets.c; sourceTree = "<group>"; }; + EA8CC0E409A39A5E001379B8 /* psymodel.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = psymodel.c; sourceTree = "<group>"; }; + EA8CC0E509A39A5E001379B8 /* psymodel.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = psymodel.h; sourceTree = "<group>"; }; + EA8CC0E609A39A5E001379B8 /* quantize.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = quantize.c; sourceTree = "<group>"; }; + EA8CC0E709A39A5E001379B8 /* quantize.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = quantize.h; sourceTree = "<group>"; }; + EA8CC0E809A39A5E001379B8 /* quantize_pvt.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = quantize_pvt.c; sourceTree = "<group>"; }; + EA8CC0E909A39A5E001379B8 /* quantize_pvt.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = quantize_pvt.h; sourceTree = "<group>"; }; + EA8CC0EA09A39A5E001379B8 /* reservoir.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = reservoir.c; sourceTree = "<group>"; }; + EA8CC0EB09A39A5E001379B8 /* reservoir.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = reservoir.h; sourceTree = "<group>"; }; + EA8CC0EC09A39A5E001379B8 /* set_get.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = set_get.c; sourceTree = "<group>"; }; + EA8CC0ED09A39A5E001379B8 /* set_get.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = set_get.h; sourceTree = "<group>"; }; + EA8CC0EE09A39A5E001379B8 /* tables.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = tables.c; sourceTree = "<group>"; }; + EA8CC0EF09A39A5E001379B8 /* tables.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = tables.h; sourceTree = "<group>"; }; + EA8CC0F009A39A5E001379B8 /* takehiro.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = takehiro.c; sourceTree = "<group>"; }; + EA8CC0F109A39A5E001379B8 /* util.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = util.c; sourceTree = "<group>"; }; + EA8CC0F209A39A5E001379B8 /* util.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = util.h; sourceTree = "<group>"; }; + EA8CC0F309A39A5E001379B8 /* vbrquantize.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = vbrquantize.c; sourceTree = "<group>"; }; + EA8CC0F409A39A5E001379B8 /* vbrquantize.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = vbrquantize.h; sourceTree = "<group>"; }; + EA8CC0F509A39A5E001379B8 /* VbrTag.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = VbrTag.c; sourceTree = "<group>"; }; + EA8CC0F609A39A5E001379B8 /* VbrTag.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = VbrTag.h; sourceTree = "<group>"; }; + EA8CC0F709A39A5E001379B8 /* version.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = version.c; sourceTree = "<group>"; }; + EA8CC0F809A39A5E001379B8 /* version.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = version.h; sourceTree = "<group>"; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + EA0A6AD20BB84E32003C87B1 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + EA0A6AD40BB84E38003C87B1 /* Cocoa.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 034768DDFF38A45A11DB9C8B /* Products */ = { + isa = PBXGroup; + children = ( + 8D07F2C80486CC7A007CD1D0 /* LAME.framework */, + ); + name = Products; + sourceTree = "<group>"; + }; + 0867D691FE84028FC02AAC07 /* LAME */ = { + isa = PBXGroup; + children = ( + 08FB77ACFE841707C02AAC07 /* Source */, + 089C1665FE841158C02AAC07 /* Resources */, + 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */, + 034768DDFF38A45A11DB9C8B /* Products */, + ); + name = LAME; + sourceTree = "<group>"; + }; + 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */ = { + isa = PBXGroup; + children = ( + EA0A6AC20BB84D93003C87B1 /* Cocoa.framework */, + ); + name = "External Frameworks and Libraries"; + sourceTree = "<group>"; + }; + 089C1665FE841158C02AAC07 /* Resources */ = { + isa = PBXGroup; + children = ( + 8D07F2C70486CC7A007CD1D0 /* Info.plist */, + 089C1666FE841158C02AAC07 /* InfoPlist.strings */, + ); + name = Resources; + sourceTree = "<group>"; + }; + 08FB77ACFE841707C02AAC07 /* Source */ = { + isa = PBXGroup; + children = ( + 32BAE0B70371A74B00C91783 /* LAME_Prefix.pch */, + EA8CC08709A39A49001379B8 /* lame.h */, + EA498C8C0DE5E37B00250F0E /* config.h */, + EA8CC0C009A39A5E001379B8 /* libmp3lame */, + EA8CC08909A39A55001379B8 /* mpglib */, + ); + name = Source; + sourceTree = "<group>"; + }; + EA8CC08909A39A55001379B8 /* mpglib */ = { + isa = PBXGroup; + children = ( + EA8CC08A09A39A55001379B8 /* common.c */, + EA8CC08B09A39A55001379B8 /* common.h */, + EA8CC08C09A39A55001379B8 /* dct64_i386.c */, + EA8CC08D09A39A55001379B8 /* dct64_i386.h */, + EA8CC08E09A39A55001379B8 /* decode_i386.c */, + EA8CC08F09A39A55001379B8 /* decode_i386.h */, + EA8CC09109A39A55001379B8 /* huffman.h */, + EA8CC09209A39A55001379B8 /* interface.c */, + EA8CC09309A39A55001379B8 /* interface.h */, + EA8CC09409A39A55001379B8 /* l2tables.h */, + EA8CC09509A39A55001379B8 /* layer1.c */, + EA8CC09609A39A55001379B8 /* layer1.h */, + EA8CC09709A39A55001379B8 /* layer2.c */, + EA8CC09809A39A55001379B8 /* layer2.h */, + EA8CC09909A39A55001379B8 /* layer3.c */, + EA8CC09A09A39A55001379B8 /* layer3.h */, + EA8CC09D09A39A55001379B8 /* mpg123.h */, + EA8CC09E09A39A55001379B8 /* mpglib.h */, + EA8CC0A209A39A55001379B8 /* tabinit.c */, + EA8CC0A309A39A55001379B8 /* tabinit.h */, + ); + name = mpglib; + path = ../mpglib; + sourceTree = "<group>"; + }; + EA8CC0C009A39A5E001379B8 /* libmp3lame */ = { + isa = PBXGroup; + children = ( + EA8CC0C109A39A5E001379B8 /* bitstream.c */, + EA8CC0C209A39A5E001379B8 /* bitstream.h */, + EA8CC0C409A39A5E001379B8 /* encoder.c */, + EA8CC0C509A39A5E001379B8 /* encoder.h */, + EA8CC0C609A39A5E001379B8 /* fft.c */, + EA8CC0C709A39A5E001379B8 /* fft.h */, + EA8CC0C809A39A5E001379B8 /* gain_analysis.c */, + EA8CC0C909A39A5E001379B8 /* gain_analysis.h */, + EA8CC0D509A39A5E001379B8 /* id3tag.c */, + EA8CC0D609A39A5E001379B8 /* id3tag.h */, + EA8CC0D709A39A5E001379B8 /* l3side.h */, + EA8CC0D809A39A5E001379B8 /* lame-analysis.h */, + EA8CC0D909A39A5E001379B8 /* lame.c */, + EA8CC0DA09A39A5E001379B8 /* lame_global_flags.h */, + EA8CC0DD09A39A5E001379B8 /* machine.h */, + EA8CC0E009A39A5E001379B8 /* mpglib_interface.c */, + EA8CC0E109A39A5E001379B8 /* newmdct.c */, + EA8CC0E209A39A5E001379B8 /* newmdct.h */, + EA8CC0E309A39A5E001379B8 /* presets.c */, + EA8CC0E409A39A5E001379B8 /* psymodel.c */, + EA8CC0E509A39A5E001379B8 /* psymodel.h */, + EA8CC0E609A39A5E001379B8 /* quantize.c */, + EA8CC0E709A39A5E001379B8 /* quantize.h */, + EA8CC0E809A39A5E001379B8 /* quantize_pvt.c */, + EA8CC0E909A39A5E001379B8 /* quantize_pvt.h */, + EA8CC0EA09A39A5E001379B8 /* reservoir.c */, + EA8CC0EB09A39A5E001379B8 /* reservoir.h */, + EA8CC0EC09A39A5E001379B8 /* set_get.c */, + EA8CC0ED09A39A5E001379B8 /* set_get.h */, + EA8CC0EE09A39A5E001379B8 /* tables.c */, + EA8CC0EF09A39A5E001379B8 /* tables.h */, + EA8CC0F009A39A5E001379B8 /* takehiro.c */, + EA8CC0F109A39A5E001379B8 /* util.c */, + EA8CC0F209A39A5E001379B8 /* util.h */, + EA8CC0F309A39A5E001379B8 /* vbrquantize.c */, + EA8CC0F409A39A5E001379B8 /* vbrquantize.h */, + EA8CC0F509A39A5E001379B8 /* VbrTag.c */, + EA8CC0F609A39A5E001379B8 /* VbrTag.h */, + EA8CC0F709A39A5E001379B8 /* version.c */, + EA8CC0F809A39A5E001379B8 /* version.h */, + ); + name = libmp3lame; + path = ../libmp3lame; + sourceTree = "<group>"; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 8D07F2BD0486CC7A007CD1D0 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 8D07F2BE0486CC7A007CD1D0 /* LAME_Prefix.pch in Headers */, + EA8CC08809A39A49001379B8 /* lame.h in Headers */, + EA8CC0A609A39A55001379B8 /* common.h in Headers */, + EA8CC0A809A39A55001379B8 /* dct64_i386.h in Headers */, + EA8CC0AA09A39A55001379B8 /* decode_i386.h in Headers */, + EA8CC0AC09A39A55001379B8 /* huffman.h in Headers */, + EA8CC0AE09A39A55001379B8 /* interface.h in Headers */, + EA8CC0AF09A39A55001379B8 /* l2tables.h in Headers */, + EA8CC0B109A39A55001379B8 /* layer1.h in Headers */, + EA8CC0B309A39A55001379B8 /* layer2.h in Headers */, + EA8CC0B509A39A55001379B8 /* layer3.h in Headers */, + EA8CC0B809A39A55001379B8 /* mpg123.h in Headers */, + EA8CC0B909A39A55001379B8 /* mpglib.h in Headers */, + EA8CC0BE09A39A55001379B8 /* tabinit.h in Headers */, + EA8CC0FA09A39A5E001379B8 /* bitstream.h in Headers */, + EA8CC0FD09A39A5E001379B8 /* encoder.h in Headers */, + EA8CC0FF09A39A5E001379B8 /* fft.h in Headers */, + EA8CC10109A39A5E001379B8 /* gain_analysis.h in Headers */, + EA8CC10D09A39A5E001379B8 /* id3tag.h in Headers */, + EA8CC10E09A39A5E001379B8 /* l3side.h in Headers */, + EA8CC10F09A39A5E001379B8 /* lame-analysis.h in Headers */, + EA8CC11109A39A5E001379B8 /* lame_global_flags.h in Headers */, + EA8CC11409A39A5E001379B8 /* machine.h in Headers */, + EA8CC11909A39A5E001379B8 /* newmdct.h in Headers */, + EA8CC11C09A39A5E001379B8 /* psymodel.h in Headers */, + EA8CC11E09A39A5E001379B8 /* quantize.h in Headers */, + EA8CC12009A39A5E001379B8 /* quantize_pvt.h in Headers */, + EA8CC12209A39A5E001379B8 /* reservoir.h in Headers */, + EA8CC12409A39A5E001379B8 /* set_get.h in Headers */, + EA8CC12609A39A5E001379B8 /* tables.h in Headers */, + EA8CC12909A39A5E001379B8 /* util.h in Headers */, + EA8CC12B09A39A5E001379B8 /* vbrquantize.h in Headers */, + EA8CC12D09A39A5E001379B8 /* VbrTag.h in Headers */, + EA8CC12F09A39A5E001379B8 /* version.h in Headers */, + EA498C8D0DE5E37B00250F0E /* config.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 8D07F2BC0486CC7A007CD1D0 /* LAME */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4FADC24208B4156D00ABE55E /* Build configuration list for PBXNativeTarget "LAME" */; + buildPhases = ( + 8D07F2BD0486CC7A007CD1D0 /* Headers */, + 8D07F2BF0486CC7A007CD1D0 /* Resources */, + 8D07F2C10486CC7A007CD1D0 /* Sources */, + EA0A6AD20BB84E32003C87B1 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = LAME; + productInstallPath = "$(HOME)/Library/Frameworks"; + productName = LAME; + productReference = 8D07F2C80486CC7A007CD1D0 /* LAME.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 0867D690FE84028FC02AAC07 /* Project object */ = { + isa = PBXProject; + buildConfigurationList = 4FADC24608B4156D00ABE55E /* Build configuration list for PBXProject "LAME" */; + compatibilityVersion = "Xcode 2.4"; + hasScannedForEncodings = 1; + mainGroup = 0867D691FE84028FC02AAC07 /* LAME */; + productRefGroup = 034768DDFF38A45A11DB9C8B /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8D07F2BC0486CC7A007CD1D0 /* LAME */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 8D07F2BF0486CC7A007CD1D0 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8D07F2C00486CC7A007CD1D0 /* InfoPlist.strings in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 8D07F2C10486CC7A007CD1D0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + EA8CC0A509A39A55001379B8 /* common.c in Sources */, + EA8CC0A709A39A55001379B8 /* dct64_i386.c in Sources */, + EA8CC0A909A39A55001379B8 /* decode_i386.c in Sources */, + EA8CC0AD09A39A55001379B8 /* interface.c in Sources */, + EA8CC0B009A39A55001379B8 /* layer1.c in Sources */, + EA8CC0B209A39A55001379B8 /* layer2.c in Sources */, + EA8CC0B409A39A55001379B8 /* layer3.c in Sources */, + EA8CC0BD09A39A55001379B8 /* tabinit.c in Sources */, + EA8CC0F909A39A5E001379B8 /* bitstream.c in Sources */, + EA8CC0FC09A39A5E001379B8 /* encoder.c in Sources */, + EA8CC0FE09A39A5E001379B8 /* fft.c in Sources */, + EA8CC10009A39A5E001379B8 /* gain_analysis.c in Sources */, + EA8CC10C09A39A5E001379B8 /* id3tag.c in Sources */, + EA8CC11009A39A5E001379B8 /* lame.c in Sources */, + EA8CC11709A39A5E001379B8 /* mpglib_interface.c in Sources */, + EA8CC11809A39A5E001379B8 /* newmdct.c in Sources */, + EA8CC11A09A39A5E001379B8 /* presets.c in Sources */, + EA8CC11B09A39A5E001379B8 /* psymodel.c in Sources */, + EA8CC11D09A39A5E001379B8 /* quantize.c in Sources */, + EA8CC11F09A39A5E001379B8 /* quantize_pvt.c in Sources */, + EA8CC12109A39A5E001379B8 /* reservoir.c in Sources */, + EA8CC12309A39A5E001379B8 /* set_get.c in Sources */, + EA8CC12509A39A5E001379B8 /* tables.c in Sources */, + EA8CC12709A39A5E001379B8 /* takehiro.c in Sources */, + EA8CC12809A39A5E001379B8 /* util.c in Sources */, + EA8CC12A09A39A5E001379B8 /* vbrquantize.c in Sources */, + EA8CC12C09A39A5E001379B8 /* VbrTag.c in Sources */, + EA8CC12E09A39A5E001379B8 /* version.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 089C1666FE841158C02AAC07 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 089C1667FE841158C02AAC07 /* English */, + ); + name = InfoPlist.strings; + sourceTree = "<group>"; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 4FADC24308B4156D00ABE55E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_VERSION = A; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = LAME_Prefix.pch; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "@executable_path/../Frameworks/"; + LIBRARY_STYLE = DYNAMIC; + MACH_O_TYPE = mh_dylib; + PRODUCT_NAME = LAME; + WRAPPER_EXTENSION = framework; + ZERO_LINK = NO; + }; + name = Debug; + }; + 4FADC24408B4156D00ABE55E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = ( + ppc, + i386, + ); + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_VERSION = A; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_MODEL_TUNING = G5; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = LAME_Prefix.pch; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "@executable_path/../Frameworks/"; + LIBRARY_STYLE = DYNAMIC; + MACH_O_TYPE = mh_dylib; + PRODUCT_NAME = LAME; + WRAPPER_EXTENSION = framework; + ZERO_LINK = NO; + }; + name = Release; + }; + 4FADC24708B4156D00ABE55E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PREBINDING = NO; + SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; + }; + name = Debug; + }; + 4FADC24808B4156D00ABE55E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PREBINDING = NO; + SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 4FADC24208B4156D00ABE55E /* Build configuration list for PBXNativeTarget "LAME" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4FADC24308B4156D00ABE55E /* Debug */, + 4FADC24408B4156D00ABE55E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4FADC24608B4156D00ABE55E /* Build configuration list for PBXProject "LAME" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4FADC24708B4156D00ABE55E /* Debug */, + 4FADC24808B4156D00ABE55E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 0867D690FE84028FC02AAC07 /* Project object */; +} diff --git a/macosx/LAME_Prefix.pch b/macosx/LAME_Prefix.pch new file mode 100644 index 0000000..aa1089d --- /dev/null +++ b/macosx/LAME_Prefix.pch @@ -0,0 +1,7 @@ +// +// Prefix header for all source files of the 'LAME' target in the 'LAME' project. +// + +#include <Carbon/Carbon.h> + +#define HAVE_CONFIG_H diff --git a/macosx/Makefile.am b/macosx/Makefile.am new file mode 100644 index 0000000..4ef0d27 --- /dev/null +++ b/macosx/Makefile.am @@ -0,0 +1,10 @@ +## $Id: Makefile.am,v 1.2 2008/05/24 08:28:58 aleidinger Exp $ + +include $(top_srcdir)/Makefile.am.global + +SUBDIRS = English.lproj LAME.xcodeproj + + +EXTRA_DIST = \ + Info.plist \ + LAME_Prefix.pch diff --git a/macosx/Makefile.in b/macosx/Makefile.in new file mode 100644 index 0000000..3f51764 --- /dev/null +++ b/macosx/Makefile.in @@ -0,0 +1,655 @@ +# Makefile.in generated by automake 1.15.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2017 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# global section for every Makefile.am +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = macosx +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + distdir +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.global +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_DEFS = @CONFIG_DEFS@ +CONFIG_MATH_LIB = @CONFIG_MATH_LIB@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CPUCCODE = @CPUCCODE@ +CPUTYPE = @CPUTYPE@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FRONTEND_CFLAGS = @FRONTEND_CFLAGS@ +FRONTEND_LDADD = @FRONTEND_LDADD@ +FRONTEND_LDFLAGS = @FRONTEND_LDFLAGS@ +GREP = @GREP@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_CONFIG = @GTK_CONFIG@ +GTK_LIBS = @GTK_LIBS@ +INCLUDES = @INCLUDES@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDADD = @LDADD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_MAJOR_VERSION = @LIB_MAJOR_VERSION@ +LIB_MINOR_VERSION = @LIB_MINOR_VERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEDEP = @MAKEDEP@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NASM = @NASM@ +NASM_FORMAT = @NASM_FORMAT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM_F = @RM_F@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_FRONTEND = @WITH_FRONTEND@ +WITH_MP3RTP = @WITH_MP3RTP@ +WITH_MP3X = @WITH_MP3X@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = 1.15 foreign +SUBDIRS = English.lproj LAME.xcodeproj +EXTRA_DIST = \ + Info.plist \ + LAME_Prefix.pch + +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.global $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign macosx/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign macosx/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/Makefile.am.global $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(am__recursive_targets) install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ + check-am clean clean-generic clean-libtool cscopelist-am ctags \ + ctags-am distclean distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# end global section + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/misc/Lame.vbs b/misc/Lame.vbs new file mode 100644 index 0000000..4e42002 --- /dev/null +++ b/misc/Lame.vbs @@ -0,0 +1,158 @@ +' lame.vbs WindowsScript wrapper v0.5, 06/15/2001 +' $id$ +' +' *Purpose* +' Use this WindowsScript to encode WAVs using drag&drop: +' 0. make sure you have windows script host v5.1 on your system +' (enter 'cscript' in a DOS-Box and compare version number) +' 1. adjust the path settings below to fit your needs +' 2a. put this file somewhere on the desktop +' 3a. drag one or more wav-files on the icon and watch them being lamed. +' +' 2b. start->execute, enter "sendto", drag the script or a link to it in +' sendto window (adjust names and icon as you like) +' 3b. select wave-file(s) and send it via the send-to menu to LAME! +' +' You may wish to create copies of this file with different options set. +' +' If you would like a GUI: try to enable the HTML UI (see below) +' +' Ralf Kempkens, ralf.kempkens@epost.de +' +' +' *History* +' V0.5 * lame.vbs will automatically decode if the file has a .mp3 extension +' * now explicitly refuses to accept folders +' V0.4 * creates single .mp3 extensions, now ID3 options in HTML interface +' V0.3 * fixed bug that prevented lame.exe to be located in a path that +' contained a space +' * experimental HTML UI support (disabled by default) +' V0.2 added multiple file support +' V0.1 initial release + +' *** change path to your needs *** + path = "D:\Audio\Lame\Lame386\" '!!! must end with a backslash !!! + lame = "lame.exe" + +' *** change default options to your needs *** + opts = "--preset hifi" + +' *** HTML GUI (experimental) *** + useGUI = False +' it set to True, opens file lameGUI.html residing in the same path as lame.exe +' to choose options. Please look at the example HTML-file for further information. + +' no changes needed below this line +' ########################################################################## +Dim wsh, args, infile, fs +title="LAME Script" + +' get input files +Set wsh = WScript.CreateObject("WScript.Shell") +Set args = WScript.Arguments +If args.Count = 0 Then + MsgBox "LAME mp3 encoder/decoder frontend script." & vbCR & _ + "Please use drag & drop to specify input files.", vbInformation, title + WScript.Quit +End If + +' check path +Set fso = CreateObject("Scripting.FileSystemObject") +If Not fso.FileExists(path & lame) Then + MsgBox "Could not find LAME!" & vbCR & "(looked for '" & path & lame & "')", vbCritical, title + WScript.Quit +End If + +' start GUI +if useGUI Then + set ie=WScript.CreateObject("InternetExplorer.Application", "ie_") + ie.navigate(path & "lameGUI.html") + do + WScript.Sleep 100 + loop until ie.ReadyState=4 'wait for GUI + + ie.Width=640 + ie.Height=600 + ie.Toolbar=false + ie.Statusbar=false + ie.visible=true + + 'link to GUI + set document=ie.document + document.forms.lameform.okbutton.onClick=GetRef("okbutton") + + 'wait for user pressing ok... + do + WScript.Sleep 300 + loop until process +end if + +'process files +For i = 0 To args.Count-1 + infile = args(i) + ' check input file + If fso.FolderExists(infile) Then + MsgBox "'" & infile & "' is a folder!" & vbCR & _ + title & " only handles proper files.", vbInformation, title + Else + If Not fso.FileExists(infile) Then + MsgBox "Error opening input-file" & vbCR & "'" & infile & "'", vbCritical , title + Else + ' run lame + If(LCase(getExtension(infile))="mp3") Then 'decode + ret = wsh.Run(Chr(34) & path & lame & CHR(34) & " --decode " & _ + Chr(34) & infile & Chr(34) & Chr(32) & Chr(34) & _ + getBasename(infile) & ".wav" & Chr(34), 1, True) + Else ' encode + ret = wsh.Run(Chr(34) & path & lame & CHR(34) & Chr(32) & opts & Chr(32) & _ + Chr(34) & infile & Chr(34) & Chr(32) & Chr(34) & _ + getBasename(infile) & ".mp3" & Chr(34), 1, True) + End If + ' diagnostics + Select Case ret + Case (0) 'okeydokey + Case (-1) + MsgBox "LAME aborted by user!", vbExclamation, title + Case (1) + MsgBox "Error returned by LAME!" & vbCR & "(Check LAME options and input file formats.)" & vbCR & "Used Options: " & opts, vbCritical, title + Case Else + MsgBox "Received unknown LAME return-code: " & ret, vbCritical, title + End Select + End If + End If +Next + +WScript.Quit +' ******************************************************************* +' utility functions + +Function getBasename(filespec) + Dim fso + Set fso = CreateObject("Scripting.FileSystemObject") + Set f = fso.GetFile(filespec) + + getBasename = f.ParentFolder & "\" & fso.GetBaseName(filespec) +End Function + +Function getExtension(filespec) + Dim fso + Set fso = CreateObject("Scripting.FileSystemObject") + Set f = fso.GetFile(filespec) + + getExtension = fso.GetExtensionName(filespec) +End Function + +' ******************************************************************* +' manage link to IE HTML-interface + +sub okbutton + 'process inputs + opts=document.all.lameoptions.Value + ie.Quit + MsgBox "LAME options:" & vbCR & opts, vbInformation, title +end sub + +sub ie_onQuit + process=True +end sub +'eof diff --git a/misc/Makefile.am b/misc/Makefile.am new file mode 100644 index 0000000..3e00fcd --- /dev/null +++ b/misc/Makefile.am @@ -0,0 +1,28 @@ +## $Id: Makefile.am,v 1.11 2011/11/05 16:32:13 robert Exp $ + +include $(top_srcdir)/Makefile.am.global + +EXTRA_PROGRAMS = abx ath scalartest + +CLEANFILES = $(EXTRA_PROGRAMS) + +EXTRA_SCRIPTS = \ + auenc \ + lameid3.pl \ + mugeco.sh \ + mlame \ + mk_mp3.sh + +EXTRA_DIST = \ + $(EXTRA_SCRIPTS) \ + Lame.vbs \ + lameGUI.html \ + lame4dos.bat \ + mlame_corr.c + +abx_SOURCES = abx.c + +ath_SOURCES = ath.c + +scalartest_SOURCES = scalartest.c + diff --git a/misc/Makefile.in b/misc/Makefile.in new file mode 100644 index 0000000..828d5cb --- /dev/null +++ b/misc/Makefile.in @@ -0,0 +1,641 @@ +# Makefile.in generated by automake 1.15.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2017 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# global section for every Makefile.am +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +EXTRA_PROGRAMS = abx$(EXEEXT) ath$(EXEEXT) scalartest$(EXEEXT) +subdir = misc +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am_abx_OBJECTS = abx.$(OBJEXT) +abx_OBJECTS = $(am_abx_OBJECTS) +abx_LDADD = $(LDADD) +abx_DEPENDENCIES = +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +am_ath_OBJECTS = ath.$(OBJEXT) +ath_OBJECTS = $(am_ath_OBJECTS) +ath_LDADD = $(LDADD) +ath_DEPENDENCIES = +am_scalartest_OBJECTS = scalartest.$(OBJEXT) +scalartest_OBJECTS = $(am_scalartest_OBJECTS) +scalartest_LDADD = $(LDADD) +scalartest_DEPENDENCIES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(abx_SOURCES) $(ath_SOURCES) $(scalartest_SOURCES) +DIST_SOURCES = $(abx_SOURCES) $(ath_SOURCES) $(scalartest_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.global $(top_srcdir)/depcomp depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_DEFS = @CONFIG_DEFS@ +CONFIG_MATH_LIB = @CONFIG_MATH_LIB@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CPUCCODE = @CPUCCODE@ +CPUTYPE = @CPUTYPE@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FRONTEND_CFLAGS = @FRONTEND_CFLAGS@ +FRONTEND_LDADD = @FRONTEND_LDADD@ +FRONTEND_LDFLAGS = @FRONTEND_LDFLAGS@ +GREP = @GREP@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_CONFIG = @GTK_CONFIG@ +GTK_LIBS = @GTK_LIBS@ +INCLUDES = @INCLUDES@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDADD = @LDADD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_MAJOR_VERSION = @LIB_MAJOR_VERSION@ +LIB_MINOR_VERSION = @LIB_MINOR_VERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEDEP = @MAKEDEP@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NASM = @NASM@ +NASM_FORMAT = @NASM_FORMAT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM_F = @RM_F@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_FRONTEND = @WITH_FRONTEND@ +WITH_MP3RTP = @WITH_MP3RTP@ +WITH_MP3X = @WITH_MP3X@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = 1.15 foreign +CLEANFILES = $(EXTRA_PROGRAMS) +EXTRA_SCRIPTS = \ + auenc \ + lameid3.pl \ + mugeco.sh \ + mlame \ + mk_mp3.sh + +EXTRA_DIST = \ + $(EXTRA_SCRIPTS) \ + Lame.vbs \ + lameGUI.html \ + lame4dos.bat \ + mlame_corr.c + +abx_SOURCES = abx.c +ath_SOURCES = ath.c +scalartest_SOURCES = scalartest.c +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.global $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign misc/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign misc/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/Makefile.am.global $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +abx$(EXEEXT): $(abx_OBJECTS) $(abx_DEPENDENCIES) $(EXTRA_abx_DEPENDENCIES) + @rm -f abx$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(abx_OBJECTS) $(abx_LDADD) $(LIBS) + +ath$(EXEEXT): $(ath_OBJECTS) $(ath_DEPENDENCIES) $(EXTRA_ath_DEPENDENCIES) + @rm -f ath$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(ath_OBJECTS) $(ath_LDADD) $(LIBS) + +scalartest$(EXEEXT): $(scalartest_OBJECTS) $(scalartest_DEPENDENCIES) $(EXTRA_scalartest_DEPENDENCIES) + @rm -f scalartest$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(scalartest_OBJECTS) $(scalartest_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/abx.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ath.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scalartest.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool cscopelist-am ctags ctags-am distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# end global section + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/misc/abx.c b/misc/abx.c new file mode 100644 index 0000000..c06364d --- /dev/null +++ b/misc/abx.c @@ -0,0 +1,1323 @@ +/* + * Usage: abx original_file test_file + * + * Ask you as long as the probability is below the given percentage that + * you recognize differences + * + * Example: abx music.wav music.mp3 + * abx music.wav music.mp3 --help + * + * Note: several 'decoding' utilites must be on the 'right' place + * + * Bugs: + * fix path of decoding utilities + * only 16 bit support + * only support of the same sample frequency + * no exact WAV file header analysis + * no mouse or joystick support + * don't uses functionality of ath.c + * only 2 files are comparable + * worse user interface + * quick & dirty hack + * wastes memory + * compile time warnings + * buffer overruns possible + * no dithering if recalcs are necessary + * correlation only done with one channel (2 channels, sum, what is better?) + * lowpass+highpass filtering (300 Hz+2*5 kHz) before delay+amplitude corr + * cross fade at start/stop + * non portable keyboard + * fade out on quit, fade in on start + * level/delay ajustment should be switchable + * pause key missing + * problems with digital silence files (division by 0) + * Gr��e cross corr fenster 2^16...18 + * Stellensuche, ab 0*len oder 0.1*len oder 0.25*len, nach Effektiv oder Spitzenwert + * Absturz bei LPAC feeding, warum? + * Als 'B' beim Ratespiel sollte auch '0'...'9' verwendbar sein + * Oder mit einem Filter 300 Hz...3 kHz vorher filtern? + * Multiple encoded differenziertes Signal + * Amplitudenanpassung schaltbar machen? + * Direkt auf der Kommandozeile kodieren: + * abx "test.wav" "!lame -b128 test.wav -" + */ + +// If the program should increase it priority while playing define USE_NICE. +// Program must be installed SUID root. Decompressing phase is using NORMAL priority +#define USE_NICE + +// Not only increase priority but change to relatime scheduling. Program must be installed SUID root +#define USE_REALTIME + +// Path of the programs: mpg123, mppdec, faad, ac3dec, ogg123, lpac, shorten, MAC, flac +//#define PATH_OF_EXTERNAL_TOOLS_FOR_UNCOMPRESSING "/usr/local/bin/" +#define PATH_OF_EXTERNAL_TOOLS_FOR_UNCOMPRESSING "" + + +#if defined HAVE_CONFIG_H +# include <config.h> +#endif + +#include <assert.h> +#include <ctype.h> +#include <fcntl.h> +#include <limits.h> +#include <math.h> +#include <memory.h> +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <termios.h> +#include <time.h> +#include <unistd.h> +#include <sys/ioctl.h> +#include <sys/mman.h> +#include <sys/stat.h> +#include <sys/time.h> +#include <sys/types.h> + +#define MAX (1<<17) + +#if defined HAVE_SYS_SOUNDCARD_H +# include <sys/soundcard.h> +#elif defined HAVE_LINUX_SOUNDCARD_H +# include <linux/soundcard.h> +#else +# include <linux/soundcard.h> /* stand alone compilable for my tests */ +#endif + +#if defined USE_NICE +# include <sys/resource.h> +#endif +#if defined USE_REALTIME +# include <sched.h> +#endif + +#define BF ((freq)/25) +#define MAX_LEN (210 * 44100) +#define DMA_SAMPLES 512 /* My Linux driver uses a DMA buffer of 65536*16 bit, which is 32768 samples in 16 bit stereo mode */ + +void Set_Realtime ( void ) +{ +#if defined USE_REALTIME + struct sched_param sp; + int ret; + + memset ( &sp, 0, sizeof(sp) ); + seteuid ( 0 ); + sp.sched_priority = sched_get_priority_min ( SCHED_FIFO ); + ret = sched_setscheduler ( 0, SCHED_RR, &sp ); + seteuid ( getuid() ); +#endif + +#if defined USE_NICE + seteuid ( 0 ); + setpriority ( PRIO_PROCESS, getpid(), -20 ); + seteuid ( getuid() ); +#endif +} + +int verbose = 0; + +static struct termios stored_settings; + + +void reset ( void ) +{ + tcsetattr ( 0, TCSANOW, &stored_settings ); +} + + +void set ( void ) +{ + struct termios new_settings; + + tcgetattr ( 0, &stored_settings ); + new_settings = stored_settings; + + new_settings.c_lflag &= ~ECHO; + /* Disable canonical mode, and set buffer size to 1 byte */ + new_settings.c_lflag &= ~ICANON; + new_settings.c_cc[VTIME] = 0; + new_settings.c_cc[VMIN] = 1; + + tcsetattr(0,TCSANOW,&new_settings); + return; +} + + +int sel ( void ) +{ + struct timeval t; + fd_set fd [1]; + int ret; + unsigned char c; + + FD_SET (0, fd); + t.tv_sec = 0; + t.tv_usec = 0; + + ret = select ( 1, fd, NULL, NULL, &t ); + + switch ( ret ) { + case 0: + return -1; + case 1: + ret = read (0, &c, 1); + return ret == 1 ? c : -1; + default: + return -2; + } +} + +#define FFT_ERR_OK 0 // no error +#define FFT_ERR_LD 1 // len is not a power of 2 +#define FFT_ERR_MAX 2 // len too large + +typedef float f_t; +typedef f_t compl [2]; +compl root [MAX >> 1]; // Sinus-/Kosinustabelle +size_t shuffle [MAX >> 1] [2]; // Shuffle-Tabelle +size_t shuffle_len; + +// Bitinversion + +size_t swap ( size_t number, int bits ) +{ + size_t ret; + for ( ret = 0; bits--; number >>= 1 ) { + ret = ret + ret + (number & 1); + } + return ret; +} + +// Bestimmen des Logarithmus dualis + +int ld ( size_t number ) +{ + size_t i; + for ( i = 0; i < sizeof(size_t)*CHAR_BIT; i++ ) + if ( ((size_t)1 << i) == number ) + return i; + return -1; +} + +// Die eigentliche FFT + +int fft ( compl* fn, const size_t newlen ) +{ + static size_t len = 0; + static int bits = 0; + size_t i; + size_t j; + size_t k; + size_t p; + + /* Tabellen initialisieren */ + + if ( newlen != len ) { + len = newlen; + + if ( (bits=ld(len)) == -1 ) + return FFT_ERR_LD; + + for ( i = 0; i < len; i++ ) { + j = swap ( i, bits ); + if ( i < j ) { + shuffle [shuffle_len] [0] = i; + shuffle [shuffle_len] [1] = j; + shuffle_len++; + } + } + for ( i = 0; i < (len>>1); i++ ) { + double x = (double) swap ( i+i, bits ) * 2*M_PI/len; + root [i] [0] = cos (x); + root [i] [1] = sin (x); + } + } + + /* Eigentliche Transformation */ + + p = len >> 1; + do { + f_t* bp = (f_t*) root; + f_t* si = (f_t*) fn; + f_t* di = (f_t*) fn+p+p; + + do { + k = p; + do { + f_t mulr = bp[0]*di[0] - bp[1]*di[1]; + f_t muli = bp[1]*di[0] + bp[0]*di[1]; + + di[0] = si[0] - mulr; + di[1] = si[1] - muli; + si[0] += mulr; + si[1] += muli; + + si += 2, di += 2; + } while ( --k ); + si += p+p, di += p+p, bp += 2; + } while ( si < &fn[len][0] ); + } while (p >>= 1); + + /* Bitinversion */ + + for ( k = 0; k < shuffle_len; k++ ) { + f_t tmp; + i = shuffle [k] [0]; + j = shuffle [k] [1]; + tmp = fn [i][0]; fn [i][0] = fn [j][0]; fn [j][0] = tmp; + tmp = fn [i][1]; fn [i][1] = fn [j][1]; fn [j][1] = tmp; + } + + return FFT_ERR_OK; +} + +void printnumber ( long double x ) +{ + unsigned exp = 0; + + if ( x < 9.999995 ) fprintf ( stderr, "%7.5f", (double)x ); + else if ( x < 99.99995 ) fprintf ( stderr, "%7.4f", (double)x ); + else if ( x < 999.9995 ) fprintf ( stderr, "%7.3f", (double)x ); + else if ( x < 9999.995 ) fprintf ( stderr, "%7.2f", (double)x ); + else if ( x < 99999.95 ) fprintf ( stderr, "%7.1f", (double)x ); + else if ( x < 999999.5 ) fprintf ( stderr, "%6.0f.", (double)x ); + else if ( x < 9999999.5 ) fprintf ( stderr, "%7.0f", (double)x ); + else if ( x < 9.9995e9 ) { + while ( x >= 9.9995 ) exp++ , x /= 10; + fprintf ( stderr, "%5.3fe%01u", (double)x, exp ); + } else if ( x < 9.995e99 ) { + while ( x >= 9.5e6 ) exp+=6 , x /= 1.e6; + while ( x >= 9.995 ) exp++ , x /= 10; + fprintf ( stderr, "%4.2fe%02u", (double)x, exp ); + } else if ( x < 9.95e999L ) { + while ( x >= 9.5e18 ) exp+=18, x /= 1.e18; + while ( x >= 9.95 ) exp++ , x /= 10; + fprintf ( stderr, "%3.1fe%03u", (double)x, exp ); + } else { + while ( x >= 9.5e48 ) exp+=48, x /= 1.e48; + while ( x >= 9.5 ) exp++ , x /= 10; + fprintf ( stderr, "%1.0f.e%04u", (double)x, exp ); + } +} + +double logdual ( long double x ) +{ + unsigned exp = 0; + + while ( x >= 18446744073709551616. ) + x /= 18446744073709551616., exp += 64; + while ( x >= 256. ) + x /= 256., exp += 8; + while ( x >= 2. ) + x /= 2., exp += 1; + return exp + log (x)/log(2); +} + +int random_number ( void ) +{ + struct timeval t; + unsigned long val; + + gettimeofday ( &t, NULL ); + + val = t.tv_sec ^ t.tv_usec ^ rand(); + val ^= val >> 16; + val ^= val >> 8; + val ^= val >> 4; + val ^= val >> 2; + val ^= val >> 1; + + return val & 1; +} + +long double prob ( int last, int total ) +{ + long double sum = 0.; + long double tmp = 1.; + int i; + int j = total; + + if ( 2*last == total ) + return 1.; + if ( 2*last > total ) + last = total - last; + + for ( i = 0; i <= last; i++ ) { + sum += tmp; + tmp = tmp * (total-i) / (1+i); + while ( j > 0 && tmp > 1 ) + j--, sum *= 0.5, tmp *= 0.5; + } + while ( j > 0 ) + j--, sum *= 0.5; + + return 2.*sum; +} + + +void eval ( int right ) +{ + static int count = 0; + static int okay = 0; + long double val; + + count ++; + okay += right; + + val = 1.L / prob ( okay, count ); + + fprintf (stderr, " %s %5u/%-5u ", right ? "OK" : "- " , okay, count ); + printnumber (val); + if ( count > 1 ) + fprintf (stderr, " %4.2f bit", 0.01 * (int)(logdual(val) / (count-1) * 100.) ); + fprintf ( stderr, "\n" ); +} + + +typedef signed short sample_t; +typedef sample_t mono_t [1]; +typedef sample_t stereo_t [2]; +typedef struct { + unsigned long n; + long double x; + long double x2; + long double y; + long double y2; + long double xy; +} korr_t; + + +void analyze_stereo ( const stereo_t* p1, const stereo_t* p2, size_t len, korr_t* const k ) +{ + long double _x = 0, _x2 = 0, _y = 0, _y2 = 0, _xy = 0; + double t1; + double t2; + + k -> n += 2*len; + + for ( ; len--; p1++, p2++ ) { + _x += (t1 = (*p1)[0]); _x2 += t1 * t1; + _y += (t2 = (*p2)[0]); _y2 += t2 * t2; + _xy += t1 * t2; + _x += (t1 = (*p1)[1]); _x2 += t1 * t1; + _y += (t2 = (*p2)[1]); _y2 += t2 * t2; + _xy += t1 * t2; + } + + k -> x += _x ; + k -> x2 += _x2; + k -> y += _y ; + k -> y2 += _y2; + k -> xy += _xy; +} + +int sgn ( double x ) +{ + if ( x == 0 ) return 0; + if ( x < 0 ) return -1; + return +1; +} + +long double report ( const korr_t* const k ) +{ + long double r; + long double sx; + long double sy; + long double x; + long double y; + long double b; + + r = (k->x2*k->n - k->x*k->x) * (k->y2*k->n - k->y*k->y); + r = r > 0.l ? (k->xy*k->n - k->x*k->y) / sqrt (r) : 1.l; + sx = k->n > 1 ? sqrt ( (k->x2 - k->x*k->x/k->n) / (k->n - 1) ) : 0.l; + sy = k->n > 1 ? sqrt ( (k->y2 - k->y*k->y/k->n) / (k->n - 1) ) : 0.l; + x = k->n > 0 ? k->x/k->n : 0.l; + y = k->n > 0 ? k->y/k->n : 0.l; + + b = sx != 0 ? sy/sx * sgn(r) : 0.l; + if (verbose) + fprintf ( stderr, "r=%Lf sx=%Lf sy=%Lf x=%Lf y=%Lf b=%Lf\n", r, sx, sy, x, y, b ); + return b; +} + + +/* Input: an unsigned short n. + * Output: the swapped bytes of n if the arch is big-endian or n itself + * if the arch is little-endian. + * Comment: should be replaced latter with a better solution than this + * home-brewed hack (rbrito). The name should be better also. + */ +inline unsigned short be16_le(unsigned short n) +{ +#ifdef _WORDS_BIGENDIAN + return (n << 8) | (n >> 8); +#else + return n; +#endif +} + + +int feed ( int fd, const stereo_t* p, int len ) +{ + int i; + stereo_t tmp[30000]; /* An arbitrary size--to be changed latter */ + + if (len > sizeof(tmp)/sizeof(*tmp)) + len = sizeof(tmp)/sizeof(*tmp); + + for (i = 0; i < len; i++) { + tmp[i][0] = be16_le(p[i][0]); + tmp[i][1] = be16_le(p[i][1]); + } + + write ( fd, tmp, sizeof(stereo_t) * len ); + return len; +} + + +short round ( double f ) +{ + long x = (long) floor ( f + 0.5 ); + return x == (short)x ? (short)x : (short) ((x >> 31) ^ 0x7FFF); +} + + +int feed2 ( int fd, const stereo_t* p1, const stereo_t* p2, int len ) +{ + stereo_t tmp [30000]; /* An arbitrary size, hope that no overruns occure */ + int i; + + if (len > sizeof(tmp)/sizeof(*tmp)) + len = sizeof(tmp)/sizeof(*tmp); + for ( i = 0; i < len; i++ ) { + double f = cos ( M_PI/2*i/len ); + f *= f; + tmp [i] [0] = be16_le(round ( p1 [i] [0] * f + p2 [i] [0] * (1. - f) )); + tmp [i] [1] = be16_le(round ( p1 [i] [1] * f + p2 [i] [1] * (1. - f) )); + } + + write ( fd, tmp, sizeof(stereo_t) * len ); + return len; +} + + +int feedfac ( int fd, const stereo_t* p1, const stereo_t* p2, int len, double fac1, double fac2 ) +{ + stereo_t tmp [30000]; /* An arbitrary size, hope that no overruns occure */ + int i; + + if (len > sizeof(tmp)/sizeof(*tmp)) + len = sizeof(tmp)/sizeof(*tmp); + for ( i = 0; i < len; i++ ) { + tmp [i] [0] = be16_le(round ( p1 [i] [0] * fac1 + p2 [i] [0] * fac2 )); + tmp [i] [1] = be16_le(round ( p1 [i] [1] * fac1 + p2 [i] [1] * fac2 )); + } + + write ( fd, tmp, sizeof(stereo_t) * len ); + return len; +} + + +void setup ( int fdd, int samples, long freq ) +{ + int status, org, arg; + + // Nach vorn verschoben + if ( -1 == (status = ioctl (fdd, SOUND_PCM_SYNC, 0)) ) + perror ("SOUND_PCM_SYNC ioctl failed"); + + org = arg = 2; + if ( -1 == (status = ioctl (fdd, SOUND_PCM_WRITE_CHANNELS, &arg)) ) + perror ("SOUND_PCM_WRITE_CHANNELS ioctl failed"); + if (arg != org) + perror ("unable to set number of channels"); + fprintf (stderr, "%1u*", arg); + + org = arg = AFMT_S16_LE; + if ( -1 == ioctl (fdd, SNDCTL_DSP_SETFMT, &arg) ) + perror ("SNDCTL_DSP_SETFMT ioctl failed"); + if ((arg & org) == 0) + perror ("unable to set data format"); + + org = arg = freq; + if ( -1 == (status = ioctl (fdd, SNDCTL_DSP_SPEED, &arg)) ) + perror ("SNDCTL_DSP_SPEED ioctl failed"); + fprintf (stderr, "%5u Hz*%.3f sec\n", arg, (double)samples/arg ); + +} + + +void Message ( const char* s, size_t index, long freq, size_t start, size_t stop ) +{ + unsigned long norm_index = 100lu * index / freq; + unsigned long norm_start = 100lu * start / freq; + unsigned long norm_stop = 100lu * stop / freq; + + fprintf ( stderr, "\rListening %s %2lu:%02lu.%02lu (%1lu:%02lu.%02lu...%1lu:%02lu.%02lu)%*.*s\rListening %s", + s, + norm_index / 6000, norm_index / 100 % 60, norm_index % 100, + norm_start / 6000, norm_start / 100 % 60, norm_start % 100, + norm_stop / 6000, norm_stop / 100 % 60, norm_stop % 100, + 36 - (int)strlen(s), 36 - (int)strlen(s), "", + s ); + + fflush ( stderr ); +} + + +size_t calc_true_index ( size_t index, size_t start, size_t stop ) +{ + if ( start >= stop ) + return start; + while ( index - start < DMA_SAMPLES ) + index += stop - start; + return index - DMA_SAMPLES; +} + + +void testing ( const stereo_t* A, const stereo_t* B, size_t len, long freq ) +{ + int c; + int fd = open ( "/dev/dsp", O_WRONLY ); + int rnd = random_number (); /* Auswahl von X */ + int state = 0; /* derzeitiger F�ttungsmodus */ + float fac1 = 0.5; + float fac2 = 0.5; + size_t start = 0; + size_t stop = len; + size_t index = start; /* derzeitiger Offset auf den Audiostr�men */ + char message [80] = "A "; + + setup ( fd, len, freq ); + + while ( 1 ) { + c = sel (); + if ( c == 27 ) + c = sel () + 0x100; + + switch ( c ) { + case 'A' : + case 'a' : + strcpy ( message, "A " ); + if ( state != 0 ) + state = 2; + break; + + case 0x100+'0' : + case '0' : + case 'B' : + case 'b' : + strcpy ( message, " B" ); + if ( state != 1 ) + state = 3; + break; + + case 'X' : + case 'x' : + strcpy ( message, " X " ); + if ( state != rnd ) + state = rnd + 2; + break; + + case 'm' : + state = 8; + break; + + case 'M' : + state = (state & 1) + 4; + break; + + case 'x'&0x1F: + state = (state & 1) + 6; + break; + + case ' ': + start = 0; + stop = len; + break; + + case 'o' : + start = calc_true_index ( index, start, stop); + break; + case 'p' : + stop = calc_true_index ( index, start, stop); + break; + case 'h' : + if ( start > freq/100 ) + start -= freq/100; + else + start = 0; + index = start; + continue; + case 'j' : + if ( start < stop-freq/100 ) + start += freq/100; + else + start = stop; + index = start; + continue; + case 'k' : + if ( stop > start+freq/100 ) + stop -= freq/100; + else + stop = start; + continue; + case 'l' : + if ( stop < len-freq/100 ) + stop += freq/100; + else + stop = len; + continue; + case '\n': + index = start; + continue; + + case 'D'+0x100: + strcpy ( message, "Difference (+40 dB)" ); + state = 9; + fac1 = -100.; + fac2 = +100.; + break; + + case 'd'+0x100: + strcpy ( message, "Difference (+30 dB)" ); + state = 9; + fac1 = -32.; + fac2 = +32.; + break; + + case 'D' & 0x1F : + strcpy ( message, "Difference (+20 dB)" ); + state = 9; + fac1 = -10.; + fac2 = +10.; + break; + + case 'D' : + strcpy ( message, "Difference (+10 dB)" ); + state = 9; + fac1 = -3.; + fac2 = +3.; + break; + + case 'd' : + strcpy ( message, "Difference ( 0 dB)" ); + state = 9; + fac1 = -1.; + fac2 = +1.; + break; + + case 0x100+'1' : + case 0x100+'2' : + case 0x100+'3' : + case 0x100+'4' : + case 0x100+'5' : + case 0x100+'6' : + case 0x100+'7' : + case 0x100+'8' : + case 0x100+'9' : + sprintf ( message, " B (Errors -%c dB)", (char)c ); + state = 9; + fac2 = pow (10., -0.05*(c-0x100-'0') ); + fac1 = 1. - fac2; + break; + + case '1' : + case '2' : + case '3' : + case '4' : + case '5' : + case '6' : + case '7' : + case '8' : + case '9' : + sprintf ( message, " B (Errors +%c dB)", c ); + state = 9; + fac2 = pow (10., 0.05*(c-'0') ); + fac1 = 1. - fac2; + break; + + case 'A' & 0x1F: + fprintf (stderr, " Vote for X:=A" ); + eval ( rnd == 0 ); + rnd = random_number (); + if ( state == 6 && state == 7 ) + state = 6 + rnd; + else if ( state != rnd ) + state = rnd + 2; + strcpy ( message," X " ); + break; + + case 'B' & 0x1F: + fprintf (stderr, " Vote for X:=B" ); + eval ( rnd == 1 ); + rnd = random_number (); + if ( state == 6 && state == 7 ) + state = 6 + rnd; + else if ( state != rnd ) + state = rnd + 2; + strcpy ( message," X " ); + break; + + case -1: + break; + + default: + fprintf (stderr, "\a" ); + break; + + case 'Q': + case 'q': + fprintf ( stderr, "\n%-79.79s\r", "Quit program" ); + close (fd); + fprintf ( stderr, "\n\n"); + return; + } + + switch (state) { + case 0: /* A */ + if ( index + BF >= stop ) + index += feed (fd, A+index, stop-index ); + else + index += feed (fd, A+index, BF ); + break; + + case 1: /* B */ + if ( index + BF >= stop ) + index += feed (fd, B+index, stop-index ); + else + index += feed (fd, B+index, BF ); + break; + + case 2: /* B => A */ + if ( index + BF >= stop ) + index += feed2 (fd, B+index, A+index, stop-index ); + else + index += feed2 (fd, B+index, A+index, BF ); + state = 0; + break; + + case 3: /* A => B */ + if ( index + BF >= stop ) + index += feed2 (fd, A+index, B+index, stop-index ); + else + index += feed2 (fd, A+index, B+index, BF ); + state = 1; + break; + + case 4: /* A */ + strcpy ( message, "A " ); + if ( index + BF >= stop ) + index += feed (fd, A+index, stop-index ), + state++; + else + index += feed (fd, A+index, BF ); + break; + + case 5: /* B */ + strcpy ( message, " B" ); + if ( index + BF >= stop ) + index += feed (fd, B+index, stop-index ), + state--; + else + index += feed (fd, B+index, BF ); + break; + + case 6: /* X */ + strcpy ( message, " X " ); + if ( index + BF >= stop ) + index += feed (fd, (rnd ? B : A)+index, stop-index ), + state++; + else + index += feed (fd, (rnd ? B : A)+index, BF ); + break; + + case 7: /* !X */ + strcpy ( message, "!X " ); + if ( index + BF >= stop ) + index += feed (fd, (rnd ? A : B)+index, stop-index ), + state--; + else + index += feed (fd, (rnd ? A : B)+index, BF ); + break; + + case 8: + if ( index + BF/2 >= stop ) + index += feed2 (fd, A+index, B+index, stop-index ); + else + index += feed2 (fd, A+index, B+index, BF/2 ); + Message ( " B", index, freq, start, stop ); + if ( index + BF >= stop ) + index += feed (fd, B+index, stop-index ); + else + index += feed (fd, B+index, BF ); + if ( index + BF/2 >= stop ) + index += feed2 (fd, B+index, A+index, stop-index ); + else + index += feed2 (fd, B+index, A+index, BF/2 ); + Message ( "A ", index, freq, start, stop ); + if ( index + BF >= stop ) + index += feed (fd, A+index, stop-index ); + else + index += feed (fd, A+index, BF ); + break; + + case 9: /* Liko */ + if ( index + BF >= stop ) + index += feedfac (fd, A+index, B+index, stop-index, fac1, fac2 ); + else + index += feedfac (fd, A+index, B+index, BF , fac1, fac2 ); + break; + + default: + assert (0); + } + + if (index >= stop) + index = start; + Message ( message, calc_true_index ( index, start, stop), freq, start, stop ); + } +} + + +int has_ext ( const char* name, const char* ext ) +{ + if ( strlen (name) < strlen (ext) ) + return 0; + name += strlen (name) - strlen (ext); + return strcasecmp (name, ext) ? 0 : 1; +} + + +typedef struct { + const char* const extention; + const char* const command; +} decoder_t; + + +#define REDIR " 2> /dev/null" +#define STDOUT "/dev/fd/1" +#define PATH PATH_OF_EXTERNAL_TOOLS_FOR_UNCOMPRESSING + +const decoder_t decoder [] = { + { ".mp1" , PATH"mpg123 -w - %s" REDIR }, // MPEG Layer I : www.iis.fhg.de, www.mpeg.org + { ".mp2" , PATH"mpg123 -w - %s" REDIR }, // MPEG Layer II : www.iis.fhg.de, www.uq.net.au/~zzmcheng, www.mpeg.org + { ".mp3" , PATH"mpg123 -w - %s" REDIR }, // MPEG Layer III : www.iis.fhg.de, www.mp3dev.org, www.mpeg.org + { ".mp3pro" , PATH"mpg123 -w - %s" REDIR }, // MPEG Layer III : www.iis.fhg.de, www.mp3dev.org, www.mpeg.org + { ".mpt" , PATH"mpg123 -w - %s" REDIR }, // MPEG Layer III : www.iis.fhg.de, www.mp3dev.org, www.mpeg.org + { ".mpp" , PATH"mppdec %s -" REDIR }, // MPEGplus : www.stud.uni-hannover.de/user/73884 + { ".mpc" , PATH"mppdec %s -" REDIR }, // MPEGplus : www.stud.uni-hannover.de/user/73884 + { ".mp+" , PATH"mppdec %s -" REDIR }, // MPEGplus : www.stud.uni-hannover.de/user/73884 + { ".aac" , PATH"faad -t.wav -w %s" REDIR }, // Advanced Audio Coding: psytel.hypermart.net, www.aac-tech.com, sourceforge.net/projects/faac, www.aac-audio.com, www.mpeg.org + { "aac.lqt" , PATH"faad -t.wav -w %s" REDIR }, // Advanced Audio Coding: psytel.hypermart.net, www.aac-tech.com, sourceforge.net/projects/faac, www.aac-audio.com, www.mpeg.org + { ".ac3" , PATH"ac3dec %s" REDIR }, // Dolby AC3 : www.att.com + { "ac3.lqt" , PATH"ac3dec %s" REDIR }, // Dolby AC3 : www.att.com + { ".ogg" , PATH"ogg123 -d wav -o file:"STDOUT" %s" REDIR }, // Ogg Vorbis : www.xiph.org/ogg/vorbis/index.html + { ".pac" , PATH"lpac -x %s "STDOUT REDIR }, // Lossless predictive Audio Compression: www-ft.ee.tu-berlin.de/~liebchen/lpac.html (liebchen@ft.ee.tu-berlin.de) + { ".shn" , PATH"shorten -x < %s" REDIR }, // Shorten : shnutils.freeshell.org, www.softsound.com/Shorten.html (shnutils@freeshell.org, shorten@softsound.com) + { ".wav.gz" , PATH"gzip -d < %s | sox -twav - -twav -sw -"REDIR }, // gziped WAV + { ".wav.sz" , PATH"szip -d < %s | sox -twav - -twav -sw -"REDIR }, // sziped WAV + { ".wav.sz2", PATH"szip2 -d < %s | sox -twav - -twav -sw -"REDIR }, // sziped WAV + { ".raw" , PATH"sox -r44100 -sw -c2 -traw %s -twav -sw -"REDIR }, // raw files are treated as CD like audio + { ".cdr" , PATH"sox -r44100 -sw -c2 -traw %s -twav -sw -"REDIR }, // CD-DA files are treated as CD like audio, no preemphasis info available + { ".rm" , "echo %s '???'" REDIR }, // Real Audio : www.real.com + { ".epc" , "echo %s '???'" REDIR }, // ePAC : www.audioveda.com, www.lucent.com/ldr + { ".mov" , "echo %s '???'" REDIR }, // QDesign Music 2 : www.qdesign.com + { ".vqf" , "echo %s '???'" REDIR }, // TwinVQ : www.yamaha-xg.com/english/xg/SoundVQ, www.vqf.com, sound.splab.ecl.ntt.co.jp/twinvq-e + { ".wma" , "echo %s '???'" REDIR }, // Microsoft Media Audio: www.windowsmedia.com, www.microsoft.com/windows/windowsmedia + { ".flac" , PATH"flac -c -d %s" REDIR }, // Free Lossless Audio Coder: flac.sourceforge.net/ + { ".fla" , PATH"flac -c -d %s" REDIR }, // Free Lossless Audio Coder: flac.sourceforge.net/ + { ".ape" , "( "PATH"MAC %s _._.wav -d > /dev/null; cat _._.wav; rm _._.wav )" REDIR }, // Monkey's Audio Codec : www.monkeysaudio.com (email@monkeysaudio.com) + { ".rka" , "( "PATH"rkau %s _._.wav > /dev/null; cat _._.wav; rm _._.wav )" REDIR }, // RK Audio: + { ".rkau" , "( "PATH"rkau %s _._.wav > /dev/null; cat _._.wav; rm _._.wav )" REDIR }, // RK Audio: + { ".mod" , PATH"xmp -b16 -c -f44100 --stereo -o- %s | sox -r44100 -sw -c2 -traw - -twav -sw -" + REDIR }, // Amiga's Music on Disk: + { "" , PATH"sox %s -twav -sw -" REDIR }, // Rest, may be sox can handle it +}; + +#undef REDIR +#undef STDOUT +#undef PATH + + +int readwave ( stereo_t* buff, size_t maxlen, const char* name, size_t* len ) +{ + char* command = malloc (2*strlen(name) + 512); + char* name_q = malloc (2*strlen(name) + 128); + unsigned short header [22]; + FILE* fp; + size_t i; + size_t j; + + // The *nice* shell quoting + i = j = 0; + if ( name[i] == '-' ) + name_q[j++] = '.', + name_q[j++] = '/'; + + while (name[i]) { + if ( !isalnum (name[i]) && name[i]!='-' && name[i]!='_' && name[i]!='.' ) + name_q[j++] = '\\'; + name_q[j++] = name[i++]; + } + name_q[j] = '\0'; + + fprintf (stderr, "Reading %s", name ); + for ( i = 0; i < sizeof(decoder)/sizeof(*decoder); i++ ) + if ( has_ext (name, decoder[i].extention) ) { + sprintf ( command, decoder[i].command, name_q ); + break; + } + + free (name_q); + if ( (fp = popen (command, "r")) == NULL ) { + fprintf (stderr, "Can't exec:\n%s\n", command ); + exit (1); + } + free (command); + + fprintf (stderr, " ..." ); + fread ( header, sizeof(*header), sizeof(header)/sizeof(*header), fp ); + + switch (be16_le(header[11])) { + case 2: + *len = fread ( buff, sizeof(stereo_t), maxlen, fp ); + for (i = 0; i < *len; i ++) { + buff[i][0] = be16_le(buff[i][0]); + buff[i][1] = be16_le(buff[i][1]); + } + break; + case 1: + *len = fread ( buff, sizeof(sample_t), maxlen, fp ); + for ( i = *len; i-- > 0; ) + buff[i][0] = buff[i][1] = ((sample_t*)buff) [i]; + break; + case 0: + fprintf (stderr, "\b\b\b\b, Standard Open Source Bug detected, try murksaround ..." ); + *len = fread ( buff, sizeof(stereo_t), maxlen, fp ); + header[11] = 2; + header[12] = 65534; /* use that of the other channel */ + break; + default: + fprintf (stderr, "Only 1 or 2 channels are supported, not %u\n", header[11] ); + pclose (fp); + return -1; + } + pclose ( fp ); + fprintf (stderr, "\n" ); + return be16_le(header[12]) ? be16_le(header[12]) : 65534; +} + + +double cross_analyze ( const stereo_t* p1, const stereo_t *p2, size_t len ) +{ + float P1 [MAX] [2]; + float P2 [MAX] [2]; + int i; + int maxindex; + double sum1; + double sum2; + double max; + double y1; + double y2; + double y3; + double yo; + double xo; + double tmp; + double tmp1; + double tmp2; + int ret = 0; + int cnt = 5; + + // Calculating effective voltage + sum1 = sum2 = 0.; + for ( i = 0; i < len; i++ ) { + sum1 += (double)p1[i][0] * p1[i][0]; + sum2 += (double)p2[i][0] * p2[i][0]; + } + sum1 = sqrt ( sum1/len ); + sum2 = sqrt ( sum2/len ); + + // Searching beginning of signal (not stable for pathological signals) + for ( i = 0; i < len; i++ ) + if ( abs (p1[i][0]) >= sum1 && abs (p2[i][0]) >= sum2 ) + break; + p1 += i; + p2 += i; + len -= i; + + if ( len <= MAX ) + return 0; + + // Filling arrays for FFT + do { + sum1 = sum2 = 0.; + for ( i = 0; i < MAX; i++ ) { +#ifdef USEDIFF + tmp1 = p1 [i][0] - p1 [i+1][0]; + tmp2 = p2 [i+ret][0] - p2 [i+ret+1][0]; +#else + tmp1 = p1 [i][0]; + tmp2 = p2 [i+ret][0]; +#endif + sum1 += tmp1*tmp1; + sum2 += tmp2*tmp2; + P1 [i][0] = tmp1; + P2 [i][0] = tmp2; + P1 [i][1] = 0.; + P2 [i][1] = 0.; + } + + fft (P1, MAX); + fft (P2, MAX); + + for ( i = 0; i < MAX; i++ ) { + double a0 = P1 [i][0]; + double a1 = P1 [i][1]; + double b0 = P2 [(MAX-i)&(MAX-1)][0]; + double b1 = P2 [(MAX-i)&(MAX-1)][1]; + P1 [i][0] = a0*b0 - a1*b1; + P1 [i][1] = a0*b1 + a1*b0; + } + + fft (P1, MAX); + + max = P1 [maxindex = 0][0]; + for ( i = 1; i < MAX; i++ ) + if ( P1[i][0] > max ) + max = P1 [maxindex = i][0]; + + y2 = P1 [ maxindex ][0]; + y1 = P1 [(maxindex-1)&(MAX-1)][0] - y2; + y3 = P1 [(maxindex+1)&(MAX-1)][0] - y2; + + xo = 0.5 * (y1-y3) / (y1+y3); + yo = 0.5 * ( (y1+y3)*xo + (y3-y1) ) * xo; + + if (maxindex > MAX/2 ) + maxindex -= MAX; + + ret += maxindex; + tmp = 100./MAX/sqrt(sum1*sum2); + if (verbose) + printf ( "[%5d]%8.4f [%5d]%8.4f [%5d]%8.4f [%10.4f]%8.4f\n", + ret- 1, (y1+y2)*tmp, + ret , y2 *tmp, + ret+ 1, (y3+y2)*tmp, + ret+xo, (yo+y2)*tmp ); + + } while ( maxindex && cnt-- ); + + return ret + xo; +} + + +short to_short ( int x ) +{ + return x == (short)x ? (short)x : (short) ((x >> 31) ^ 0x7FFF); +} + + +void DC_cancel ( stereo_t* p, size_t len ) +{ + double sum1 = 0; + double sum2 = 0; + size_t i; + int diff1; + int diff2; + + for (i = 0; i < len; i++ ) { + sum1 += p[i][0]; + sum2 += p[i][1]; + } + if ( fabs(sum1) < len && fabs(sum2) < len ) + return; + + diff1 = round ( sum1 / len ); + diff2 = round ( sum2 / len ); + if (verbose) + fprintf (stderr, "Removing DC (left=%d, right=%d)\n", diff1, diff2 ); + + for (i = 0; i < len; i++ ) { + p[i][0] = to_short ( p[i][0] - diff1); + p[i][1] = to_short ( p[i][1] - diff2); + } +} + +void multiply ( char c, stereo_t* p, size_t len, double fact ) +{ + size_t i; + + if ( fact == 1. ) + return; + if (verbose) + fprintf (stderr, "Multiplying %c by %7.5f\n", c, fact ); + + for (i = 0; i < len; i++ ) { + p[i][0] = to_short ( p[i][0] * fact ); + p[i][1] = to_short ( p[i][1] * fact ); + } +} + + +int maximum ( stereo_t* p, size_t len ) +{ + int max = 0; + size_t i; + + for (i = 0; i < len; i++ ) { + if (abs(p[i][0]) > max) max = abs(p[i][0]); + if (abs(p[i][1]) > max) max = abs(p[i][1]); + } + return max; +} + + +void usage ( void ) +{ + fprintf ( stderr, + "usage: abx [-v] File_A File_B\n" + "\n" + "File_A and File_B loaded and played. File_A should be the better/reference\n" + "file, File_B the other. You can press the following keys:\n" + "\n" + " a/A: Listen to File A\n" + " b/B: Listen to File B\n" + " x/X: Listen to the randomly selected File X, which is A or B\n" + " Ctrl-A: You vote for X=A\n" + " Ctrl-B: You vote for X=B\n" + " m: Alternating playing A and B. Fast switching\n" + " M: Alternating playing A and B. Slow switching\n" + " d/D/Ctrl-D/Alt-d/Alt-D:\n" + " Listen to the difference A-B (+0 dB...+40 dB)\n" + " o/p: Chunk select\n" + " hjkl: Chunk fine adjust (hj: start, kl: stop)\n" + " Space: Chunk deselect\n" + " 0...9: Listen to B, but difference A-B is amplified by 0-9 dB\n" + " Q: Quit the program\n" + "\n" + ); +} + + +int main ( int argc, char** argv ) +{ + stereo_t* _A = calloc ( MAX_LEN, sizeof(stereo_t) ); + stereo_t* _B = calloc ( MAX_LEN, sizeof(stereo_t) ); + stereo_t* A = _A; + stereo_t* B = _B; + size_t len_A; + size_t len_B; + size_t len; + int max_A; + int max_B; + int max; + long freq1; + long freq2; + int shift; + double fshift; + double ampl; + int ampl_X; + korr_t k; + + if (argc > 1 && 0 == strcmp (argv[1], "-v") ) { + verbose = 1; + argc--; + argv++; + } + + switch ( argc ) { + case 0: + case 1: + case 2: + default: + usage (); + return 1; + case 3: + usage(); + break; + } + + freq1 = readwave ( A, MAX_LEN, argv[1], &len_A ); + DC_cancel ( A, len_A ); + freq2 = readwave ( B, MAX_LEN, argv[2], &len_B ); + DC_cancel ( B, len_B ); + + if ( freq1 == 65534 && freq2 != 65534 ) + freq1 = freq2; + else if ( freq2 == 65534 && freq1 != 65534 ) + freq2 = freq1; + else if ( freq1 == 65534 && freq2 == 65534 ) + freq1 = freq2 = 44100; + + if ( freq1 != freq2 ) { + fprintf ( stderr, "Different sample frequencies currently not supported\n"); + fprintf ( stderr, "A: %ld, B: %ld\n", freq1, freq2 ); + return 2; + } + + len = len_A < len_B ? len_A : len_B; + fshift = cross_analyze ( A, B, len ); + shift = floor ( fshift + 0.5 ); + + if ( verbose ) { + fprintf ( stderr, "Delay Ch1 is %.4f samples\n", fshift ); + fprintf ( stderr, "Delay Ch2 is %.4f samples\n", + cross_analyze ( (stereo_t*)(((sample_t*)A)+1), (stereo_t*)(((sample_t*)B)+1), len ) ); + } + + if (shift > 0) { + if (verbose) + fprintf ( stderr, "Delaying A by %d samples\n", +shift); + B += shift; + len_B -= shift; + } + if (shift < 0) { + if (verbose) + fprintf ( stderr, "Delaying B by %d samples\n", -shift); + A -= shift; + len_A += shift; + } + + len = len_A < len_B ? len_A : len_B; + memset ( &k, 0, sizeof(k) ); + analyze_stereo ( A, B, len, &k ); + ampl = report (&k); + max_A = maximum ( A, len ); + max_B = maximum ( B, len ); + + if ( ampl <= 0.98855 ) { /* < -0.05 dB */ + max = max_A*ampl < max_B ? max_B : max_A*ampl; + ampl_X = (int)(29203 / max); + if ( ampl_X < 2 ) ampl_X = 1; + multiply ( 'A', A, len, ampl*ampl_X ); + multiply ( 'B', B, len, ampl_X ); + } else if ( ampl >= 1.01158 ) { /* > +0.05 dB */ + max = max_A < max_B/ampl ? max_B/ampl : max_A; + ampl_X = (int)(29203 / max); + if ( ampl_X < 2 ) ampl_X = 1; + multiply ( 'A', A, len, ampl_X ); + multiply ( 'B', B, len, 1./ampl*ampl_X ); + } else { + max = max_A < max_B ? max_B : max_A; + ampl_X = (int)(29203 / max); + if ( ampl_X < 2 ) ampl_X = 1; + multiply ( 'A', A, len, ampl_X ); + multiply ( 'B', B, len, ampl_X ); + } + + set (); + Set_Realtime (); + testing ( A, B, len, freq1 ); + reset (); + + free (_A); + free (_B); + return 0; +} + +/* end of abx.c */ diff --git a/misc/ath.c b/misc/ath.c new file mode 100644 index 0000000..ee6cfda --- /dev/null +++ b/misc/ath.c @@ -0,0 +1,839 @@ +/* $Id: ath.c,v 1.12 2000/12/05 15:37:26 aleidinger Exp $ */ +/* + * Known bugs (sorted by importance): + * - human delay (ca. 200 ms or more???) and buffering delay (341 ms @48 kHz/64 KByte) + * should be subtracted + * - error handling + * - cos slope on direction changes + * - calibration file of soundcard/amplifier/head phone + * - worse handling + * - +/- handling via mouse (do you have code?) in a dark room + * - ENTER as direction change + * - finer precalculated ATH for pre-emphasis + */ + +/* + * Suggested level ranges: + * 180 Hz...13.5 kHz: 50...70 dB + * 100 Hz...15.0 kHz: 40...70 dB + * 70 Hz...16.0 kHz: 30...70 dB + * 45 Hz...16.5 kHz: 20...70 dB + * 30 Hz...17.5 kHz: 10...70 dB + * 25 Hz...18.0 kHz: 5...75 dB + * 20 Hz...19.0 kHz: 0...80 dB + * 16 Hz...20.0 kHz: -10...80 dB + */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <assert.h> +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <fcntl.h> +#include <limits.h> +#include <termios.h> +#include <math.h> +#include <time.h> +#include <signal.h> +#include <sys/ioctl.h> +#include <sys/time.h> +#include <sys/types.h> +#include <sys/stat.h> +#ifdef HAVE_SYS_SOUNDCARD_H +# include <sys/soundcard.h> +#elif defined(HAVE_LINUX_SOUNDCARD_H) +# include <linux/soundcard.h> +#else +# error no soundcard include +#endif + + + +#define AUDIO_DEVICE "/dev/dsp" +//#define COOLEDIT_FILE "/mnt/dosd/cooledit.wav" +#define DELAY_UNTIL_XCHG 2.5 +#define TURN_STEPS 2400 + +/****************************************************************************************************** + * soundcard stuff + ******************************************************************************************************/ + +const double dither_coeff [] [16] = { + { /* 48 kHz */ 3.35185352775391591311, 4.24914379295482032978, 1.78042251729150153086, -0.92601381419186201184, -1.37308596104182343645, -1.85951915999247704829, -3.28074437872632330526, -3.05496670185702990882, -1.22855462839450528837, -0.30291531959171267015, -0.18598486195652600770, 0.42010512205702003790, 0.92278786111368653452, 0.62102380451771775193, 0.14312897206650044828, -0.00454721508203927746 }, + { /* 56 kHz */ 3.86404134982280628749, 6.67195592701613291071, 5.90576195467245802046, 1.57589705921487261981, -2.10618201389737372178, -2.74191788822507184395, -2.62175070636849999396, -3.78505226463032808863, -4.45698848578010438284, -2.76825966243460536110, -0.26509931375584007312, 0.67853812028968716799, 0.17633528441477021892, -0.28511417191837823770, -0.21866605100975608470, -0.04751674094456833719 }, + { /* 64 kHz */ 4.09276938880098092172, 8.27424044674659812937, 10.11503162292146762880, 7.19159801569544317353, 1.39770070291739556523, -2.86595901981244688601, -3.76567274050094691362, -3.58051445684472378298, -4.78262917738758022539, -6.53075750894777650899, -6.31330514306857055627, -3.69971382767763534195, -0.78125094191744878298, 0.59027508113837267217, 0.53500264009607367648, 0.14860043567206217506 }, + { /* 72 kHz */ 4.13833553801985235465, 9.02461778089340082437, 12.93090366932740510782, 12.66372285767699051948, 7.76122176702274149630, 1.30617257555732278296, -2.92859120887121285358, -4.02438598495837830627, -4.16673068132491936262, -5.55618065300129916574, -7.82657788611231653103, -8.83055904466106668035, -7.34884789347713815672, -4.33977664906048314891, -1.67711310288611975398, -0.33086687044710235420 }, + { /* 80 kHz */ 4.22135293342667005517, 9.76639846582539722375, 15.46562682418357478290, 17.54378549927855248346, 13.29112084313158963396, 3.51512441998252657470, -7.51025671462502577300,-14.84164320864536219368,-16.10306907358826504148,-12.54775907691866414402, -7.40560667268782655149, -3.34708029482052565732, -1.19572214872925790860, -0.39582185216275086786, -0.14803160816846603424, -0.04292818488627011881 }, + { /* 88 kHz */ 4.18521467865996935325, 9.96765821475909556942, 16.91905760389390617551, 21.74016824668913557689, 20.96457146354060682367, 13.28640453421253890542, 0.85116933842171101587,-11.66054516261007127469,-19.62750656985581800169,-20.98831962473015904508,-16.95374072505042825458,-10.68848180295390154146, -5.17169792984369678908, -1.79975409439650319129, -0.38057073791415898674, -0.02672653932844656975 }, + { /* 96 kHz */ 4.09418877324899473189, 9.77977364010870211207, 17.10120082680385341159, 23.37356217615995036818, 25.27121942060722374276, 20.64059991613550174190, 9.99721445051475610371, -3.39833000550997938512,-15.03410054392933377278,-21.36704201000683067679,-21.40772859969388741685,-16.79355426136657673808,-10.48570200688141622163, -5.07642951516127438486, -1.75555240936989159436, -0.33817997298586054131 }, +}; + +typedef struct { + const char* device; + int fd; + long double sample_freq; + const double* dither; + int channels; + int bits; +} soundcard_t; + +typedef signed short sample_t; +typedef sample_t stereo_t [2]; + +int open_soundcard ( + soundcard_t* const k, + const char* device, + const int channels, + const int bits, + const long double freq ) +{ + int arg; + int org; + int index; + int status; + + k->device = device; + if ( -1 == (k->fd = open ( k->device, O_WRONLY )) ) { + perror("opening of audio device failed"); + return -1; + } + + if ( -1 == (status = ioctl (k->fd, SOUND_PCM_SYNC, 0))) { + fprintf ( stderr, "%s: SOUND_PCM_SYNC ioctl failed: %s\n", k->device, strerror (errno)); + return -1; + } + + org = arg = channels; + if ( -1 == (status = ioctl (k->fd, SOUND_PCM_WRITE_CHANNELS, &arg)) ) { + fprintf ( stderr, "%s: SOUND_PCM_WRITE_CHANNELS (%d) ioctl failed: %s\n" , k->device, channels, strerror (errno) ); + return -1; + } + if (arg != org) { + fprintf ( stderr, "%s: unable to set number of channels: %d instead of %d\n", k->device, arg, org ); + return -1; + } + k->channels = arg; + + org = arg = bits; + if ( -1 == (status = ioctl (k->fd, SOUND_PCM_WRITE_BITS, &arg)) ) { + fprintf ( stderr, "%s: SOUND_PCM_WRITE_BITS ioctl failed\n", k->device ); + return -1; + } + if (arg != org) { + fprintf ( stderr, "%s: unable to set sample size: %d instead of %d\n", k->device, arg, org ); + return -1; + } + k->bits = arg; + + org = arg = k->bits <= 8 ? AFMT_U8 : AFMT_S16_LE; + if ( -1 == ioctl (k->fd, SNDCTL_DSP_SETFMT, &arg) ) { + fprintf ( stderr, "%s: SNDCTL_DSP_SETFMT ioctl failed\n", k->device ); + return -1; + } + if ((arg & org) == 0) { + fprintf ( stderr, "%s: unable to set data format\n", k->device ); + return -1; + } + + org = arg = (int) floor ( freq + 0.5 ); + if ( -1 == (status = ioctl (k->fd, SOUND_PCM_WRITE_RATE, &arg)) ) { + fprintf ( stderr, "%s: SOUND_PCM_WRITE_WRITE ioctl failed\n", k->device ); + return -1; + } + k->sample_freq = (long double)arg; + index = (arg - 44000) / 8000; + if ( index < 0 ) index = 0; + if ( index >= sizeof(dither_coeff)/sizeof(*dither_coeff) ) index = sizeof(dither_coeff)/sizeof(*dither_coeff) - 1; + k->dither = dither_coeff [ index ]; + return 0; +} + +int play_soundcard ( soundcard_t* const k, stereo_t* samples, size_t length ) +{ + size_t bytes = length * sizeof (*samples); + +#ifdef COOLEDIT_FILE + static int fd = -1; + if ( fd < 0 ) fd = open ( COOLEDIT_FILE, O_WRONLY | O_CREAT ); + write ( fd, samples, bytes ); +#endif + + return write ( k->fd, samples, bytes ) == bytes ? 0 : -1; +} + +int close_soundcard ( soundcard_t* const k ) +{ + return close (k->fd); +} + + +/****************************************************************************************************** + * frequency stuff + ******************************************************************************************************/ + +typedef enum { + linear = 0, + logarithm = 1, + square = 2, + cubic = 3, + erb = 4, + recip = 5 +} genmode_t; + +static long double linear_f ( long double x ) { return x > 0.L ? x : 0.0L; } +static long double logarithm_f ( long double x ) { return x > 0.L ? log10 (x) : -3.5L; } +static long double square_f ( long double x ) { return x > 0.L ? sqrt (x) : 0.0L; } +static long double cubic_f ( long double x ) { return x > 0.L ? pow (x,1/3.) : 0.0L; } +static long double erb_f ( long double x ) { return log (1. + 0.00437*x); } +static long double recip_f ( long double x ) { return x > 1.L ? 1.L/x : 1.0L; } + +static long double inv_linear_f ( long double x ) { return x; } +static long double inv_logarithm_f ( long double x ) { return pow (10., x); } +static long double inv_square_f ( long double x ) { return x*x; } +static long double inv_cubic_f ( long double x ) { return x*x*x; } +static long double inv_erb_f ( long double x ) { return (exp(x) - 1.) * (1./0.00437); } +static long double inv_recip_f ( long double x ) { return x > 1.L ? 1.L/x : 1.0L; } + +typedef long double (*converter_fn_t) ( long double ); + +const converter_fn_t func [] = { linear_f, logarithm_f, square_f, cubic_f , erb_f , recip_f }; +const converter_fn_t inv_func [] = { inv_linear_f, inv_logarithm_f, inv_square_f, inv_cubic_f, inv_erb_f, inv_recip_f }; + +typedef struct { + genmode_t genmode; + long double start_freq; + long double stop_freq; + long double sample_freq; + unsigned long duration; + + long double phase; + long double param1; + long double param2; + unsigned long counter; +} generator_t; + +int open_generator ( + generator_t* const g, + const soundcard_t* const s, + const genmode_t genmode, + const long double duration, + const long double start_freq, + const long double stop_freq ) +{ + g->sample_freq = s->sample_freq; + g->genmode = genmode; + g->start_freq = start_freq; + g->stop_freq = stop_freq; + g->duration = (unsigned long) floor ( duration * g->sample_freq + 0.5 ); + + if ( g->duration < 2 ) + return -1; + + if ( g->genmode >= sizeof (func)/sizeof(*func) ) + return -1; + + g->param1 = func [g->genmode] ( g->start_freq / g->sample_freq ); + g->param2 = ( func [ g->genmode ] ( g->stop_freq / g->sample_freq ) - g->param1 ) + / ( g->duration - 1 ); + g->phase = 0.L; + g->counter= 0; + + return 0; +} + +long double iterate_generator ( generator_t* const g ) +{ + long double freq; + + freq = inv_func [ g->genmode ] ( g->param1 + g->counter++ * g->param2 ); + + g->phase += freq; + if (g->phase > 15.) + g->phase -= 16.; + return sin ( 2.*M_PI * g->phase ); +} + +long double get_sine ( generator_t* const g ) +{ + return sin ( 2.*M_PI * g->phase ); +} + +long double get_cosine ( generator_t* const g ) +{ + return cos ( 2.*M_PI * g->phase ); +} + + +long double frequency ( const generator_t* const g ) +{ + return inv_func [ g->genmode ] ( g->param1 + g->counter * g->param2 ) * g->sample_freq; +} + +int close_generator ( generator_t* const g ) +{ + return 0; +} + +/****************************************************************************************************** + * amplitude stuff + ******************************************************************************************************/ + +typedef enum { + up = 0, + down = 1, + turn_up = 2, + turn_down = 3, + still_up = 4, + still_down = 5, + change = 6 +} direction_t; + + +typedef struct { + long double sample_freq; + direction_t direction; // down, up, still_up, still_down, turn_down, turn_up + int multiplier; // -TURN_STEPS: down, +TURN_STEPS up + long double amplitude; + long double delta_amplitude; + long direction_change; +} amplitude_t; + +int open_amplifier ( + amplitude_t* const a, + const soundcard_t* const s, + const long double start_ampl, + const double dB_per_sec ) +{ + a->sample_freq = s->sample_freq; + a->direction = up; + a->multiplier = +TURN_STEPS; + a->amplitude = start_ampl * 32767.; + a->delta_amplitude = dB_per_sec * 0.1151292546497022842 / s->sample_freq / TURN_STEPS; + a->direction_change = 0; + + srand ( time (NULL) ); + return 0; +} + +long double iterate_amplifier ( amplitude_t* const a ) +{ + switch ( a->direction ) { + case still_up: + assert (a->multiplier == +TURN_STEPS); + if (a->direction_change > 0 ) + a->direction_change--; + else + a->direction = turn_down; + break; + case still_down: + assert (a->multiplier == -TURN_STEPS); + if (a->direction_change > 0 ) + a->direction_change--; + else + a->direction = turn_up; + break; + case turn_up: + assert (a->direction_change == 0); + if ( a->multiplier < +TURN_STEPS ) + a->multiplier++; + else + a->direction = up; + break; + case turn_down: + assert (a->direction_change == 0); + if ( a->multiplier > -TURN_STEPS ) + a->multiplier--; + else + a->direction = down; + break; + case up: + assert (a->multiplier == +TURN_STEPS); + assert (a->direction_change == 0); + break; + case down: + assert (a->multiplier == -TURN_STEPS); + assert (a->direction_change == 0); + break; + default: + fprintf ( stderr, "\n\r*** Bug! ***\n"); + break; + } + + a->amplitude *= 1.L + a->delta_amplitude * a->multiplier; + return a->amplitude; +} + +long double amplitude ( const amplitude_t* const a ) +{ + return a->amplitude / 32767.; +} + +int change_direction ( amplitude_t* const a, direction_t new_direction ) +{ + switch ( new_direction ) { + case up: + if (a->direction == down) { + a->direction = still_down; + } else { + fprintf ( stderr, "Direction not down, so ignored\n" ); + return -1; + } + break; + case down: + if (a->direction == up) { + a->direction = still_up; + } else { + fprintf ( stderr, "Direction not up, so ignored\n" ); + return -1; + } + break; + case change: + switch ( a->direction ) { + case up: + a->direction = still_up; + break; + case down: + a->direction = still_down; + break; + default: + fprintf ( stderr, "Direction still changing, so ignored\n" ); + return -1; + } + break; + + default: + fprintf ( stderr, "Direction unknown, so ignored\n" ); + return -1; + } + + a->direction_change = 1 + rand () * (a->sample_freq * DELAY_UNTIL_XCHG / RAND_MAX); + return 0; +} + +int close_amplifier ( amplitude_t* const a ) +{ + return 0; +} + + +double ATH ( double freq ) +{ + static float tab [] = { + /* 10.0 */ 96.69, 96.69, 96.26, 95.12, + /* 12.6 */ 93.53, 91.13, 88.82, 86.76, + /* 15.8 */ 84.69, 82.43, 79.97, 77.48, + /* 20.0 */ 74.92, 72.39, 70.00, 67.62, + /* 25.1 */ 65.29, 63.02, 60.84, 59.00, + /* 31.6 */ 57.17, 55.34, 53.51, 51.67, + /* 39.8 */ 50.04, 48.12, 46.38, 44.66, + /* 50.1 */ 43.10, 41.73, 40.50, 39.22, + /* 63.1 */ 37.23, 35.77, 34.51, 32.81, + /* 79.4 */ 31.32, 30.36, 29.02, 27.60, + /* 100.0 */ 26.58, 25.91, 24.41, 23.01, + /* 125.9 */ 22.12, 21.25, 20.18, 19.00, + /* 158.5 */ 17.70, 16.82, 15.94, 15.12, + /* 199.5 */ 14.30, 13.41, 12.60, 11.98, + /* 251.2 */ 11.36, 10.57, 9.98, 9.43, + /* 316.2 */ 8.87, 8.46, 7.44, 7.12, + /* 398.1 */ 6.93, 6.68, 6.37, 6.06, + /* 501.2 */ 5.80, 5.55, 5.29, 5.02, + /* 631.0 */ 4.75, 4.48, 4.22, 3.98, + /* 794.3 */ 3.75, 3.51, 3.27, 3.22, + /* 1000.0 */ 3.12, 3.01, 2.91, 2.68, + /* 1258.9 */ 2.46, 2.15, 1.82, 1.46, + /* 1584.9 */ 1.07, 0.61, 0.13, -0.35, + /* 1995.3 */ -0.96, -1.56, -1.79, -2.35, + /* 2511.9 */ -2.95, -3.50, -4.01, -4.21, + /* 3162.3 */ -4.46, -4.99, -5.32, -5.35, + /* 3981.1 */ -5.13, -4.76, -4.31, -3.13, + /* 5011.9 */ -1.79, 0.08, 2.03, 4.03, + /* 6309.6 */ 5.80, 7.36, 8.81, 10.22, + /* 7943.3 */ 11.54, 12.51, 13.48, 14.21, + /* 10000.0 */ 14.79, 13.99, 12.85, 11.93, + /* 12589.3 */ 12.87, 15.19, 19.14, 23.69, + /* 15848.9 */ 33.52, 48.65, 59.42, 61.77, + /* 19952.6 */ 63.85, 66.04, 68.33, 70.09, + /* 25118.9 */ 70.66, 71.27, 71.91, 72.60, + }; + double freq_log; + double dB; + unsigned index; + + if ( freq < 10. ) freq = 10.; + if ( freq > 25000. ) freq = 25000.; + + freq_log = 40. * log10 (0.1 * freq); /* 4 steps per third, starting at 10 Hz */ + index = (unsigned) freq_log; + assert ( index < sizeof(tab)/sizeof(*tab) ); + dB = tab [index] * (1 + index - freq_log) + tab [index+1] * (freq_log - index); + return pow ( 10., 0.05*dB ); +} + +/****************************************************************************************************** + * keyboard stuff + ******************************************************************************************************/ + +typedef struct { + int init; + struct termios stored_setting; + struct termios current_setting; +} keyboard_t; + +static keyboard_t* __k; + +/* Restore term-settings to those saved when term_init was called */ + +static void term_restore (void) +{ + tcsetattr ( 0, TCSANOW, &(__k->stored_setting) ); +} /* term_restore */ + +/* Clean up terminal; called on exit */ + +static void term_exit ( int sig ) +{ + term_restore (); +} /* term_exit */ + +/* Will be called when ctrl-Z is pressed, this correctly handles the terminal */ + +static void term_ctrl_z ( int sig ) +{ + signal ( SIGTSTP, term_ctrl_z ); + term_restore (); + kill ( getpid(), SIGSTOP ); +} /* term_ctrl_z */ + +/* Will be called when application is continued after having been stopped */ + +static void term_cont ( int sig ) +{ + signal ( SIGCONT, term_cont ); + tcsetattr ( 0, TCSANOW, &(__k->current_setting) ); +} /* term_cont() */ + +int open_keyboard ( keyboard_t* const k ) +{ + __k = k; + tcgetattr ( 0, &(k->stored_setting) ); + tcgetattr ( 0, &(k->current_setting) ); + + signal ( SIGINT, term_exit ); /* We _must_ clean up when we exit */ + signal ( SIGQUIT, term_exit ); + signal ( SIGTSTP, term_ctrl_z ); /* Ctrl-Z must also be handled */ + signal ( SIGCONT, term_cont ); +// atexit ( term_exit ); + + /* One or more characters are sufficient to cause a read to return */ + cfmakeraw ( &(k->current_setting) ); + k->current_setting.c_oflag |= ONLCR | OPOST; /* enables NL => CRLF on output */ + + tcsetattr ( 0, TCSANOW, &(k->current_setting) ); + return 0; +} + +int getchar_keyboard ( keyboard_t* const k ) +{ + struct timeval t; + fd_set fd [1]; + int ret; + unsigned char c; + + FD_SET (0, fd); + t.tv_sec = 0; + t.tv_usec = 0; + + ret = select ( 1, fd, NULL, NULL, &t ); + + switch ( ret ) { + case 0: + return -1; + case 1: + ret = read (0, &c, 1); + return ret == 1 ? c : -1; + default: + return -2; + } +} + +int close_keyboard ( keyboard_t* const k ) +{ + term_restore (); + return 0; +} + + +/****************************************************************************************************** + * reporting stuff + ******************************************************************************************************/ + +int report_open ( void ) +{ + static char buff [32767]; + fflush ( stdout ); + setvbuf ( stdout, buff, _IOFBF, sizeof(buff) ); + return 0; +} + +int report ( const generator_t* const g, const amplitude_t* const a ) +{ + static double last_freq = -1.; + static double last_level = -1.; + double freq; + double level; + + freq = frequency (g); + level = 20. * log10 (amplitude (a) * ATH (freq) ) + 80.; + + if ( last_freq >= 0 ) + printf ( "%11.3f %8.2f\n", sqrt (freq*last_freq), 0.5 * (level+last_level) ); + printf ( "# %9.3f %8.2f\n", freq, level ); + + fflush ( stdout ); + + last_freq = freq; + last_level = level; + return 0; +} + +int report_close ( void ) +{ + printf ( "%%%%\n\n" ); + fflush ( stdout ); + close ( dup ( fileno(stdout) ) ); + setvbuf ( stdout, NULL, _IONBF, 0 ); + return 0; +} + + +/****************************************************************************************************** + * main stuff + ******************************************************************************************************/ + +typedef enum { + left = 0, + right = 1, + phase0 = 2, + both = 2, + phase90 = 3, + phase180 = 4, + phasemod = 5 +} earmode_t; + +static long double scalar ( const double* a, const double* b ) +{ + return a[ 0]*b[ 0] + a[ 1]*b[ 1] + a[ 2]*b[ 2] + a[ 3]*b[ 3] + +a[ 4]*b[ 4] + a[ 5]*b[ 5] + a[ 6]*b[ 6] + a[ 7]*b[ 7] + +a[ 8]*b[ 8] + a[ 9]*b[ 9] + a[10]*b[10] + a[11]*b[11] + +a[12]*b[12] + a[13]*b[13] + a[14]*b[14] + a[15]*b[15]; +} + +int experiment ( generator_t* const g, + amplitude_t* const a, + keyboard_t* const k, + soundcard_t* const s, + earmode_t earmode ) +{ + long i; + int j; + stereo_t samples [512]; + static double quant_errors [2] [16]; + long double val; + double ampl; + long ival; + + fprintf ( stderr, "\r+++ up +++" ); + for ( i = 0; i < g->duration; i += sizeof(samples)/sizeof(*samples) ) { + fprintf ( stderr, "%3lu%%\b\b\b\b", i*100lu/g->duration ); + + for (j = 0; j < sizeof(samples)/sizeof(*samples); j++ ) { + ampl = iterate_amplifier (a) * ATH (frequency (g)); + val = ampl * iterate_generator (g); + ival = (long) floor ( val + 0.5 + scalar (quant_errors[0], s->dither) ); + + if ( ival != (sample_t) ival ) { + report (g, a); + fprintf ( stderr, "\rOverrun \n\n" ); + return -1; + } + memmove ( & quant_errors [0] [1], & quant_errors [0] [0], + sizeof(quant_errors[0]) - sizeof(quant_errors[0][0]) ); + quant_errors [0] [0] = val - ival; + switch ( earmode ) { + case both: + samples [j] [0] = samples [j] [1] = ival; + break; + case left: + samples [j] [0] = ival; + samples [j] [1] = 0; + break; + case right: + samples [j] [0] = 0; + samples [j] [1] = ival; + break; + case phase180: + samples [j] [0] = ival == -32768 ? 32767 : -ival; + samples [j] [1] = +ival; + break; + case phase90: + samples [j] [0] = ival; + val = ampl * get_cosine (g); + ival = (long) floor ( val + 0.5 + scalar (quant_errors[1], s->dither) ); + if ( ival != (sample_t) ival ) { + report (g, a); + fprintf ( stderr, "\rOverrun \n\n" ); + return -1; + } + memmove ( & quant_errors [1] [1], & quant_errors [1] [0], + sizeof(quant_errors[1]) - sizeof(quant_errors[1][0]) ); + quant_errors [1] [0] = val - ival; + samples [j] [1] = ival; + break; + default: + assert (0); + return -1; + } + } + play_soundcard ( s, samples, sizeof(samples)/sizeof(*samples) ); + if ( amplitude (a) * ATH (frequency (g)) <= 3.16227766e-6 ) { + report (g, a); + fprintf ( stderr, "\rUnderrun \n\n" ); + return -1; + } + + switch ( getchar_keyboard (k) ) { + case '+': + fprintf ( stderr, "\r+++ up +++" ); + report (g, a); + change_direction ( a, up ); + break; + case '-': + fprintf ( stderr, "\r--- down ---" ); + report (g, a); + change_direction ( a, down ); + break; + case '\r': + case '\n': + fprintf ( stderr, "\r** change **" ); + report (g, a); + change_direction ( a, change ); + break; + case 'C'&0x1F: + case 'q': + case 'Q': + case 'x': + case 'X': + fprintf ( stderr, "\rBreak \n\n" ); + fflush ( stderr ); + return -1; + default: + fprintf ( stderr, "\a" ); + break; + case -1: + break; + } + } + + fprintf ( stderr, "\rReady \n\n" ); + return 0; +} + +static void usage ( void ) +{ + static const char help[] = + "'Absolute Threshold of Hearing' -- Version 0.07 (C) Frank Klemm 2000\n" + "\n" + "usage:\n" + " ath type minfreq maxfreq duration ampl_speed [start_level [earmode] > reportfile\n" + "\n" + " type: linear, logarithm, square, cubic, erb, recip\n" + " minfreq: initial frequency [Hz]\n" + " maxfreq: end frequency [Hz]\n" + " duration: duration of the experiment [s]\n" + " ampl_speed: amplitude slope speed [phon/s]\n" + " start_level: absolute level at startup [0...1]\n" + " earmode: left, right, both, phase90, phase180\n" + "\n" + "example:\n" + " ath erb 700 22000 600 3 0.0001 > result1\n" + " ath erb 1400 16 360 3 0.0001 > result2\n" + "\n" + "handling:\n" + " press '-' once when you start hearing a tone\n" + " press '+' once when you stop hearing a tone\n" + " press 'q' to early leave the program\n" + " on errors the pressed key is ignored\n"; + + fprintf ( stderr, "%s\n", help ); +} + +int main ( int argc, char** argv ) +{ + generator_t g; + amplitude_t a; + soundcard_t s; + keyboard_t k; + genmode_t genmode; + earmode_t earmode; + + if ( argc == 1 ) { + usage (); + system ( "./ath erb 700 22000 600 3 0.0001 > result1" ); + system ( "./ath erb 1400 16 360 3 0.0001 > result2" ); + system ( "xmgr result1 result2 &> /dev/null &" ); + return 0; + } + + if ( argc < 6 ) { + usage (); + return 1; + } + + if ( 0 == strncmp ( argv[1], "li" , 2) ) genmode = linear; + else if ( 0 == strncmp ( argv[1], "lo" , 2) ) genmode = logarithm; + else if ( 0 == strncmp ( argv[1], "sq" , 2) ) genmode = square; + else if ( 0 == strncmp ( argv[1], "cu" , 2) ) genmode = cubic; + else if ( 0 == strncmp ( argv[1], "er" , 2) ) genmode = erb; + else if ( 0 == strncmp ( argv[1], "re" , 2) ) genmode = recip; + else { + usage (); + return 1; + } + + if ( argc < 8 ) earmode = both; + else if ( 0 == strncmp ( argv[7], "le" , 2) ) earmode = left; + else if ( 0 == strncmp ( argv[7], "ri" , 2) ) earmode = right; + else if ( 0 == strncmp ( argv[7], "bo" , 2) ) earmode = both; + else if ( 0 == strncmp ( argv[7], "phase9" , 6) ) earmode = phase90; + else if ( 0 == strncmp ( argv[7], "phase1" , 6) ) earmode = phase180; + else { + usage (); + return 1; + } + + + open_soundcard ( &s, AUDIO_DEVICE, sizeof(stereo_t)/sizeof(sample_t), CHAR_BIT*sizeof(sample_t), 96000.0 ); + open_generator ( &g, &s, genmode, atof (argv[4]), atof (argv[2]), atof (argv[3]) ); + open_amplifier ( &a, &s, argc > 6 ? atof (argv[6]) : 0.0001, atof (argv[5]) ); + open_keyboard ( &k ); + + report_open ( ); + experiment ( &g, &a, &k, &s, earmode ); + report_close ( ); + + close_keyboard ( &k ); + close_amplifier( &a ); + close_generator( &g ); + close_soundcard( &s ); + + return 0; +} + +/* end of ath.c */ + + diff --git a/misc/auenc b/misc/auenc new file mode 100755 index 0000000..50d9c81 --- /dev/null +++ b/misc/auenc @@ -0,0 +1,39 @@ +#!/bin/sh +# +# auenc -- version 0.1 +# +# A wrapper for lame to encode multiple files. By default, a .wav +# extension is removed and replaced by .mp3 . +# +# (C) 1999 Gerhard Wesp <gwesp@cosy.sbg.ac.at> under the GPL. + +# set the variables below according to your taste +LAME=lame +LAME_OPTS="-S -h -v -V 0 -b 256" # high quality, silent operation + +if [ $# -lt 1 ] ; then + exec 1>&2 + cat << _EOF_ +usage: $0 [options] file... +options: + -d --delete: delete original file after successful encoding +_EOF_ + exit 1 +fi + +unset DELETE +case "$1" in + -d | --delete ) DELETE=1 ; shift ;; +esac + +for f +do + $LAME $LAME_OPTS "$f" `basename "$f" .wav`.mp3 || { + exec 1>&2 + echo "encoding of $f failed, aborting..." + exit 1 + } + if [ -n "$DELETE" ] ; then + rm -f "$f" + fi +done diff --git a/misc/depcomp b/misc/depcomp new file mode 100755 index 0000000..b39f98f --- /dev/null +++ b/misc/depcomp @@ -0,0 +1,791 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2016-01-11.22; # UTC + +# Copyright (C) 1999-2017 Free Software Foundation, Inc. + +# This program 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 2, or (at your option) +# any later version. + +# This program 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 this program. If not, see <http://www.gnu.org/licenses/>. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by 'PROGRAMS ARGS'. + object Object file output by 'PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputting dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to <bug-automake@gnu.org>. +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +# Get the directory component of the given path, and save it in the +# global variables '$dir'. Note that this directory component will +# be either empty or ending with a '/' character. This is deliberate. +set_dir_from () +{ + case $1 in + */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; + *) dir=;; + esac +} + +# Get the suffix-stripped basename of the given path, and save it the +# global variable '$base'. +set_base_from () +{ + base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` +} + +# If no dependency file was actually created by the compiler invocation, +# we still have to create a dummy depfile, to avoid errors with the +# Makefile "include basename.Plo" scheme. +make_dummy_depfile () +{ + echo "#dummy" > "$depfile" +} + +# Factor out some common post-processing of the generated depfile. +# Requires the auxiliary global variable '$tmpdepfile' to be set. +aix_post_process_depfile () +{ + # If the compiler actually managed to produce a dependency file, + # post-process it. + if test -f "$tmpdepfile"; then + # Each line is of the form 'foo.o: dependency.h'. + # Do two passes, one to just change these to + # $object: dependency.h + # and one to simply output + # dependency.h: + # which is needed to avoid the deleted-header problem. + { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" + sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" + } > "$depfile" + rm -f "$tmpdepfile" + else + make_dummy_depfile + fi +} + +# A tabulation character. +tab=' ' +# A newline character. +nl=' +' +# Character ranges might be problematic outside the C locale. +# These definitions help. +upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ +lower=abcdefghijklmnopqrstuvwxyz +digits=0123456789 +alpha=${upper}${lower} + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Avoid interferences from the environment. +gccflag= dashmflag= + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvisualcpp +fi + +if test "$depmode" = msvc7msys; then + # This is just like msvc7 but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvc7 +fi + +if test "$depmode" = xlc; then + # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. + gccflag=-qmakedep=gcc,-MF + depmode=gcc +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. +## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. +## (see the conditional assignment to $gccflag above). +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). Also, it might not be +## supported by the other compilers which use the 'gcc' depmode. +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The second -e expression handles DOS-style file names with drive + # letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the "deleted header file" problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. +## Some versions of gcc put a space before the ':'. On the theory +## that the space means something, we add a space to the output as +## well. hp depmode also adds that space, but also prefixes the VPATH +## to the object. Take care to not repeat it in the output. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like '#:fec' to the end of the + # dependency line. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ + | tr "$nl" ' ' >> "$depfile" + echo >> "$depfile" + # The second pass generates a dummy entry for each header file. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" + ;; + +xlc) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts '$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + aix_post_process_depfile + ;; + +tcc) + # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 + # FIXME: That version still under development at the moment of writing. + # Make that this statement remains true also for stable, released + # versions. + # It will wrap lines (doesn't matter whether long or short) with a + # trailing '\', as in: + # + # foo.o : \ + # foo.c \ + # foo.h \ + # + # It will put a trailing '\' even on the last line, and will use leading + # spaces rather than leading tabs (at least since its commit 0394caf7 + # "Emit spaces for -MD"). + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. + # We have to change lines of the first kind to '$object: \'. + sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" + # And for each line of the second kind, we have to emit a 'dep.h:' + # dummy dependency, to avoid the deleted-header problem. + sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" + rm -f "$tmpdepfile" + ;; + +## The order of this option in the case statement is important, since the +## shell code in configure will try each of these formats in the order +## listed in this file. A plain '-MD' option would be understood by many +## compilers, so we must ensure this comes after the gcc and icc options. +pgcc) + # Portland's C compiler understands '-MD'. + # Will always output deps to 'file.d' where file is the root name of the + # source file under compilation, even if file resides in a subdirectory. + # The object file name does not affect the name of the '.d' file. + # pgcc 10.2 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using '\' : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + set_dir_from "$object" + # Use the source, not the object, to determine the base name, since + # that's sadly what pgcc will do too. + set_base_from "$source" + tmpdepfile=$base.d + + # For projects that build the same source file twice into different object + # files, the pgcc approach of using the *source* file root name can cause + # problems in parallel builds. Use a locking strategy to avoid stomping on + # the same $tmpdepfile. + lockdir=$base.d-lock + trap " + echo '$0: caught signal, cleaning up...' >&2 + rmdir '$lockdir' + exit 1 + " 1 2 13 15 + numtries=100 + i=$numtries + while test $i -gt 0; do + # mkdir is a portable test-and-set. + if mkdir "$lockdir" 2>/dev/null; then + # This process acquired the lock. + "$@" -MD + stat=$? + # Release the lock. + rmdir "$lockdir" + break + else + # If the lock is being held by a different process, wait + # until the winning process is done or we timeout. + while test -d "$lockdir" && test $i -gt 0; do + sleep 1 + i=`expr $i - 1` + done + fi + i=`expr $i - 1` + done + trap - 1 2 13 15 + if test $i -le 0; then + echo "$0: failed to acquire lock after $numtries attempts" >&2 + echo "$0: check lockdir '$lockdir'" >&2 + exit 1 + fi + + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" + # Add 'dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in 'foo.d' instead, so we check for that too. + # Subdirectories are respected. + set_dir_from "$object" + set_base_from "$object" + + if test "$libtool" = yes; then + # Libtool generates 2 separate objects for the 2 libraries. These + # two compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir$base.o.d # libtool 1.5 + tmpdepfile2=$dir.libs/$base.o.d # Likewise. + tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + # Same post-processing that is required for AIX mode. + aix_post_process_depfile + ;; + +msvc7) + if test "$libtool" = yes; then + showIncludes=-Wc,-showIncludes + else + showIncludes=-showIncludes + fi + "$@" $showIncludes > "$tmpdepfile" + stat=$? + grep -v '^Note: including file: ' "$tmpdepfile" + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The first sed program below extracts the file names and escapes + # backslashes for cygpath. The second sed program outputs the file + # name when reading, but also accumulates all include files in the + # hold buffer in order to output them again at the end. This only + # works with sed implementations that can handle large buffers. + sed < "$tmpdepfile" -n ' +/^Note: including file: *\(.*\)/ { + s//\1/ + s/\\/\\\\/g + p +}' | $cygpath_u | sort -u | sed -n ' +s/ /\\ /g +s/\(.*\)/'"$tab"'\1 \\/p +s/.\(.*\) \\/\1:/ +H +$ { + s/.*/'"$tab"'/ + G + p +}' >> "$depfile" + echo >> "$depfile" # make sure the fragment doesn't end with a backslash + rm -f "$tmpdepfile" + ;; + +msvc7msys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for ':' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. + "$@" $dashmflag | + sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this sed invocation + # correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + # makedepend may prepend the VPATH from the source file name to the object. + # No need to regex-escape $object, excess matching of '.' is harmless. + sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process the last invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed '1,2d' "$tmpdepfile" \ + | tr ' ' "$nl" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E \ + | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + | sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" + echo "$tab" >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/misc/lame4dos.bat b/misc/lame4dos.bat new file mode 100644 index 0000000..b15cb3e --- /dev/null +++ b/misc/lame4dos.bat @@ -0,0 +1,41 @@ +@echo off +rem --------------------------------------------- +rem PURPOSE: +rem - put this Batch-Command on your Desktop, +rem so you can drag and drop wave files on it +rem and LAME will encode them to mp3 format. +rem - put this Batch-Command in a place mentioned +rem in your PATH environment, start the DOS-BOX +rem and change to a directory where your wave +rem files are located. the following line will +rem encode all your wave files to mp3 +rem "lame.bat *.wav" +rem --------------------------------------------- +rem C2000 Robert Hegemann +rem --------------------------------------------- +rem Changes to support long filenames using 4DOS +rem by Alexander Stumpf <dropdachalupa@gmx.net> +rem --------------------------------------------- +rem please set LAME and LAMEOPTS +rem LAME - where the executeable is +rem OPTS - options you like LAME to use + + set LAME=c:\progra~1\sound&~1\lame\lame.exe + set OPTS=-h --lowpass-width 2 --lowpass 20.5 -b 112 --abr 180 + +rem --------------------------------------------- + + set thecmd=%LAME% %OPTS% + for %%f in (%&) do (%thecmd% %@sfn[%%f]^(ren %@sfn[%%f].mp3 "%@lfn[%%f].mp_">NUL)) + ren *.mp3.mp_ *.new.mp3 >& NUL + ren *.wav.mp_ *.mp3 >& NUL + goto endmark +:errormark + echo. + echo. + echo ERROR processing %1 + echo. +:endmark +rem +rem finished +rem diff --git a/misc/lameGUI.html b/misc/lameGUI.html new file mode 100644 index 0000000..db90fd0 --- /dev/null +++ b/misc/lameGUI.html @@ -0,0 +1,403 @@ +<html> + +<head> +<meta http-equiv="Content-Type" +content="text/html; charset=iso-8859-1"> +<meta name="GENERATOR" content="Microsoft FrontPage Express 2.0"> +<title>Lame + + + + + + + +
+

LAME Frontend

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Fixed Bitrate 
bitrate (-b) high quality (-h)
 fast (no noise shaping)
  
Variable Bitrate 
variable + bitrate (-v)VBR quality (-V)
maximum bitrate (-B) enforce min. bitrate (-F)
  
General 
mode (-m) disable all filters (-k)
copyrighted (-c)non-original (-o)
  
ID3-Tag 
title (--tt) artist (--ta)
album (--tl) year (--ty) track (--tn)
comment (--tc) genre (--tg)
   
+
+ + + + + + +
[LAME HELP] [LAME Readme] [LAME History] [LAME + Homepage] 
+ + diff --git a/misc/lameid3.pl b/misc/lameid3.pl new file mode 100644 index 0000000..5352877 --- /dev/null +++ b/misc/lameid3.pl @@ -0,0 +1,55 @@ +# +# From: Per Bolmstedt +# +# AC> If someone has scripts that read input ID3 tags and convert +# AC> them to args for lame (which then encodes the tags into the +# AC> output files), let me know, too! +# +# This is easy peasy using Perl. Especially using Chris Nandor's excellent +# MP3::Info package (available on CPAN). Here's a program I just wrote that +# I think does what you want. Invoke it with " [options]" +# (where the options can include an output filename), like for example: +# +# lameid3.pl HQ.mp3 LQ.mp3 -fv +# +# (Note how the syntax differs from that of Lame's.) The program will +# extract ID3 tags from the input file and invoke Lame with arguments for +# including them. (This program has not undergone any real testing..) + +use MP3::Info; +use strict; + +my %flds = ( + TITLE => 'tt', + ARTIST => 'ta', + ALBUM => 'tl', + YEAR => 'ty', + COMMENT => 'tc', + GENRE => 'tg', + TRACKNUM => 'tn' + ); + +my $f = shift @ARGV; +my $s = "lame ${f} " . &makeid3args( $f ) . join ' ', @ARGV; +print STDERR "[${s}]\n"; +system( $s ); + +sub makeid3args( $ ) +{ + my $s; + if ( my $tag = get_mp3tag( @_->[ 0 ] ) ) + { + for ( keys %flds ) + { + if ( $tag->{ $_ } ) + { + $s .= sprintf( + "--%s \"%s\" ", + %flds->{ $_ }, + $tag->{ $_ } ); + } + } + } + return $s || ""; +} + diff --git a/misc/mk_mp3.sh b/misc/mk_mp3.sh new file mode 100644 index 0000000..36b7b1b --- /dev/null +++ b/misc/mk_mp3.sh @@ -0,0 +1,170 @@ +### (c)2000-2011 Robert Hegemann +### +### ///-/ +### +### SRC_ROOT : where the CD are located +### DST_ROOT : where newly encoded tracks should go +### DONE_ROOT : where verified encoded tracks are located +### LAME_EXE : points to program +### LAME_OPT : what options to use +################################################################ +_V=2 +SRC_ROOT=/windows/W/CD +DST_ROOT=/windows/Z/mp3v${_V}wg +DONE_ROOT=/windows/Z/mp3v${_V}wg +LAME_EXE=lame-399 +LAME_OPT="-V${_V} --quiet --noreplaygain --id3v2-only" + +SKIP_DONE_FOLDER_EXISTS=1 +SKIP_DEST_FOLDER_EXISTS=1 +SCAN_ALBUM_GAIN_ONLY=0 + +case "$0" in + mk_album_gain.sh) SCAN_ALBUM_GAIN_ONLY=1;; +esac +case "$1" in + --scan-gain-only) SCAN_ALBUM_GAIN_ONLY=1;; +esac +if [ $SCAN_ALBUM_GAIN_ONLY = 1 ] +then + SKIP_DONE_FOLDER_EXISTS=0 + SKIP_DEST_FOLDER_EXISTS=0 +fi + +if (test -e "${SRC_ROOT}") +then + if test -e "${DST_ROOT}" + then + : + else + mkdir "${DST_ROOT}" + fi + + for _artist in "${SRC_ROOT}"/* + do + _ARTIST=$(basename "${_artist}") + DST_ARTIST=${DST_ROOT}/${_ARTIST} + DS2_ARTIST=${DONE_ROOT}/${_ARTIST} + echo "${_ARTIST}" + + VARIOUS_ARTISTS_MODE=0 + case "${_ARTIST}" in + "Various" | "Various Artists" ) + VARIOUS_ARTISTS_MODE=1 + ID3_ALBUM_ARTIST="Various Artists" + ;; + "Musik Express" ) + VARIOUS_ARTISTS_MODE=2 + ID3_ALBUM_ARTIST="Various (ME)" + ;; + *) + VARIOUS_ARTISTS_MODE=0 + ID3_ALBUM_ARTIST=${_ARTIST} + ;; + esac + + for _cd in "${_artist}"/* + do + _CD=$(basename "${_cd}") + DST_CD=${DST_ARTIST}/${_CD} + DS2_CD=${DS2_ARTIST}/${_CD} + ID3_YR=`echo "${_CD}"|cut -b 1-4` + ID3_CD=`echo "${_CD}"|cut -b 6-` + if [ $SKIP_DONE_FOLDER_EXISTS = 1 ] + then + if test -e "${DS2_CD}" + then + continue + fi + fi + if [ $SKIP_DEST_FOLDER_EXISTS = 1 ] + then + if test -e "${DST_CD}" + then + continue + fi + fi + echo "${_ARTIST} / ${_CD}" + + ALBUM_GAIN="1.0" + if test -e "${_cd}/album_gain_scale.txt" + then + ALBUM_GAIN=`cat "${_cd}/album_gain_scale.txt"` + elif test -e "${DS2_CD}/album_gain_scale.txt" + then + ALBUM_GAIN=`cat "${DS2_CD}/album_gain_scale.txt"` + elif test -e "${DST_CD}/album_gain_scale.txt" + then + ALBUM_GAIN=`cat "${DST_CD}/album_gain_scale.txt"` + else + unset ALBUM_GAIN + fi + if [ "${ALBUM_GAIN}" = "" ] + then + if test -e "${DST_ARTIST}" + then + : + else + mkdir "${DST_ARTIST}" + fi + if test -e "${DST_CD}" + then + : + else + mkdir "${DST_CD}" + fi + ALBUM_GAIN=`wavegain -x -a "${_cd}"/ 2>/dev/null` + echo ${ALBUM_GAIN} > "${DST_CD}/album_gain_scale.txt" + fi + if [ $SCAN_ALBUM_GAIN_ONLY = 1 ] + then + continue + fi + + for _song in "${_cd}"/*.wav + do + _SONG=$(basename "${_song}" .wav) + DST_SONG=${DST_CD}/$(basename "${_song}" .wav).mp3 + if test -e "${DST_SONG}" + then + : + else + if test -e "${DST_ARTIST}" + then + : + else + mkdir "${DST_ARTIST}" + fi + if test -e "${DST_CD}" + then + : + else + mkdir "${DST_CD}" + fi + ID3_TRACK=`echo "${_SONG}"|cut -b 1-2` + if [ $VARIOUS_ARTISTS_MODE = 0 ] + then + ID3_TITLE=`echo "${_SONG}"|cut -b 4-` + ID3_TRACK_ARTIST=${_ARTIST} + else + ID3_TITLE=`echo "${_SONG% - *}"|cut -b 4-` + ID3_TRACK_ARTIST=`echo "${_SONG#* - }"` + fi + ${LAME_EXE} ${LAME_OPT} \ + --scale ${ALBUM_GAIN} \ + --ta "${ID3_TRACK_ARTIST}" \ + --tl "${ID3_CD}" \ + --ty "${ID3_YR}" \ + --tt "${ID3_TITLE}" \ + --tn "${ID3_TRACK}" \ + --tv "TXXX=ALBUM ARTIST=${ID3_ALBUM_ARTIST}" \ + --tv "TXXX=LAME SCALE=${ALBUM_GAIN}" \ + "${_song}" "${DST_SONG}" & + fi + done + wait + done + done +else + echo Quellverzeichnis ${SRC_ROOT} existiert nicht. +fi diff --git a/misc/mlame b/misc/mlame new file mode 100755 index 0000000..23beab5 --- /dev/null +++ b/misc/mlame @@ -0,0 +1,195 @@ +#!/bin/sh + +############################################################################ +# +# Run the LAME encoder on multiple files, with option to delete .wav files +# after encoding. "mlame -?" will give instructions. +# +# Robert Hegemann +# modified on request: Frank Klemm <pfk@uni-jena.de> +# +############################################################################ + +# encoder path to use +mp3coder="lame" +mp3analyzer="mlame_corr" + +# default options to use +options_low="-h -d -mj -b 128" +options_high="-h -d -mj -V 1 -b 112 -B 320" +options=$options_high + +# remove source? +removesource=false + +# force overwrite of destination +testoverwrite=true + +# waiting after error report n seconds +errordelay=1 + +helptext="\n\ +This script runs the LAME mp3 encoder on multiple files: \n\n\ + $0 [options] <file 1> ... <file n>\n\ +\n\ + options:\n\ + -? this help text\n\ + -r remove files after encoding\n\ + -f force overwrite of destination if exists\n\ + -l low quality settings\n\ + -h high quality settings\n\ + -o \"<lame options>\" overrides script default options +\n\ + example:\n\ + $0 -r -f -o \"-v -V 0 -b 112\" a*.wav z*.aif g*.mp?\n\ +\n\ +" + +# process command-line options +# this could be extended to fake the +# commandline interface of the mp3encoder + +while getopts ":o:r:h:l:f" optn; do + case $optn in + o ) options=$OPTARG # replace default options + echo New lame options are \'$options\' + ;; + r ) removesource=true + echo Removing source files after successfully converting + ;; + f ) testoverwrite=false + echo Force overwriting existing destination files + ;; + h ) options=$options_high + ;; + l ) options=$options_low + ;; + \? ) printf "$helptext" + sleep $errordelay + exit 1 + ;; + esac +done +shift $(($OPTIND - 1)) + +# no files remaining? + +if [ "$1" = "" ]; then + printf "$helptext" + sleep $errordelay + exit 1 +fi + +# process input-files + +for src in "$@"; do + + case $src in + *[.][wW][aA][vV] ) + dst=${src%[.][wW][aA][vV]}.mp3 + if [ -f "$src" ]; then + if [ $testoverwrite = true -a -f "$dst" ]; then + echo \'$dst\' already exists, skipping + sleep $errordelay + elif $mp3coder $options `$mp3analyzer "$src"` "$src" "$dst"; then + if [ $removesource = true ]; then + rm -f "$src" + fi + else + echo converting of \'$src\' to \'$dst\' failed + sleep $errordelay + fi + else + echo No source file \'$src\' found. + sleep $errordelay + fi + ;; + + *[.][aA][iI][fF] ) + dst=${src%[.][aA][iI][fF]}.mp3 + if [ -f "$src" ]; then + if [ $testoverwrite = true -a -f "$dst" ]; then + echo \'$dst\' already exists, skipping + sleep $errordelay + elif $mp3coder $options "$src" "$dst"; then + if [ $removesource = true ]; then + rm -f "$src" + fi + else + echo converting of \'$src\' to \'$dst\' failed + sleep $errordelay + fi + else + echo No source file \'$src\' found. + sleep $errordelay + fi + ;; + + *[.][aA][iI][fF][fF] ) + dst=${src%[.][aA][iI][fF][fF]}.mp3 + if [ -f "$src" ]; then + if [ $testoverwrite = true -a -f "$dst" ]; then + echo \'$dst\' already exists, skipping + sleep $errordelay + elif $mp3coder $options "$src" "$dst"; then + if [ $removesource = true ]; then + rm -f "$src" + fi + else + echo converting of \'$src\' to \'$dst\' failed + sleep $errordelay + fi + else + echo No source file \'$src\' found. + sleep $errordelay + fi + ;; + + *[.][mM][pP][gG12] ) + dst=${src%[.][mM][pP][gG12]}.mp3 + if [ -f "$src" ]; then + if [ $testoverwrite = true -a -f "$dst" ]; then + echo \'$dst\' already exists, skipping + sleep $errordelay + elif $mp3coder $options "$src" "$dst"; then + if [ $removesource = true ]; then + rm -f "$src" + fi + else + echo converting of \'$src\' to \'$dst\' failed + sleep $errordelay + fi + else + echo No source file \'$src\' found. + sleep $errordelay + fi + ;; + + *[.][mM][pP]3 ) + dst=${src%[.][mM][pP]3}-new-converted-file.${src##*.} + if [ -f "$src" ]; then + if [ $testoverwrite = true -a -f "$dst" ]; then + echo \'$dst\' already exists, skipping + sleep $errordelay + elif $mp3coder $options "$src" "$dst"; then + if [ $removesource = true ]; then + mv -f "$dst" "$src" + fi + else + echo converting of \'$src\' to \'$dst\' failed + sleep $errordelay + fi + else + echo No source file \'$src\' found. + sleep $errordelay + fi + ;; + + * ) # the rest + echo warning: File extention \'.${src##*.}\' not supported + sleep $errordelay + ;; + + esac + +done diff --git a/misc/mlame_corr.c b/misc/mlame_corr.c new file mode 100644 index 0000000..4305b63 --- /dev/null +++ b/misc/mlame_corr.c @@ -0,0 +1,220 @@ +/* + Bug: + - runs only on little endian machines for WAV files + - Not all WAV files are recognized + */ + +#include <stdio.h> +#include <unistd.h> +#include <math.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <memory.h> + +typedef signed short stereo [2]; +typedef signed short mono; +typedef struct { + unsigned long long n; + long double x; + long double x2; + long double y; + long double y2; + long double xy; +} korr_t; + +void analyze_stereo ( const stereo* p, size_t len, korr_t* k ) +{ + long double _x = 0, _x2 = 0, _y = 0, _y2 = 0, _xy = 0; + double t1; + double t2; + + k -> n += len; + + for ( ; len--; p++ ) { + _x += (t1 = (*p)[0]); _x2 += t1 * t1; + _y += (t2 = (*p)[1]); _y2 += t2 * t2; + _xy += t1 * t2; + } + + k -> x += _x ; + k -> x2 += _x2; + k -> y += _y ; + k -> y2 += _y2; + k -> xy += _xy; +} + +void analyze_dstereo ( const stereo* p, size_t len, korr_t* k ) +{ + static double l0 = 0; + static double l1 = 0; + long double _x = 0, _x2 = 0, _y = 0, _y2 = 0, _xy = 0; + double t1; + double t2; + + k -> n += len; + + for ( ; len--; p++ ) { + _x += (t1 = (*p)[0] - l0); _x2 += t1 * t1; + _y += (t2 = (*p)[1] - l1); _y2 += t2 * t2; + _xy += t1 * t2; + l0 = (*p)[0]; + l1 = (*p)[1]; + } + + k -> x += _x ; + k -> x2 += _x2; + k -> y += _y ; + k -> y2 += _y2; + k -> xy += _xy; +} + + +void analyze_mono ( const mono* p, size_t len, korr_t* k ) +{ + long double _x = 0, _x2 = 0; + double t1; + + k -> n += len; + + for ( ; len--; p++ ) { + _x += (t1 = (*p)); _x2 += t1 * t1; + } + + k -> x += _x ; + k -> x2 += _x2; + k -> y += _x ; + k -> y2 += _x2; + k -> xy += _x2; +} + +void analyze_dmono ( const mono* p, size_t len, korr_t* k ) +{ + static double l0 = 0; + long double _x = 0, _x2 = 0; + double t1; + + k -> n += len; + + for ( ; len--; p++ ) { + _x += (t1 = (*p) - l0); _x2 += t1 * t1; + l0 = *p; + } + + k -> x += _x ; + k -> x2 += _x2; + k -> y += _x ; + k -> y2 += _x2; + k -> xy += _x2; +} + +int sgn ( long double x ) +{ + if ( x > 0 ) return +1; + if ( x < 0 ) return -1; + return 0; +} + +int report ( const korr_t* k ) +{ + long double scale = sqrt ( 1.e5 / (1<<29) ); // Sine Full Scale is +10 dB, 7327 = 100% + long double r; + long double rd; + long double sx; + long double sy; + long double x; + long double y; + long double b; + + r = (k->x2*k->n - k->x*k->x) * (k->y2*k->n - k->y*k->y); + r = r > 0.l ? (k->xy*k->n - k->x*k->y) / sqrt (r) : 1.l; + sx = k->n > 1 ? sqrt ( (k->x2 - k->x*k->x/k->n) / (k->n - 1) ) : 0.l; + sy = k->n > 1 ? sqrt ( (k->y2 - k->y*k->y/k->n) / (k->n - 1) ) : 0.l; + x = k->n > 0 ? k->x/k->n : 0.l; + y = k->n > 0 ? k->y/k->n : 0.l; + + b = atan2 ( sy, sx * sgn (r) ) * ( 8 / M_PI); + +// 6 5 4 3 2 +// _______________________________ +// |\ | /| +// 7 | \ | / | 1 +// | \ | / | +// | \ | / | +// | \ | / | +// 8 |--------------+--------------| 0 +// | / | \ | +// | / | \ | +// -7 | / | \ | -1 +// | / | \ | +// |/_____________|_____________\| +// +// -6 -5 -4 -3 -2 + + if ( r > 0.98 ) { + printf ("-mm"); // disguised mono file + return; + } + if ( fabs (b-2) > 0.666 ) { + printf ("-ms"); // low profit for joint stereo + return; + } + if ( r < 0.333 ) { + printf ("-ms"); // low profit for joint stereo + return; + } +} + +void readfile ( const char* name, int fd ) +{ + unsigned short header [22]; + stereo s [4096]; + mono m [8192]; + size_t samples; + korr_t k0; + korr_t k1; + + memset ( &k0, 0, sizeof(k0) ); + memset ( &k1, 0, sizeof(k1) ); + + read ( fd, header, sizeof(header) ); + + switch ( header[11] ) { + case 1: + printf ("-mm\n"); + break; + + case 2: + while ( ( samples = read (fd, s, sizeof(s)) ) > 0 ) { + analyze_stereo ( s, samples / sizeof (*s), &k0 ); + analyze_dstereo ( s, samples / sizeof (*s), &k1 ); + } + report (&k0); + report (&k1); + break; + + default: + fprintf ( stderr, "%u Channels not supported: %s\n", header[11], name ); + break; + } +} + +int main ( int argc, char** argv ) +{ + char* name; + int fd; + + if (argc < 2) + readfile ( "<stdin>", 0 ); + else + while ( (name = *++argv) != NULL ) { + if ( (fd = open ( name, O_RDONLY )) >= 0 ) { + readfile ( name, fd ); + close ( fd ); + } else { + fprintf ( stderr, "Can't open: %s\n", name ); + } + } + + return 0; +} diff --git a/misc/mugeco.sh b/misc/mugeco.sh new file mode 100755 index 0000000..6be2774 --- /dev/null +++ b/misc/mugeco.sh @@ -0,0 +1,137 @@ +#!/bin/sh +progname=mugeco version=0.1 +programr='Alexander Leidinger' +progdate='7 Dec 2000' +progdesc='MUltiGEnerationCOding' +# NEEDS: getopt, lame +# Please have a look at the DEFAULTS section. + +# $Id: mugeco.sh,v 1.6 2000/12/08 13:47:56 aleidinger Exp $ + +usage() { +cat << EOF +** $progname v$version, $progdate ** +by $programr +$progdesc +usage: $progname [ <flags> ] -g <num> <file> + -v use builtin VBR options + -g <num> number of generations + -h help + + used + - env vars: + * LAME : alternative encoder binary + * LAMEOPT: alternative encoder options + - VBR opts: $enc_vbr_opts + - CBR opts: $enc_cbr_opts +EOF +} + +# DEFAULTS + +# if you can, use getopt(1) (c)1997 by Frodo Looijaard <frodol@dds.nl> +# it's in most modern unixen, or look at http://huizen.dds.nl/~frodol/ +: ${GETOPT=getopt} # helper program +# mktemp (optional) is also in most modern unixen (originally from OpenBSD) +: ${MKTEMP=mktemp} # helper program +: ${TMPDIR:=/tmp} # set default temp directory +: ${LAME:=lame} # path to LAME + +enc_cbr_opts="-b192 -h --lowpass 18 --lowpass-width 0" +enc_vbr_opts="--vbr-mtrh --nspsytune -v -h -d -Y -X3" +enc_opts=${LAMEOPT:-$enc_cbr_opts} +num= # default number of generations + +# DEFINE FUNCTIONS + +e() { echo "$progname: $*"; } +die() { # usage: die [ <exitcode> [ <errormessage> ] ] + trap '' 1 2 3 13 15 + exitcode=0 + [ $# -gt 0 ] && { exitcode=$1; shift; } + [ $# -gt 0 ] && e "Error: $*" >&2 + exit $exitcode +} + +# tfile() +# this function creates temporary files. 'tfile temp' will make a tempfile +# and put the path to it in the variable $temp (defaults to variable $tf) +trap 'for f in $ztfiles; do rm -f "$f"; done' 0 +trap 'trap "" 1 2 3 13 15; exit 10' 1 2 3 13 15 +unset ztfiles +tfile() { # usage: tfile <variable_name> + ztf=`$MKTEMP -q $TMPDIR/$progname.XXXXXX 2>/dev/null` # try mktemp + if [ $? -gt 0 -o -z "$ztf" ]; then # if mktemp fails, do it unsafely + ztf=$TMPDIR/$LOGNAME.$progname.$$ + [ -e "$ztf" ] && ztf= || { touch $ztf && chmod 600 $ztf; } + fi + [ "$ztf" -a -f "$ztf" ] || { echo Could not make tempfile; exit 8; } + ztfiles="$ztfiles $ztf" + eval ${1:-tf}='$ztf' +} + +# PARSE COMMAND LINE + +options="g:vh" # option string for getopt(1) +help=; [ "$1" = -h -o "$1" = -help -o "$1" = --help ] && help=yes +[ "$help" ] && { usage; die; } +$GETOPT -T >/dev/null 2>&1 +[ $? -eq 4 ] && GETOPT="$GETOPT -n $progname -s sh" #frodol's getopt? +eval set -- `$GETOPT "$options" "$@"` +[ $# -lt 1 ] && { die 9 getopt failed; } +while [ $# -gt 0 ]; do + case "$1" in + -g) num=$2; shift ;; + -v) enc_opts=$enc_cbr_opts ;; + -h) help=y ;; + --) shift; break ;; + *) usage; die 9 "invalid command line syntax!" ;; + esac + shift +done +[ "$help" ] && { usage; die; } +[ $# -eq 0 ] && { usage; die 9 no arguments; } #change or remove if desired +# sanity checking +[ "$num" ] && echo "$num"|grep -q '^[0-9]*$' && [ $num -ge 1 ] \ + || die 1 please use the -g flag with a valid number + +# MAIN PROGRAM + +# what version of lame are we using? +lame_vers=`$LAME 2>&1 | awk 'NR==1{print $3}'` + +# check filename +[ -f "$1" ] || die 2 "'$1' isn't a file" +echo "$1"|grep -qi '\.wav$' || die 2 "'$1' isn't a .wav" + +# make tempfiles +base=`echo "$1"|sed 's/\.[^.]*$//'` +dest=${base}_generation_$num.wav +[ -e "$dest" ] && die 2 "'$dest' already exists" +touch "$dest" || die 2 "couldn't create '$dest'" +TMPDIR=. tfile tmpwav +TMPDIR=. tfile tmpmp3 +cp -f "$1" "$tmpwav" + +# do the loop +start=`date` +i=1 +while [ $i -le $num ]; do + e "Working on file '$1', generation number $i..." + + $LAME $enc_opts --tc "lame $lame_vers; Generation: $i" \ + "$tmpwav" "$tmpmp3" || die 3 encoding failed + $LAME --decode --mp3input "$tmpmp3" "$tmpwav" || die 3 decoding failed + + i=`expr $i + 1` +done +end=`date` + +# save the result +ln -f "$tmpwav" "$dest" + +echo +e "Start: $start" +e "Stop : $end" + +die diff --git a/misc/scalartest.c b/misc/scalartest.c new file mode 100644 index 0000000..01680d0 --- /dev/null +++ b/misc/scalartest.c @@ -0,0 +1,166 @@ +#include <stdio.h> +#include <math.h> +#include <asm/msr.h> +#include "resample.h" + +#define CLK 300.e6 +#define LOOPS 20000 + + +typedef double ( *ddf ) ( double ); + + +float a1 [256]; +float a2 [256]; + +void init ( void ) +{ + int i; + + for ( i = 0; i < sizeof(a1)/sizeof(*a1); i++ ) { + a1 [i] = sin(i)+0.2*sin(1.8*i)+log(2+i); + a2 [i] = cos(0.1*i); + } +} + +void test ( int no, scalar_t f ) +{ + unsigned long long t1; + unsigned long long t2; + unsigned long long t3; + unsigned long long t4; + int l; + double last = 0; + double curr = 0; + + printf ( "[%3u] %22.14f\t\t", no, (double)f (a1,a2) ); + fflush ( stdout ); + + do { + rdtscll (t1); + l = LOOPS; + do + ; + while (--l); + rdtscll (t2); + rdtscll (t3); + l = LOOPS; + do + f(a1,a2), f(a1,a2), f(a1,a2), f(a1,a2); + while (--l); + rdtscll (t4); + last = curr; + curr = (t4-t3-t2+t1) / CLK / LOOPS / 4 * 1.e9; + } while ( fabs(curr-last) > 1.e-4 * (curr+last) ); + printf ("%8.2f ns\n", (curr+last) / 2 ); +} + +void testn ( scalarn_t f ) +{ + unsigned long long t1; + unsigned long long t2; + unsigned long long t3; + unsigned long long t4; + int l; + int i; + double last = 0; + double curr = 0; + + for ( i = 1; i <= 64; i += i<6 ? 1 : i<8 ? 2 : i ) { + printf ( "[%3u] %22.14f\t\t", 4*i, (double)f (a1,a2,i) ); + fflush ( stdout ); + + do { + rdtscll (t1); + l = LOOPS; + do + ; + while (--l); + rdtscll (t2); + rdtscll (t3); + l = LOOPS; + do + f(a1,a2,i), f(a1,a2,i), f(a1,a2,i), f(a1,a2,i); + while (--l); + rdtscll (t4); + last = curr; + curr = (t4-t3-t2+t1) / CLK / LOOPS / 4 * 1.e9; + } while ( fabs(curr-last) > 1.e-4 * (curr+last) ); + printf ("%8.2f ns\n", (curr+last) / 2 ); + } +} + +void test2 ( const char* name, ddf f ) +{ + int i; + double x; + + printf ( "\n%%%% %s\n\n", name ); + + for ( i = -1000; i <= 1000; i++ ) { + x = 1.e-3 * i; + printf ( "%5d\t%12.8f\t%12.8f\t%12.8f\n", i, f(x), (f(x+5.e-5) - f(x-5.e-5))*1.e+4, (f(x+1.e-4) + f(x-1.e-4) - 2*f(x))*5.e+7 ); + } + printf ( "%%%%\n" ); + fflush ( stdout ); +} + + +int main ( int argc, char** argv ) +{ + +#if 0 + + test2 ( "Hann", hanning ); + test2 ( "Hamm", hamming ); + test2 ( "BM", blackman ); + test2 ( "BM1",blackman1 ); + test2 ( "BM2",blackman2 ); + test2 ( "BMH N",blackmanharris_nuttall ); + test2 ( "MNH Min",blackmanharris_min4 ); + +#else + + init (); + + test ( 4, scalar04_float32 ); + test ( 4, scalar04_float32_i387 ); + test ( 4, scalar04_float32_3DNow ); + test ( 4, scalar04_float32_SIMD ); + + test ( 8, scalar08_float32 ); + test ( 8, scalar08_float32_i387 ); + test ( 8, scalar08_float32_3DNow ); + test ( 8, scalar08_float32_SIMD ); + + test ( 12, scalar12_float32 ); + test ( 12, scalar12_float32_i387 ); + test ( 12, scalar12_float32_3DNow ); + test ( 12, scalar12_float32_SIMD ); + + test ( 16, scalar16_float32 ); + test ( 16, scalar16_float32_i387 ); + test ( 16, scalar16_float32_3DNow ); + test ( 16, scalar16_float32_SIMD ); + + test ( 20, scalar20_float32 ); + test ( 20, scalar20_float32_i387 ); + test ( 20, scalar20_float32_3DNow ); + test ( 20, scalar20_float32_SIMD ); + + test ( 24, scalar24_float32 ); + test ( 24, scalar24_float32_i387 ); + test ( 24, scalar24_float32_3DNow ); + test ( 24, scalar24_float32_SIMD ); + + testn( scalar4n_float32 ); + testn( scalar4n_float32_i387 ); + testn( scalar4n_float32_3DNow ); + testn( scalar4n_float32_SIMD ); + +#endif + + return 0; +} + +/* end of scalartest.c */ diff --git a/missing b/missing new file mode 100755 index 0000000..c6e3795 --- /dev/null +++ b/missing @@ -0,0 +1,215 @@ +#! /bin/sh +# Common wrapper for a few potentially missing GNU programs. + +scriptversion=2016-01-11.22; # UTC + +# Copyright (C) 1996-2017 Free Software Foundation, Inc. +# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996. + +# This program 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 2, or (at your option) +# any later version. + +# This program 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 this program. If not, see <http://www.gnu.org/licenses/>. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try '$0 --help' for more information" + exit 1 +fi + +case $1 in + + --is-lightweight) + # Used by our autoconf macros to check whether the available missing + # script is modern enough. + exit 0 + ;; + + --run) + # Back-compat with the calling convention used by older automake. + shift + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due +to PROGRAM being missing or too old. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + +Supported PROGRAM values: + aclocal autoconf autoheader autom4te automake makeinfo + bison yacc flex lex help2man + +Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and +'g' are ignored when checking the name. + +Send bug reports to <bug-automake@gnu.org>." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: unknown '$1' option" + echo 1>&2 "Try '$0 --help' for more information" + exit 1 + ;; + +esac + +# Run the given program, remember its exit status. +"$@"; st=$? + +# If it succeeded, we are done. +test $st -eq 0 && exit 0 + +# Also exit now if we it failed (or wasn't found), and '--version' was +# passed; such an option is passed most likely to detect whether the +# program is present and works. +case $2 in --version|--help) exit $st;; esac + +# Exit code 63 means version mismatch. This often happens when the user +# tries to use an ancient version of a tool on a file that requires a +# minimum version. +if test $st -eq 63; then + msg="probably too old" +elif test $st -eq 127; then + # Program was missing. + msg="missing on your system" +else + # Program was found and executed, but failed. Give up. + exit $st +fi + +perl_URL=http://www.perl.org/ +flex_URL=http://flex.sourceforge.net/ +gnu_software_URL=http://www.gnu.org/software + +program_details () +{ + case $1 in + aclocal|automake) + echo "The '$1' program is part of the GNU Automake package:" + echo "<$gnu_software_URL/automake>" + echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/autoconf>" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + autoconf|autom4te|autoheader) + echo "The '$1' program is part of the GNU Autoconf package:" + echo "<$gnu_software_URL/autoconf/>" + echo "It also requires GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + esac +} + +give_advice () +{ + # Normalize program name to check for. + normalized_program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + + printf '%s\n' "'$1' is $msg." + + configure_deps="'configure.ac' or m4 files included by 'configure.ac'" + case $normalized_program in + autoconf*) + echo "You should only need it if you modified 'configure.ac'," + echo "or m4 files included by it." + program_details 'autoconf' + ;; + autoheader*) + echo "You should only need it if you modified 'acconfig.h' or" + echo "$configure_deps." + program_details 'autoheader' + ;; + automake*) + echo "You should only need it if you modified 'Makefile.am' or" + echo "$configure_deps." + program_details 'automake' + ;; + aclocal*) + echo "You should only need it if you modified 'acinclude.m4' or" + echo "$configure_deps." + program_details 'aclocal' + ;; + autom4te*) + echo "You might have modified some maintainer files that require" + echo "the 'autom4te' program to be rebuilt." + program_details 'autom4te' + ;; + bison*|yacc*) + echo "You should only need it if you modified a '.y' file." + echo "You may want to install the GNU Bison package:" + echo "<$gnu_software_URL/bison/>" + ;; + lex*|flex*) + echo "You should only need it if you modified a '.l' file." + echo "You may want to install the Fast Lexical Analyzer package:" + echo "<$flex_URL>" + ;; + help2man*) + echo "You should only need it if you modified a dependency" \ + "of a man page." + echo "You may want to install the GNU Help2man package:" + echo "<$gnu_software_URL/help2man/>" + ;; + makeinfo*) + echo "You should only need it if you modified a '.texi' file, or" + echo "any other file indirectly affecting the aspect of the manual." + echo "You might want to install the Texinfo package:" + echo "<$gnu_software_URL/texinfo/>" + echo "The spurious makeinfo call might also be the consequence of" + echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" + echo "want to install GNU make:" + echo "<$gnu_software_URL/make/>" + ;; + *) + echo "You might have modified some files without having the proper" + echo "tools for further handling them. Check the 'README' file, it" + echo "often tells you about the needed prerequisites for installing" + echo "this package. You may also peek at any GNU archive site, in" + echo "case some other package contains this missing '$1' program." + ;; + esac +} + +give_advice "$1" | sed -e '1s/^/WARNING: /' \ + -e '2,$s/^/ /' >&2 + +# Propagate the correct exit status (expected to be 127 for a program +# not found, 63 for a program that failed due to version mismatch). +exit $st + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/mpglib/AUTHORS b/mpglib/AUTHORS new file mode 100644 index 0000000..0a6a10b --- /dev/null +++ b/mpglib/AUTHORS @@ -0,0 +1,16 @@ +Michael Hipp <mh@mpg123.de> Author of orignal mpglib version 0.2a. + +Albert L. Faber <afaber@users.sf.net> +Aleksander Korzynski <olcios@users.sf.net> +Alexander Leidinger <aleidinger@users.sf.net> +Frank Klemm <pfk@users.sf.net> +Gabriel Bouvigne <bouvigne@users.sf.net> +Leigh Smith <leighsmith@users.sf.net> +Mark Taylor <markt@users.sf.net> +Myers Carpenter <myers@users.sf.net> +Naoki Shibata <shibatch@users.sf.net> +Robert Hegemann <robert@users.sf.net> +Sigbjorn Skjaeret <cisc@users.sf.net> +Stefan Bellon <sbellon@users.sf.net> +Steve Lhomme <robux4@users.sf.net> +Takehiro TOMINAGA <takehiro@users.sf.net> diff --git a/mpglib/Makefile.am b/mpglib/Makefile.am new file mode 100644 index 0000000..b521f20 --- /dev/null +++ b/mpglib/Makefile.am @@ -0,0 +1,55 @@ +## $Id: Makefile.am,v 1.18 2010/10/30 13:21:02 robert Exp $ + +include $(top_srcdir)/Makefile.am.global + +INCLUDES = @INCLUDES@ -I$(top_srcdir)/libmp3lame -I$(top_builddir) + +EXTRA_DIST = \ + AUTHORS \ + README + +DEFS = @DEFS@ @CONFIG_DEFS@ + +noinst_LTLIBRARIES = libmpgdecoder.la + +libmpgdecoder_la_SOURCES = common.c \ + dct64_i386.c \ + decode_i386.c \ + interface.c \ + layer1.c \ + layer2.c \ + layer3.c \ + tabinit.c + +noinst_HEADERS = common.h \ + dct64_i386.h \ + decode_i386.h \ + huffman.h \ + interface.h \ + l2tables.h \ + layer1.h \ + layer2.h \ + layer3.h \ + mpg123.h \ + mpglib.h \ + tabinit.h + +LCLINTFLAGS= \ + +posixlib \ + +showsummary \ + +showalluses \ + +whichlib \ + +forcehints \ + -fixedformalarray \ + +matchanyintegral \ + -Dlint + +lclint.txt: ${libmpgdecoder_la_SOURCES} ${noinst_HEADERS} + @lclint ${LCLINTFLAGS} ${INCLUDES} ${DEFS} ${libmpgdecoder_la_SOURCES} 2>&1 >lclint.txt || true + +lclint: lclint.txt + more lclint.txt + +#$(OBJECTS): libtool +#libtool: $(LIBTOOL_DEPS) +# $(SHELL) $(top_builddir)/config.status --recheck diff --git a/mpglib/Makefile.in b/mpglib/Makefile.in new file mode 100644 index 0000000..edc519f --- /dev/null +++ b/mpglib/Makefile.in @@ -0,0 +1,675 @@ +# Makefile.in generated by automake 1.15.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2017 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# global section for every Makefile.am + + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = mpglib +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ + $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libmpgdecoder_la_LIBADD = +am_libmpgdecoder_la_OBJECTS = common.lo dct64_i386.lo decode_i386.lo \ + interface.lo layer1.lo layer2.lo layer3.lo tabinit.lo +libmpgdecoder_la_OBJECTS = $(am_libmpgdecoder_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libmpgdecoder_la_SOURCES) +DIST_SOURCES = $(libmpgdecoder_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +HEADERS = $(noinst_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.global $(top_srcdir)/depcomp AUTHORS \ + README depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_DEFS = @CONFIG_DEFS@ +CONFIG_MATH_LIB = @CONFIG_MATH_LIB@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CPUCCODE = @CPUCCODE@ +CPUTYPE = @CPUTYPE@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ @CONFIG_DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FRONTEND_CFLAGS = @FRONTEND_CFLAGS@ +FRONTEND_LDADD = @FRONTEND_LDADD@ +FRONTEND_LDFLAGS = @FRONTEND_LDFLAGS@ +GREP = @GREP@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_CONFIG = @GTK_CONFIG@ +GTK_LIBS = @GTK_LIBS@ +INCLUDES = @INCLUDES@ -I$(top_srcdir)/libmp3lame -I$(top_builddir) +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDADD = @LDADD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_MAJOR_VERSION = @LIB_MAJOR_VERSION@ +LIB_MINOR_VERSION = @LIB_MINOR_VERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEDEP = @MAKEDEP@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NASM = @NASM@ +NASM_FORMAT = @NASM_FORMAT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM_F = @RM_F@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_FRONTEND = @WITH_FRONTEND@ +WITH_MP3RTP = @WITH_MP3RTP@ +WITH_MP3X = @WITH_MP3X@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = 1.15 foreign +EXTRA_DIST = \ + AUTHORS \ + README + +noinst_LTLIBRARIES = libmpgdecoder.la +libmpgdecoder_la_SOURCES = common.c \ + dct64_i386.c \ + decode_i386.c \ + interface.c \ + layer1.c \ + layer2.c \ + layer3.c \ + tabinit.c + +noinst_HEADERS = common.h \ + dct64_i386.h \ + decode_i386.h \ + huffman.h \ + interface.h \ + l2tables.h \ + layer1.h \ + layer2.h \ + layer3.h \ + mpg123.h \ + mpglib.h \ + tabinit.h + +LCLINTFLAGS = \ + +posixlib \ + +showsummary \ + +showalluses \ + +whichlib \ + +forcehints \ + -fixedformalarray \ + +matchanyintegral \ + -Dlint + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.global $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign mpglib/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign mpglib/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/Makefile.am.global $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libmpgdecoder.la: $(libmpgdecoder_la_OBJECTS) $(libmpgdecoder_la_DEPENDENCIES) $(EXTRA_libmpgdecoder_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(libmpgdecoder_la_OBJECTS) $(libmpgdecoder_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dct64_i386.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/decode_i386.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/interface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/layer1.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/layer2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/layer3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tabinit.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# end global section + +lclint.txt: ${libmpgdecoder_la_SOURCES} ${noinst_HEADERS} + @lclint ${LCLINTFLAGS} ${INCLUDES} ${DEFS} ${libmpgdecoder_la_SOURCES} 2>&1 >lclint.txt || true + +lclint: lclint.txt + more lclint.txt + +#$(OBJECTS): libtool +#libtool: $(LIBTOOL_DEPS) +# $(SHELL) $(top_builddir)/config.status --recheck + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/mpglib/README b/mpglib/README new file mode 100644 index 0000000..7155d00 --- /dev/null +++ b/mpglib/README @@ -0,0 +1,26 @@ +hip - Hip Isn't a Player +A LGPLed mpeg audio decoding library. + +Based off of Michael Hipp's mpglib 0.2a <http://www.mpg123.de/>, with many +improvements by the lame development team (see AUTHORS). + +The interface to the library is based off of vorbisfile. If you add mp3 +support to your app using this library it should be a snap to add Ogg Vorbis +support as well. + +This isn't as fast as mpg123 will be for decoding as none of it is in +assmbler. + +Seeking currently isn't implemented. + + +From mpglib's orginal README: +============================= + +PLEASE NOTE: This software may contain patented algorithms (at least + patented in some countries). It may be not allowed to sell/use products + based on this source code in these countries. Check this out first! + +COPYRIGHT of MP3 music: + Please note, that the duplicating of copyrighted music without explicit + permission violates the rights of the owner. diff --git a/mpglib/common.c b/mpglib/common.c new file mode 100644 index 0000000..b6ba144 --- /dev/null +++ b/mpglib/common.c @@ -0,0 +1,364 @@ +/* + * common.c: some common bitstream operations + * + * Copyright (C) 1999-2010 The L.A.M.E. project + * + * Initially written by Michael Hipp, see also AUTHORS and README. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* $Id: common.c,v 1.42 2017/08/19 14:20:27 robert Exp $ */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <ctype.h> +#include <stdlib.h> +#include <signal.h> + +#ifdef HAVE_FCNTL_H +#include <fcntl.h> +#endif + +#ifdef macintosh +#include <types.h> +#include <stat.h> +#else +#include <sys/types.h> +#include <sys/stat.h> +#endif + +#include <assert.h> + +#include "common.h" + +#ifdef WITH_DMALLOC +#include <dmalloc.h> +#endif + +/* In C++ the array first must be prototyped, why ? */ + + + /* *INDENT-OFF* */ +const int tabsel_123 [2] [3] [16] = { + { {0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,}, + {0,32,48,56, 64, 80, 96,112,128,160,192,224,256,320,384,}, + {0,32,40,48, 56, 64, 80, 96,112,128,160,192,224,256,320,} }, + + { {0,32,48,56,64,80,96,112,128,144,160,176,192,224,256,}, + {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,}, + {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,} } +}; + +const long freqs[9] = { 44100, 48000, 32000, + 22050, 24000, 16000, + 11025, 12000, 8000 }; + + /* *INDENT-ON* */ + + +real muls[27][64]; + +#if 0 +static void +get_II_stuff(struct frame *fr) +{ + /* *INDENT-OFF* */ + static const int translate [3] [2] [16] = /* char ? */ + { { { 0,2,2,2,2,2,2,0,0,0,1,1,1,1,1,0 } , + { 0,2,2,0,0,0,1,1,1,1,1,1,1,1,1,0 } } , + { { 0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0 } , + { 0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0 } } , + { { 0,3,3,3,3,3,3,0,0,0,1,1,1,1,1,0 } , + { 0,3,3,0,0,0,1,1,1,1,1,1,1,1,1,0 } } }; + /* *INDENT-ON* */ + + int table, sblim; + static const struct al_table2 *tables[5] = { alloc_0, alloc_1, alloc_2, alloc_3, alloc_4 }; + static int sblims[5] = { 27, 30, 8, 12, 30 }; + + if (fr->lsf) + table = 4; + else + table = translate[fr->sampling_frequency][2 - fr->stereo][fr->bitrate_index]; + sblim = sblims[table]; + + fr->alloc = tables[table]; + fr->II_sblimit = sblim; +} +#endif + +#define HDRCMPMASK 0xfffffd00 + +#define MAX_INPUT_FRAMESIZE 4096 + +int +head_check(unsigned long head, int check_layer) +{ + /* + look for a valid header. + if check_layer > 0, then require that + nLayer = check_layer. + */ + + /* bits 13-14 = layer 3 */ + int nLayer = 4 - ((head >> 17) & 3); + + if ((head & 0xffe00000) != 0xffe00000) { + /* syncword */ + return FALSE; + } + + if (nLayer == 4) + return FALSE; + + if (check_layer > 0 && nLayer != check_layer) + return FALSE; + + if (((head >> 12) & 0xf) == 0xf) { + /* bits 16,17,18,19 = 1111 invalid bitrate */ + return FALSE; + } + if (((head >> 10) & 0x3) == 0x3) { + /* bits 20,21 = 11 invalid sampling freq */ + return FALSE; + } + if ((head & 0x3) == 0x2) + /* invalid emphasis */ + return FALSE; + return TRUE; +} + + +#if 0 +static void +print_header(PMPSTR mp, struct frame *fr) +{ + static const char *modes[4] = { "Stereo", "Joint-Stereo", "Dual-Channel", "Single-Channel" }; + static const char *layers[4] = { "Unknown", "I", "II", "III" }; + + lame_report_fnc(mp->report_msg, "MPEG %s, Layer: %s, Freq: %ld, mode: %s, modext: %d, BPF : %d\n", + fr->mpeg25 ? "2.5" : (fr->lsf ? "2.0" : "1.0"), + layers[fr->lay], freqs[fr->sampling_frequency], + modes[fr->mode], fr->mode_ext, fr->framesize + 4); + lame_report_fnc(mp->report_msg, "Channels: %d, copyright: %s, original: %s, CRC: %s, emphasis: %d.\n", + fr->stereo, fr->copyright ? "Yes" : "No", + fr->original ? "Yes" : "No", fr->error_protection ? "Yes" : "No", fr->emphasis); + lame_report_fnc(mp->report_msg, "Bitrate: %d Kbits/s, Extension value: %d\n", + tabsel_123[fr->lsf][fr->lay - 1][fr->bitrate_index], fr->extension); +} + +static void +print_header_compact(PMPSTR mp, struct frame *fr) +{ + static const char *modes[4] = { "stereo", "joint-stereo", "dual-channel", "mono" }; + static const char *layers[4] = { "Unknown", "I", "II", "III" }; + + lame_report_fnc(mp->report_err, "MPEG %s layer %s, %d kbit/s, %ld Hz %s\n", + fr->mpeg25 ? "2.5" : (fr->lsf ? "2.0" : "1.0"), + layers[fr->lay], + tabsel_123[fr->lsf][fr->lay - 1][fr->bitrate_index], + freqs[fr->sampling_frequency], modes[fr->mode]); +} + +#endif + +/* + * decode a header and write the information + * into the frame structure + */ +int +decode_header(PMPSTR mp, struct frame *fr, unsigned long newhead) +{ + + + if (newhead & (1 << 20)) { + fr->lsf = (newhead & (1 << 19)) ? 0x0 : 0x1; + fr->mpeg25 = 0; + } + else { + fr->lsf = 1; + fr->mpeg25 = 1; + } + + + fr->lay = 4 - ((newhead >> 17) & 3); + + if (fr->lay != 3 && fr->mpeg25) { + lame_report_fnc(mp->report_err, "MPEG-2.5 is supported by Layer3 only\n"); + return 0; + } + if (((newhead >> 10) & 0x3) == 0x3) { + lame_report_fnc(mp->report_err, "Stream error\n"); + return 0; + } + if (fr->mpeg25) { + fr->sampling_frequency = 6 + ((newhead >> 10) & 0x3); + } + else + fr->sampling_frequency = ((newhead >> 10) & 0x3) + (fr->lsf * 3); + + fr->error_protection = ((newhead >> 16) & 0x1) ^ 0x1; + + if (fr->mpeg25) /* allow Bitrate change for 2.5 ... */ + fr->bitrate_index = ((newhead >> 12) & 0xf); + + fr->bitrate_index = ((newhead >> 12) & 0xf); + fr->padding = ((newhead >> 9) & 0x1); + fr->extension = ((newhead >> 8) & 0x1); + fr->mode = ((newhead >> 6) & 0x3); + fr->mode_ext = ((newhead >> 4) & 0x3); + fr->copyright = ((newhead >> 3) & 0x1); + fr->original = ((newhead >> 2) & 0x1); + fr->emphasis = newhead & 0x3; + + fr->stereo = (fr->mode == MPG_MD_MONO) ? 1 : 2; + + switch (fr->lay) { + case 1: + fr->framesize = (long) tabsel_123[fr->lsf][0][fr->bitrate_index] * 12000; + fr->framesize /= freqs[fr->sampling_frequency]; + fr->framesize = ((fr->framesize + fr->padding) << 2) - 4; + fr->down_sample = 0; + fr->down_sample_sblimit = SBLIMIT >> (fr->down_sample); + break; + + case 2: + fr->framesize = (long) tabsel_123[fr->lsf][1][fr->bitrate_index] * 144000; + fr->framesize /= freqs[fr->sampling_frequency]; + fr->framesize += fr->padding - 4; + fr->down_sample = 0; + fr->down_sample_sblimit = SBLIMIT >> (fr->down_sample); + break; + + case 3: +#if 0 + fr->do_layer = do_layer3; + if (fr->lsf) + ssize = (fr->stereo == 1) ? 9 : 17; + else + ssize = (fr->stereo == 1) ? 17 : 32; +#endif + +#if 0 + if (fr->error_protection) + ssize += 2; +#endif + if (fr->framesize > MAX_INPUT_FRAMESIZE) { + lame_report_fnc(mp->report_err, "Frame size too big.\n"); + fr->framesize = MAX_INPUT_FRAMESIZE; + return (0); + } + + + if (fr->bitrate_index == 0) + fr->framesize = 0; + else { + fr->framesize = (long) tabsel_123[fr->lsf][2][fr->bitrate_index] * 144000; + fr->framesize /= freqs[fr->sampling_frequency] << (fr->lsf); + fr->framesize = fr->framesize + fr->padding - 4; + } + break; + default: + lame_report_fnc(mp->report_err, "Sorry, layer %d not supported\n", fr->lay); + return (0); + } + /* print_header(mp, fr); */ + + return 1; +} + + +unsigned int +getbits(PMPSTR mp, int number_of_bits) +{ + unsigned long rval; + + if (number_of_bits <= 0 || !mp->wordpointer) + return 0; + + { + rval = mp->wordpointer[0]; + rval <<= 8; + rval |= mp->wordpointer[1]; + rval <<= 8; + rval |= mp->wordpointer[2]; + rval <<= mp->bitindex; + rval &= 0xffffff; + + mp->bitindex += number_of_bits; + + rval >>= (24 - number_of_bits); + + mp->wordpointer += (mp->bitindex >> 3); + mp->bitindex &= 7; + } + return rval; +} + +unsigned int +getbits_fast(PMPSTR mp, int number_of_bits) +{ + unsigned long rval; + + { + rval = mp->wordpointer[0]; + rval <<= 8; + rval |= mp->wordpointer[1]; + rval <<= mp->bitindex; + rval &= 0xffff; + mp->bitindex += number_of_bits; + + rval >>= (16 - number_of_bits); + + mp->wordpointer += (mp->bitindex >> 3); + mp->bitindex &= 7; + } + return rval; +} + +unsigned char +get_leq_8_bits(PMPSTR mp, unsigned int number_of_bits) +{ + assert(number_of_bits <= 8); + return (unsigned char) getbits_fast(mp, number_of_bits); +} + +unsigned short +get_leq_16_bits(PMPSTR mp, unsigned int number_of_bits) +{ + assert(number_of_bits <= 16); + return (unsigned short) getbits_fast(mp, number_of_bits); +} + +int +set_pointer(PMPSTR mp, long backstep) +{ + unsigned char *bsbufold; + + if (mp->fsizeold < 0 && backstep > 0) { + lame_report_fnc(mp->report_err, "hip: Can't step back %ld bytes!\n", backstep); + return MP3_ERR; + } + bsbufold = mp->bsspace[1 - mp->bsnum] + 512; + mp->wordpointer -= backstep; + if (backstep) + memcpy(mp->wordpointer, bsbufold + mp->fsizeold - backstep, (size_t) backstep); + mp->bitindex = 0; + return MP3_OK; +} diff --git a/mpglib/common.h b/mpglib/common.h new file mode 100644 index 0000000..62cf17e --- /dev/null +++ b/mpglib/common.h @@ -0,0 +1,43 @@ +/* + * Copyright (C) 1999-2010 The L.A.M.E. project + * + * Initially written by Michael Hipp, see also AUTHORS and README. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + + +#ifndef COMMON_H_INCLUDED +#define COMMON_H_INCLUDED + +#include "mpg123.h" +#include "mpglib.h" + +extern const int tabsel_123[2][3][16]; +extern const long freqs[9]; + +extern real muls[27][64]; + + +int head_check(unsigned long head, int check_layer); +int decode_header(PMPSTR mp, struct frame *fr, unsigned long newhead); +unsigned int getbits(PMPSTR mp, int number_of_bits); +unsigned int getbits_fast(PMPSTR mp, int number_of_bits); +unsigned char get_leq_8_bits(PMPSTR mp, unsigned int number_of_bits); +unsigned short get_leq_16_bits(PMPSTR mp, unsigned int number_of_bits); +int set_pointer(PMPSTR mp, long backstep); + +#endif diff --git a/mpglib/dct64_i386.c b/mpglib/dct64_i386.c new file mode 100644 index 0000000..0bf1509 --- /dev/null +++ b/mpglib/dct64_i386.c @@ -0,0 +1,348 @@ +/* + * dct64_i368.c + * + * Copyright (C) 1999-2010 The L.A.M.E. project + * + * Initially written by Michael Hipp, see also AUTHORS and README. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * + * Discrete Cosine Tansform (DCT) for subband synthesis + * optimized for machines with no auto-increment. + * The performance is highly compiler dependend. Maybe + * the dct64.c version for 'normal' processor may be faster + * even for Intel processors. + */ + +/* $Id: dct64_i386.c,v 1.14 2010/03/22 14:30:19 robert Exp $ */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "dct64_i386.h" +#include "tabinit.h" + +#ifdef WITH_DMALLOC +#include <dmalloc.h> +#endif + +static void +dct64_1(real * out0, real * out1, real * b1, real * b2, real * samples) +{ + + { + real *costab = pnts[0]; + + b1[0x00] = samples[0x00] + samples[0x1F]; + b1[0x1F] = (samples[0x00] - samples[0x1F]) * costab[0x0]; + + b1[0x01] = samples[0x01] + samples[0x1E]; + b1[0x1E] = (samples[0x01] - samples[0x1E]) * costab[0x1]; + + b1[0x02] = samples[0x02] + samples[0x1D]; + b1[0x1D] = (samples[0x02] - samples[0x1D]) * costab[0x2]; + + b1[0x03] = samples[0x03] + samples[0x1C]; + b1[0x1C] = (samples[0x03] - samples[0x1C]) * costab[0x3]; + + b1[0x04] = samples[0x04] + samples[0x1B]; + b1[0x1B] = (samples[0x04] - samples[0x1B]) * costab[0x4]; + + b1[0x05] = samples[0x05] + samples[0x1A]; + b1[0x1A] = (samples[0x05] - samples[0x1A]) * costab[0x5]; + + b1[0x06] = samples[0x06] + samples[0x19]; + b1[0x19] = (samples[0x06] - samples[0x19]) * costab[0x6]; + + b1[0x07] = samples[0x07] + samples[0x18]; + b1[0x18] = (samples[0x07] - samples[0x18]) * costab[0x7]; + + b1[0x08] = samples[0x08] + samples[0x17]; + b1[0x17] = (samples[0x08] - samples[0x17]) * costab[0x8]; + + b1[0x09] = samples[0x09] + samples[0x16]; + b1[0x16] = (samples[0x09] - samples[0x16]) * costab[0x9]; + + b1[0x0A] = samples[0x0A] + samples[0x15]; + b1[0x15] = (samples[0x0A] - samples[0x15]) * costab[0xA]; + + b1[0x0B] = samples[0x0B] + samples[0x14]; + b1[0x14] = (samples[0x0B] - samples[0x14]) * costab[0xB]; + + b1[0x0C] = samples[0x0C] + samples[0x13]; + b1[0x13] = (samples[0x0C] - samples[0x13]) * costab[0xC]; + + b1[0x0D] = samples[0x0D] + samples[0x12]; + b1[0x12] = (samples[0x0D] - samples[0x12]) * costab[0xD]; + + b1[0x0E] = samples[0x0E] + samples[0x11]; + b1[0x11] = (samples[0x0E] - samples[0x11]) * costab[0xE]; + + b1[0x0F] = samples[0x0F] + samples[0x10]; + b1[0x10] = (samples[0x0F] - samples[0x10]) * costab[0xF]; + } + + + { + real *costab = pnts[1]; + + b2[0x00] = b1[0x00] + b1[0x0F]; + b2[0x0F] = (b1[0x00] - b1[0x0F]) * costab[0]; + b2[0x01] = b1[0x01] + b1[0x0E]; + b2[0x0E] = (b1[0x01] - b1[0x0E]) * costab[1]; + b2[0x02] = b1[0x02] + b1[0x0D]; + b2[0x0D] = (b1[0x02] - b1[0x0D]) * costab[2]; + b2[0x03] = b1[0x03] + b1[0x0C]; + b2[0x0C] = (b1[0x03] - b1[0x0C]) * costab[3]; + b2[0x04] = b1[0x04] + b1[0x0B]; + b2[0x0B] = (b1[0x04] - b1[0x0B]) * costab[4]; + b2[0x05] = b1[0x05] + b1[0x0A]; + b2[0x0A] = (b1[0x05] - b1[0x0A]) * costab[5]; + b2[0x06] = b1[0x06] + b1[0x09]; + b2[0x09] = (b1[0x06] - b1[0x09]) * costab[6]; + b2[0x07] = b1[0x07] + b1[0x08]; + b2[0x08] = (b1[0x07] - b1[0x08]) * costab[7]; + + b2[0x10] = b1[0x10] + b1[0x1F]; + b2[0x1F] = (b1[0x1F] - b1[0x10]) * costab[0]; + b2[0x11] = b1[0x11] + b1[0x1E]; + b2[0x1E] = (b1[0x1E] - b1[0x11]) * costab[1]; + b2[0x12] = b1[0x12] + b1[0x1D]; + b2[0x1D] = (b1[0x1D] - b1[0x12]) * costab[2]; + b2[0x13] = b1[0x13] + b1[0x1C]; + b2[0x1C] = (b1[0x1C] - b1[0x13]) * costab[3]; + b2[0x14] = b1[0x14] + b1[0x1B]; + b2[0x1B] = (b1[0x1B] - b1[0x14]) * costab[4]; + b2[0x15] = b1[0x15] + b1[0x1A]; + b2[0x1A] = (b1[0x1A] - b1[0x15]) * costab[5]; + b2[0x16] = b1[0x16] + b1[0x19]; + b2[0x19] = (b1[0x19] - b1[0x16]) * costab[6]; + b2[0x17] = b1[0x17] + b1[0x18]; + b2[0x18] = (b1[0x18] - b1[0x17]) * costab[7]; + } + + { + real *costab = pnts[2]; + + b1[0x00] = b2[0x00] + b2[0x07]; + b1[0x07] = (b2[0x00] - b2[0x07]) * costab[0]; + b1[0x01] = b2[0x01] + b2[0x06]; + b1[0x06] = (b2[0x01] - b2[0x06]) * costab[1]; + b1[0x02] = b2[0x02] + b2[0x05]; + b1[0x05] = (b2[0x02] - b2[0x05]) * costab[2]; + b1[0x03] = b2[0x03] + b2[0x04]; + b1[0x04] = (b2[0x03] - b2[0x04]) * costab[3]; + + b1[0x08] = b2[0x08] + b2[0x0F]; + b1[0x0F] = (b2[0x0F] - b2[0x08]) * costab[0]; + b1[0x09] = b2[0x09] + b2[0x0E]; + b1[0x0E] = (b2[0x0E] - b2[0x09]) * costab[1]; + b1[0x0A] = b2[0x0A] + b2[0x0D]; + b1[0x0D] = (b2[0x0D] - b2[0x0A]) * costab[2]; + b1[0x0B] = b2[0x0B] + b2[0x0C]; + b1[0x0C] = (b2[0x0C] - b2[0x0B]) * costab[3]; + + b1[0x10] = b2[0x10] + b2[0x17]; + b1[0x17] = (b2[0x10] - b2[0x17]) * costab[0]; + b1[0x11] = b2[0x11] + b2[0x16]; + b1[0x16] = (b2[0x11] - b2[0x16]) * costab[1]; + b1[0x12] = b2[0x12] + b2[0x15]; + b1[0x15] = (b2[0x12] - b2[0x15]) * costab[2]; + b1[0x13] = b2[0x13] + b2[0x14]; + b1[0x14] = (b2[0x13] - b2[0x14]) * costab[3]; + + b1[0x18] = b2[0x18] + b2[0x1F]; + b1[0x1F] = (b2[0x1F] - b2[0x18]) * costab[0]; + b1[0x19] = b2[0x19] + b2[0x1E]; + b1[0x1E] = (b2[0x1E] - b2[0x19]) * costab[1]; + b1[0x1A] = b2[0x1A] + b2[0x1D]; + b1[0x1D] = (b2[0x1D] - b2[0x1A]) * costab[2]; + b1[0x1B] = b2[0x1B] + b2[0x1C]; + b1[0x1C] = (b2[0x1C] - b2[0x1B]) * costab[3]; + } + + { + real const cos0 = pnts[3][0]; + real const cos1 = pnts[3][1]; + + b2[0x00] = b1[0x00] + b1[0x03]; + b2[0x03] = (b1[0x00] - b1[0x03]) * cos0; + b2[0x01] = b1[0x01] + b1[0x02]; + b2[0x02] = (b1[0x01] - b1[0x02]) * cos1; + + b2[0x04] = b1[0x04] + b1[0x07]; + b2[0x07] = (b1[0x07] - b1[0x04]) * cos0; + b2[0x05] = b1[0x05] + b1[0x06]; + b2[0x06] = (b1[0x06] - b1[0x05]) * cos1; + + b2[0x08] = b1[0x08] + b1[0x0B]; + b2[0x0B] = (b1[0x08] - b1[0x0B]) * cos0; + b2[0x09] = b1[0x09] + b1[0x0A]; + b2[0x0A] = (b1[0x09] - b1[0x0A]) * cos1; + + b2[0x0C] = b1[0x0C] + b1[0x0F]; + b2[0x0F] = (b1[0x0F] - b1[0x0C]) * cos0; + b2[0x0D] = b1[0x0D] + b1[0x0E]; + b2[0x0E] = (b1[0x0E] - b1[0x0D]) * cos1; + + b2[0x10] = b1[0x10] + b1[0x13]; + b2[0x13] = (b1[0x10] - b1[0x13]) * cos0; + b2[0x11] = b1[0x11] + b1[0x12]; + b2[0x12] = (b1[0x11] - b1[0x12]) * cos1; + + b2[0x14] = b1[0x14] + b1[0x17]; + b2[0x17] = (b1[0x17] - b1[0x14]) * cos0; + b2[0x15] = b1[0x15] + b1[0x16]; + b2[0x16] = (b1[0x16] - b1[0x15]) * cos1; + + b2[0x18] = b1[0x18] + b1[0x1B]; + b2[0x1B] = (b1[0x18] - b1[0x1B]) * cos0; + b2[0x19] = b1[0x19] + b1[0x1A]; + b2[0x1A] = (b1[0x19] - b1[0x1A]) * cos1; + + b2[0x1C] = b1[0x1C] + b1[0x1F]; + b2[0x1F] = (b1[0x1F] - b1[0x1C]) * cos0; + b2[0x1D] = b1[0x1D] + b1[0x1E]; + b2[0x1E] = (b1[0x1E] - b1[0x1D]) * cos1; + } + + { + real const cos0 = pnts[4][0]; + + b1[0x00] = b2[0x00] + b2[0x01]; + b1[0x01] = (b2[0x00] - b2[0x01]) * cos0; + b1[0x02] = b2[0x02] + b2[0x03]; + b1[0x03] = (b2[0x03] - b2[0x02]) * cos0; + b1[0x02] += b1[0x03]; + + b1[0x04] = b2[0x04] + b2[0x05]; + b1[0x05] = (b2[0x04] - b2[0x05]) * cos0; + b1[0x06] = b2[0x06] + b2[0x07]; + b1[0x07] = (b2[0x07] - b2[0x06]) * cos0; + b1[0x06] += b1[0x07]; + b1[0x04] += b1[0x06]; + b1[0x06] += b1[0x05]; + b1[0x05] += b1[0x07]; + + b1[0x08] = b2[0x08] + b2[0x09]; + b1[0x09] = (b2[0x08] - b2[0x09]) * cos0; + b1[0x0A] = b2[0x0A] + b2[0x0B]; + b1[0x0B] = (b2[0x0B] - b2[0x0A]) * cos0; + b1[0x0A] += b1[0x0B]; + + b1[0x0C] = b2[0x0C] + b2[0x0D]; + b1[0x0D] = (b2[0x0C] - b2[0x0D]) * cos0; + b1[0x0E] = b2[0x0E] + b2[0x0F]; + b1[0x0F] = (b2[0x0F] - b2[0x0E]) * cos0; + b1[0x0E] += b1[0x0F]; + b1[0x0C] += b1[0x0E]; + b1[0x0E] += b1[0x0D]; + b1[0x0D] += b1[0x0F]; + + b1[0x10] = b2[0x10] + b2[0x11]; + b1[0x11] = (b2[0x10] - b2[0x11]) * cos0; + b1[0x12] = b2[0x12] + b2[0x13]; + b1[0x13] = (b2[0x13] - b2[0x12]) * cos0; + b1[0x12] += b1[0x13]; + + b1[0x14] = b2[0x14] + b2[0x15]; + b1[0x15] = (b2[0x14] - b2[0x15]) * cos0; + b1[0x16] = b2[0x16] + b2[0x17]; + b1[0x17] = (b2[0x17] - b2[0x16]) * cos0; + b1[0x16] += b1[0x17]; + b1[0x14] += b1[0x16]; + b1[0x16] += b1[0x15]; + b1[0x15] += b1[0x17]; + + b1[0x18] = b2[0x18] + b2[0x19]; + b1[0x19] = (b2[0x18] - b2[0x19]) * cos0; + b1[0x1A] = b2[0x1A] + b2[0x1B]; + b1[0x1B] = (b2[0x1B] - b2[0x1A]) * cos0; + b1[0x1A] += b1[0x1B]; + + b1[0x1C] = b2[0x1C] + b2[0x1D]; + b1[0x1D] = (b2[0x1C] - b2[0x1D]) * cos0; + b1[0x1E] = b2[0x1E] + b2[0x1F]; + b1[0x1F] = (b2[0x1F] - b2[0x1E]) * cos0; + b1[0x1E] += b1[0x1F]; + b1[0x1C] += b1[0x1E]; + b1[0x1E] += b1[0x1D]; + b1[0x1D] += b1[0x1F]; + } + + out0[0x10 * 16] = b1[0x00]; + out0[0x10 * 12] = b1[0x04]; + out0[0x10 * 8] = b1[0x02]; + out0[0x10 * 4] = b1[0x06]; + out0[0x10 * 0] = b1[0x01]; + out1[0x10 * 0] = b1[0x01]; + out1[0x10 * 4] = b1[0x05]; + out1[0x10 * 8] = b1[0x03]; + out1[0x10 * 12] = b1[0x07]; + + b1[0x08] += b1[0x0C]; + out0[0x10 * 14] = b1[0x08]; + b1[0x0C] += b1[0x0a]; + out0[0x10 * 10] = b1[0x0C]; + b1[0x0A] += b1[0x0E]; + out0[0x10 * 6] = b1[0x0A]; + b1[0x0E] += b1[0x09]; + out0[0x10 * 2] = b1[0x0E]; + b1[0x09] += b1[0x0D]; + out1[0x10 * 2] = b1[0x09]; + b1[0x0D] += b1[0x0B]; + out1[0x10 * 6] = b1[0x0D]; + b1[0x0B] += b1[0x0F]; + out1[0x10 * 10] = b1[0x0B]; + out1[0x10 * 14] = b1[0x0F]; + + b1[0x18] += b1[0x1C]; + out0[0x10 * 15] = b1[0x10] + b1[0x18]; + out0[0x10 * 13] = b1[0x18] + b1[0x14]; + b1[0x1C] += b1[0x1a]; + out0[0x10 * 11] = b1[0x14] + b1[0x1C]; + out0[0x10 * 9] = b1[0x1C] + b1[0x12]; + b1[0x1A] += b1[0x1E]; + out0[0x10 * 7] = b1[0x12] + b1[0x1A]; + out0[0x10 * 5] = b1[0x1A] + b1[0x16]; + b1[0x1E] += b1[0x19]; + out0[0x10 * 3] = b1[0x16] + b1[0x1E]; + out0[0x10 * 1] = b1[0x1E] + b1[0x11]; + b1[0x19] += b1[0x1D]; + out1[0x10 * 1] = b1[0x11] + b1[0x19]; + out1[0x10 * 3] = b1[0x19] + b1[0x15]; + b1[0x1D] += b1[0x1B]; + out1[0x10 * 5] = b1[0x15] + b1[0x1D]; + out1[0x10 * 7] = b1[0x1D] + b1[0x13]; + b1[0x1B] += b1[0x1F]; + out1[0x10 * 9] = b1[0x13] + b1[0x1B]; + out1[0x10 * 11] = b1[0x1B] + b1[0x17]; + out1[0x10 * 13] = b1[0x17] + b1[0x1F]; + out1[0x10 * 15] = b1[0x1F]; +} + +/* + * the call via dct64 is a trick to force GCC to use + * (new) registers for the b1,b2 pointer to the bufs[xx] field + */ +void +dct64(real * a, real * b, real * c) +{ + real bufs[0x40]; + dct64_1(a, b, bufs, bufs + 0x20, c); +} diff --git a/mpglib/dct64_i386.h b/mpglib/dct64_i386.h new file mode 100644 index 0000000..a140ee7 --- /dev/null +++ b/mpglib/dct64_i386.h @@ -0,0 +1,30 @@ +/* + * Copyright (C) 1999-2010 The L.A.M.E. project + * + * Initially written by Michael Hipp, see also AUTHORS and README. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef MPGLIB_DCT64_I386_H_INCLUDED +#define MPGLIB_DCT64_I386_H_INCLUDED + +#include "common.h" + +void dct64(real * a, real * b, real * c); + + +#endif diff --git a/mpglib/decode_i386.c b/mpglib/decode_i386.c new file mode 100644 index 0000000..8ffcab3 --- /dev/null +++ b/mpglib/decode_i386.c @@ -0,0 +1,224 @@ +/* + * decode_i396.c: Mpeg Layer-1,2,3 audio decoder + * + * Copyright (C) 1999-2010 The L.A.M.E. project + * + * Initially written by Michael Hipp, see also AUTHORS and README. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * + * Slighlty optimized for machines without autoincrement/decrement. + * The performance is highly compiler dependend. Maybe + * the decode.c version for 'normal' processor may be faster + * even for Intel processors. + */ + +/* $Id: decode_i386.c,v 1.22 2010/03/22 14:30:19 robert Exp $ */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#ifdef STDC_HEADERS +# include <stdlib.h> +# include <string.h> +#else +# ifndef HAVE_STRCHR +# define strchr index +# define strrchr rindex +# endif +char *strchr(), *strrchr(); +# ifndef HAVE_MEMCPY +# define memcpy(d, s, n) bcopy ((s), (d), (n)) +# define memmove(d, s, n) bcopy ((s), (d), (n)) +# endif +#endif + +#if defined(__riscos__) && defined(FPA10) +#include "ymath.h" +#else +#include <math.h> +#endif + +#include "decode_i386.h" +#include "dct64_i386.h" +#include "tabinit.h" + +#ifdef WITH_DMALLOC +#include <dmalloc.h> +#endif + + + /* old WRITE_SAMPLE_CLIPPED */ +#define WRITE_SAMPLE_CLIPPED(TYPE,samples,sum,clip) \ + if( (sum) > 32767.0) { *(samples) = 0x7fff; (clip)++; } \ + else if( (sum) < -32768.0) { *(samples) = -0x8000; (clip)++; } \ + else { *(samples) = (TYPE)((sum)>0 ? (sum)+0.5 : (sum)-0.5) ; } + +#define WRITE_SAMPLE_UNCLIPPED(TYPE,samples,sum,clip) \ + *samples = (TYPE)sum; + + /* *INDENT-OFF* */ + + /* versions: clipped (when TYPE == short) and unclipped (when TYPE == real) of synth_1to1_mono* functions */ +#define SYNTH_1TO1_MONO_CLIPCHOICE(TYPE,SYNTH_1TO1) \ + TYPE samples_tmp[64]; \ + TYPE *tmp1 = samples_tmp; \ + int i,ret; \ + int pnt1 = 0; \ + \ + ret = SYNTH_1TO1 (mp,bandPtr,0,(unsigned char *) samples_tmp,&pnt1); \ + out += *pnt; \ + \ + for(i=0;i<32;i++) { \ + *( (TYPE *) out) = *tmp1; \ + out += sizeof(TYPE); \ + tmp1 += 2; \ + } \ + *pnt += 32*sizeof(TYPE); \ + \ + return ret; + + /* *INDENT-ON* */ + + +int +synth_1to1_mono(PMPSTR mp, real * bandPtr, unsigned char *out, int *pnt) +{ + SYNTH_1TO1_MONO_CLIPCHOICE(short, synth_1to1) +} int +synth_1to1_mono_unclipped(PMPSTR mp, real * bandPtr, unsigned char *out, int *pnt) +{ + SYNTH_1TO1_MONO_CLIPCHOICE(real, synth_1to1_unclipped) +} + + /* *INDENT-OFF* */ +/* versions: clipped (when TYPE == short) and unclipped (when TYPE == real) of synth_1to1* functions */ +#define SYNTH_1TO1_CLIPCHOICE(TYPE,WRITE_SAMPLE) \ + static const int step = 2; \ + int bo; \ + TYPE *samples = (TYPE *) (out + *pnt); \ + \ + real *b0,(*buf)[0x110]; \ + int clip = 0; \ + int bo1; \ + \ + bo = mp->synth_bo; \ + \ + if(!channel) { \ + bo--; \ + bo &= 0xf; \ + buf = mp->synth_buffs[0]; \ + } \ + else { \ + samples++; \ + buf = mp->synth_buffs[1]; \ + } \ + \ + if(bo & 0x1) { \ + b0 = buf[0]; \ + bo1 = bo; \ + dct64(buf[1]+((bo+1)&0xf),buf[0]+bo,bandPtr); \ + } \ + else { \ + b0 = buf[1]; \ + bo1 = bo+1; \ + dct64(buf[0]+bo,buf[1]+bo+1,bandPtr); \ + } \ + \ + mp->synth_bo = bo; \ + \ + { \ + int j; \ + real *window = decwin + 16 - bo1; \ + \ + for (j=16;j;j--,b0+=0x10,window+=0x20,samples+=step) \ + { \ + real sum; \ + sum = window[0x0] * b0[0x0]; \ + sum -= window[0x1] * b0[0x1]; \ + sum += window[0x2] * b0[0x2]; \ + sum -= window[0x3] * b0[0x3]; \ + sum += window[0x4] * b0[0x4]; \ + sum -= window[0x5] * b0[0x5]; \ + sum += window[0x6] * b0[0x6]; \ + sum -= window[0x7] * b0[0x7]; \ + sum += window[0x8] * b0[0x8]; \ + sum -= window[0x9] * b0[0x9]; \ + sum += window[0xA] * b0[0xA]; \ + sum -= window[0xB] * b0[0xB]; \ + sum += window[0xC] * b0[0xC]; \ + sum -= window[0xD] * b0[0xD]; \ + sum += window[0xE] * b0[0xE]; \ + sum -= window[0xF] * b0[0xF]; \ + \ + WRITE_SAMPLE (TYPE,samples,sum,clip); \ + } \ + \ + { \ + real sum; \ + sum = window[0x0] * b0[0x0]; \ + sum += window[0x2] * b0[0x2]; \ + sum += window[0x4] * b0[0x4]; \ + sum += window[0x6] * b0[0x6]; \ + sum += window[0x8] * b0[0x8]; \ + sum += window[0xA] * b0[0xA]; \ + sum += window[0xC] * b0[0xC]; \ + sum += window[0xE] * b0[0xE]; \ + WRITE_SAMPLE (TYPE,samples,sum,clip); \ + b0-=0x10,window-=0x20,samples+=step; \ + } \ + window += bo1<<1; \ + \ + for (j=15;j;j--,b0-=0x10,window-=0x20,samples+=step) \ + { \ + real sum; \ + sum = -window[-0x1] * b0[0x0]; \ + sum -= window[-0x2] * b0[0x1]; \ + sum -= window[-0x3] * b0[0x2]; \ + sum -= window[-0x4] * b0[0x3]; \ + sum -= window[-0x5] * b0[0x4]; \ + sum -= window[-0x6] * b0[0x5]; \ + sum -= window[-0x7] * b0[0x6]; \ + sum -= window[-0x8] * b0[0x7]; \ + sum -= window[-0x9] * b0[0x8]; \ + sum -= window[-0xA] * b0[0x9]; \ + sum -= window[-0xB] * b0[0xA]; \ + sum -= window[-0xC] * b0[0xB]; \ + sum -= window[-0xD] * b0[0xC]; \ + sum -= window[-0xE] * b0[0xD]; \ + sum -= window[-0xF] * b0[0xE]; \ + sum -= window[-0x0] * b0[0xF]; \ + \ + WRITE_SAMPLE (TYPE,samples,sum,clip); \ + } \ + } \ + *pnt += 64*sizeof(TYPE); \ + \ + return clip; + /* *INDENT-ON* */ + + +int +synth_1to1(PMPSTR mp, real * bandPtr, int channel, unsigned char *out, int *pnt) +{ + SYNTH_1TO1_CLIPCHOICE(short, WRITE_SAMPLE_CLIPPED) +} int +synth_1to1_unclipped(PMPSTR mp, real * bandPtr, int channel, unsigned char *out, int *pnt) +{ + SYNTH_1TO1_CLIPCHOICE(real, WRITE_SAMPLE_UNCLIPPED) +} diff --git a/mpglib/decode_i386.h b/mpglib/decode_i386.h new file mode 100644 index 0000000..8fc9dbe --- /dev/null +++ b/mpglib/decode_i386.h @@ -0,0 +1,33 @@ +/* + * Copyright (C) 1999-2010 The L.A.M.E. project + * + * Initially written by Michael Hipp, see also AUTHORS and README. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef DECODE_I386_H_INCLUDED +#define DECODE_I386_H_INCLUDED + +#include "common.h" + +int synth_1to1_mono(PMPSTR mp, real * bandPtr, unsigned char *out, int *pnt); +int synth_1to1(PMPSTR mp, real * bandPtr, int channel, unsigned char *out, int *pnt); + +int synth_1to1_mono_unclipped(PMPSTR mp, real * bandPtr, unsigned char *out, int *pnt); +int synth_1to1_unclipped(PMPSTR mp, real * bandPtr, int channel, unsigned char *out, int *pnt); + +#endif diff --git a/mpglib/depcomp b/mpglib/depcomp new file mode 100755 index 0000000..b39f98f --- /dev/null +++ b/mpglib/depcomp @@ -0,0 +1,791 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2016-01-11.22; # UTC + +# Copyright (C) 1999-2017 Free Software Foundation, Inc. + +# This program 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 2, or (at your option) +# any later version. + +# This program 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 this program. If not, see <http://www.gnu.org/licenses/>. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by 'PROGRAMS ARGS'. + object Object file output by 'PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputting dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to <bug-automake@gnu.org>. +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +# Get the directory component of the given path, and save it in the +# global variables '$dir'. Note that this directory component will +# be either empty or ending with a '/' character. This is deliberate. +set_dir_from () +{ + case $1 in + */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; + *) dir=;; + esac +} + +# Get the suffix-stripped basename of the given path, and save it the +# global variable '$base'. +set_base_from () +{ + base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` +} + +# If no dependency file was actually created by the compiler invocation, +# we still have to create a dummy depfile, to avoid errors with the +# Makefile "include basename.Plo" scheme. +make_dummy_depfile () +{ + echo "#dummy" > "$depfile" +} + +# Factor out some common post-processing of the generated depfile. +# Requires the auxiliary global variable '$tmpdepfile' to be set. +aix_post_process_depfile () +{ + # If the compiler actually managed to produce a dependency file, + # post-process it. + if test -f "$tmpdepfile"; then + # Each line is of the form 'foo.o: dependency.h'. + # Do two passes, one to just change these to + # $object: dependency.h + # and one to simply output + # dependency.h: + # which is needed to avoid the deleted-header problem. + { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" + sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" + } > "$depfile" + rm -f "$tmpdepfile" + else + make_dummy_depfile + fi +} + +# A tabulation character. +tab=' ' +# A newline character. +nl=' +' +# Character ranges might be problematic outside the C locale. +# These definitions help. +upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ +lower=abcdefghijklmnopqrstuvwxyz +digits=0123456789 +alpha=${upper}${lower} + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Avoid interferences from the environment. +gccflag= dashmflag= + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvisualcpp +fi + +if test "$depmode" = msvc7msys; then + # This is just like msvc7 but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvc7 +fi + +if test "$depmode" = xlc; then + # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. + gccflag=-qmakedep=gcc,-MF + depmode=gcc +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. +## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. +## (see the conditional assignment to $gccflag above). +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). Also, it might not be +## supported by the other compilers which use the 'gcc' depmode. +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The second -e expression handles DOS-style file names with drive + # letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the "deleted header file" problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. +## Some versions of gcc put a space before the ':'. On the theory +## that the space means something, we add a space to the output as +## well. hp depmode also adds that space, but also prefixes the VPATH +## to the object. Take care to not repeat it in the output. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like '#:fec' to the end of the + # dependency line. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ + | tr "$nl" ' ' >> "$depfile" + echo >> "$depfile" + # The second pass generates a dummy entry for each header file. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" + ;; + +xlc) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts '$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + aix_post_process_depfile + ;; + +tcc) + # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 + # FIXME: That version still under development at the moment of writing. + # Make that this statement remains true also for stable, released + # versions. + # It will wrap lines (doesn't matter whether long or short) with a + # trailing '\', as in: + # + # foo.o : \ + # foo.c \ + # foo.h \ + # + # It will put a trailing '\' even on the last line, and will use leading + # spaces rather than leading tabs (at least since its commit 0394caf7 + # "Emit spaces for -MD"). + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. + # We have to change lines of the first kind to '$object: \'. + sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" + # And for each line of the second kind, we have to emit a 'dep.h:' + # dummy dependency, to avoid the deleted-header problem. + sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" + rm -f "$tmpdepfile" + ;; + +## The order of this option in the case statement is important, since the +## shell code in configure will try each of these formats in the order +## listed in this file. A plain '-MD' option would be understood by many +## compilers, so we must ensure this comes after the gcc and icc options. +pgcc) + # Portland's C compiler understands '-MD'. + # Will always output deps to 'file.d' where file is the root name of the + # source file under compilation, even if file resides in a subdirectory. + # The object file name does not affect the name of the '.d' file. + # pgcc 10.2 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using '\' : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + set_dir_from "$object" + # Use the source, not the object, to determine the base name, since + # that's sadly what pgcc will do too. + set_base_from "$source" + tmpdepfile=$base.d + + # For projects that build the same source file twice into different object + # files, the pgcc approach of using the *source* file root name can cause + # problems in parallel builds. Use a locking strategy to avoid stomping on + # the same $tmpdepfile. + lockdir=$base.d-lock + trap " + echo '$0: caught signal, cleaning up...' >&2 + rmdir '$lockdir' + exit 1 + " 1 2 13 15 + numtries=100 + i=$numtries + while test $i -gt 0; do + # mkdir is a portable test-and-set. + if mkdir "$lockdir" 2>/dev/null; then + # This process acquired the lock. + "$@" -MD + stat=$? + # Release the lock. + rmdir "$lockdir" + break + else + # If the lock is being held by a different process, wait + # until the winning process is done or we timeout. + while test -d "$lockdir" && test $i -gt 0; do + sleep 1 + i=`expr $i - 1` + done + fi + i=`expr $i - 1` + done + trap - 1 2 13 15 + if test $i -le 0; then + echo "$0: failed to acquire lock after $numtries attempts" >&2 + echo "$0: check lockdir '$lockdir'" >&2 + exit 1 + fi + + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" + # Add 'dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in 'foo.d' instead, so we check for that too. + # Subdirectories are respected. + set_dir_from "$object" + set_base_from "$object" + + if test "$libtool" = yes; then + # Libtool generates 2 separate objects for the 2 libraries. These + # two compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir$base.o.d # libtool 1.5 + tmpdepfile2=$dir.libs/$base.o.d # Likewise. + tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + # Same post-processing that is required for AIX mode. + aix_post_process_depfile + ;; + +msvc7) + if test "$libtool" = yes; then + showIncludes=-Wc,-showIncludes + else + showIncludes=-showIncludes + fi + "$@" $showIncludes > "$tmpdepfile" + stat=$? + grep -v '^Note: including file: ' "$tmpdepfile" + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The first sed program below extracts the file names and escapes + # backslashes for cygpath. The second sed program outputs the file + # name when reading, but also accumulates all include files in the + # hold buffer in order to output them again at the end. This only + # works with sed implementations that can handle large buffers. + sed < "$tmpdepfile" -n ' +/^Note: including file: *\(.*\)/ { + s//\1/ + s/\\/\\\\/g + p +}' | $cygpath_u | sort -u | sed -n ' +s/ /\\ /g +s/\(.*\)/'"$tab"'\1 \\/p +s/.\(.*\) \\/\1:/ +H +$ { + s/.*/'"$tab"'/ + G + p +}' >> "$depfile" + echo >> "$depfile" # make sure the fragment doesn't end with a backslash + rm -f "$tmpdepfile" + ;; + +msvc7msys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for ':' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. + "$@" $dashmflag | + sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this sed invocation + # correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + # makedepend may prepend the VPATH from the source file name to the object. + # No need to regex-escape $object, excess matching of '.' is harmless. + sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process the last invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed '1,2d' "$tmpdepfile" \ + | tr ' ' "$nl" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E \ + | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + | sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" + echo "$tab" >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/mpglib/huffman.h b/mpglib/huffman.h new file mode 100644 index 0000000..7d73a74 --- /dev/null +++ b/mpglib/huffman.h @@ -0,0 +1,353 @@ +/* + * Copyright (C) 1999-2010 The L.A.M.E. project + * + * Initially written by Michael Hipp, see also AUTHORS and README. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * huffman tables ... recalcualted to work with my optimzed + * decoder scheme (MH) + * + * probably we could save a few bytes of memory, because the + * smaller tables are often the part of a bigger table + */ + +/* *INDENT-OFF* */ + + +struct newhuff +{ + const unsigned int linbits; + const short * const table; +}; + +static const short tab0[] = +{ + 0 +}; + +static const short tab1[] = +{ + -5, -3, -1, 17, 1, 16, 0 +}; + +static const short tab2[] = +{ + -15, -11, -9, -5, -3, -1, 34, 2, 18, -1, 33, 32, 17, -1, 1, 16, 0 +}; + +static const short tab3[] = +{ + -13, -11, -9, -5, -3, -1, 34, 2, 18, -1, 33, 32, 16, 17, -1, + 1, 0 +}; + +static const short tab5[] = +{ + -29, -25, -23, -15, -7, -5, -3, -1, 51, 35, 50, 49, -3, -1, 19, + 3, -1, 48, 34, -3, -1, 18, 33, -1, 2, 32, 17, -1, 1, 16, + 0 +}; + +static const short tab6[] = +{ + -25, -19, -13, -9, -5, -3, -1, 51, 3, 35, -1, 50, 48, -1, 19, + 49, -3, -1, 34, 2, 18, -3, -1, 33, 32, 1, -1, 17, -1, 16, + 0 +}; + +static const short tab7[] = +{ + -69, -65, -57, -39, -29, -17, -11, -7, -3, -1, 85, 69, -1, 84, 83, + -1, 53, 68, -3, -1, 37, 82, 21, -5, -1, 81, -1, 5, 52, -1, + 80, -1, 67, 51, -5, -3, -1, 36, 66, 20, -1, 65, 64, -11, -7, + -3, -1, 4, 35, -1, 50, 3, -1, 19, 49, -3, -1, 48, 34, 18, + -5, -1, 33, -1, 2, 32, 17, -1, 1, 16, 0 +}; + +static const short tab8[] = +{ + -65, -63, -59, -45, -31, -19, -13, -7, -5, -3, -1, 85, 84, 69, 83, + -3, -1, 53, 68, 37, -3, -1, 82, 5, 21, -5, -1, 81, -1, 52, + 67, -3, -1, 80, 51, 36, -5, -3, -1, 66, 20, 65, -3, -1, 4, + 64, -1, 35, 50, -9, -7, -3, -1, 19, 49, -1, 3, 48, 34, -1, + 2, 32, -1, 18, 33, 17, -3, -1, 1, 16, 0 +}; + +static const short tab9[] = +{ + -63, -53, -41, -29, -19, -11, -5, -3, -1, 85, 69, 53, -1, 83, -1, + 84, 5, -3, -1, 68, 37, -1, 82, 21, -3, -1, 81, 52, -1, 67, + -1, 80, 4, -7, -3, -1, 36, 66, -1, 51, 64, -1, 20, 65, -5, + -3, -1, 35, 50, 19, -1, 49, -1, 3, 48, -5, -3, -1, 34, 2, + 18, -1, 33, 32, -3, -1, 17, 1, -1, 16, 0 +}; + +static const short tab10[] = +{ +-125,-121,-111, -83, -55, -35, -21, -13, -7, -3, -1, 119, 103, -1, 118, + 87, -3, -1, 117, 102, 71, -3, -1, 116, 86, -1, 101, 55, -9, -3, + -1, 115, 70, -3, -1, 85, 84, 99, -1, 39, 114, -11, -5, -3, -1, + 100, 7, 112, -1, 98, -1, 69, 53, -5, -1, 6, -1, 83, 68, 23, + -17, -5, -1, 113, -1, 54, 38, -5, -3, -1, 37, 82, 21, -1, 81, + -1, 52, 67, -3, -1, 22, 97, -1, 96, -1, 5, 80, -19, -11, -7, + -3, -1, 36, 66, -1, 51, 4, -1, 20, 65, -3, -1, 64, 35, -1, + 50, 3, -3, -1, 19, 49, -1, 48, 34, -7, -3, -1, 18, 33, -1, + 2, 32, 17, -1, 1, 16, 0 +}; + +static const short tab11[] = +{ +-121,-113, -89, -59, -43, -27, -17, -7, -3, -1, 119, 103, -1, 118, 117, + -3, -1, 102, 71, -1, 116, -1, 87, 85, -5, -3, -1, 86, 101, 55, + -1, 115, 70, -9, -7, -3, -1, 69, 84, -1, 53, 83, 39, -1, 114, + -1, 100, 7, -5, -1, 113, -1, 23, 112, -3, -1, 54, 99, -1, 96, + -1, 68, 37, -13, -7, -5, -3, -1, 82, 5, 21, 98, -3, -1, 38, + 6, 22, -5, -1, 97, -1, 81, 52, -5, -1, 80, -1, 67, 51, -1, + 36, 66, -15, -11, -7, -3, -1, 20, 65, -1, 4, 64, -1, 35, 50, + -1, 19, 49, -5, -3, -1, 3, 48, 34, 33, -5, -1, 18, -1, 2, + 32, 17, -3, -1, 1, 16, 0 +}; + +static const short tab12[] = +{ +-115, -99, -73, -45, -27, -17, -9, -5, -3, -1, 119, 103, 118, -1, 87, + 117, -3, -1, 102, 71, -1, 116, 101, -3, -1, 86, 55, -3, -1, 115, + 85, 39, -7, -3, -1, 114, 70, -1, 100, 23, -5, -1, 113, -1, 7, + 112, -1, 54, 99, -13, -9, -3, -1, 69, 84, -1, 68, -1, 6, 5, + -1, 38, 98, -5, -1, 97, -1, 22, 96, -3, -1, 53, 83, -1, 37, + 82, -17, -7, -3, -1, 21, 81, -1, 52, 67, -5, -3, -1, 80, 4, + 36, -1, 66, 20, -3, -1, 51, 65, -1, 35, 50, -11, -7, -5, -3, + -1, 64, 3, 48, 19, -1, 49, 34, -1, 18, 33, -7, -5, -3, -1, + 2, 32, 0, 17, -1, 1, 16 +}; + +static const short tab13[] = +{ +-509,-503,-475,-405,-333,-265,-205,-153,-115, -83, -53, -35, -21, -13, -9, + -7, -5, -3, -1, 254, 252, 253, 237, 255, -1, 239, 223, -3, -1, 238, + 207, -1, 222, 191, -9, -3, -1, 251, 206, -1, 220, -1, 175, 233, -1, + 236, 221, -9, -5, -3, -1, 250, 205, 190, -1, 235, 159, -3, -1, 249, + 234, -1, 189, 219, -17, -9, -3, -1, 143, 248, -1, 204, -1, 174, 158, + -5, -1, 142, -1, 127, 126, 247, -5, -1, 218, -1, 173, 188, -3, -1, + 203, 246, 111, -15, -7, -3, -1, 232, 95, -1, 157, 217, -3, -1, 245, + 231, -1, 172, 187, -9, -3, -1, 79, 244, -3, -1, 202, 230, 243, -1, + 63, -1, 141, 216, -21, -9, -3, -1, 47, 242, -3, -1, 110, 156, 15, + -5, -3, -1, 201, 94, 171, -3, -1, 125, 215, 78, -11, -5, -3, -1, + 200, 214, 62, -1, 185, -1, 155, 170, -1, 31, 241, -23, -13, -5, -1, + 240, -1, 186, 229, -3, -1, 228, 140, -1, 109, 227, -5, -1, 226, -1, + 46, 14, -1, 30, 225, -15, -7, -3, -1, 224, 93, -1, 213, 124, -3, + -1, 199, 77, -1, 139, 184, -7, -3, -1, 212, 154, -1, 169, 108, -1, + 198, 61, -37, -21, -9, -5, -3, -1, 211, 123, 45, -1, 210, 29, -5, + -1, 183, -1, 92, 197, -3, -1, 153, 122, 195, -7, -5, -3, -1, 167, + 151, 75, 209, -3, -1, 13, 208, -1, 138, 168, -11, -7, -3, -1, 76, + 196, -1, 107, 182, -1, 60, 44, -3, -1, 194, 91, -3, -1, 181, 137, + 28, -43, -23, -11, -5, -1, 193, -1, 152, 12, -1, 192, -1, 180, 106, + -5, -3, -1, 166, 121, 59, -1, 179, -1, 136, 90, -11, -5, -1, 43, + -1, 165, 105, -1, 164, -1, 120, 135, -5, -1, 148, -1, 119, 118, 178, + -11, -3, -1, 27, 177, -3, -1, 11, 176, -1, 150, 74, -7, -3, -1, + 58, 163, -1, 89, 149, -1, 42, 162, -47, -23, -9, -3, -1, 26, 161, + -3, -1, 10, 104, 160, -5, -3, -1, 134, 73, 147, -3, -1, 57, 88, + -1, 133, 103, -9, -3, -1, 41, 146, -3, -1, 87, 117, 56, -5, -1, + 131, -1, 102, 71, -3, -1, 116, 86, -1, 101, 115, -11, -3, -1, 25, + 145, -3, -1, 9, 144, -1, 72, 132, -7, -5, -1, 114, -1, 70, 100, + 40, -1, 130, 24, -41, -27, -11, -5, -3, -1, 55, 39, 23, -1, 113, + -1, 85, 7, -7, -3, -1, 112, 54, -1, 99, 69, -3, -1, 84, 38, + -1, 98, 53, -5, -1, 129, -1, 8, 128, -3, -1, 22, 97, -1, 6, + 96, -13, -9, -5, -3, -1, 83, 68, 37, -1, 82, 5, -1, 21, 81, + -7, -3, -1, 52, 67, -1, 80, 36, -3, -1, 66, 51, 20, -19, -11, + -5, -1, 65, -1, 4, 64, -3, -1, 35, 50, 19, -3, -1, 49, 3, + -1, 48, 34, -3, -1, 18, 33, -1, 2, 32, -3, -1, 17, 1, 16, + 0 +}; + +static const short tab15[] = +{ +-495,-445,-355,-263,-183,-115, -77, -43, -27, -13, -7, -3, -1, 255, 239, + -1, 254, 223, -1, 238, -1, 253, 207, -7, -3, -1, 252, 222, -1, 237, + 191, -1, 251, -1, 206, 236, -7, -3, -1, 221, 175, -1, 250, 190, -3, + -1, 235, 205, -1, 220, 159, -15, -7, -3, -1, 249, 234, -1, 189, 219, + -3, -1, 143, 248, -1, 204, 158, -7, -3, -1, 233, 127, -1, 247, 173, + -3, -1, 218, 188, -1, 111, -1, 174, 15, -19, -11, -3, -1, 203, 246, + -3, -1, 142, 232, -1, 95, 157, -3, -1, 245, 126, -1, 231, 172, -9, + -3, -1, 202, 187, -3, -1, 217, 141, 79, -3, -1, 244, 63, -1, 243, + 216, -33, -17, -9, -3, -1, 230, 47, -1, 242, -1, 110, 240, -3, -1, + 31, 241, -1, 156, 201, -7, -3, -1, 94, 171, -1, 186, 229, -3, -1, + 125, 215, -1, 78, 228, -15, -7, -3, -1, 140, 200, -1, 62, 109, -3, + -1, 214, 227, -1, 155, 185, -7, -3, -1, 46, 170, -1, 226, 30, -5, + -1, 225, -1, 14, 224, -1, 93, 213, -45, -25, -13, -7, -3, -1, 124, + 199, -1, 77, 139, -1, 212, -1, 184, 154, -7, -3, -1, 169, 108, -1, + 198, 61, -1, 211, 210, -9, -5, -3, -1, 45, 13, 29, -1, 123, 183, + -5, -1, 209, -1, 92, 208, -1, 197, 138, -17, -7, -3, -1, 168, 76, + -1, 196, 107, -5, -1, 182, -1, 153, 12, -1, 60, 195, -9, -3, -1, + 122, 167, -1, 166, -1, 192, 11, -1, 194, -1, 44, 91, -55, -29, -15, + -7, -3, -1, 181, 28, -1, 137, 152, -3, -1, 193, 75, -1, 180, 106, + -5, -3, -1, 59, 121, 179, -3, -1, 151, 136, -1, 43, 90, -11, -5, + -1, 178, -1, 165, 27, -1, 177, -1, 176, 105, -7, -3, -1, 150, 74, + -1, 164, 120, -3, -1, 135, 58, 163, -17, -7, -3, -1, 89, 149, -1, + 42, 162, -3, -1, 26, 161, -3, -1, 10, 160, 104, -7, -3, -1, 134, + 73, -1, 148, 57, -5, -1, 147, -1, 119, 9, -1, 88, 133, -53, -29, + -13, -7, -3, -1, 41, 103, -1, 118, 146, -1, 145, -1, 25, 144, -7, + -3, -1, 72, 132, -1, 87, 117, -3, -1, 56, 131, -1, 102, 71, -7, + -3, -1, 40, 130, -1, 24, 129, -7, -3, -1, 116, 8, -1, 128, 86, + -3, -1, 101, 55, -1, 115, 70, -17, -7, -3, -1, 39, 114, -1, 100, + 23, -3, -1, 85, 113, -3, -1, 7, 112, 54, -7, -3, -1, 99, 69, + -1, 84, 38, -3, -1, 98, 22, -3, -1, 6, 96, 53, -33, -19, -9, + -5, -1, 97, -1, 83, 68, -1, 37, 82, -3, -1, 21, 81, -3, -1, + 5, 80, 52, -7, -3, -1, 67, 36, -1, 66, 51, -1, 65, -1, 20, + 4, -9, -3, -1, 35, 50, -3, -1, 64, 3, 19, -3, -1, 49, 48, + 34, -9, -7, -3, -1, 18, 33, -1, 2, 32, 17, -3, -1, 1, 16, + 0 +}; + +static const short tab16[] = +{ +-509,-503,-461,-323,-103, -37, -27, -15, -7, -3, -1, 239, 254, -1, 223, + 253, -3, -1, 207, 252, -1, 191, 251, -5, -1, 175, -1, 250, 159, -3, + -1, 249, 248, 143, -7, -3, -1, 127, 247, -1, 111, 246, 255, -9, -5, + -3, -1, 95, 245, 79, -1, 244, 243, -53, -1, 240, -1, 63, -29, -19, + -13, -7, -5, -1, 206, -1, 236, 221, 222, -1, 233, -1, 234, 217, -1, + 238, -1, 237, 235, -3, -1, 190, 205, -3, -1, 220, 219, 174, -11, -5, + -1, 204, -1, 173, 218, -3, -1, 126, 172, 202, -5, -3, -1, 201, 125, + 94, 189, 242, -93, -5, -3, -1, 47, 15, 31, -1, 241, -49, -25, -13, + -5, -1, 158, -1, 188, 203, -3, -1, 142, 232, -1, 157, 231, -7, -3, + -1, 187, 141, -1, 216, 110, -1, 230, 156, -13, -7, -3, -1, 171, 186, + -1, 229, 215, -1, 78, -1, 228, 140, -3, -1, 200, 62, -1, 109, -1, + 214, 155, -19, -11, -5, -3, -1, 185, 170, 225, -1, 212, -1, 184, 169, + -5, -1, 123, -1, 183, 208, 227, -7, -3, -1, 14, 224, -1, 93, 213, + -3, -1, 124, 199, -1, 77, 139, -75, -45, -27, -13, -7, -3, -1, 154, + 108, -1, 198, 61, -3, -1, 92, 197, 13, -7, -3, -1, 138, 168, -1, + 153, 76, -3, -1, 182, 122, 60, -11, -5, -3, -1, 91, 137, 28, -1, + 192, -1, 152, 121, -1, 226, -1, 46, 30, -15, -7, -3, -1, 211, 45, + -1, 210, 209, -5, -1, 59, -1, 151, 136, 29, -7, -3, -1, 196, 107, + -1, 195, 167, -1, 44, -1, 194, 181, -23, -13, -7, -3, -1, 193, 12, + -1, 75, 180, -3, -1, 106, 166, 179, -5, -3, -1, 90, 165, 43, -1, + 178, 27, -13, -5, -1, 177, -1, 11, 176, -3, -1, 105, 150, -1, 74, + 164, -5, -3, -1, 120, 135, 163, -3, -1, 58, 89, 42, -97, -57, -33, + -19, -11, -5, -3, -1, 149, 104, 161, -3, -1, 134, 119, 148, -5, -3, + -1, 73, 87, 103, 162, -5, -1, 26, -1, 10, 160, -3, -1, 57, 147, + -1, 88, 133, -9, -3, -1, 41, 146, -3, -1, 118, 9, 25, -5, -1, + 145, -1, 144, 72, -3, -1, 132, 117, -1, 56, 131, -21, -11, -5, -3, + -1, 102, 40, 130, -3, -1, 71, 116, 24, -3, -1, 129, 128, -3, -1, + 8, 86, 55, -9, -5, -1, 115, -1, 101, 70, -1, 39, 114, -5, -3, + -1, 100, 85, 7, 23, -23, -13, -5, -1, 113, -1, 112, 54, -3, -1, + 99, 69, -1, 84, 38, -3, -1, 98, 22, -1, 97, -1, 6, 96, -9, + -5, -1, 83, -1, 53, 68, -1, 37, 82, -1, 81, -1, 21, 5, -33, + -23, -13, -7, -3, -1, 52, 67, -1, 80, 36, -3, -1, 66, 51, 20, + -5, -1, 65, -1, 4, 64, -1, 35, 50, -3, -1, 19, 49, -3, -1, + 3, 48, 34, -3, -1, 18, 33, -1, 2, 32, -3, -1, 17, 1, 16, + 0 +}; + +static const short tab24[] = +{ +-451,-117, -43, -25, -15, -7, -3, -1, 239, 254, -1, 223, 253, -3, -1, + 207, 252, -1, 191, 251, -5, -1, 250, -1, 175, 159, -1, 249, 248, -9, + -5, -3, -1, 143, 127, 247, -1, 111, 246, -3, -1, 95, 245, -1, 79, + 244, -71, -7, -3, -1, 63, 243, -1, 47, 242, -5, -1, 241, -1, 31, + 240, -25, -9, -1, 15, -3, -1, 238, 222, -1, 237, 206, -7, -3, -1, + 236, 221, -1, 190, 235, -3, -1, 205, 220, -1, 174, 234, -15, -7, -3, + -1, 189, 219, -1, 204, 158, -3, -1, 233, 173, -1, 218, 188, -7, -3, + -1, 203, 142, -1, 232, 157, -3, -1, 217, 126, -1, 231, 172, 255,-235, +-143, -77, -45, -25, -15, -7, -3, -1, 202, 187, -1, 141, 216, -5, -3, + -1, 14, 224, 13, 230, -5, -3, -1, 110, 156, 201, -1, 94, 186, -9, + -5, -1, 229, -1, 171, 125, -1, 215, 228, -3, -1, 140, 200, -3, -1, + 78, 46, 62, -15, -7, -3, -1, 109, 214, -1, 227, 155, -3, -1, 185, + 170, -1, 226, 30, -7, -3, -1, 225, 93, -1, 213, 124, -3, -1, 199, + 77, -1, 139, 184, -31, -15, -7, -3, -1, 212, 154, -1, 169, 108, -3, + -1, 198, 61, -1, 211, 45, -7, -3, -1, 210, 29, -1, 123, 183, -3, + -1, 209, 92, -1, 197, 138, -17, -7, -3, -1, 168, 153, -1, 76, 196, + -3, -1, 107, 182, -3, -1, 208, 12, 60, -7, -3, -1, 195, 122, -1, + 167, 44, -3, -1, 194, 91, -1, 181, 28, -57, -35, -19, -7, -3, -1, + 137, 152, -1, 193, 75, -5, -3, -1, 192, 11, 59, -3, -1, 176, 10, + 26, -5, -1, 180, -1, 106, 166, -3, -1, 121, 151, -3, -1, 160, 9, + 144, -9, -3, -1, 179, 136, -3, -1, 43, 90, 178, -7, -3, -1, 165, + 27, -1, 177, 105, -1, 150, 164, -17, -9, -5, -3, -1, 74, 120, 135, + -1, 58, 163, -3, -1, 89, 149, -1, 42, 162, -7, -3, -1, 161, 104, + -1, 134, 119, -3, -1, 73, 148, -1, 57, 147, -63, -31, -15, -7, -3, + -1, 88, 133, -1, 41, 103, -3, -1, 118, 146, -1, 25, 145, -7, -3, + -1, 72, 132, -1, 87, 117, -3, -1, 56, 131, -1, 102, 40, -17, -7, + -3, -1, 130, 24, -1, 71, 116, -5, -1, 129, -1, 8, 128, -1, 86, + 101, -7, -5, -1, 23, -1, 7, 112, 115, -3, -1, 55, 39, 114, -15, + -7, -3, -1, 70, 100, -1, 85, 113, -3, -1, 54, 99, -1, 69, 84, + -7, -3, -1, 38, 98, -1, 22, 97, -5, -3, -1, 6, 96, 53, -1, + 83, 68, -51, -37, -23, -15, -9, -3, -1, 37, 82, -1, 21, -1, 5, + 80, -1, 81, -1, 52, 67, -3, -1, 36, 66, -1, 51, 20, -9, -5, + -1, 65, -1, 4, 64, -1, 35, 50, -1, 19, 49, -7, -5, -3, -1, + 3, 48, 34, 18, -1, 33, -1, 2, 32, -3, -1, 17, 1, -1, 16, + 0 +}; + +static const short tab_c0[] = +{ + -29, -21, -13, -7, -3, -1, 11, 15, -1, 13, 14, -3, -1, 7, 5, + 9, -3, -1, 6, 3, -1, 10, 12, -3, -1, 2, 1, -1, 4, 8, + 0 +}; + +static const short tab_c1[] = +{ + -15, -7, -3, -1, 15, 14, -1, 13, 12, -3, -1, 11, 10, -1, 9, + 8, -7, -3, -1, 7, 6, -1, 5, 4, -3, -1, 3, 2, -1, 1, + 0 +}; + + + +static const struct newhuff ht[] = +{ + { /* 0 */ 0 , tab0 } , + { /* 2 */ 0 , tab1 } , + { /* 3 */ 0 , tab2 } , + { /* 3 */ 0 , tab3 } , + { /* 0 */ 0 , tab0 } , + { /* 4 */ 0 , tab5 } , + { /* 4 */ 0 , tab6 } , + { /* 6 */ 0 , tab7 } , + { /* 6 */ 0 , tab8 } , + { /* 6 */ 0 , tab9 } , + { /* 8 */ 0 , tab10 } , + { /* 8 */ 0 , tab11 } , + { /* 8 */ 0 , tab12 } , + { /* 16 */ 0 , tab13 } , + { /* 0 */ 0 , tab0 } , + { /* 16 */ 0 , tab15 } , + + { /* 16 */ 1 , tab16 } , + { /* 16 */ 2 , tab16 } , + { /* 16 */ 3 , tab16 } , + { /* 16 */ 4 , tab16 } , + { /* 16 */ 6 , tab16 } , + { /* 16 */ 8 , tab16 } , + { /* 16 */ 10, tab16 } , + { /* 16 */ 13, tab16 } , + { /* 16 */ 4 , tab24 } , + { /* 16 */ 5 , tab24 } , + { /* 16 */ 6 , tab24 } , + { /* 16 */ 7 , tab24 } , + { /* 16 */ 8 , tab24 } , + { /* 16 */ 9 , tab24 } , + { /* 16 */ 11, tab24 } , + { /* 16 */ 13, tab24 } +}; + +static const struct newhuff htc[] = +{ + { /* 1 , 1 , */ 0 , tab_c0 } , + { /* 1 , 1 , */ 0 , tab_c1 } +}; + + /* *INDENT-ON* */ diff --git a/mpglib/interface.c b/mpglib/interface.c new file mode 100644 index 0000000..9719ff9 --- /dev/null +++ b/mpglib/interface.c @@ -0,0 +1,718 @@ +/* + * interface.c + * + * Copyright (C) 1999-2012 The L.A.M.E. project + * + * Initially written by Michael Hipp, see also AUTHORS and README. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +/* $Id: interface.c,v 1.69 2017/09/06 15:07:30 robert Exp $ */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <stdlib.h> +#include <stdio.h> + +#include "common.h" +#include "interface.h" +#include "tabinit.h" +#include "layer3.h" +#include "lame.h" +#include "machine.h" +#include "VbrTag.h" +#include "decode_i386.h" + +#include "layer1.h" +#include "layer2.h" + +#ifdef WITH_DMALLOC +#include <dmalloc.h> +#endif + +extern void lame_report_def(const char* format, va_list args); + +/* #define HIP_DEBUG */ + +int +InitMP3(PMPSTR mp) +{ + hip_init_tables_layer1(); + hip_init_tables_layer2(); + hip_init_tables_layer3(); + + if (mp) { + memset(mp, 0, sizeof(MPSTR)); + + mp->framesize = 0; + mp->num_frames = 0; + mp->enc_delay = -1; + mp->enc_padding = -1; + mp->vbr_header = 0; + mp->header_parsed = 0; + mp->side_parsed = 0; + mp->data_parsed = 0; + mp->free_format = 0; + mp->old_free_format = 0; + mp->ssize = 0; + mp->dsize = 0; + mp->fsizeold = -1; + mp->bsize = 0; + mp->head = mp->tail = NULL; + mp->fr.single = -1; + mp->bsnum = 0; + mp->wordpointer = mp->bsspace[mp->bsnum] + 512; + mp->bitindex = 0; + mp->synth_bo = 1; + mp->sync_bitstream = 1; + + mp->report_dbg = &lame_report_def; + mp->report_err = &lame_report_def; + mp->report_msg = &lame_report_def; + } + make_decode_tables(32767); + + return 1; +} + +void +ExitMP3(PMPSTR mp) +{ + if (mp) { + struct buf *b, *bn; + + b = mp->tail; + while (b) { + free(b->pnt); + bn = b->next; + free(b); + b = bn; + } + } +} + +static struct buf * +addbuf(PMPSTR mp, unsigned char *buf, int size) +{ + struct buf *nbuf; + + nbuf = (struct buf *) malloc(sizeof(struct buf)); + if (!nbuf) { + lame_report_fnc(mp->report_err, "hip: addbuf() Out of memory!\n"); + return NULL; + } + nbuf->pnt = (unsigned char *) malloc((size_t) size); + if (!nbuf->pnt) { + free(nbuf); + return NULL; + } + nbuf->size = size; + memcpy(nbuf->pnt, buf, (size_t) size); + nbuf->next = NULL; + nbuf->prev = mp->head; + nbuf->pos = 0; + + if (!mp->tail) { + mp->tail = nbuf; + } + else { + mp->head->next = nbuf; + } + + mp->head = nbuf; + mp->bsize += size; + + return nbuf; +} + +void +remove_buf(PMPSTR mp) +{ + struct buf *buf = mp->tail; + + mp->tail = buf->next; + if (mp->tail) + mp->tail->prev = NULL; + else { + mp->tail = mp->head = NULL; + } + + free(buf->pnt); + free(buf); + +} + +static int +read_buf_byte(PMPSTR mp) +{ + unsigned int b; + + int pos; + + + pos = mp->tail->pos; + while (pos >= mp->tail->size) { + remove_buf(mp); + if (!mp->tail) { + lame_report_fnc(mp->report_err, "hip: Fatal error! tried to read past mp buffer\n"); + exit(1); + } + pos = mp->tail->pos; + } + + b = mp->tail->pnt[pos]; + mp->bsize--; + mp->tail->pos++; + + + return b; +} + + + +static void +read_head(PMPSTR mp) +{ + unsigned long head; + + head = read_buf_byte(mp); + head <<= 8; + head |= read_buf_byte(mp); + head <<= 8; + head |= read_buf_byte(mp); + head <<= 8; + head |= read_buf_byte(mp); + + mp->header = head; +} + + + + +static void +copy_mp(PMPSTR mp, int size, unsigned char *ptr) +{ + int len = 0; + + while (len < size && mp->tail) { + int nlen; + int blen = mp->tail->size - mp->tail->pos; + if ((size - len) <= blen) { + nlen = size - len; + } + else { + nlen = blen; + } + memcpy(ptr + len, mp->tail->pnt + mp->tail->pos, (size_t) nlen); + len += nlen; + mp->tail->pos += nlen; + mp->bsize -= nlen; + if (mp->tail->pos == mp->tail->size) { + remove_buf(mp); + } + } +} + +/* number of bytes needed by GetVbrTag to parse header */ +#define XING_HEADER_SIZE 194 + +/* +traverse mp data structure without changing it +(just like sync_buffer) +pull out Xing bytes +call vbr header check code from LAME +if we find a header, parse it and also compute the VBR header size +if no header, do nothing. + +bytes = number of bytes before MPEG header. skip this many bytes +before starting to read +return value: number of bytes in VBR header, including syncword +*/ +static int +check_vbr_header(PMPSTR mp, int bytes) +{ + int i, pos; + struct buf *buf = mp->tail; + unsigned char xing[XING_HEADER_SIZE]; + VBRTAGDATA pTagData; + + pos = buf->pos; + /* skip to valid header */ + for (i = 0; i < bytes; ++i) { + while (pos >= buf->size) { + buf = buf->next; + if (!buf) + return -1; /* fatal error */ + pos = buf->pos; + } + ++pos; + } + /* now read header */ + for (i = 0; i < XING_HEADER_SIZE; ++i) { + while (pos >= buf->size) { + buf = buf->next; + if (!buf) + return -1; /* fatal error */ + pos = buf->pos; + } + xing[i] = buf->pnt[pos]; + ++pos; + } + + /* check first bytes for Xing header */ + mp->vbr_header = GetVbrTag(&pTagData, xing); + if (mp->vbr_header) { + mp->num_frames = pTagData.frames; + mp->enc_delay = pTagData.enc_delay; + mp->enc_padding = pTagData.enc_padding; + + /* lame_report_fnc(mp->report_msg,"hip: delays: %i %i \n",mp->enc_delay,mp->enc_padding); */ + /* lame_report_fnc(mp->report_msg,"hip: Xing VBR header dectected. MP3 file has %i frames\n", pTagData.frames); */ + if (pTagData.headersize < 1) + return 1; + return pTagData.headersize; + } + return 0; +} + + + + + +static int +sync_buffer(PMPSTR mp, int free_match) +{ + /* traverse mp structure without modifying pointers, looking + * for a frame valid header. + * if free_format, valid header must also have the same + * samplerate. + * return number of bytes in mp, before the header + * return -1 if header is not found + */ + unsigned int b[4] = { 0, 0, 0, 0 }; + int i, h, pos; + struct buf *buf = mp->tail; + if (!buf) + return -1; + + pos = buf->pos; + for (i = 0; i < mp->bsize; i++) { + /* get 4 bytes */ + + b[0] = b[1]; + b[1] = b[2]; + b[2] = b[3]; + while (pos >= buf->size) { + buf = buf->next; + if (!buf) { + return -1; + /* not enough data to read 4 bytes */ + } + pos = buf->pos; + } + b[3] = buf->pnt[pos]; + ++pos; + + if (i >= 3) { + struct frame *fr = &mp->fr; + unsigned long head; + + head = b[0]; + head <<= 8; + head |= b[1]; + head <<= 8; + head |= b[2]; + head <<= 8; + head |= b[3]; + h = head_check(head, fr->lay); + + if (h && free_match) { + /* just to be even more thorough, match the sample rate */ + int mode, stereo, sampling_frequency, mpeg25, lsf; + + if (head & (1 << 20)) { + lsf = (head & (1 << 19)) ? 0x0 : 0x1; + mpeg25 = 0; + } + else { + lsf = 1; + mpeg25 = 1; + } + + mode = ((head >> 6) & 0x3); + stereo = (mode == MPG_MD_MONO) ? 1 : 2; + + if (mpeg25) + sampling_frequency = 6 + ((head >> 10) & 0x3); + else + sampling_frequency = ((head >> 10) & 0x3) + (lsf * 3); + h = ((stereo == fr->stereo) && (lsf == fr->lsf) && (mpeg25 == fr->mpeg25) && + (sampling_frequency == fr->sampling_frequency)); + } + + if (h) { + return i - 3; + } + } + } + return -1; +} + + +void +decode_reset(PMPSTR mp) +{ +#if 0 + remove_buf(mp); + /* start looking for next frame */ + /* mp->fsizeold = mp->framesize; */ + mp->fsizeold = -1; + mp->old_free_format = mp->free_format; + mp->framesize = 0; + mp->header_parsed = 0; + mp->side_parsed = 0; + mp->data_parsed = 0; + mp->sync_bitstream = 1; /* TODO check if this is right */ +#else + InitMP3(mp); /* Less error prone to just to reinitialise. */ +#endif +} + +int +audiodata_precedesframes(PMPSTR mp) +{ + if (mp->fr.lay == 3) + return layer3_audiodata_precedesframes(mp); + else + return 0; /* For Layer 1 & 2 the audio data starts at the frame that describes it, so no audio data precedes. */ +} + +static int +decodeMP3_clipchoice(PMPSTR mp, unsigned char *in, int isize, char *out, int *done, + int (*synth_1to1_mono_ptr) (PMPSTR, real *, unsigned char *, int *), + int (*synth_1to1_ptr) (PMPSTR, real *, int, unsigned char *, int *)) +{ + int i, iret, bits, bytes; + + if (in && isize && addbuf(mp, in, isize) == NULL) + return MP3_ERR; + + /* First decode header */ + if (!mp->header_parsed) { + + if (mp->fsizeold == -1 || mp->sync_bitstream) { + int vbrbytes; + mp->sync_bitstream = 0; + + /* This is the very first call. sync with anything */ + /* bytes= number of bytes before header */ + bytes = sync_buffer(mp, 0); + + /* now look for Xing VBR header */ + if (mp->bsize >= bytes + XING_HEADER_SIZE) { + /* vbrbytes = number of bytes in entire vbr header */ + vbrbytes = check_vbr_header(mp, bytes); + } + else { + /* not enough data to look for Xing header */ +#ifdef HIP_DEBUG + lame_report_fnc(mp->report_dbg, "hip: not enough data to look for Xing header\n"); +#endif + return MP3_NEED_MORE; + } + + if (mp->vbr_header) { + /* do we have enough data to parse entire Xing header? */ + if (bytes + vbrbytes > mp->bsize) { + /* lame_report_fnc(mp->report_err,"hip: not enough data to parse entire Xing header\n"); */ + return MP3_NEED_MORE; + } + + /* read in Xing header. Buffer data in case it + * is used by a non zero main_data_begin for the next + * frame, but otherwise dont decode Xing header */ +#ifdef HIP_DEBUG + lame_report_fnc(mp->report_dbg, "hip: found xing header, skipping %i bytes\n", vbrbytes + bytes); +#endif + for (i = 0; i < vbrbytes + bytes; ++i) + read_buf_byte(mp); + /* now we need to find another syncword */ + /* just return and make user send in more data */ + + return MP3_NEED_MORE; + } + } + else { + /* match channels, samplerate, etc, when syncing */ + bytes = sync_buffer(mp, 1); + } + + /* buffer now synchronized */ + if (bytes < 0) { + /* lame_report_fnc(mp->report_err,"hip: need more bytes %d\n", bytes); */ + return MP3_NEED_MORE; + } + if (bytes > 0) { + /* there were some extra bytes in front of header. + * bitstream problem, but we are now resynced + * should try to buffer previous data in case new + * frame has nonzero main_data_begin, but we need + * to make sure we do not overflow buffer + */ + int size; + if (mp->fsizeold != -1) { + lame_report_fnc(mp->report_err, "hip: bitstream problem, resyncing skipping %d bytes...\n", bytes); + } + mp->old_free_format = 0; +#if 1 + /* FIXME: correct ??? */ + mp->sync_bitstream = 1; +#endif + /* skip some bytes, buffer the rest */ + size = (int) (mp->wordpointer - (mp->bsspace[mp->bsnum] + 512)); + + if (size > MAXFRAMESIZE) { + /* wordpointer buffer is trashed. probably cant recover, but try anyway */ + lame_report_fnc(mp->report_err, "hip: wordpointer trashed. size=%i (%i) bytes=%i \n", + size, MAXFRAMESIZE, bytes); + size = 0; + mp->wordpointer = mp->bsspace[mp->bsnum] + 512; + } + + /* buffer contains 'size' data right now + we want to add 'bytes' worth of data, but do not + exceed MAXFRAMESIZE, so we through away 'i' bytes */ + i = (size + bytes) - MAXFRAMESIZE; + for (; i > 0; --i) { + --bytes; + read_buf_byte(mp); + } + + copy_mp(mp, bytes, mp->wordpointer); + mp->fsizeold += bytes; + } + + read_head(mp); + if (!decode_header(mp, &mp->fr, mp->header)) + return MP3_ERR; + mp->header_parsed = 1; + mp->framesize = mp->fr.framesize; + mp->free_format = (mp->framesize == 0); + + if (mp->fr.lsf) + mp->ssize = (mp->fr.stereo == 1) ? 9 : 17; + else + mp->ssize = (mp->fr.stereo == 1) ? 17 : 32; + if (mp->fr.error_protection) + mp->ssize += 2; + + mp->bsnum = 1 - mp->bsnum; /* toggle buffer */ + mp->wordpointer = mp->bsspace[mp->bsnum] + 512; + mp->bitindex = 0; + + /* for very first header, never parse rest of data */ + if (mp->fsizeold == -1) { +#ifdef HIP_DEBUG + lame_report_fnc(mp->report_dbg, "hip: not parsing the rest of the data of the first header\n"); +#endif + return MP3_NEED_MORE; + } + } /* end of header parsing block */ + + /* now decode side information */ + if (!mp->side_parsed) { + + /* Layer 3 only */ + if (mp->fr.lay == 3) { + if (mp->bsize < mp->ssize) + return MP3_NEED_MORE; + + copy_mp(mp, mp->ssize, mp->wordpointer); + + if (mp->fr.error_protection) + getbits(mp, 16); + bits = decode_layer3_sideinfo(mp); + /* bits = actual number of bits needed to parse this frame */ + /* can be negative, if all bits needed are in the reservoir */ + if (bits < 0) + bits = 0; + + /* read just as many bytes as necessary before decoding */ + mp->dsize = (bits + 7) / 8; + + if (!mp->free_format) { + /* do not read more than framsize data */ + int framesize = mp->fr.framesize - mp->ssize; + if (mp->dsize > framesize) { + lame_report_fnc(mp->report_err, + "hip: error audio data exceeds framesize by %d bytes\n", + mp->dsize - framesize); + mp->dsize = framesize; + } + } +#ifdef HIP_DEBUG + lame_report_fnc(mp->report_dbg, + "hip: %d bits needed to parse layer III frame, number of bytes to read before decoding dsize = %d\n", + bits, mp->dsize); +#endif + + /* this will force mpglib to read entire frame before decoding */ + /* mp->dsize= mp->framesize - mp->ssize; */ + + } + else { + /* Layers 1 and 2 */ + + /* check if there is enough input data */ + if (mp->fr.framesize > mp->bsize) + return MP3_NEED_MORE; + + /* takes care that the right amount of data is copied into wordpointer */ + mp->dsize = mp->fr.framesize; + mp->ssize = 0; + } + + mp->side_parsed = 1; + } + + /* now decode main data */ + iret = MP3_NEED_MORE; + if (!mp->data_parsed) { + if (mp->dsize > mp->bsize) { + return MP3_NEED_MORE; + } + + copy_mp(mp, mp->dsize, mp->wordpointer); + + *done = 0; + + /*do_layer3(&mp->fr,(unsigned char *) out,done); */ + switch (mp->fr.lay) { + case 1: + if (mp->fr.error_protection) + getbits(mp, 16); + + if (decode_layer1_frame(mp, (unsigned char *) out, done) < 0) + return MP3_ERR; + break; + + case 2: + if (mp->fr.error_protection) + getbits(mp, 16); + + decode_layer2_frame(mp, (unsigned char *) out, done); + break; + + case 3: + decode_layer3_frame(mp, (unsigned char *) out, done, synth_1to1_mono_ptr, synth_1to1_ptr); + break; + default: + lame_report_fnc(mp->report_err, "hip: invalid layer %d\n", mp->fr.lay); + } + + mp->wordpointer = mp->bsspace[mp->bsnum] + 512 + mp->ssize + mp->dsize; + + mp->data_parsed = 1; + iret = MP3_OK; + } + + + /* remaining bits are ancillary data, or reservoir for next frame + * If free format, scan stream looking for next frame to determine + * mp->framesize */ + if (mp->free_format) { + if (mp->old_free_format) { + /* free format. bitrate must not vary */ + mp->framesize = mp->fsizeold_nopadding + (mp->fr.padding); + } + else { + bytes = sync_buffer(mp, 1); + if (bytes < 0) + return iret; + mp->framesize = bytes + mp->ssize + mp->dsize; + mp->fsizeold_nopadding = mp->framesize - mp->fr.padding; +#if 0 + lame_report_fnc(mp->report_dbg,"hip: freeformat bitstream: estimated bitrate=%ikbs \n", + 8*(4+mp->framesize)*freqs[mp->fr.sampling_frequency]/ + (1000*576*(2-mp->fr.lsf))); +#endif + } + } + + /* buffer the ancillary data and reservoir for next frame */ + bytes = mp->framesize - (mp->ssize + mp->dsize); + if (bytes > mp->bsize) { + return iret; + } + + if (bytes > 0) { + int size; +#if 1 + /* FIXME: while loop OK ??? */ + while (bytes > 512) { + read_buf_byte(mp); + bytes--; + mp->framesize--; + } +#endif + copy_mp(mp, bytes, mp->wordpointer); + mp->wordpointer += bytes; + + size = (int) (mp->wordpointer - (mp->bsspace[mp->bsnum] + 512)); + if (size > MAXFRAMESIZE) { + lame_report_fnc(mp->report_err, "hip: fatal error. MAXFRAMESIZE not large enough.\n"); + } + + } + + /* the above frame is completely parsed. start looking for next frame */ + mp->fsizeold = mp->framesize; + mp->old_free_format = mp->free_format; + mp->framesize = 0; + mp->header_parsed = 0; + mp->side_parsed = 0; + mp->data_parsed = 0; + + return iret; +} + +int +decodeMP3(PMPSTR mp, unsigned char *in, int isize, char *out, int osize, int *done) +{ + if (osize < 4608) { + lame_report_fnc(mp->report_err, "hip: Insufficient memory for decoding buffer %d\n", osize); + return MP3_ERR; + } + + /* passing pointers to the functions which clip the samples */ + return decodeMP3_clipchoice(mp, in, isize, out, done, synth_1to1_mono, synth_1to1); +} + +int +decodeMP3_unclipped(PMPSTR mp, unsigned char *in, int isize, char *out, int osize, int *done) +{ + /* we forbid input with more than 1152 samples per channel for output in unclipped mode */ + if (osize < (int) (1152 * 2 * sizeof(real))) { + lame_report_fnc(mp->report_err, "hip: out space too small for unclipped mode\n"); + return MP3_ERR; + } + + /* passing pointers to the functions which don't clip the samples */ + return decodeMP3_clipchoice(mp, in, isize, out, done, synth_1to1_mono_unclipped, + synth_1to1_unclipped); +} diff --git a/mpglib/interface.h b/mpglib/interface.h new file mode 100644 index 0000000..f713b46 --- /dev/null +++ b/mpglib/interface.h @@ -0,0 +1,56 @@ +/* + * Copyright (C) 1999-2010 The L.A.M.E. project + * + * Initially written by Michael Hipp, see also AUTHORS and README. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef INTERFACE_H_INCLUDED +#define INTERFACE_H_INCLUDED + +#ifdef __cplusplus +extern "C" { +#endif + +#include "common.h" + + int InitMP3(PMPSTR mp); + int decodeMP3(PMPSTR mp, unsigned char *inmemory, int inmemsize, char *outmemory, + int outmemsize, int *done); + void ExitMP3(PMPSTR mp); + +/* added decodeMP3_unclipped to support returning raw floating-point values of samples. The representation + of the floating-point numbers is defined in mpg123.h as #define real. It is 64-bit double by default. + No more than 1152 samples per channel are allowed. */ + int decodeMP3_unclipped(PMPSTR mp, unsigned char *inmemory, int inmemsize, char *outmemory, + int outmemsize, int *done); + +/* added remove_buf to support mpglib seeking */ + void remove_buf(PMPSTR mp); + +/* added audiodata_precedesframes to return the number of bitstream frames the audio data will precede the + current frame by for Layer 3 data. Aids seeking. + */ + int audiodata_precedesframes(PMPSTR mp); + +/* Resets decoding. Aids seeking. */ + void decode_reset(PMPSTR mp); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/mpglib/l2tables.h b/mpglib/l2tables.h new file mode 100644 index 0000000..6a3deac --- /dev/null +++ b/mpglib/l2tables.h @@ -0,0 +1,183 @@ +/* + * Copyright (C) 1999-2010 The L.A.M.E. project + * + * Initially written by Michael Hipp, see also AUTHORS and README. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Layer 2 Alloc tables .. + * most other tables are calculated on program start (which is (of course) + * not ISO-conform) .. + * Layer-3 huffman table is in huffman.h + */ + +const struct al_table2 alloc_0[] = { + {4, 0}, {5, 3}, {3, -3}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, + -511}, + {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383}, {16, -32767}, + {4, 0}, {5, 3}, {3, -3}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, + -511}, + {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383}, {16, -32767}, + {4, 0}, {5, 3}, {3, -3}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, + -511}, + {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383}, {16, -32767}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, + {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, + {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, + {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, + {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, + {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, + {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, + {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, + {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, + {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, + {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, + {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, + {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, + {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, + {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, + {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, + {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, + {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, + {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, + {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, + {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, + {2, 0}, {5, 3}, {7, 5}, {16, -32767}, + {2, 0}, {5, 3}, {7, 5}, {16, -32767}, + {2, 0}, {5, 3}, {7, 5}, {16, -32767}, + {2, 0}, {5, 3}, {7, 5}, {16, -32767} +}; + +const struct al_table2 alloc_1[] = { + {4, 0}, {5, 3}, {3, -3}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, + -511}, + {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383}, {16, -32767}, + {4, 0}, {5, 3}, {3, -3}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, + -511}, + {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383}, {16, -32767}, + {4, 0}, {5, 3}, {3, -3}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, + -511}, + {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383}, {16, -32767}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, + {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, + {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, + {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, + {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, + {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, + {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, + {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, + {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, + {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, + {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, + {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, + {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, + {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, + {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, + {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, + {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, + {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, + {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, + {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, + {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, + {2, 0}, {5, 3}, {7, 5}, {16, -32767}, + {2, 0}, {5, 3}, {7, 5}, {16, -32767}, + {2, 0}, {5, 3}, {7, 5}, {16, -32767}, + {2, 0}, {5, 3}, {7, 5}, {16, -32767}, + {2, 0}, {5, 3}, {7, 5}, {16, -32767}, + {2, 0}, {5, 3}, {7, 5}, {16, -32767}, + {2, 0}, {5, 3}, {7, 5}, {16, -32767} +}; + +const struct al_table2 alloc_2[] = { + {4, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, + {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383}, + {4, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, + {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383}, + {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, + {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, + {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, + {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, + {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, + {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63} +}; + +const struct al_table2 alloc_3[] = { + {4, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, + {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383}, + {4, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, + {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383}, + {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, + {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, + {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, + {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, + {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, + {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, + {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, + {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, + {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, + {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63} +}; + +const struct al_table2 alloc_4[] = { + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, + {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, + {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, + {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, + {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, + {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, + {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, + {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, + {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, + {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, + {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, + {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, + {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, + {2, 0}, {5, 3}, {7, 5}, {10, 9}, + {2, 0}, {5, 3}, {7, 5}, {10, 9}, + {2, 0}, {5, 3}, {7, 5}, {10, 9}, + {2, 0}, {5, 3}, {7, 5}, {10, 9}, + {2, 0}, {5, 3}, {7, 5}, {10, 9}, + {2, 0}, {5, 3}, {7, 5}, {10, 9}, + {2, 0}, {5, 3}, {7, 5}, {10, 9}, + {2, 0}, {5, 3}, {7, 5}, {10, 9}, + {2, 0}, {5, 3}, {7, 5}, {10, 9}, + {2, 0}, {5, 3}, {7, 5}, {10, 9}, + {2, 0}, {5, 3}, {7, 5}, {10, 9}, + {2, 0}, {5, 3}, {7, 5}, {10, 9}, + {2, 0}, {5, 3}, {7, 5}, {10, 9}, + {2, 0}, {5, 3}, {7, 5}, {10, 9}, + {2, 0}, {5, 3}, {7, 5}, {10, 9}, + {2, 0}, {5, 3}, {7, 5}, {10, 9}, + {2, 0}, {5, 3}, {7, 5}, {10, 9}, + {2, 0}, {5, 3}, {7, 5}, {10, 9}, + {2, 0}, {5, 3}, {7, 5}, {10, 9} +}; diff --git a/mpglib/layer1.c b/mpglib/layer1.c new file mode 100644 index 0000000..7101a46 --- /dev/null +++ b/mpglib/layer1.c @@ -0,0 +1,232 @@ +/* + * layer1.c: Mpeg Layer-1 audio decoder + * + * Copyright (C) 1999-2010 The L.A.M.E. project + * + * Initially written by Michael Hipp, see also AUTHORS and README. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* $Id: layer1.c,v 1.31 2017/08/23 13:22:23 robert Exp $ */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <assert.h> +#include "common.h" +#include "decode_i386.h" + +#ifdef WITH_DMALLOC +#include <dmalloc.h> +#endif + +#include "layer1.h" + +static int gd_are_hip_tables_layer1_initialized = 0; + +void +hip_init_tables_layer1(void) +{ + if (gd_are_hip_tables_layer1_initialized) { + return; + } + gd_are_hip_tables_layer1_initialized = 1; +} + +typedef struct sideinfo_layer_I_struct +{ + unsigned char allocation[SBLIMIT][2]; + unsigned char scalefactor[SBLIMIT][2]; +} sideinfo_layer_I; + +static int +I_step_one(PMPSTR mp, sideinfo_layer_I* si) +{ + struct frame *fr = &(mp->fr); + int jsbound = (fr->mode == MPG_MD_JOINT_STEREO) ? (fr->mode_ext << 2) + 4 : 32; + int i; + int illegal_value_detected = 0; + unsigned char const ba15 = 15; /* bit pattern not allowed, looks like sync(?) */ + memset(si, 0, sizeof(*si)); + assert(fr->stereo == 1 || fr->stereo == 2); + + if (fr->stereo == 2) { + for (i = 0; i < jsbound; i++) { + unsigned char b0 = get_leq_8_bits(mp, 4); /* values 0-15 */ + unsigned char b1 = get_leq_8_bits(mp, 4); /* values 0-15 */ + si->allocation[i][0] = b0; + si->allocation[i][1] = b1; + if (b0 == ba15 || b1 == ba15) + illegal_value_detected = 1; + } + for (i = jsbound; i < SBLIMIT; i++) { + unsigned char b = get_leq_8_bits(mp, 4); /* values 0-15 */ + si->allocation[i][0] = b; + si->allocation[i][1] = b; + if (b == ba15) + illegal_value_detected = 1; + } + for (i = 0; i < SBLIMIT; i++) { + unsigned char n0 = si->allocation[i][0]; + unsigned char n1 = si->allocation[i][1]; + unsigned char b0 = n0 ? get_leq_8_bits(mp, 6) : 0; /* values 0-63 */ + unsigned char b1 = n1 ? get_leq_8_bits(mp, 6) : 0; /* values 0-63 */ + si->scalefactor[i][0] = b0; + si->scalefactor[i][1] = b1; + } + } + else { + for (i = 0; i < SBLIMIT; i++) { + unsigned char b0 = get_leq_8_bits(mp, 4); /* values 0-15 */ + si->allocation[i][0] = b0; + if (b0 == ba15) + illegal_value_detected = 1; + } + for (i = 0; i < SBLIMIT; i++) { + unsigned char n0 = si->allocation[i][0]; + unsigned char b0 = n0 ? get_leq_8_bits(mp, 6) : 0; /* values 0-63 */ + si->scalefactor[i][0] = b0; + } + } + return illegal_value_detected; +} + +static void +I_step_two(PMPSTR mp, sideinfo_layer_I *si, real fraction[2][SBLIMIT]) +{ + double r0, r1; + struct frame *fr = &(mp->fr); + int ds_limit = fr->down_sample_sblimit; + int i; + + assert(fr->stereo == 1 || fr->stereo == 2); + if (fr->stereo == 2) { + int jsbound = (fr->mode == MPG_MD_JOINT_STEREO) ? (fr->mode_ext << 2) + 4 : 32; + for (i = 0; i < jsbound; i++) { + unsigned char i0 = si->scalefactor[i][0]; + unsigned char i1 = si->scalefactor[i][1]; + unsigned char n0 = si->allocation[i][0]; + unsigned char n1 = si->allocation[i][1]; + assert( i0 < 64 ); + assert( i1 < 64 ); + assert( n0 < 16 ); + assert( n1 < 16 ); + if (n0 > 0) { + unsigned short v = get_leq_16_bits(mp, n0 + 1); /* 0-65535 */ + r0 = (((-1) << n0) + v + 1) * muls[n0 + 1][i0]; + } + else { + r0 = 0; + } + if (n1 > 0) { + unsigned short v = get_leq_16_bits(mp, n1 + 1); /* 0-65535 */ + r1 = (((-1) << n1) + v + 1) * muls[n1 + 1][i1]; + } + else { + r1 = 0; + } + fraction[0][i] = (real)r0; + fraction[1][i] = (real)r1; + } + for (i = jsbound; i < SBLIMIT; i++) { + unsigned char i0 = si->scalefactor[i][0]; + unsigned char i1 = si->scalefactor[i][1]; + unsigned char n = si->allocation[i][0]; + assert( i0 < 64 ); + assert( i1 < 64 ); + assert( n < 16 ); + if (n > 0) { + unsigned short v = get_leq_16_bits(mp, n + 1); /* 0-65535 */ + unsigned int w = (((-1) << n) + v + 1); + r0 = w * muls[n + 1][i0]; + r1 = w * muls[n + 1][i1]; + } + else { + r0 = r1 = 0; + } + fraction[0][i] = (real)r0; + fraction[1][i] = (real)r1; + } + for (i = ds_limit; i < SBLIMIT; i++) { + fraction[0][i] = 0.0; + fraction[1][i] = 0.0; + } + } + else { + for (i = 0; i < SBLIMIT; i++) { + unsigned char n = si->allocation[i][0]; + unsigned char j = si->scalefactor[i][0]; + assert( j < 64 ); + assert( n < 16 ); + if (n > 0) { + unsigned short v = get_leq_16_bits(mp, n + 1); + r0 = (((-1) << n) + v + 1) * muls[n + 1][j]; + } + else { + r0 = 0; + } + fraction[0][i] = (real)r0; + } + for (i = ds_limit; i < SBLIMIT; i++) { + fraction[0][i] = 0.0; + } + } +} + +int +decode_layer1_sideinfo(PMPSTR mp) +{ + (void) mp; + /* FIXME: extract side information and check values */ + return 0; +} + +int +decode_layer1_frame(PMPSTR mp, unsigned char *pcm_sample, int *pcm_point) +{ + real fraction[2][SBLIMIT]; /* FIXME: change real -> double ? */ + sideinfo_layer_I si; + struct frame *fr = &(mp->fr); + int single = fr->single; + int i, clip = 0; + + if (I_step_one(mp, &si)) { + lame_report_fnc(mp->report_err, "hip: Aborting layer 1 decode, illegal bit allocation value\n"); + return -1; + } + if (fr->stereo == 1 || single == 3) + single = 0; + + if (single >= 0) { + /* decoding one of possibly two channels */ + for (i = 0; i < SCALE_BLOCK; i++) { + I_step_two(mp, &si, fraction); + clip += synth_1to1_mono(mp, (real *) fraction[single], pcm_sample, pcm_point); + } + } + else { + for (i = 0; i < SCALE_BLOCK; i++) { + int p1 = *pcm_point; + I_step_two(mp, &si, fraction); + clip += synth_1to1(mp, (real *) fraction[0], 0, pcm_sample, &p1); + clip += synth_1to1(mp, (real *) fraction[1], 1, pcm_sample, pcm_point); + } + } + + return clip; +} diff --git a/mpglib/layer1.h b/mpglib/layer1.h new file mode 100644 index 0000000..308c437 --- /dev/null +++ b/mpglib/layer1.h @@ -0,0 +1,29 @@ +/* + * Copyright (C) 1999-2010 The L.A.M.E. project + * + * Initially written by Michael Hipp, see also AUTHORS and README. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef LAYER1_H_INCLUDED +#define LAYER1_H_INCLUDED + +void hip_init_tables_layer1(void); +int decode_layer1_sideinfo(PMPSTR mp); +int decode_layer1_frame(PMPSTR mp, unsigned char *pcm_sample, int *pcm_point); + +#endif diff --git a/mpglib/layer2.c b/mpglib/layer2.c new file mode 100644 index 0000000..d3f869d --- /dev/null +++ b/mpglib/layer2.c @@ -0,0 +1,403 @@ +/* + * layer2.c: Mpeg Layer-2 audio decoder + * + * Copyright (C) 1999-2010 The L.A.M.E. project + * + * Initially written by Michael Hipp, see also AUTHORS and README. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +/* $Id: layer2.c,v 1.34 2017/08/22 23:31:07 robert Exp $ */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include "common.h" +#include "layer2.h" +#include "l2tables.h" +#include "decode_i386.h" + +#ifdef WITH_DMALLOC +#include <dmalloc.h> +#endif +#include <assert.h> + +static int gd_are_hip_tables_layer2_initialized = 0; + +static unsigned char grp_3tab[32 * 3] = { 0, }; /* used: 27 */ +static unsigned char grp_5tab[128 * 3] = { 0, }; /* used: 125 */ +static unsigned char grp_9tab[1024 * 3] = { 0, }; /* used: 729 */ + + +void +hip_init_tables_layer2(void) +{ + static const double mulmul[27] = { + 0.0, -2.0 / 3.0, 2.0 / 3.0, + 2.0 / 7.0, 2.0 / 15.0, 2.0 / 31.0, 2.0 / 63.0, 2.0 / 127.0, 2.0 / 255.0, + 2.0 / 511.0, 2.0 / 1023.0, 2.0 / 2047.0, 2.0 / 4095.0, 2.0 / 8191.0, + 2.0 / 16383.0, 2.0 / 32767.0, 2.0 / 65535.0, + -4.0 / 5.0, -2.0 / 5.0, 2.0 / 5.0, 4.0 / 5.0, + -8.0 / 9.0, -4.0 / 9.0, -2.0 / 9.0, 2.0 / 9.0, 4.0 / 9.0, 8.0 / 9.0 + }; + static const unsigned char base[3][9] = { + {1, 0, 2,}, + {17, 18, 0, 19, 20,}, + {21, 1, 22, 23, 0, 24, 25, 2, 26} + }; + int i, j, k, l, len; + real *table; + static const int tablen[3] = { 3, 5, 9 }; + static unsigned char *itable, *tables[3] = { grp_3tab, grp_5tab, grp_9tab }; + + if (gd_are_hip_tables_layer2_initialized) { + return; + } + gd_are_hip_tables_layer2_initialized = 1; + + for (i = 0; i < 3; i++) { + itable = tables[i]; + len = tablen[i]; + for (j = 0; j < len; j++) + for (k = 0; k < len; k++) + for (l = 0; l < len; l++) { + *itable++ = base[i][l]; + *itable++ = base[i][k]; + *itable++ = base[i][j]; + } + } + + for (k = 0; k < 27; k++) { + double m = mulmul[k]; + table = muls[k]; + for (j = 3, i = 0; i < 63; i++, j--) + *table++ = (real) (m * pow(2.0, (double) j / 3.0)); + *table++ = 0.0; + } +} + + +static unsigned char* +grp_table_select(short d1, unsigned int idx) +{ + /* RH: it seems to be common, that idx is larger than the table's sizes. + is it OK to return a zero vector in this case? FIXME + /*/ + static unsigned char dummy_table[] = { 0,0,0 }; + unsigned int x; + switch (d1) { + case 3: + x = 3*3*3; + idx = idx < x ? idx : x; + return &grp_3tab[3 * idx]; + case 5: + x = 5*5*5; + idx = idx < x ? idx : x; + return &grp_5tab[3 * idx]; + case 9: + x = 9*9*9; + idx = idx < x ? idx : x; + return &grp_9tab[3 * idx]; + default: + /* fatal error */ + assert(0); + } + return &dummy_table[0]; +} + +typedef struct sideinfo_layer_II_struct +{ + unsigned char allocation[SBLIMIT][2]; + unsigned char scalefactor[SBLIMIT][2][3]; /* subband / channel / block */ +} sideinfo_layer_II; + + + +static void +II_step_one(PMPSTR mp, sideinfo_layer_II *si, struct frame *fr) +{ + int nch = fr->stereo; + int sblimit = fr->II_sblimit; + int jsbound = (fr->mode == MPG_MD_JOINT_STEREO) ? (fr->mode_ext << 2) + 4 : fr->II_sblimit; + struct al_table2 const *alloc1 = fr->alloc; + unsigned char scfsi[SBLIMIT][2]; + int i, ch; + + memset(si, 0, sizeof(*si)); + if (jsbound > sblimit) + jsbound = sblimit; + if (nch == 2) { + for (i = 0; i < jsbound; ++i) { + short step = alloc1->bits; + unsigned char b0 = get_leq_8_bits(mp, step); + unsigned char b1 = get_leq_8_bits(mp, step); + alloc1 += ((size_t)1 << step); + si->allocation[i][0] = b0; + si->allocation[i][1] = b1; + } + for (i = jsbound; i < sblimit; ++i) { + short step = alloc1->bits; + unsigned char b0 = get_leq_8_bits(mp, step); + alloc1 += ((size_t)1 << step); + si->allocation[i][0] = b0; + si->allocation[i][1] = b0; + } + for (i = 0; i < sblimit; ++i) { + unsigned char n0 = si->allocation[i][0]; + unsigned char n1 = si->allocation[i][1]; + unsigned char b0 = n0 ? get_leq_8_bits(mp, 2) : 0; + unsigned char b1 = n1 ? get_leq_8_bits(mp, 2) : 0; + scfsi[i][0] = b0; + scfsi[i][1] = b1; + } + } + else { /* mono */ + for (i = 0; i < sblimit; ++i) { + short step = alloc1->bits; + unsigned char b0 = get_leq_8_bits(mp, step); + alloc1 += ((size_t)1 << step); + si->allocation[i][0] = b0; + } + for (i = 0; i < sblimit; ++i) { + unsigned char n0 = si->allocation[i][0]; + unsigned char b0 = n0 ? get_leq_8_bits(mp, 2) : 0; + scfsi[i][0] = b0; + } + } + for (i = 0; i < sblimit; ++i) { + for (ch = 0; ch < nch; ++ch) { + unsigned char s0 = 0, s1 = 0, s2 = 0; + if (si->allocation[i][ch]) { + switch (scfsi[i][ch]) { + case 0: + s0 = get_leq_8_bits(mp, 6); + s1 = get_leq_8_bits(mp, 6); + s2 = get_leq_8_bits(mp, 6); + break; + case 1: + s0 = get_leq_8_bits(mp, 6); + s1 = s0; + s2 = get_leq_8_bits(mp, 6); + break; + case 2: + s0 = get_leq_8_bits(mp, 6); + s1 = s0; + s2 = s0; + break; + case 3: + s0 = get_leq_8_bits(mp, 6); + s1 = get_leq_8_bits(mp, 6); + s2 = s1; + break; + default: + assert(0); + } + } + si->scalefactor[i][ch][0] = s0; + si->scalefactor[i][ch][1] = s1; + si->scalefactor[i][ch][2] = s2; + } + } +} + +static void +II_step_two(PMPSTR mp, sideinfo_layer_II* si, struct frame *fr, int gr, real fraction[2][4][SBLIMIT]) +{ + struct al_table2 const *alloc1 = fr->alloc; + int sblimit = fr->II_sblimit; + int jsbound = (fr->mode == MPG_MD_JOINT_STEREO) ? (fr->mode_ext << 2) + 4 : fr->II_sblimit; + int i, ch, nch = fr->stereo; + double cm, r0, r1, r2; + + if (jsbound > sblimit) + jsbound = sblimit; + for (i = 0; i < jsbound; ++i) { + short step = alloc1->bits; + for (ch = 0; ch < nch; ++ch) { + unsigned char ba = si->allocation[i][ch]; + if (ba) { + unsigned char x1 = si->scalefactor[i][ch][gr]; + struct al_table2 const *alloc2 = alloc1 + ba; + short k = alloc2->bits; + short d1 = alloc2->d; + assert( k <= 16 ); + k = (k <= 16) ? k : 16; + assert( x1 < 64 ); + x1 = (x1 < 64) ? x1 : 63; + if (d1 < 0) { + int v0 = getbits(mp, k); + int v1 = getbits(mp, k); + int v2 = getbits(mp, k); + cm = muls[k][x1]; + r0 = (v0 + d1) * cm; + r1 = (v1 + d1) * cm; + r2 = (v2 + d1) * cm; + } + else { + unsigned int idx = getbits(mp, k); + unsigned char *tab = grp_table_select(d1, idx); + unsigned char k0 = tab[0]; + unsigned char k1 = tab[1]; + unsigned char k2 = tab[2]; + r0 = muls[k0][x1]; + r1 = muls[k1][x1]; + r2 = muls[k2][x1]; + } + fraction[ch][0][i] = (real) r0; + fraction[ch][1][i] = (real) r1; + fraction[ch][2][i] = (real) r2; + } + else { + fraction[ch][0][i] = fraction[ch][1][i] = fraction[ch][2][i] = 0.0; + } + } + alloc1 += ((size_t)1 << step); + } + + for (i = jsbound; i < sblimit; i++) { + short step = alloc1->bits; + unsigned char ba = si->allocation[i][0]; + if (ba) { + struct al_table2 const *alloc2 = alloc1 + ba; + short k = alloc2->bits; + short d1 = alloc2->d; + assert( k <= 16 ); + k = (k <= 16) ? k : 16; + if (d1 < 0) { + int v0 = getbits(mp, k); + int v1 = getbits(mp, k); + int v2 = getbits(mp, k); + for (ch = 0; ch < nch; ++ch) { + unsigned char x1 = si->scalefactor[i][ch][gr]; + assert( x1 < 64 ); + x1 = (x1 < 64) ? x1 : 63; + cm = muls[k][x1]; + r0 = (v0 + d1) * cm; + r1 = (v1 + d1) * cm; + r2 = (v2 + d1) * cm; + fraction[ch][0][i] = (real) r0; + fraction[ch][1][i] = (real) r1; + fraction[ch][2][i] = (real) r2; + } + } + else { + unsigned int idx = getbits(mp, k); + unsigned char *tab = grp_table_select(d1, idx); + unsigned char k0 = tab[0]; + unsigned char k1 = tab[1]; + unsigned char k2 = tab[2]; + for (ch = 0; ch < nch; ++ch) { + unsigned char x1 = si->scalefactor[i][ch][gr]; + assert( x1 < 64 ); + x1 = (x1 < 64) ? x1 : 63; + r0 = muls[k0][x1]; + r1 = muls[k1][x1]; + r2 = muls[k2][x1]; + fraction[ch][0][i] = (real) r0; + fraction[ch][1][i] = (real) r1; + fraction[ch][2][i] = (real) r2; + } + } + } + else { + fraction[0][0][i] = fraction[0][1][i] = fraction[0][2][i] = 0.0; + fraction[1][0][i] = fraction[1][1][i] = fraction[1][2][i] = 0.0; + } + alloc1 += ((size_t)1 << step); + } + if (sblimit > fr->down_sample_sblimit) { + sblimit = fr->down_sample_sblimit; + } + for (ch = 0; ch < nch; ++ch) { + for (i = sblimit; i < SBLIMIT; ++i) { + fraction[ch][0][i] = fraction[ch][1][i] = fraction[ch][2][i] = 0.0; + } + } +} + +static void +II_select_table(struct frame *fr) +{ + /* *INDENT-OFF* */ + static const int translate[3][2][16] = + { { { 0,2,2,2,2,2,2,0,0,0,1,1,1,1,1,0 } , + { 0,2,2,0,0,0,1,1,1,1,1,1,1,1,1,0 } } , + { { 0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0 } , + { 0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0 } } , + { { 0,3,3,3,3,3,3,0,0,0,1,1,1,1,1,0 } , + { 0,3,3,0,0,0,1,1,1,1,1,1,1,1,1,0 } } }; + /* *INDENT-ON* */ + + int table, sblim; + static const struct al_table2 *tables[5] = { alloc_0, alloc_1, alloc_2, alloc_3, alloc_4 }; + static const int sblims[5] = { 27, 30, 8, 12, 30 }; + + if (fr->lsf) + table = 4; + else + table = translate[fr->sampling_frequency][2 - fr->stereo][fr->bitrate_index]; + sblim = sblims[table]; + + fr->alloc = (struct al_table2 const *) tables[table]; + fr->II_sblimit = sblim; +} + + +int +decode_layer2_sideinfo(PMPSTR mp) +{ + (void) mp; + /* FIXME: extract side information and check values */ + return 0; +} + +int +decode_layer2_frame(PMPSTR mp, unsigned char *pcm_sample, int *pcm_point) +{ + real fraction[2][4][SBLIMIT]; /* pick_table clears unused subbands */ + sideinfo_layer_II si; + struct frame *fr = &(mp->fr); + int single = fr->single; + int i, j, clip = 0; + + II_select_table(fr); + II_step_one(mp, &si, fr); + + if (fr->stereo == 1 || single == 3) + single = 0; + + if (single >= 0) { + for (i = 0; i < SCALE_BLOCK; i++) { + II_step_two(mp, &si, fr, i >> 2, fraction); + for (j = 0; j < 3; j++) { + clip += synth_1to1_mono(mp, fraction[single][j], pcm_sample, pcm_point); + } + } + } + else { + for (i = 0; i < SCALE_BLOCK; i++) { + II_step_two(mp, &si, fr, i >> 2, fraction); + for (j = 0; j < 3; j++) { + int p1 = *pcm_point; + clip += synth_1to1(mp, fraction[0][j], 0, pcm_sample, &p1); + clip += synth_1to1(mp, fraction[1][j], 1, pcm_sample, pcm_point); + } + } + } + + return clip; +} diff --git a/mpglib/layer2.h b/mpglib/layer2.h new file mode 100644 index 0000000..fafc9a7 --- /dev/null +++ b/mpglib/layer2.h @@ -0,0 +1,39 @@ +/* + * Copyright (C) 1999-2010 The L.A.M.E. project + * + * Initially written by Michael Hipp, see also AUTHORS and README. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + + +#ifndef LAYER2_H_INCLUDED +#define LAYER2_H_INCLUDED + + +struct al_table2 { + short bits; + short d; +}; + + + +void hip_init_tables_layer2(void); +int decode_layer2_sideinfo(PMPSTR mp); +int decode_layer2_frame(PMPSTR mp, unsigned char *pcm_sample, int *pcm_point); + + +#endif diff --git a/mpglib/layer3.c b/mpglib/layer3.c new file mode 100644 index 0000000..af5b69e --- /dev/null +++ b/mpglib/layer3.c @@ -0,0 +1,1969 @@ +/* + * layer3.c: Mpeg Layer-3 audio decoder + * + * Copyright (C) 1999-2010 The L.A.M.E. project + * + * Initially written by Michael Hipp, see also AUTHORS and README. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +/* $Id: layer3.c,v 1.69 2017/08/20 20:06:57 robert Exp $ */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <stdlib.h> +#include "common.h" +#include "huffman.h" +#include "lame.h" +#include "machine.h" +#include "encoder.h" +#include "lame-analysis.h" +#include "decode_i386.h" +#include "layer3.h" + +#ifdef WITH_DMALLOC +#include <dmalloc.h> +#endif + + +static int gd_are_hip_tables_layer3_initialized = 0; + +static real ispow[8207]; +static real aa_ca[8], aa_cs[8]; +static real COS1[12][6]; +static real win[4][36]; +static real win1[4][36]; +static real gainpow2[256 + 118 + 4]; +static real COS9[9]; +static real COS6_1, COS6_2; +static real tfcos36[9]; +static real tfcos12[3]; + +struct bandInfoStruct { + short longIdx[23]; + short longDiff[22]; + short shortIdx[14]; + short shortDiff[13]; +}; + +static int longLimit[9][23]; +static int shortLimit[9][14]; + +/* *INDENT-OFF* */ + +static const struct bandInfoStruct bandInfo[9] = { + +/* MPEG 1.0 */ + { {0,4,8,12,16,20,24,30,36,44,52,62,74, 90,110,134,162,196,238,288,342,418,576}, + {4,4,4,4,4,4,6,6,8, 8,10,12,16,20,24,28,34,42,50,54, 76,158}, + {0,4*3,8*3,12*3,16*3,22*3,30*3,40*3,52*3,66*3, 84*3,106*3,136*3,192*3}, + {4,4,4,4,6,8,10,12,14,18,22,30,56} } , + + { {0,4,8,12,16,20,24,30,36,42,50,60,72, 88,106,128,156,190,230,276,330,384,576}, + {4,4,4,4,4,4,6,6,6, 8,10,12,16,18,22,28,34,40,46,54, 54,192}, + {0,4*3,8*3,12*3,16*3,22*3,28*3,38*3,50*3,64*3, 80*3,100*3,126*3,192*3}, + {4,4,4,4,6,6,10,12,14,16,20,26,66} } , + + { {0,4,8,12,16,20,24,30,36,44,54,66,82,102,126,156,194,240,296,364,448,550,576} , + {4,4,4,4,4,4,6,6,8,10,12,16,20,24,30,38,46,56,68,84,102, 26} , + {0,4*3,8*3,12*3,16*3,22*3,30*3,42*3,58*3,78*3,104*3,138*3,180*3,192*3} , + {4,4,4,4,6,8,12,16,20,26,34,42,12} } , + +/* MPEG 2.0 */ + { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576}, + {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54 } , + {0,4*3,8*3,12*3,18*3,24*3,32*3,42*3,56*3,74*3,100*3,132*3,174*3,192*3} , + {4,4,4,6,6,8,10,14,18,26,32,42,18 } } , + /* docs: 332. mpg123: 330 */ + { {0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,332,394,464,540,576}, + {6,6,6,6,6,6,8,10,12,14,16,18,22,26,32,38,46,54,62,70,76,36 } , + {0,4*3,8*3,12*3,18*3,26*3,36*3,48*3,62*3,80*3,104*3,136*3,180*3,192*3} , + {4,4,4,6,8,10,12,14,18,24,32,44,12 } } , + + { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576}, + {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54 }, + {0,4*3,8*3,12*3,18*3,26*3,36*3,48*3,62*3,80*3,104*3,134*3,174*3,192*3}, + {4,4,4,6,8,10,12,14,18,24,30,40,18 } } , +/* MPEG 2.5 */ + { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576} , + {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54}, + {0,12,24,36,54,78,108,144,186,240,312,402,522,576}, + {4,4,4,6,8,10,12,14,18,24,30,40,18} }, + { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576} , + {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54}, + {0,12,24,36,54,78,108,144,186,240,312,402,522,576}, + {4,4,4,6,8,10,12,14,18,24,30,40,18} }, + { {0,12,24,36,48,60,72,88,108,132,160,192,232,280,336,400,476,566,568,570,572,574,576}, + {12,12,12,12,12,12,16,20,24,28,32,40,48,56,64,76,90,2,2,2,2,2}, + {0, 24, 48, 72,108,156,216,288,372,480,486,492,498,576}, + {8,8,8,12,16,20,24,28,36,2,2,2,26} } , +}; +/* *INDENT-ON* */ + +static int mapbuf0[9][152]; +static int mapbuf1[9][156]; +static int mapbuf2[9][44]; +static int *map[9][3]; +static int *mapend[9][3]; + +static unsigned int n_slen2[512]; /* MPEG 2.0 slen for 'normal' mode */ +static unsigned int i_slen2[256]; /* MPEG 2.0 slen for intensity stereo */ + +static real tan1_1[16], tan2_1[16], tan1_2[16], tan2_2[16]; +static real pow1_1[2][16], pow2_1[2][16], pow1_2[2][16], pow2_2[2][16]; + +static unsigned int +get1bit(PMPSTR mp) +{ + unsigned char rval; + rval = *mp->wordpointer << mp->bitindex; + + mp->bitindex++; + mp->wordpointer += (mp->bitindex >> 3); + mp->bitindex &= 7; + + return rval >> 7; +} + +static real +get_gain(real const* gain_ptr, int idx, int* overflow) +{ + static const real* const gainpow2_end_ptr = gainpow2 + (sizeof(gainpow2)/sizeof(gainpow2[0])) -1; + real const * ptr = &gain_ptr[idx]; + if (&gain_ptr[idx] > gainpow2_end_ptr) { + ptr = gainpow2_end_ptr; + if (overflow) *overflow = 1; + } + return *ptr; +} + + +/* + * init tables for layer-3 + */ +void +hip_init_tables_layer3(void) +{ + int i, j, k; + + if (gd_are_hip_tables_layer3_initialized) { + return; + } + gd_are_hip_tables_layer3_initialized = 1; + + for (i = -256; i < 118 + 4; i++) + gainpow2[i + 256] = pow((double) 2.0, -0.25 * (double) (i + 210)); + + for (i = 0; i < 8207; i++) + ispow[i] = pow((double) i, (double) 4.0 / 3.0); + + for (i = 0; i < 8; i++) { + static const double Ci[8] = { -0.6, -0.535, -0.33, -0.185, -0.095, -0.041, -0.0142, -0.0037 }; + double sq = sqrt(1.0 + Ci[i] * Ci[i]); + aa_cs[i] = 1.0 / sq; + aa_ca[i] = Ci[i] / sq; + } + + for (i = 0; i < 18; i++) { + win[0][i] = win[1][i] = + 0.5 * sin(M_PI / 72.0 * (double) (2 * (i + 0) + 1)) / cos(M_PI * + (double) (2 * (i + 0) + + 19) / 72.0); + win[0][i + 18] = win[3][i + 18] = + 0.5 * sin(M_PI / 72.0 * (double) (2 * (i + 18) + 1)) / cos(M_PI * + (double) (2 * (i + 18) + + 19) / 72.0); + } + for (i = 0; i < 6; i++) { + win[1][i + 18] = 0.5 / cos(M_PI * (double) (2 * (i + 18) + 19) / 72.0); + win[3][i + 12] = 0.5 / cos(M_PI * (double) (2 * (i + 12) + 19) / 72.0); + win[1][i + 24] = + 0.5 * sin(M_PI / 24.0 * (double) (2 * i + 13)) / cos(M_PI * + (double) (2 * (i + 24) + + 19) / 72.0); + win[1][i + 30] = win[3][i] = 0.0; + win[3][i + 6] = + 0.5 * sin(M_PI / 24.0 * (double) (2 * i + 1)) / cos(M_PI * (double) (2 * (i + 6) + 19) / + 72.0); + } + + for (i = 0; i < 9; i++) + COS9[i] = cos(M_PI / 18.0 * (double) i); + + for (i = 0; i < 9; i++) + tfcos36[i] = 0.5 / cos(M_PI * (double) (i * 2 + 1) / 36.0); + for (i = 0; i < 3; i++) + tfcos12[i] = 0.5 / cos(M_PI * (double) (i * 2 + 1) / 12.0); + + COS6_1 = cos(M_PI / 6.0 * (double) 1); + COS6_2 = cos(M_PI / 6.0 * (double) 2); + + for (i = 0; i < 12; i++) { + win[2][i] = + 0.5 * sin(M_PI / 24.0 * (double) (2 * i + 1)) / cos(M_PI * (double) (2 * i + 7) / 24.0); + for (j = 0; j < 6; j++) + COS1[i][j] = cos(M_PI / 24.0 * (double) ((2 * i + 7) * (2 * j + 1))); + } + + for (j = 0; j < 4; j++) { + static int const len[4] = { 36, 36, 12, 36 }; + for (i = 0; i < len[j]; i += 2) + win1[j][i] = +win[j][i]; + for (i = 1; i < len[j]; i += 2) + win1[j][i] = -win[j][i]; + } + + for (i = 0; i < 16; i++) { + double t = tan((double) i * M_PI / 12.0); + tan1_1[i] = t / (1.0 + t); + tan2_1[i] = 1.0 / (1.0 + t); + tan1_2[i] = M_SQRT2 * t / (1.0 + t); + tan2_2[i] = M_SQRT2 / (1.0 + t); + + for (j = 0; j < 2; j++) { + double base = pow(2.0, -0.25 * (j + 1.0)); + double p1 = 1.0, p2 = 1.0; + if (i > 0) { + if (i & 1) + p1 = pow(base, (i + 1.0) * 0.5); + else + p2 = pow(base, i * 0.5); + } + pow1_1[j][i] = p1; + pow2_1[j][i] = p2; + pow1_2[j][i] = M_SQRT2 * p1; + pow2_2[j][i] = M_SQRT2 * p2; + } + } + + for (j = 0; j < 9; j++) { + struct bandInfoStruct const *bi = (struct bandInfoStruct const *) &bandInfo[j]; + int *mp; + int cb, lwin; + short const *bdf; + int switch_idx = (j < 3) ? 8 : 6; + + mp = map[j][0] = mapbuf0[j]; + bdf = bi->longDiff; + for (i = 0, cb = 0; cb < switch_idx; cb++, i += *bdf++) { + *mp++ = (*bdf) >> 1; + *mp++ = i; + *mp++ = 3; + *mp++ = cb; + } + bdf = bi->shortDiff + 3; + for (cb = 3; cb < 13; cb++) { + int l = (*bdf++) >> 1; + for (lwin = 0; lwin < 3; lwin++) { + *mp++ = l; + *mp++ = i + lwin; + *mp++ = lwin; + *mp++ = cb; + } + i += 6 * l; + } + mapend[j][0] = mp; + + mp = map[j][1] = mapbuf1[j]; + bdf = bi->shortDiff + 0; + for (i = 0, cb = 0; cb < 13; cb++) { + int l = (*bdf++) >> 1; + for (lwin = 0; lwin < 3; lwin++) { + *mp++ = l; + *mp++ = i + lwin; + *mp++ = lwin; + *mp++ = cb; + } + i += 6 * l; + } + mapend[j][1] = mp; + + mp = map[j][2] = mapbuf2[j]; + bdf = bi->longDiff; + for (cb = 0; cb < 22; cb++) { + *mp++ = (*bdf++) >> 1; + *mp++ = cb; + } + mapend[j][2] = mp; + + } + + for (j = 0; j < 9; j++) { + for (i = 0; i < 23; i++) { + longLimit[j][i] = (bandInfo[j].longIdx[i] - 1 + 8) / 18 + 1; + if (longLimit[j][i] > SBLIMIT) + longLimit[j][i] = SBLIMIT; + } + for (i = 0; i < 14; i++) { + shortLimit[j][i] = (bandInfo[j].shortIdx[i] - 1) / 18 + 1; + if (shortLimit[j][i] > SBLIMIT) + shortLimit[j][i] = SBLIMIT; + } + } + + for (i = 0; i < 5; i++) { + for (j = 0; j < 6; j++) { + for (k = 0; k < 6; k++) { + int n = k + j * 6 + i * 36; + i_slen2[n] = i | (j << 3) | (k << 6) | (3 << 12); + } + } + } + for (i = 0; i < 4; i++) { + for (j = 0; j < 4; j++) { + for (k = 0; k < 4; k++) { + int n = k + j * 4 + i * 16; + i_slen2[n + 180] = i | (j << 3) | (k << 6) | (4 << 12); + } + } + } + for (i = 0; i < 4; i++) { + for (j = 0; j < 3; j++) { + int n = j + i * 3; + i_slen2[n + 244] = i | (j << 3) | (5 << 12); + n_slen2[n + 500] = i | (j << 3) | (2 << 12) | (1 << 15); + } + } + + for (i = 0; i < 5; i++) { + for (j = 0; j < 5; j++) { + for (k = 0; k < 4; k++) { + int l; + for (l = 0; l < 4; l++) { + int n = l + k * 4 + j * 16 + i * 80; + n_slen2[n] = i | (j << 3) | (k << 6) | (l << 9) | (0 << 12); + } + } + } + } + for (i = 0; i < 5; i++) { + for (j = 0; j < 5; j++) { + for (k = 0; k < 4; k++) { + int n = k + j * 4 + i * 20; + n_slen2[n + 400] = i | (j << 3) | (k << 6) | (1 << 12); + } + } + } +} + +/* + * read additional side information + */ + +static void +III_get_side_info_1(PMPSTR mp, int stereo, + int ms_stereo, long sfreq, int single) +{ + int ch, gr; + int powdiff = (single == 3) ? 4 : 0; + + mp->sideinfo.main_data_begin = getbits(mp, 9); + if (stereo == 1) + mp->sideinfo.private_bits = getbits_fast(mp, 5); + else + mp->sideinfo.private_bits = getbits_fast(mp, 3); + + for (ch = 0; ch < stereo; ch++) { + mp->sideinfo.ch[ch].gr[0].scfsi = -1; + mp->sideinfo.ch[ch].gr[1].scfsi = getbits_fast(mp, 4); + } + + for (gr = 0; gr < 2; gr++) { + for (ch = 0; ch < stereo; ch++) { + struct gr_info_s *gr_infos = &(mp->sideinfo.ch[ch].gr[gr]); + + gr_infos->part2_3_length = getbits(mp, 12); + gr_infos->big_values = getbits_fast(mp, 9); + if (gr_infos->big_values > 288) { + lame_report_fnc(mp->report_err, "big_values too large! %i\n", gr_infos->big_values); + gr_infos->big_values = 288; + } + { + unsigned int qss = getbits_fast(mp, 8); + gr_infos->pow2gain = gainpow2 + 256 - qss + powdiff; + if (mp->pinfo != NULL) { + mp->pinfo->qss[gr][ch] = qss; + } + } + if (ms_stereo) + gr_infos->pow2gain += 2; + gr_infos->scalefac_compress = getbits_fast(mp, 4); +/* window-switching flag == 1 for block_Type != 0 .. and block-type == 0 -> win-sw-flag = 0 */ + if (get1bit(mp)) { + int i; + gr_infos->block_type = getbits_fast(mp, 2); + gr_infos->mixed_block_flag = get1bit(mp); + gr_infos->table_select[0] = getbits_fast(mp, 5); + gr_infos->table_select[1] = getbits_fast(mp, 5); + + + /* + * table_select[2] not needed, because there is no region2, + * but to satisfy some verifications tools we set it either. + */ + gr_infos->table_select[2] = 0; + for (i = 0; i < 3; i++) { + unsigned int sbg = (getbits_fast(mp, 3) << 3); + gr_infos->full_gain[i] = gr_infos->pow2gain + sbg; + if (mp->pinfo != NULL) + mp->pinfo->sub_gain[gr][ch][i] = sbg / 8; + } + + if (gr_infos->block_type == 0) { + lame_report_fnc(mp->report_err, "Blocktype == 0 and window-switching == 1 not allowed.\n"); + /* error seems to be very good recoverable, so don't exit */ + /* exit(1); */ + } + /* region_count/start parameters are implicit in this case. */ + gr_infos->region1start = 36 >> 1; + gr_infos->region2start = 576 >> 1; + } + else { + unsigned int i, r0c, r1c, region0index, region1index; + for (i = 0; i < 3; i++) + gr_infos->table_select[i] = getbits_fast(mp, 5); + r0c = getbits_fast(mp, 4); + r1c = getbits_fast(mp, 3); + region0index = r0c+1; + if (region0index > 22) { + lame_report_fnc(mp->report_err, "region0index=%d > 22\n", region0index); + region0index = 22; + } + region1index = r0c+1 + r1c+1; + if (region1index > 22) { + lame_report_fnc(mp->report_err, "region1index=%d > 22\n", region1index); + region1index = 22; + } + gr_infos->region1start = bandInfo[sfreq].longIdx[region0index] >> 1; + gr_infos->region2start = bandInfo[sfreq].longIdx[region1index] >> 1; + gr_infos->block_type = 0; + gr_infos->mixed_block_flag = 0; + } + gr_infos->preflag = get1bit(mp); + gr_infos->scalefac_scale = get1bit(mp); + gr_infos->count1table_select = get1bit(mp); + } + } +} + +/* + * Side Info for MPEG 2.0 / LSF + */ +static void +III_get_side_info_2(PMPSTR mp, int stereo, int ms_stereo, long sfreq, int single) +{ + int ch; + int powdiff = (single == 3) ? 4 : 0; + + mp->sideinfo.main_data_begin = getbits(mp, 8); + + if (stereo == 1) + mp->sideinfo.private_bits = get1bit(mp); + else + mp->sideinfo.private_bits = getbits_fast(mp, 2); + + for (ch = 0; ch < stereo; ch++) { + struct gr_info_s *gr_infos = &(mp->sideinfo.ch[ch].gr[0]); + unsigned int qss; + + gr_infos->part2_3_length = getbits(mp, 12); + gr_infos->big_values = getbits_fast(mp, 9); + if (gr_infos->big_values > 288) { + lame_report_fnc(mp->report_err, "big_values too large! %i\n", gr_infos->big_values); + gr_infos->big_values = 288; + } + qss = getbits_fast(mp, 8); + gr_infos->pow2gain = gainpow2 + 256 - qss + powdiff; + if (mp->pinfo != NULL) { + mp->pinfo->qss[0][ch] = qss; + } + + + if (ms_stereo) + gr_infos->pow2gain += 2; + gr_infos->scalefac_compress = getbits(mp, 9); +/* window-switching flag == 1 for block_Type != 0 .. and block-type == 0 -> win-sw-flag = 0 */ + if (get1bit(mp)) { + int i; + gr_infos->block_type = getbits_fast(mp, 2); + gr_infos->mixed_block_flag = get1bit(mp); + gr_infos->table_select[0] = getbits_fast(mp, 5); + gr_infos->table_select[1] = getbits_fast(mp, 5); + /* + * table_select[2] not needed, because there is no region2, + * but to satisfy some verifications tools we set it either. + */ + gr_infos->table_select[2] = 0; + for (i = 0; i < 3; i++) { + unsigned int sbg = (getbits_fast(mp, 3) << 3); + gr_infos->full_gain[i] = gr_infos->pow2gain + sbg; + if (mp->pinfo != NULL) + mp->pinfo->sub_gain[0][ch][i] = sbg / 8; + + } + + if (gr_infos->block_type == 0) { + lame_report_fnc(mp->report_err, "Blocktype == 0 and window-switching == 1 not allowed.\n"); + /* error seems to be very good recoverable, so don't exit */ + /* exit(1); */ + } + /* region_count/start parameters are implicit in this case. */ + if (gr_infos->block_type == 2) { + if (gr_infos->mixed_block_flag == 0) + gr_infos->region1start = 36 >> 1; + else + gr_infos->region1start = 48 >> 1; + } + else + gr_infos->region1start = 54 >> 1; + if (sfreq == 8) + gr_infos->region1start *= 2; + gr_infos->region2start = 576 >> 1; + } + else { + unsigned int i, r0c, r1c, region0index, region1index; + for (i = 0; i < 3; i++) + gr_infos->table_select[i] = getbits_fast(mp, 5); + r0c = getbits_fast(mp, 4); + r1c = getbits_fast(mp, 3); + region0index = r0c+1; + if (region0index > 22) { + lame_report_fnc(mp->report_err, "region0index=%d > 22\n", region0index); + region0index = 22; + } + region1index = r0c+1 + r1c+1; + if (region1index > 22) { + lame_report_fnc(mp->report_err, "region1index=%d > 22\n", region1index); + region1index = 22; + } + gr_infos->region1start = bandInfo[sfreq].longIdx[region0index] >> 1; + gr_infos->region2start = bandInfo[sfreq].longIdx[region1index] >> 1; + gr_infos->block_type = 0; + gr_infos->mixed_block_flag = 0; + } + gr_infos->scalefac_scale = get1bit(mp); + gr_infos->count1table_select = get1bit(mp); + } +} + +/* + * read scalefactors + */ + +static int +III_get_scale_factors_1(PMPSTR mp, int *scf, struct gr_info_s *gr_infos) +{ + static const unsigned char slen[2][16] = { + {0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4}, + {0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3} + }; + int numbits; + int num0 = slen[0][gr_infos->scalefac_compress]; + int num1 = slen[1][gr_infos->scalefac_compress]; + + if (gr_infos->block_type == 2) { + int i = 18; + numbits = (num0 + num1) * 18; + + if (gr_infos->mixed_block_flag) { + for (i = 8; i; i--) + *scf++ = getbits_fast(mp, num0); + i = 9; + numbits -= num0; /* num0 * 17 + num1 * 18 */ + } + + for (; i; i--) + *scf++ = getbits_fast(mp, num0); + for (i = 18; i; i--) + *scf++ = getbits_fast(mp, num1); + *scf++ = 0; + *scf++ = 0; + *scf++ = 0; /* short[13][0..2] = 0 */ + } + else { + int i; + int scfsi = gr_infos->scfsi; + + if (scfsi < 0) { /* scfsi < 0 => granule == 0 */ + for (i = 11; i; i--) + *scf++ = getbits_fast(mp, num0); + for (i = 10; i; i--) + *scf++ = getbits_fast(mp, num1); + numbits = (num0 + num1) * 10 + num0; + } + else { + numbits = 0; + if (!(scfsi & 0x8)) { + for (i = 6; i; i--) + *scf++ = getbits_fast(mp, num0); + numbits += num0 * 6; + } + else { + scf += 6; + } + + if (!(scfsi & 0x4)) { + for (i = 5; i; i--) + *scf++ = getbits_fast(mp, num0); + numbits += num0 * 5; + } + else { + scf += 5; + } + + if (!(scfsi & 0x2)) { + for (i = 5; i; i--) + *scf++ = getbits_fast(mp, num1); + numbits += num1 * 5; + } + else { + scf += 5; + } + + if (!(scfsi & 0x1)) { + for (i = 5; i; i--) + *scf++ = getbits_fast(mp, num1); + numbits += num1 * 5; + } + else { + scf += 5; + } + } + + *scf++ = 0; /* no l[21] in original sources */ + } + return numbits; +} + + +static int +III_get_scale_factors_2(PMPSTR mp, int *scf, struct gr_info_s *gr_infos, int i_stereo) +{ + unsigned char const *pnt; + int i, j; + unsigned int slen; + int n = 0; + int numbits = 0; + + /* *INDENT-OFF* */ + static const unsigned char stab[3][6][4] = { + { { 6, 5, 5,5 } , { 6, 5, 7,3 } , { 11,10,0,0} , + { 7, 7, 7,0 } , { 6, 6, 6,3 } , { 8, 8,5,0} } , + { { 9, 9, 9,9 } , { 9, 9,12,6 } , { 18,18,0,0} , + {12,12,12,0 } , {12, 9, 9,6 } , { 15,12,9,0} } , + { { 6, 9, 9,9 } , { 6, 9,12,6 } , { 15,18,0,0} , + { 6,15,12,0 } , { 6,12, 9,6 } , { 6,18,9,0} } }; + /* *INDENT-ON* */ + + if (i_stereo) /* i_stereo AND second channel -> do_layer3() checks this */ + slen = i_slen2[gr_infos->scalefac_compress >> 1]; + else + slen = n_slen2[gr_infos->scalefac_compress]; + + gr_infos->preflag = (slen >> 15) & 0x1; + + n = 0; + if (gr_infos->block_type == 2) { + n++; + if (gr_infos->mixed_block_flag) + n++; + } + + pnt = (unsigned char const *) stab[n][(slen >> 12) & 0x7]; + + for (i = 0; i < 4; i++) { + int num = slen & 0x7; + slen >>= 3; + if (num) { + for (j = 0; j < (int) (pnt[i]); j++) + *scf++ = getbits_fast(mp, num); + numbits += pnt[i] * num; + } + else { + for (j = 0; j < (int) (pnt[i]); j++) + *scf++ = 0; + } + } + + n = (n << 1) + 1; + for (i = 0; i < n; i++) + *scf++ = 0; + + return numbits; +} + +/* *INDENT-OFF* */ +static const int pretab1 [22] = {0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,3,3,3,2,0}; /* char enough ? */ +static const int pretab2 [22] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; +/* *INDENT-ON* */ + +/* + * don't forget to apply the same changes to III_dequantize_sample_ms() !!! + */ +static int +III_dequantize_sample(PMPSTR mp, real xr[SBLIMIT][SSLIMIT], int *scf, + struct gr_info_s *gr_infos, int sfreq, int part2bits) +{ + int shift = 1 + gr_infos->scalefac_scale; + real *xrpnt = (real *) xr, xr_value=0; + int l[3], l3; + int part2remain = gr_infos->part2_3_length - part2bits; + int *me; + real const * const xr_endptr = &xr[SBLIMIT-1][SSLIMIT-1]; + + int isbug = 0; + int bobug = 0; + int bobug_sb = 0, bobug_l3=0; +#define BUFFER_OVERFLOW_BUG() if(!bobug){bobug=1;bobug_sb=cb;bobug_l3=l3;}else + + /* lame_report_fnc(mp->report_dbg,"part2remain = %d, gr_infos->part2_3_length = %d, part2bits = %d\n", + part2remain, gr_infos->part2_3_length, part2bits); */ + + { + int i; + + for (i = (&xr[SBLIMIT][0] - xrpnt) >> 1; i > 0; i--) { + *xrpnt++ = 0.0; + *xrpnt++ = 0.0; + } + + xrpnt = (real *) xr; + } + + { + int bv = gr_infos->big_values; + int region1 = gr_infos->region1start; + int region2 = gr_infos->region2start; + + l3 = ((576 >> 1) - bv) >> 1; +/* + * we may lose the 'odd' bit here !! + * check this later again + */ + if (bv <= region1) { + l[0] = bv; + l[1] = 0; + l[2] = 0; + } + else { + l[0] = region1; + if (bv <= region2) { + l[1] = bv - l[0]; + l[2] = 0; + } + else { + l[1] = region2 - l[0]; + l[2] = bv - region2; + } + } + } + /* MDH crash fix */ + { + int i; + for (i = 0; i < 3; i++) { + if (l[i] < 0) { + lame_report_fnc(mp->report_err, "hip: Bogus region length (%d)\n", l[i]); + l[i] = 0; + } + } + } + /* end MDH crash fix */ + + if (gr_infos->block_type == 2) { + /* + * decoding with short or mixed mode BandIndex table + */ + int i, max[4]; + int step = 0, lwin = 0, cb = 0; + real v = 0.0; + int *m, mc; + + if (gr_infos->mixed_block_flag) { + max[3] = -1; + max[0] = max[1] = max[2] = 2; + m = map[sfreq][0]; + me = mapend[sfreq][0]; + } + else { + max[0] = max[1] = max[2] = max[3] = -1; + /* max[3] not really needed in this case */ + m = map[sfreq][1]; + me = mapend[sfreq][1]; + } + + mc = 0; + for (i = 0; i < 2; i++) { + int lp = l[i]; + struct newhuff const *h = (struct newhuff const *) (ht + gr_infos->table_select[i]); + for (; lp; lp--, mc--) { + int x, y; + if ((!mc)) { + mc = *m++; + xrpnt = ((real *) xr) + (*m++); + lwin = *m++; + cb = *m++; + if (lwin == 3) { + v = get_gain(gr_infos->pow2gain, (*scf++) << shift, &isbug); + step = 1; + } + else { + v = get_gain(gr_infos->full_gain[lwin], (*scf++) << shift, &isbug); + step = 3; + } + } + { + short const *val = (short const *) h->table; + while ((y = *val++) < 0) { + if (get1bit(mp)) + val -= y; + part2remain--; + } + x = y >> 4; + y &= 0xf; + } + if (x == 15) { + max[lwin] = cb; + part2remain -= h->linbits + 1; + x += getbits(mp, (int) h->linbits); + if (get1bit(mp)) + xr_value = -ispow[x] * v; + else + xr_value = ispow[x] * v; + } + else if (x) { + max[lwin] = cb; + if (get1bit(mp)) + xr_value = -ispow[x] * v; + else + xr_value = ispow[x] * v; + part2remain--; + } + else + xr_value = 0.0; + + if (xrpnt <= xr_endptr) + *xrpnt = xr_value; + else + BUFFER_OVERFLOW_BUG(); + xrpnt += step; + if (y == 15) { + max[lwin] = cb; + part2remain -= h->linbits + 1; + y += getbits(mp, (int) h->linbits); + if (get1bit(mp)) + xr_value = -ispow[y] * v; + else + xr_value = ispow[y] * v; + } + else if (y) { + max[lwin] = cb; + if (get1bit(mp)) + xr_value = -ispow[y] * v; + else + xr_value = ispow[y] * v; + part2remain--; + } + else + xr_value = 0.0; + + if (xrpnt <= xr_endptr) + *xrpnt = xr_value; + else + BUFFER_OVERFLOW_BUG(); + xrpnt += step; + } + } + for (; (l3 > 0) && (part2remain > 0); l3--) { + struct newhuff const *h = (struct newhuff const *) (htc + gr_infos->count1table_select); + short const *val = (short const *) h->table; + short a; + + while ((a = *val++) < 0) { + part2remain--; + if (part2remain < 0) { + part2remain++; + a = 0; + break; + } + if (get1bit(mp)) + val -= a; + } + for (i = 0; i < 4; i++) { + if (!(i & 1)) { + if (!mc) { + mc = *m++; + xrpnt = ((real *) xr) + (*m++); + lwin = *m++; + cb = *m++; + if (lwin == 3) { + v = get_gain(gr_infos->pow2gain, (*scf++) << shift, &isbug); + step = 1; + } + else { + v = get_gain(gr_infos->full_gain[lwin], (*scf++) << shift, &isbug); + step = 3; + } + } + mc--; + } + if ((a & (0x8 >> i))) { + max[lwin] = cb; + part2remain--; + if (part2remain < 0) { + part2remain++; + break; + } + if (get1bit(mp)) + xr_value = -v; + else + xr_value = v; + } + else + xr_value = 0.0; + + if (xrpnt <= xr_endptr) + *xrpnt = xr_value; + else + BUFFER_OVERFLOW_BUG(); + xrpnt += step; + } + } + while (m < me) { + if (!mc) { + mc = *m++; + xrpnt = ((real *) xr) + *m++; + if ((*m++) == 3) + step = 1; + else + step = 3; + m++; /* cb */ + } + mc--; + if (xrpnt <= xr_endptr) + *xrpnt = 0.0; + else + BUFFER_OVERFLOW_BUG(); + xrpnt += step; + if (xrpnt <= xr_endptr) + *xrpnt = 0.0; + else + BUFFER_OVERFLOW_BUG(); + xrpnt += step; +/* we could add a little opt. here: + * if we finished a band for window 3 or a long band + * further bands could copied in a simple loop without a + * special 'map' decoding + */ + } + + gr_infos->maxband[0] = max[0] + 1; + gr_infos->maxband[1] = max[1] + 1; + gr_infos->maxband[2] = max[2] + 1; + gr_infos->maxbandl = max[3] + 1; + + { + int rmax = max[0] > max[1] ? max[0] : max[1]; + rmax = (rmax > max[2] ? rmax : max[2]) + 1; + gr_infos->maxb = rmax ? shortLimit[sfreq][rmax] : longLimit[sfreq][max[3] + 1]; + } + + } + else { + /* + * decoding with 'long' BandIndex table (block_type != 2) + */ + int const *pretab = (int const *) (gr_infos->preflag ? pretab1 : pretab2); + int i, max = -1; + int cb = 0; + int *m = map[sfreq][2]; + real v = 0.0; + int mc = 0; + + /* + * long hash table values + */ + for (i = 0; i < 3; i++) { + int lp = l[i]; + struct newhuff const *h = (struct newhuff const *) (ht + gr_infos->table_select[i]); + + for (; lp; lp--, mc--) { + int x, y; + + if (!mc) { + mc = *m++; + v = get_gain(gr_infos->pow2gain, ((*scf++) + (*pretab++)) << shift, &isbug); + cb = *m++; + } + { + short const *val = (short const *) h->table; + while ((y = *val++) < 0) { + if (get1bit(mp)) + val -= y; + part2remain--; + } + x = y >> 4; + y &= 0xf; + } + if (x == 15) { + max = cb; + part2remain -= h->linbits + 1; + x += getbits(mp, (int) h->linbits); + if (get1bit(mp)) + xr_value = -ispow[x] * v; + else + xr_value = ispow[x] * v; + } + else if (x) { + max = cb; + if (get1bit(mp)) + xr_value = -ispow[x] * v; + else + xr_value = ispow[x] * v; + part2remain--; + } + else + xr_value = 0.0; + + if (xrpnt <= xr_endptr) + *xrpnt++ = xr_value; + else + BUFFER_OVERFLOW_BUG(); + + if (y == 15) { + max = cb; + part2remain -= h->linbits + 1; + y += getbits(mp, (int) h->linbits); + if (get1bit(mp)) + xr_value = -ispow[y] * v; + else + xr_value = ispow[y] * v; + } + else if (y) { + max = cb; + if (get1bit(mp)) + xr_value = -ispow[y] * v; + else + xr_value = ispow[y] * v; + part2remain--; + } + else + xr_value = 0.0; + + if (xrpnt <= xr_endptr) + *xrpnt++ = xr_value; + else + BUFFER_OVERFLOW_BUG(); + } + } + + /* + * short (count1table) values + */ + for (; l3 && (part2remain > 0); l3--) { + struct newhuff const *h = (struct newhuff const *) (htc + gr_infos->count1table_select); + short const *val = (short const *) h->table; + short a; + + while ((a = *val++) < 0) { + part2remain--; + if (part2remain < 0) { + part2remain++; + a = 0; + break; + } + if (get1bit(mp)) + val -= a; + } + for (i = 0; i < 4; i++) { + if (!(i & 1)) { + if (!mc) { + mc = *m++; + cb = *m++; + v = get_gain(gr_infos->pow2gain, ((*scf++) + (*pretab++)) << shift, &isbug); + } + mc--; + } + if ((a & (0x8 >> i))) { + max = cb; + part2remain--; + if (part2remain < 0) { + part2remain++; + break; + } + if (get1bit(mp)) + xr_value = -v; + else + xr_value = v; + } + else + xr_value = 0.0; + + if (xrpnt <= xr_endptr) + *xrpnt++ = xr_value; + else + BUFFER_OVERFLOW_BUG(); + } + } + + /* + * zero part + */ + while (xrpnt <= xr_endptr) + *xrpnt++ = 0.0; + + gr_infos->maxbandl = max + 1; + gr_infos->maxb = longLimit[sfreq][gr_infos->maxbandl]; + } +#undef BUFFER_OVERFLOW_BUG + if (bobug) { + /* well, there was a bug report, where this happened! + The problem was, that mixed blocks summed up to over 576, + because of a wrong long/short switching index. + It's likely, that the buffer overflow is fixed now, after correcting mixed block map. + */ + lame_report_fnc + (mp->report_err + ,"hip: OOPS, part2remain=%d l3=%d cb=%d bv=%d region1=%d region2=%d b-type=%d mixed=%d\n" + ,part2remain + ,bobug_l3 + ,bobug_sb + ,gr_infos->big_values + ,gr_infos->region1start + ,gr_infos->region2start + ,gr_infos->block_type + ,gr_infos->mixed_block_flag + ); + } + if (isbug) { + /* there is a bug report, where there is trouble with IS coded short block gain. + Is intensity stereo coding implementation correct? Likely not. + */ + int i_stereo = 0; + if (mp->fr.mode == MPG_MD_JOINT_STEREO) { + i_stereo = mp->fr.mode_ext & 0x1; + } + lame_report_fnc + (mp->report_err + ,"hip: OOPS, 'gainpow2' buffer overflow lsf=%d i-stereo=%d b-type=%d mixed=%d\n" + ,mp->fr.lsf + ,i_stereo + ,gr_infos->block_type + ,gr_infos->mixed_block_flag + ); + } + + while (part2remain > 16) { + getbits(mp, 16); /* Dismiss stuffing Bits */ + part2remain -= 16; + } + if (part2remain > 0) + getbits(mp, part2remain); + else if (part2remain < 0) { + lame_report_fnc(mp->report_err, "hip: Can't rewind stream by %d bits!\n", -part2remain); + return 1; /* -> error */ + } + return 0; +} + +/* intensity position, transmitted via a scalefactor value, allowed range is 0 - 15 */ +static +int scalefac_to_is_pos(int sf) +{ + if (0 <= sf && sf <= 15) + return sf; + return (sf < 0 ? 0 : 15); +} + +/* + * III_stereo: calculate real channel values for Joint-I-Stereo-mode + */ +static void +III_i_stereo(real xr_buf[2][SBLIMIT][SSLIMIT], int *scalefac, + struct gr_info_s *gr_infos, int sfreq, int ms_stereo, int lsf) +{ + real(*xr)[SBLIMIT * SSLIMIT] = (real(*)[SBLIMIT * SSLIMIT]) xr_buf; + struct bandInfoStruct const *bi = (struct bandInfoStruct const *) &bandInfo[sfreq]; + real *tabl1, *tabl2; + + if (lsf) { + int p = gr_infos->scalefac_compress & 0x1; + if (ms_stereo) { + tabl1 = pow1_2[p]; + tabl2 = pow2_2[p]; + } + else { + tabl1 = pow1_1[p]; + tabl2 = pow2_1[p]; + } + } + else { + if (ms_stereo) { + tabl1 = tan1_2; + tabl2 = tan2_2; + } + else { + tabl1 = tan1_1; + tabl2 = tan2_1; + } + } + + if (gr_infos->block_type == 2) { + int lwin, do_l = 0; + if (gr_infos->mixed_block_flag) + do_l = 1; + + for (lwin = 0; lwin < 3; lwin++) { /* process each window */ + /* get first band with zero values */ + int is_p, sb, idx, sfb = gr_infos->maxband[lwin]; /* sfb is minimal 3 for mixed mode */ + if (sfb > 3) + do_l = 0; + + for (; sfb < 12; sfb++) { + is_p = scalefac[sfb * 3 + lwin - gr_infos->mixed_block_flag]; /* scale: 0-15 */ + is_p = scalefac_to_is_pos(is_p); + if (is_p != 7) { + real t1, t2; + sb = bi->shortDiff[sfb]; + idx = bi->shortIdx[sfb] + lwin; + t1 = tabl1[is_p]; + t2 = tabl2[is_p]; + for (; sb > 0; sb--, idx += 3) { + real v = xr[0][idx]; + xr[0][idx] = v * t1; + xr[1][idx] = v * t2; + } + } + } + +#if 1 +/* in the original: copy 10 to 11 , here: copy 11 to 12 +maybe still wrong??? (copy 12 to 13?) */ + is_p = scalefac[11 * 3 + lwin - gr_infos->mixed_block_flag]; /* scale: 0-15 */ + sb = bi->shortDiff[12]; + idx = bi->shortIdx[12] + lwin; +#else + is_p = scalefac[10 * 3 + lwin - gr_infos->mixed_block_flag]; /* scale: 0-15 */ + sb = bi->shortDiff[11]; + idx = bi->shortIdx[11] + lwin; +#endif + is_p = scalefac_to_is_pos(is_p); + if (is_p != 7) { + real t1, t2; + t1 = tabl1[is_p]; + t2 = tabl2[is_p]; + for (; sb > 0; sb--, idx += 3) { + real v = xr[0][idx]; + xr[0][idx] = v * t1; + xr[1][idx] = v * t2; + } + } + } /* end for(lwin; .. ; . ) */ + + if (do_l) { +/* also check l-part, if ALL bands in the three windows are 'empty' + * and mode = mixed_mode + */ + int sfb = gr_infos->maxbandl; + int idx = bi->longIdx[sfb]; + + for (; sfb < 8; sfb++) { + int sb = bi->longDiff[sfb]; + int is_p = scalefac[sfb]; /* scale: 0-15 */ + is_p = scalefac_to_is_pos(is_p); + if (is_p != 7) { + real t1, t2; + t1 = tabl1[is_p]; + t2 = tabl2[is_p]; + for (; sb > 0; sb--, idx++) { + real v = xr[0][idx]; + xr[0][idx] = v * t1; + xr[1][idx] = v * t2; + } + } + else + idx += sb; + } + } + } + else { /* ((gr_infos->block_type != 2)) */ + + int sfb = gr_infos->maxbandl; + int is_p, idx = bi->longIdx[sfb]; + for (; sfb < 21; sfb++) { + int sb = bi->longDiff[sfb]; + is_p = scalefac[sfb]; /* scale: 0-15 */ + is_p = scalefac_to_is_pos(is_p); + if (is_p != 7) { + real t1, t2; + t1 = tabl1[is_p]; + t2 = tabl2[is_p]; + for (; sb > 0; sb--, idx++) { + real v = xr[0][idx]; + xr[0][idx] = v * t1; + xr[1][idx] = v * t2; + } + } + else + idx += sb; + } + + is_p = scalefac[20]; /* copy l-band 20 to l-band 21 */ + is_p = scalefac_to_is_pos(is_p); + idx = bi->longIdx[21]; + if (is_p != 7) { + int sb; + real t1 = tabl1[is_p], t2 = tabl2[is_p]; + + for (sb = bi->longDiff[21]; sb > 0; sb--, idx++) { + real v = xr[0][idx]; + xr[0][idx] = v * t1; + xr[1][idx] = v * t2; + } + } + } /* ... */ +} + +static void +III_antialias(real xr[SBLIMIT][SSLIMIT], struct gr_info_s *gr_infos) +{ + int sblim; + + if (gr_infos->block_type == 2) { + if (!gr_infos->mixed_block_flag) + return; + sblim = 1; + } + else { + sblim = gr_infos->maxb - 1; + } + + /* 31 alias-reduction operations between each pair of sub-bands */ + /* with 8 butterflies between each pair */ + + { + int sb; + real *xr1 = (real *) xr[1]; + + for (sb = sblim; sb; sb--, xr1 += 10) { + int ss; + real *cs = aa_cs, *ca = aa_ca; + real *xr2 = xr1; + + for (ss = 7; ss >= 0; ss--) { /* upper and lower butterfly inputs */ + real bu = *--xr2, bd = *xr1; + *xr2 = (bu * (*cs)) - (bd * (*ca)); + *xr1++ = (bd * (*cs++)) + (bu * (*ca++)); + } + } + } +} + + +/* *INDENT-OFF* */ + +/* + DCT insipired by Jeff Tsay's DCT from the maplay package + this is an optimized version with manual unroll. + + References: + [1] S. Winograd: "On Computing the Discrete Fourier Transform", + Mathematics of Computation, Volume 32, Number 141, January 1978, + Pages 175-199 +*/ + +static void dct36(real *inbuf,real *o1,real *o2,real *wintab,real *tsbuf) +{ + { + real *in = inbuf; + + in[17]+=in[16]; in[16]+=in[15]; in[15]+=in[14]; + in[14]+=in[13]; in[13]+=in[12]; in[12]+=in[11]; + in[11]+=in[10]; in[10]+=in[9]; in[9] +=in[8]; + in[8] +=in[7]; in[7] +=in[6]; in[6] +=in[5]; + in[5] +=in[4]; in[4] +=in[3]; in[3] +=in[2]; + in[2] +=in[1]; in[1] +=in[0]; + + in[17]+=in[15]; in[15]+=in[13]; in[13]+=in[11]; in[11]+=in[9]; + in[9] +=in[7]; in[7] +=in[5]; in[5] +=in[3]; in[3] +=in[1]; + + { + +#define MACRO0(v) { \ + real tmp; \ + out2[9+(v)] = (tmp = sum0 + sum1) * w[27+(v)]; \ + out2[8-(v)] = tmp * w[26-(v)]; } \ + sum0 -= sum1; \ + ts[SBLIMIT*(8-(v))] = out1[8-(v)] + sum0 * w[8-(v)]; \ + ts[SBLIMIT*(9+(v))] = out1[9+(v)] + sum0 * w[9+(v)]; +#define MACRO1(v) { \ + real sum0,sum1; \ + sum0 = tmp1a + tmp2a; \ + sum1 = (tmp1b + tmp2b) * tfcos36[(v)]; \ + MACRO0(v); } +#define MACRO2(v) { \ + real sum0,sum1; \ + sum0 = tmp2a - tmp1a; \ + sum1 = (tmp2b - tmp1b) * tfcos36[(v)]; \ + MACRO0(v); } + + const real *c = COS9; + real *out2 = o2; + real *w = wintab; + real *out1 = o1; + real *ts = tsbuf; + + real ta33,ta66,tb33,tb66; + + ta33 = in[2*3+0] * c[3]; + ta66 = in[2*6+0] * c[6]; + tb33 = in[2*3+1] * c[3]; + tb66 = in[2*6+1] * c[6]; + + { + real tmp1a,tmp2a,tmp1b,tmp2b; + tmp1a = in[2*1+0] * c[1] + ta33 + in[2*5+0] * c[5] + in[2*7+0] * c[7]; + tmp1b = in[2*1+1] * c[1] + tb33 + in[2*5+1] * c[5] + in[2*7+1] * c[7]; + tmp2a = in[2*0+0] + in[2*2+0] * c[2] + in[2*4+0] * c[4] + ta66 + in[2*8+0] * c[8]; + tmp2b = in[2*0+1] + in[2*2+1] * c[2] + in[2*4+1] * c[4] + tb66 + in[2*8+1] * c[8]; + + MACRO1(0); + MACRO2(8); + } + + { + real tmp1a,tmp2a,tmp1b,tmp2b; + tmp1a = ( in[2*1+0] - in[2*5+0] - in[2*7+0] ) * c[3]; + tmp1b = ( in[2*1+1] - in[2*5+1] - in[2*7+1] ) * c[3]; + tmp2a = ( in[2*2+0] - in[2*4+0] - in[2*8+0] ) * c[6] - in[2*6+0] + in[2*0+0]; + tmp2b = ( in[2*2+1] - in[2*4+1] - in[2*8+1] ) * c[6] - in[2*6+1] + in[2*0+1]; + + MACRO1(1); + MACRO2(7); + } + + { + real tmp1a,tmp2a,tmp1b,tmp2b; + tmp1a = in[2*1+0] * c[5] - ta33 - in[2*5+0] * c[7] + in[2*7+0] * c[1]; + tmp1b = in[2*1+1] * c[5] - tb33 - in[2*5+1] * c[7] + in[2*7+1] * c[1]; + tmp2a = in[2*0+0] - in[2*2+0] * c[8] - in[2*4+0] * c[2] + ta66 + in[2*8+0] * c[4]; + tmp2b = in[2*0+1] - in[2*2+1] * c[8] - in[2*4+1] * c[2] + tb66 + in[2*8+1] * c[4]; + + MACRO1(2); + MACRO2(6); + } + + { + real tmp1a,tmp2a,tmp1b,tmp2b; + tmp1a = in[2*1+0] * c[7] - ta33 + in[2*5+0] * c[1] - in[2*7+0] * c[5]; + tmp1b = in[2*1+1] * c[7] - tb33 + in[2*5+1] * c[1] - in[2*7+1] * c[5]; + tmp2a = in[2*0+0] - in[2*2+0] * c[4] + in[2*4+0] * c[8] + ta66 - in[2*8+0] * c[2]; + tmp2b = in[2*0+1] - in[2*2+1] * c[4] + in[2*4+1] * c[8] + tb66 - in[2*8+1] * c[2]; + + MACRO1(3); + MACRO2(5); + } + + { + real sum0,sum1; + sum0 = in[2*0+0] - in[2*2+0] + in[2*4+0] - in[2*6+0] + in[2*8+0]; + sum1 = (in[2*0+1] - in[2*2+1] + in[2*4+1] - in[2*6+1] + in[2*8+1] ) * tfcos36[4]; + MACRO0(4); + } + } + + } +} + + +/* + * new DCT12 + */ +static void dct12(real *in,real *rawout1,real *rawout2,real *wi,real *ts) +{ +#define DCT12_PART1 \ + in5 = in[5*3]; \ + in5 += (in4 = in[4*3]); \ + in4 += (in3 = in[3*3]); \ + in3 += (in2 = in[2*3]); \ + in2 += (in1 = in[1*3]); \ + in1 += (in0 = in[0*3]); \ + \ + in5 += in3; in3 += in1; \ + \ + in2 *= COS6_1; \ + in3 *= COS6_1; \ + +#define DCT12_PART2 \ + in0 += in4 * COS6_2; \ + \ + in4 = in0 + in2; \ + in0 -= in2; \ + \ + in1 += in5 * COS6_2; \ + \ + in5 = (in1 + in3) * tfcos12[0]; \ + in1 = (in1 - in3) * tfcos12[2]; \ + \ + in3 = in4 + in5; \ + in4 -= in5; \ + \ + in2 = in0 + in1; \ + in0 -= in1; + + + { + real in0,in1,in2,in3,in4,in5; + real *out1 = rawout1; + ts[SBLIMIT*0] = out1[0]; ts[SBLIMIT*1] = out1[1]; ts[SBLIMIT*2] = out1[2]; + ts[SBLIMIT*3] = out1[3]; ts[SBLIMIT*4] = out1[4]; ts[SBLIMIT*5] = out1[5]; + + DCT12_PART1 + + { + real tmp0,tmp1 = (in0 - in4); + { + real tmp2 = (in1 - in5) * tfcos12[1]; + tmp0 = tmp1 + tmp2; + tmp1 -= tmp2; + } + ts[(17-1)*SBLIMIT] = out1[17-1] + tmp0 * wi[11-1]; + ts[(12+1)*SBLIMIT] = out1[12+1] + tmp0 * wi[6+1]; + ts[(6 +1)*SBLIMIT] = out1[6 +1] + tmp1 * wi[1]; + ts[(11-1)*SBLIMIT] = out1[11-1] + tmp1 * wi[5-1]; + } + + DCT12_PART2 + + ts[(17-0)*SBLIMIT] = out1[17-0] + in2 * wi[11-0]; + ts[(12+0)*SBLIMIT] = out1[12+0] + in2 * wi[6+0]; + ts[(12+2)*SBLIMIT] = out1[12+2] + in3 * wi[6+2]; + ts[(17-2)*SBLIMIT] = out1[17-2] + in3 * wi[11-2]; + + ts[(6+0)*SBLIMIT] = out1[6+0] + in0 * wi[0]; + ts[(11-0)*SBLIMIT] = out1[11-0] + in0 * wi[5-0]; + ts[(6+2)*SBLIMIT] = out1[6+2] + in4 * wi[2]; + ts[(11-2)*SBLIMIT] = out1[11-2] + in4 * wi[5-2]; + } + + in++; + + { + real in0,in1,in2,in3,in4,in5; + real *out2 = rawout2; + + DCT12_PART1 + + { + real tmp0,tmp1 = (in0 - in4); + { + real tmp2 = (in1 - in5) * tfcos12[1]; + tmp0 = tmp1 + tmp2; + tmp1 -= tmp2; + } + out2[5-1] = tmp0 * wi[11-1]; + out2[0+1] = tmp0 * wi[6+1]; + ts[(12+1)*SBLIMIT] += tmp1 * wi[1]; + ts[(17-1)*SBLIMIT] += tmp1 * wi[5-1]; + } + + DCT12_PART2 + + out2[5-0] = in2 * wi[11-0]; + out2[0+0] = in2 * wi[6+0]; + out2[0+2] = in3 * wi[6+2]; + out2[5-2] = in3 * wi[11-2]; + + ts[(12+0)*SBLIMIT] += in0 * wi[0]; + ts[(17-0)*SBLIMIT] += in0 * wi[5-0]; + ts[(12+2)*SBLIMIT] += in4 * wi[2]; + ts[(17-2)*SBLIMIT] += in4 * wi[5-2]; + } + + in++; + + { + real in0,in1,in2,in3,in4,in5; + real *out2 = rawout2; + out2[12]=out2[13]=out2[14]=out2[15]=out2[16]=out2[17]=0.0; + + DCT12_PART1 + + { + real tmp0,tmp1 = (in0 - in4); + { + real tmp2 = (in1 - in5) * tfcos12[1]; + tmp0 = tmp1 + tmp2; + tmp1 -= tmp2; + } + out2[11-1] = tmp0 * wi[11-1]; + out2[6 +1] = tmp0 * wi[6+1]; + out2[0+1] += tmp1 * wi[1]; + out2[5-1] += tmp1 * wi[5-1]; + } + + DCT12_PART2 + + out2[11-0] = in2 * wi[11-0]; + out2[6 +0] = in2 * wi[6+0]; + out2[6 +2] = in3 * wi[6+2]; + out2[11-2] = in3 * wi[11-2]; + + out2[0+0] += in0 * wi[0]; + out2[5-0] += in0 * wi[5-0]; + out2[0+2] += in4 * wi[2]; + out2[5-2] += in4 * wi[5-2]; + } +} +/* *INDENT-ON* */ + +/* + * III_hybrid + */ +static void +III_hybrid(PMPSTR mp, real fsIn[SBLIMIT][SSLIMIT], real tsOut[SSLIMIT][SBLIMIT], + int ch, struct gr_info_s *gr_infos) +{ + real *tspnt = (real *) tsOut; + real(*block)[2][SBLIMIT * SSLIMIT] = mp->hybrid_block; + int *blc = mp->hybrid_blc; + real *rawout1, *rawout2; + int bt; + int sb = 0; + + { + int b = blc[ch]; + rawout1 = block[b][ch]; + b = -b + 1; + rawout2 = block[b][ch]; + blc[ch] = b; + } + + + if (gr_infos->mixed_block_flag) { + sb = 2; + dct36(fsIn[0], rawout1, rawout2, win[0], tspnt); + dct36(fsIn[1], rawout1 + 18, rawout2 + 18, win1[0], tspnt + 1); + rawout1 += 36; + rawout2 += 36; + tspnt += 2; + } + + bt = gr_infos->block_type; + if (bt == 2) { + for (; sb < (int) gr_infos->maxb; sb += 2, tspnt += 2, rawout1 += 36, rawout2 += 36) { + dct12(fsIn[sb], rawout1, rawout2, win[2], tspnt); + dct12(fsIn[sb + 1], rawout1 + 18, rawout2 + 18, win1[2], tspnt + 1); + } + } + else { + for (; sb < (int) gr_infos->maxb; sb += 2, tspnt += 2, rawout1 += 36, rawout2 += 36) { + dct36(fsIn[sb], rawout1, rawout2, win[bt], tspnt); + dct36(fsIn[sb + 1], rawout1 + 18, rawout2 + 18, win1[bt], tspnt + 1); + } + } + + for (; sb < SBLIMIT; sb++, tspnt++) { + int i; + for (i = 0; i < SSLIMIT; i++) { + tspnt[i * SBLIMIT] = *rawout1++; + *rawout2++ = 0.0; + } + } +} + +/* + * main layer3 handler + */ + +int +layer3_audiodata_precedesframes(PMPSTR mp) +{ + int audioDataInFrame; + int framesToBacktrack; + + /* specific to Layer 3, since Layer 1 & 2 the audio data starts at the frame that describes it. */ + /* determine how many bytes and therefore bitstream frames the audio data precedes it's matching frame */ + /* lame_report_fnc(mp->report_err, "hip: main_data_begin = %d, mp->bsize %d, mp->fsizeold %d, mp->ssize %d\n", + sideinfo.main_data_begin, mp->bsize, mp->fsizeold, mp->ssize); */ + /* compute the number of frames to backtrack, 4 for the header, ssize already holds the CRC */ + /* TODO Erroneously assumes current frame is same as previous frame. */ + audioDataInFrame = mp->bsize - 4 - mp->ssize; + framesToBacktrack = (mp->sideinfo.main_data_begin + audioDataInFrame - 1) / audioDataInFrame; + /* lame_report_fnc(mp->report_err, "hip: audioDataInFrame %d framesToBacktrack %d\n", audioDataInFrame, framesToBacktrack); */ + return framesToBacktrack; +} + +int +decode_layer3_sideinfo(PMPSTR mp) +{ + struct frame *fr = &mp->fr; + int stereo = fr->stereo; + int single = fr->single; + int ms_stereo; + int sfreq = fr->sampling_frequency; + int granules; + int ch, gr, databits; + + if (stereo == 1) { /* stream is mono */ + single = 0; + } + + if (fr->mode == MPG_MD_JOINT_STEREO) { + ms_stereo = fr->mode_ext & 0x2; + } + else + ms_stereo = 0; + + + if (fr->lsf) { + granules = 1; + III_get_side_info_2(mp, stereo, ms_stereo, sfreq, single); + } + else { + granules = 2; + III_get_side_info_1(mp, stereo, ms_stereo, sfreq, single); + } + + databits = 0; + for (gr = 0; gr < granules; ++gr) { + for (ch = 0; ch < stereo; ++ch) { + struct gr_info_s *gr_infos = &(mp->sideinfo.ch[ch].gr[gr]); + databits += gr_infos->part2_3_length; + } + } + return databits - 8 * mp->sideinfo.main_data_begin; +} + + + +int +decode_layer3_frame(PMPSTR mp, unsigned char *pcm_sample, int *pcm_point, + int (*synth_1to1_mono_ptr) (PMPSTR, real *, unsigned char *, int *), + int (*synth_1to1_ptr) (PMPSTR, real *, int, unsigned char *, int *)) +{ + int gr, ch, ss, clip = 0; + int scalefacs[2][39]; /* max 39 for short[13][3] mode, mixed: 38, long: 22 */ + /* struct III_sideinfo sideinfo; */ + struct frame *fr = &(mp->fr); + int stereo = fr->stereo; + int single = fr->single; + int ms_stereo, i_stereo; + int sfreq = fr->sampling_frequency; + int stereo1, granules; + real hybridIn[2][SBLIMIT][SSLIMIT]; + real hybridOut[2][SSLIMIT][SBLIMIT]; + + if (set_pointer(mp, (int) mp->sideinfo.main_data_begin) == MP3_ERR) + return 0; + + if (stereo == 1) { /* stream is mono */ + stereo1 = 1; + single = 0; + } + else if (single >= 0) /* stream is stereo, but force to mono */ + stereo1 = 1; + else + stereo1 = 2; + + if (fr->mode == MPG_MD_JOINT_STEREO) { + ms_stereo = fr->mode_ext & 0x2; + i_stereo = fr->mode_ext & 0x1; + } + else + ms_stereo = i_stereo = 0; + + + if (fr->lsf) { + granules = 1; + } + else { + granules = 2; + } + + for (gr = 0; gr < granules; gr++) { + + { + struct gr_info_s *gr_infos = &(mp->sideinfo.ch[0].gr[gr]); + long part2bits; + + if (fr->lsf) + part2bits = III_get_scale_factors_2(mp, scalefacs[0], gr_infos, 0); + else { + part2bits = III_get_scale_factors_1(mp, scalefacs[0], gr_infos); + } + if (mp->pinfo != NULL) { + int i; + mp->pinfo->sfbits[gr][0] = part2bits; + for (i = 0; i < 39; i++) + mp->pinfo->sfb_s[gr][0][i] = scalefacs[0][i]; + } + + /* lame_report_fnc(mp->report_err, "calling III dequantize sample 1 gr_infos->part2_3_length %d\n", gr_infos->part2_3_length); */ + if (III_dequantize_sample(mp, hybridIn[0], scalefacs[0], gr_infos, sfreq, part2bits)) + return clip; + } + if (stereo == 2) { + struct gr_info_s *gr_infos = &(mp->sideinfo.ch[1].gr[gr]); + long part2bits; + if (fr->lsf) + part2bits = III_get_scale_factors_2(mp, scalefacs[1], gr_infos, i_stereo); + else { + part2bits = III_get_scale_factors_1(mp, scalefacs[1], gr_infos); + } + if (mp->pinfo != NULL) { + int i; + mp->pinfo->sfbits[gr][1] = part2bits; + for (i = 0; i < 39; i++) + mp->pinfo->sfb_s[gr][1][i] = scalefacs[1][i]; + } + + /* lame_report_fnc(mp->report_err, "calling III dequantize sample 2 gr_infos->part2_3_length %d\n", gr_infos->part2_3_length); */ + if (III_dequantize_sample(mp, hybridIn[1], scalefacs[1], gr_infos, sfreq, part2bits)) + return clip; + + if (ms_stereo) { + int i; + for (i = 0; i < SBLIMIT * SSLIMIT; i++) { + real tmp0, tmp1; + tmp0 = ((real *) hybridIn[0])[i]; + tmp1 = ((real *) hybridIn[1])[i]; + ((real *) hybridIn[1])[i] = tmp0 - tmp1; + ((real *) hybridIn[0])[i] = tmp0 + tmp1; + } + } + + if (i_stereo) + III_i_stereo(hybridIn, scalefacs[1], gr_infos, sfreq, ms_stereo, fr->lsf); + + if (ms_stereo || i_stereo || (single == 3)) { + if (gr_infos->maxb > mp->sideinfo.ch[0].gr[gr].maxb) + mp->sideinfo.ch[0].gr[gr].maxb = gr_infos->maxb; + else + gr_infos->maxb = mp->sideinfo.ch[0].gr[gr].maxb; + } + + switch (single) { + case 3: + { + int i; + real *in0 = (real *) hybridIn[0], *in1 = (real *) hybridIn[1]; + for (i = 0; i < (int) (SSLIMIT * gr_infos->maxb); i++, in0++) + *in0 = (*in0 + *in1++); /* *0.5 done by pow-scale */ + } + break; + case 1: + { + int i; + real *in0 = (real *) hybridIn[0], *in1 = (real *) hybridIn[1]; + for (i = 0; i < (int) (SSLIMIT * gr_infos->maxb); i++) + *in0++ = *in1++; + } + break; + } + } + + if (mp->pinfo != NULL) { + int i, sb; + float ifqstep; + + mp->pinfo->bitrate = tabsel_123[fr->lsf][fr->lay - 1][fr->bitrate_index]; + mp->pinfo->sampfreq = freqs[sfreq]; + mp->pinfo->emph = fr->emphasis; + mp->pinfo->crc = fr->error_protection; + mp->pinfo->padding = fr->padding; + mp->pinfo->stereo = fr->stereo; + mp->pinfo->js = (fr->mode == MPG_MD_JOINT_STEREO); + mp->pinfo->ms_stereo = ms_stereo; + mp->pinfo->i_stereo = i_stereo; + mp->pinfo->maindata = mp->sideinfo.main_data_begin; + + for (ch = 0; ch < stereo1; ch++) { + struct gr_info_s *gr_infos = &(mp->sideinfo.ch[ch].gr[gr]); + mp->pinfo->big_values[gr][ch] = gr_infos->big_values; + mp->pinfo->scalefac_scale[gr][ch] = gr_infos->scalefac_scale; + mp->pinfo->mixed[gr][ch] = gr_infos->mixed_block_flag; + mp->pinfo->mpg123blocktype[gr][ch] = gr_infos->block_type; + mp->pinfo->mainbits[gr][ch] = gr_infos->part2_3_length; + mp->pinfo->preflag[gr][ch] = gr_infos->preflag; + if (gr == 1) + mp->pinfo->scfsi[ch] = gr_infos->scfsi; + } + + + for (ch = 0; ch < stereo1; ch++) { + struct gr_info_s *gr_infos = &(mp->sideinfo.ch[ch].gr[gr]); + ifqstep = (mp->pinfo->scalefac_scale[gr][ch] == 0) ? .5 : 1.0; + if (2 == gr_infos->block_type) { + for (i = 0; i < 3; i++) { + for (sb = 0; sb < 12; sb++) { + int j = 3 * sb + i; + /* + is_p = scalefac[sfb*3+lwin-gr_infos->mixed_block_flag]; + */ + /* scalefac was copied into pinfo->sfb_s[] above */ + mp->pinfo->sfb_s[gr][ch][j] = + -ifqstep * mp->pinfo->sfb_s[gr][ch][j - gr_infos->mixed_block_flag]; + mp->pinfo->sfb_s[gr][ch][j] -= 2 * (mp->pinfo->sub_gain[gr][ch][i]); + } + mp->pinfo->sfb_s[gr][ch][3 * sb + i] = + -2 * (mp->pinfo->sub_gain[gr][ch][i]); + } + } + else { + for (sb = 0; sb < 21; sb++) { + /* scalefac was copied into pinfo->sfb[] above */ + mp->pinfo->sfb[gr][ch][sb] = mp->pinfo->sfb_s[gr][ch][sb]; + if (gr_infos->preflag) + mp->pinfo->sfb[gr][ch][sb] += pretab1[sb]; + mp->pinfo->sfb[gr][ch][sb] *= -ifqstep; + } + mp->pinfo->sfb[gr][ch][21] = 0; + } + } + + + + for (ch = 0; ch < stereo1; ch++) { + int j = 0; + for (sb = 0; sb < SBLIMIT; sb++) + for (ss = 0; ss < SSLIMIT; ss++, j++) + mp->pinfo->mpg123xr[gr][ch][j] = hybridIn[ch][sb][ss]; + } + } + + + for (ch = 0; ch < stereo1; ch++) { + struct gr_info_s *gr_infos = &(mp->sideinfo.ch[ch].gr[gr]); + III_antialias(hybridIn[ch], gr_infos); + III_hybrid(mp, hybridIn[ch], hybridOut[ch], ch, gr_infos); + } + + for (ss = 0; ss < SSLIMIT; ss++) { + if (single >= 0) { + clip += (*synth_1to1_mono_ptr) (mp, hybridOut[0][ss], pcm_sample, pcm_point); + } + else { + int p1 = *pcm_point; + clip += (*synth_1to1_ptr) (mp, hybridOut[0][ss], 0, pcm_sample, &p1); + clip += (*synth_1to1_ptr) (mp, hybridOut[1][ss], 1, pcm_sample, pcm_point); + } + } + } + + return clip; +} diff --git a/mpglib/layer3.h b/mpglib/layer3.h new file mode 100644 index 0000000..2e30192 --- /dev/null +++ b/mpglib/layer3.h @@ -0,0 +1,32 @@ +/* + * Copyright (C) 1999-2010 The L.A.M.E. project + * + * Initially written by Michael Hipp, see also AUTHORS and README. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef LAYER3_H_INCLUDED +#define LAYER3_H_INCLUDED + +void hip_init_tables_layer3(void); +int decode_layer3_sideinfo(PMPSTR mp); +int decode_layer3_frame(PMPSTR mp, unsigned char *pcm_sample, int *pcm_point, + int (*synth_1to1_mono_ptr) (PMPSTR, real *, unsigned char *, int *), + int (*synth_1to1_ptr) (PMPSTR, real *, int, unsigned char *, int *)); +int layer3_audiodata_precedesframes(PMPSTR mp); + +#endif diff --git a/mpglib/mpg123.h b/mpglib/mpg123.h new file mode 100644 index 0000000..6ac8b67 --- /dev/null +++ b/mpglib/mpg123.h @@ -0,0 +1,152 @@ +/* + * Copyright (C) 1999-2010 The L.A.M.E. project + * + * Initially written by Michael Hipp, see also AUTHORS and README. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +#ifndef MPG123_H_INCLUDED +#define MPG123_H_INCLUDED + +#include <stdio.h> + +#ifdef STDC_HEADERS +# include <string.h> +#else +# ifndef HAVE_STRCHR +# define strchr index +# define strrchr rindex +# endif +char *strchr(), *strrchr(); +# ifndef HAVE_MEMCPY +# define memcpy(d, s, n) bcopy ((s), (d), (n)) +# define memmove(d, s, n) bcopy ((s), (d), (n)) +# endif +#endif + +#include <signal.h> + + +#if defined(__riscos__) && defined(FPA10) +#include "ymath.h" +#else +#include <math.h> +#endif + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif +#ifndef M_SQRT2 +#define M_SQRT2 1.41421356237309504880 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif +#ifndef TRUE +#define TRUE 1 +#endif + +#undef REAL_IS_FLOAT +#define REAL_IS_FLOAT + +#ifdef REAL_IS_FLOAT +# define real float +#elif defined(REAL_IS_LONG_DOUBLE) +# define real long double +#else +# define real double +#endif + +#define FALSE 0 +#define TRUE 1 + +#define SBLIMIT 32 +#define SSLIMIT 18 + +#define MPG_MD_STEREO 0 +#define MPG_MD_JOINT_STEREO 1 +#define MPG_MD_DUAL_CHANNEL 2 +#define MPG_MD_MONO 3 + +#define MAXFRAMESIZE 2880 + +/* AF: ADDED FOR LAYER1/LAYER2 */ +#define SCALE_BLOCK 12 + + +/* Pre Shift fo 16 to 8 bit converter table */ +#define AUSHIFT (3) + +struct frame { + int stereo; + int single; /* single channel (monophonic) */ + int lsf; /* 0 = MPEG-1, 1 = MPEG-2/2.5 */ + int mpeg25; /* 1 = MPEG-2.5, 0 = MPEG-1/2 */ + int header_change; + int lay; /* Layer */ + int error_protection; /* 1 = CRC-16 code following header */ + int bitrate_index; + int sampling_frequency; /* sample rate of decompressed audio in Hz */ + int padding; + int extension; + int mode; + int mode_ext; + int copyright; + int original; + int emphasis; + int framesize; /* computed framesize */ + + /* AF: ADDED FOR LAYER1/LAYER2 */ + int II_sblimit; + struct al_table2 const *alloc; + int down_sample_sblimit; + int down_sample; + + +}; + +struct gr_info_s { + int scfsi; + unsigned part2_3_length; + unsigned big_values; + unsigned scalefac_compress; + unsigned block_type; + unsigned mixed_block_flag; + unsigned table_select[3]; + unsigned subblock_gain[3]; + unsigned maxband[3]; + unsigned maxbandl; + unsigned maxb; + unsigned region1start; + unsigned region2start; + unsigned preflag; + unsigned scalefac_scale; + unsigned count1table_select; + real *full_gain[3]; + real *pow2gain; +}; + +struct III_sideinfo { + unsigned main_data_begin; + unsigned private_bits; + struct { + struct gr_info_s gr[2]; + } ch[2]; +}; + + +#endif diff --git a/mpglib/mpglib.h b/mpglib/mpglib.h new file mode 100644 index 0000000..7ab4d5f --- /dev/null +++ b/mpglib/mpglib.h @@ -0,0 +1,96 @@ +/* + * Copyright (C) 1999-2010 The L.A.M.E. project + * + * Initially written by Michael Hipp, see also AUTHORS and README. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +#ifndef _MPGLIB_H_ +#define _MPGLIB_H_ + +#include "lame.h" + +#ifndef plotting_data_defined +#define plotting_data_defined +struct plotting_data; +typedef struct plotting_data plotting_data; +#endif + + +extern void lame_report_fnc(lame_report_function f, const char *format, ...); + +struct buf { + unsigned char *pnt; + long size; + long pos; + struct buf *next; + struct buf *prev; +}; + +struct framebuf { + struct buf *buf; + long pos; + struct frame *next; + struct frame *prev; +}; + +typedef struct mpstr_tag { + struct buf *head, *tail; /* buffer linked list pointers, tail points to oldest buffer */ + int vbr_header; /* 1 if valid Xing vbr header detected */ + int num_frames; /* set if vbr header present */ + int enc_delay; /* set if vbr header present */ + int enc_padding; /* set if vbr header present */ + /* header_parsed, side_parsed and data_parsed must be all set 1 + before the full frame has been parsed */ + int header_parsed; /* 1 = header of current frame has been parsed */ + int side_parsed; /* 1 = header of sideinfo of current frame has been parsed */ + int data_parsed; + int free_format; /* 1 = free format frame */ + int old_free_format; /* 1 = last frame was free format */ + int bsize; + int framesize; + int ssize; /* number of bytes used for side information, including 2 bytes for CRC-16 if present */ + int dsize; + int fsizeold; /* size of previous frame, -1 for first */ + int fsizeold_nopadding; + struct frame fr; /* holds the parameters decoded from the header */ + struct III_sideinfo sideinfo; + unsigned char bsspace[2][MAXFRAMESIZE + 1024]; /* bit stream space used ???? */ /* MAXFRAMESIZE */ + real hybrid_block[2][2][SBLIMIT * SSLIMIT]; + int hybrid_blc[2]; + unsigned long header; + int bsnum; + real synth_buffs[2][2][0x110]; + int synth_bo; + int sync_bitstream; /* 1 = bitstream is yet to be synchronized */ + + int bitindex; + unsigned char *wordpointer; + plotting_data *pinfo; + + lame_report_function report_msg; + lame_report_function report_dbg; + lame_report_function report_err; +} MPSTR, *PMPSTR; + + +#define MP3_ERR -1 +#define MP3_OK 0 +#define MP3_NEED_MORE 1 + + + +#endif /* _MPGLIB_H_ */ diff --git a/mpglib/tabinit.c b/mpglib/tabinit.c new file mode 100644 index 0000000..7eeaca4 --- /dev/null +++ b/mpglib/tabinit.c @@ -0,0 +1,152 @@ +/* + * tabinit.c + * + * Copyright (C) 1999-2010 The L.A.M.E. project + * + * Initially written by Michael Hipp, see also AUTHORS and README. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +/* $Id: tabinit.c,v 1.17 2017/09/06 15:07:30 robert Exp $ */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <stdlib.h> +#include "tabinit.h" +#include "mpg123.h" + +#ifdef WITH_DMALLOC +#include <dmalloc.h> +#endif + +static int table_init_called = 0; + +real decwin[512 + 32]; +static real cos64[16], cos32[8], cos16[4], cos8[2], cos4[1]; +real *pnts[] = { cos64, cos32, cos16, cos8, cos4 }; + +/* *INDENT-OFF* */ + +static const double dewin[512] = { + 0.000000000,-0.000015259,-0.000015259,-0.000015259, + -0.000015259,-0.000015259,-0.000015259,-0.000030518, + -0.000030518,-0.000030518,-0.000030518,-0.000045776, + -0.000045776,-0.000061035,-0.000061035,-0.000076294, + -0.000076294,-0.000091553,-0.000106812,-0.000106812, + -0.000122070,-0.000137329,-0.000152588,-0.000167847, + -0.000198364,-0.000213623,-0.000244141,-0.000259399, + -0.000289917,-0.000320435,-0.000366211,-0.000396729, + -0.000442505,-0.000473022,-0.000534058,-0.000579834, + -0.000625610,-0.000686646,-0.000747681,-0.000808716, + -0.000885010,-0.000961304,-0.001037598,-0.001113892, + -0.001205444,-0.001296997,-0.001388550,-0.001480103, + -0.001586914,-0.001693726,-0.001785278,-0.001907349, + -0.002014160,-0.002120972,-0.002243042,-0.002349854, + -0.002456665,-0.002578735,-0.002685547,-0.002792358, + -0.002899170,-0.002990723,-0.003082275,-0.003173828, + -0.003250122,-0.003326416,-0.003387451,-0.003433228, + -0.003463745,-0.003479004,-0.003479004,-0.003463745, + -0.003417969,-0.003372192,-0.003280640,-0.003173828, + -0.003051758,-0.002883911,-0.002700806,-0.002487183, + -0.002227783,-0.001937866,-0.001617432,-0.001266479, + -0.000869751,-0.000442505, 0.000030518, 0.000549316, + 0.001098633, 0.001693726, 0.002334595, 0.003005981, + 0.003723145, 0.004486084, 0.005294800, 0.006118774, + 0.007003784, 0.007919312, 0.008865356, 0.009841919, + 0.010848999, 0.011886597, 0.012939453, 0.014022827, + 0.015121460, 0.016235352, 0.017349243, 0.018463135, + 0.019577026, 0.020690918, 0.021789551, 0.022857666, + 0.023910522, 0.024932861, 0.025909424, 0.026840210, + 0.027725220, 0.028533936, 0.029281616, 0.029937744, + 0.030532837, 0.031005859, 0.031387329, 0.031661987, + 0.031814575, 0.031845093, 0.031738281, 0.031478882, + 0.031082153, 0.030517578, 0.029785156, 0.028884888, + 0.027801514, 0.026535034, 0.025085449, 0.023422241, + 0.021575928, 0.019531250, 0.017257690, 0.014801025, + 0.012115479, 0.009231567, 0.006134033, 0.002822876, + -0.000686646,-0.004394531,-0.008316040,-0.012420654, + -0.016708374,-0.021179199,-0.025817871,-0.030609131, + -0.035552979,-0.040634155,-0.045837402,-0.051132202, + -0.056533813,-0.061996460,-0.067520142,-0.073059082, + -0.078628540,-0.084182739,-0.089706421,-0.095169067, + -0.100540161,-0.105819702,-0.110946655,-0.115921021, + -0.120697021,-0.125259399,-0.129562378,-0.133590698, + -0.137298584,-0.140670776,-0.143676758,-0.146255493, + -0.148422241,-0.150115967,-0.151306152,-0.151962280, + -0.152069092,-0.151596069,-0.150497437,-0.148773193, + -0.146362305,-0.143264771,-0.139450073,-0.134887695, + -0.129577637,-0.123474121,-0.116577148,-0.108856201, + -0.100311279,-0.090927124,-0.080688477,-0.069595337, + -0.057617187,-0.044784546,-0.031082153,-0.016510010, + -0.001068115, 0.015228271, 0.032379150, 0.050354004, + 0.069168091, 0.088775635, 0.109161377, 0.130310059, + 0.152206421, 0.174789429, 0.198059082, 0.221984863, + 0.246505737, 0.271591187, 0.297210693, 0.323318481, + 0.349868774, 0.376800537, 0.404083252, 0.431655884, + 0.459472656, 0.487472534, 0.515609741, 0.543823242, + 0.572036743, 0.600219727, 0.628295898, 0.656219482, + 0.683914185, 0.711318970, 0.738372803, 0.765029907, + 0.791213989, 0.816864014, 0.841949463, 0.866363525, + 0.890090942, 0.913055420, 0.935195923, 0.956481934, + 0.976852417, 0.996246338, 1.014617920, 1.031936646, + 1.048156738, 1.063217163, 1.077117920, 1.089782715, + 1.101211548, 1.111373901, 1.120223999, 1.127746582, + 1.133926392, 1.138763428, 1.142211914, 1.144287109, + 1.144989014 +}; +/* *INDENT-ON* */ + +void +make_decode_tables(long scaleval) +{ + int i, j, k, kr, divv; + real *table, *costab; + + if (table_init_called) + return; + + table_init_called = 1; + + for (i = 0; i < 5; i++) { + kr = 0x10 >> i; + divv = 0x40 >> i; + costab = pnts[i]; + for (k = 0; k < kr; k++) + costab[k] = (real) (1.0 / (2.0 * cos(M_PI * ((double) k * 2.0 + 1.0) / (double) divv))); + } + + table = decwin; + scaleval = -scaleval; + for (i = 0, j = 0; i < 256; i++, j++, table += 32) { + if (table < decwin + 512 + 16) + table[16] = table[0] = (real) (dewin[j] * scaleval); + if (i % 32 == 31) + table -= 1023; + if (i % 64 == 63) + scaleval = -scaleval; + } + + for ( /* i=256 */ ; i < 512; i++, j--, table += 32) { + if (table < decwin + 512 + 16) + table[16] = table[0] = (real) (dewin[j] * scaleval); + if (i % 32 == 31) + table -= 1023; + if (i % 64 == 63) + scaleval = -scaleval; + } +} diff --git a/mpglib/tabinit.h b/mpglib/tabinit.h new file mode 100644 index 0000000..76f4c42 --- /dev/null +++ b/mpglib/tabinit.h @@ -0,0 +1,32 @@ +/* + * Copyright (C) 1999-2010 The L.A.M.E. project + * + * Initially written by Michael Hipp, see also AUTHORS and README. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef MPGLIB_TABINIT_H_INCLUDED +#define MPGLIB_TABINIT_H_INCLUDED + +#include "mpg123.h" + +extern real decwin[512 + 32]; +extern real *pnts[5]; + +void make_decode_tables(long scale); + +#endif diff --git a/testcase.mp3 b/testcase.mp3 new file mode 100644 index 0000000..a4862d4 Binary files /dev/null and b/testcase.mp3 differ diff --git a/testcase.wav b/testcase.wav new file mode 100644 index 0000000..7c835f7 Binary files /dev/null and b/testcase.wav differ diff --git a/vc_solution/Makefile.am b/vc_solution/Makefile.am new file mode 100644 index 0000000..8a39895 --- /dev/null +++ b/vc_solution/Makefile.am @@ -0,0 +1,26 @@ +## $Id: Makefile.am,v 1.3 2017/10/13 20:21:45 aleidinger Exp $ + +include $(top_srcdir)/Makefile.am.global + +EXTRA_DIST = \ + arch_nasm.vsprops \ + arch_sse2.vsprops \ + arch_x87.vsprops \ + vc9_lame_acm_adbg.vcproj \ + vc9_lame_acm_tinyxml.vcproj \ + vc9_lame_acm.vcproj \ + vc9_lame_clients.sln \ + vc9_lame_config.vsprops \ + vc9_lame_dll_example.vcproj \ + vc9_lame_dll.vcproj \ + vc9_lame_dshow.vcproj \ + vc9_lame_lame.vcproj \ + vc9_lame_mp3rtp.vcproj \ + vc9_lame_mp3x.vcproj \ + vc9_lame_test.vcproj \ + vc9_lame.sln \ + vc9_libmp3lame_dll.vcproj \ + vc9_libmp3lame.vcproj \ + vc9_mpglib.vcproj \ + vc9_nasm.rules + diff --git a/vc_solution/Makefile.in b/vc_solution/Makefile.in new file mode 100644 index 0000000..cd8fb76 --- /dev/null +++ b/vc_solution/Makefile.in @@ -0,0 +1,492 @@ +# Makefile.in generated by automake 1.15.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2017 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# global section for every Makefile.am +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = vc_solution +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.global +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_DEFS = @CONFIG_DEFS@ +CONFIG_MATH_LIB = @CONFIG_MATH_LIB@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CPUCCODE = @CPUCCODE@ +CPUTYPE = @CPUTYPE@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FRONTEND_CFLAGS = @FRONTEND_CFLAGS@ +FRONTEND_LDADD = @FRONTEND_LDADD@ +FRONTEND_LDFLAGS = @FRONTEND_LDFLAGS@ +GREP = @GREP@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_CONFIG = @GTK_CONFIG@ +GTK_LIBS = @GTK_LIBS@ +INCLUDES = @INCLUDES@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDADD = @LDADD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_MAJOR_VERSION = @LIB_MAJOR_VERSION@ +LIB_MINOR_VERSION = @LIB_MINOR_VERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEDEP = @MAKEDEP@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NASM = @NASM@ +NASM_FORMAT = @NASM_FORMAT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM_F = @RM_F@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_FRONTEND = @WITH_FRONTEND@ +WITH_MP3RTP = @WITH_MP3RTP@ +WITH_MP3X = @WITH_MP3X@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = 1.15 foreign +EXTRA_DIST = \ + arch_nasm.vsprops \ + arch_sse2.vsprops \ + arch_x87.vsprops \ + vc9_lame_acm_adbg.vcproj \ + vc9_lame_acm_tinyxml.vcproj \ + vc9_lame_acm.vcproj \ + vc9_lame_clients.sln \ + vc9_lame_config.vsprops \ + vc9_lame_dll_example.vcproj \ + vc9_lame_dll.vcproj \ + vc9_lame_dshow.vcproj \ + vc9_lame_lame.vcproj \ + vc9_lame_mp3rtp.vcproj \ + vc9_lame_mp3x.vcproj \ + vc9_lame_test.vcproj \ + vc9_lame.sln \ + vc9_libmp3lame_dll.vcproj \ + vc9_libmp3lame.vcproj \ + vc9_mpglib.vcproj \ + vc9_nasm.rules + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.global $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign vc_solution/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign vc_solution/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/Makefile.am.global $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# end global section + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/vc_solution/arch_nasm.vsprops b/vc_solution/arch_nasm.vsprops new file mode 100644 index 0000000..5429774 --- /dev/null +++ b/vc_solution/arch_nasm.vsprops @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioPropertySheet + ProjectType="Visual C++" + Version="8.00" + Name="arch_nasm" + > + <Tool + Name="VCCLCompilerTool" + PreprocessorDefinitions="TAKEHIRO_IEEE754_HACK;HAVE_NASM;MMX_choose_table" + /> +</VisualStudioPropertySheet> diff --git a/vc_solution/arch_sse2.vsprops b/vc_solution/arch_sse2.vsprops new file mode 100644 index 0000000..af6183a --- /dev/null +++ b/vc_solution/arch_sse2.vsprops @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioPropertySheet + ProjectType="Visual C++" + Version="8.00" + Name="arch_sse2" + > + <Tool + Name="VCCLCompilerTool" + PreprocessorDefinitions="HAVE_XMMINTRIN_H;MIN_ARCH_SSE" + EnableEnhancedInstructionSet="2" + FloatingPointModel="2" + /> +</VisualStudioPropertySheet> diff --git a/vc_solution/arch_x87.vsprops b/vc_solution/arch_x87.vsprops new file mode 100644 index 0000000..39ebb09 --- /dev/null +++ b/vc_solution/arch_x87.vsprops @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioPropertySheet + ProjectType="Visual C++" + Version="8.00" + Name="arch_x87" + > + <Tool + Name="VCCLCompilerTool" + PreprocessorDefinitions="TAKEHIRO_IEEE754_HACK" + /> +</VisualStudioPropertySheet> diff --git a/vc_solution/vc9_lame.sln b/vc_solution/vc9_lame.sln new file mode 100644 index 0000000..988e044 --- /dev/null +++ b/vc_solution/vc9_lame.sln @@ -0,0 +1,91 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual C++ Express 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "app lame", "vc9_lame_lame.vcproj", "{EEF5B49E-DBD1-4E1B-8B86-C5D64FCBAD38}" + ProjectSection(ProjectDependencies) = postProject + {20536101-3B0E-43EF-94F9-080D595DAC57} = {20536101-3B0E-43EF-94F9-080D595DAC57} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lib encoder LAME", "vc9_libmp3lame.vcproj", "{20536101-3B0E-43EF-94F9-080D595DAC57}" + ProjectSection(ProjectDependencies) = postProject + {E2DAB91A-8248-4625-8A85-2C2C2A390DD8} = {E2DAB91A-8248-4625-8A85-2C2C2A390DD8} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dll lame", "vc9_libmp3lame_dll.vcproj", "{92BD50AA-04D6-4FBF-ACE1-468FAF6778F2}" + ProjectSection(ProjectDependencies) = postProject + {20536101-3B0E-43EF-94F9-080D595DAC57} = {20536101-3B0E-43EF-94F9-080D595DAC57} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lib decoder HIP", "vc9_mpglib.vcproj", "{E2DAB91A-8248-4625-8A85-2C2C2A390DD8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "app mp3rtp", "vc9_lame_mp3rtp.vcproj", "{C04BA4EA-F719-456D-A332-6C3AF92D7BEA}" + ProjectSection(ProjectDependencies) = postProject + {20536101-3B0E-43EF-94F9-080D595DAC57} = {20536101-3B0E-43EF-94F9-080D595DAC57} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "app mp3x", "vc9_lame_mp3x.vcproj", "{E745EB1A-070A-45ED-B8BD-D9F794E23CFA}" + ProjectSection(ProjectDependencies) = postProject + {20536101-3B0E-43EF-94F9-080D595DAC57} = {20536101-3B0E-43EF-94F9-080D595DAC57} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + ReleaseNASM|Win32 = ReleaseNASM|Win32 + ReleaseSSE2|Win32 = ReleaseSSE2|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {EEF5B49E-DBD1-4E1B-8B86-C5D64FCBAD38}.Debug|Win32.ActiveCfg = Debug|Win32 + {EEF5B49E-DBD1-4E1B-8B86-C5D64FCBAD38}.Debug|Win32.Build.0 = Debug|Win32 + {EEF5B49E-DBD1-4E1B-8B86-C5D64FCBAD38}.Release|Win32.ActiveCfg = Release|Win32 + {EEF5B49E-DBD1-4E1B-8B86-C5D64FCBAD38}.Release|Win32.Build.0 = Release|Win32 + {EEF5B49E-DBD1-4E1B-8B86-C5D64FCBAD38}.ReleaseNASM|Win32.ActiveCfg = ReleaseNASM|Win32 + {EEF5B49E-DBD1-4E1B-8B86-C5D64FCBAD38}.ReleaseNASM|Win32.Build.0 = ReleaseNASM|Win32 + {EEF5B49E-DBD1-4E1B-8B86-C5D64FCBAD38}.ReleaseSSE2|Win32.ActiveCfg = ReleaseSSE2|Win32 + {EEF5B49E-DBD1-4E1B-8B86-C5D64FCBAD38}.ReleaseSSE2|Win32.Build.0 = ReleaseSSE2|Win32 + {20536101-3B0E-43EF-94F9-080D595DAC57}.Debug|Win32.ActiveCfg = Debug|Win32 + {20536101-3B0E-43EF-94F9-080D595DAC57}.Debug|Win32.Build.0 = Debug|Win32 + {20536101-3B0E-43EF-94F9-080D595DAC57}.Release|Win32.ActiveCfg = Release|Win32 + {20536101-3B0E-43EF-94F9-080D595DAC57}.Release|Win32.Build.0 = Release|Win32 + {20536101-3B0E-43EF-94F9-080D595DAC57}.ReleaseNASM|Win32.ActiveCfg = ReleaseNASM|Win32 + {20536101-3B0E-43EF-94F9-080D595DAC57}.ReleaseNASM|Win32.Build.0 = ReleaseNASM|Win32 + {20536101-3B0E-43EF-94F9-080D595DAC57}.ReleaseSSE2|Win32.ActiveCfg = ReleaseSSE2|Win32 + {20536101-3B0E-43EF-94F9-080D595DAC57}.ReleaseSSE2|Win32.Build.0 = ReleaseSSE2|Win32 + {92BD50AA-04D6-4FBF-ACE1-468FAF6778F2}.Debug|Win32.ActiveCfg = Debug|Win32 + {92BD50AA-04D6-4FBF-ACE1-468FAF6778F2}.Debug|Win32.Build.0 = Debug|Win32 + {92BD50AA-04D6-4FBF-ACE1-468FAF6778F2}.Release|Win32.ActiveCfg = Release|Win32 + {92BD50AA-04D6-4FBF-ACE1-468FAF6778F2}.Release|Win32.Build.0 = Release|Win32 + {92BD50AA-04D6-4FBF-ACE1-468FAF6778F2}.ReleaseNASM|Win32.ActiveCfg = ReleaseNASM|Win32 + {92BD50AA-04D6-4FBF-ACE1-468FAF6778F2}.ReleaseNASM|Win32.Build.0 = ReleaseNASM|Win32 + {92BD50AA-04D6-4FBF-ACE1-468FAF6778F2}.ReleaseSSE2|Win32.ActiveCfg = ReleaseSSE2|Win32 + {92BD50AA-04D6-4FBF-ACE1-468FAF6778F2}.ReleaseSSE2|Win32.Build.0 = ReleaseSSE2|Win32 + {E2DAB91A-8248-4625-8A85-2C2C2A390DD8}.Debug|Win32.ActiveCfg = Debug|Win32 + {E2DAB91A-8248-4625-8A85-2C2C2A390DD8}.Debug|Win32.Build.0 = Debug|Win32 + {E2DAB91A-8248-4625-8A85-2C2C2A390DD8}.Release|Win32.ActiveCfg = Release|Win32 + {E2DAB91A-8248-4625-8A85-2C2C2A390DD8}.Release|Win32.Build.0 = Release|Win32 + {E2DAB91A-8248-4625-8A85-2C2C2A390DD8}.ReleaseNASM|Win32.ActiveCfg = ReleaseNASM|Win32 + {E2DAB91A-8248-4625-8A85-2C2C2A390DD8}.ReleaseNASM|Win32.Build.0 = ReleaseNASM|Win32 + {E2DAB91A-8248-4625-8A85-2C2C2A390DD8}.ReleaseSSE2|Win32.ActiveCfg = ReleaseSSE2|Win32 + {E2DAB91A-8248-4625-8A85-2C2C2A390DD8}.ReleaseSSE2|Win32.Build.0 = ReleaseSSE2|Win32 + {C04BA4EA-F719-456D-A332-6C3AF92D7BEA}.Debug|Win32.ActiveCfg = Debug|Win32 + {C04BA4EA-F719-456D-A332-6C3AF92D7BEA}.Debug|Win32.Build.0 = Debug|Win32 + {C04BA4EA-F719-456D-A332-6C3AF92D7BEA}.Release|Win32.ActiveCfg = Release|Win32 + {C04BA4EA-F719-456D-A332-6C3AF92D7BEA}.Release|Win32.Build.0 = Release|Win32 + {C04BA4EA-F719-456D-A332-6C3AF92D7BEA}.ReleaseNASM|Win32.ActiveCfg = ReleaseNASM|Win32 + {C04BA4EA-F719-456D-A332-6C3AF92D7BEA}.ReleaseNASM|Win32.Build.0 = ReleaseNASM|Win32 + {C04BA4EA-F719-456D-A332-6C3AF92D7BEA}.ReleaseSSE2|Win32.ActiveCfg = ReleaseSSE2|Win32 + {C04BA4EA-F719-456D-A332-6C3AF92D7BEA}.ReleaseSSE2|Win32.Build.0 = ReleaseSSE2|Win32 + {E745EB1A-070A-45ED-B8BD-D9F794E23CFA}.Debug|Win32.ActiveCfg = Debug|Win32 + {E745EB1A-070A-45ED-B8BD-D9F794E23CFA}.Debug|Win32.Build.0 = Debug|Win32 + {E745EB1A-070A-45ED-B8BD-D9F794E23CFA}.Release|Win32.ActiveCfg = Release|Win32 + {E745EB1A-070A-45ED-B8BD-D9F794E23CFA}.Release|Win32.Build.0 = Release|Win32 + {E745EB1A-070A-45ED-B8BD-D9F794E23CFA}.ReleaseNASM|Win32.ActiveCfg = ReleaseNASM|Win32 + {E745EB1A-070A-45ED-B8BD-D9F794E23CFA}.ReleaseNASM|Win32.Build.0 = ReleaseNASM|Win32 + {E745EB1A-070A-45ED-B8BD-D9F794E23CFA}.ReleaseSSE2|Win32.ActiveCfg = ReleaseSSE2|Win32 + {E745EB1A-070A-45ED-B8BD-D9F794E23CFA}.ReleaseSSE2|Win32.Build.0 = ReleaseSSE2|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/vc_solution/vc9_lame_acm.vcproj b/vc_solution/vc9_lame_acm.vcproj new file mode 100644 index 0000000..9c4608b --- /dev/null +++ b/vc_solution/vc9_lame_acm.vcproj @@ -0,0 +1,433 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9,00" + Name="ACM" + ProjectGUID="{FC3D65E7-B7CB-406E-B6C9-0B26E30FE7F4}" + TargetFrameworkVersion="0" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Release|Win32" + ConfigurationType="2" + InheritedPropertySheets=".\vc9_lame_config.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="NDEBUG" + MkTypLibCompatible="true" + SuppressStartupBanner="true" + TargetEnvironment="1" + TypeLibraryName=".\..\output\Release/lameACM.tlb" + HeaderFileName="" + /> + <Tool + Name="VCCLCompilerTool" + InlineFunctionExpansion="2" + AdditionalIncludeDirectories="../include,../mpglib,../ACM,../ACM/ddk" + PreprocessorDefinitions="NDEBUG;_BLADEDLL;_WINDOWS;WIN32;LAME_ACM" + StringPooling="true" + RuntimeLibrary="2" + StructMemberAlignment="2" + TreatWChar_tAsBuiltInType="false" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="NDEBUG" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + IgnoreImportLibrary="true" + AdditionalDependencies="libmp3lame.lib url.lib winmm.lib" + OutputFile="..\output\Release\lameACM.acm" + LinkIncremental="1" + AdditionalLibraryDirectories="" + IgnoreAllDefaultLibraries="false" + ModuleDefinitionFile="..\ACM\lameACM.def" + SubSystem="2" + ImportLibrary="$(IntDir)/$(TargetName).lib" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + Description="ACM config files" + CommandLine="copy ..\ACM\lameacm.inf $(TargetDir)*.* copy ..\ACM\lame_acm.xml $(TargetDir)*.* " + /> + </Configuration> + <Configuration + Name="Debug|Win32" + ConfigurationType="2" + InheritedPropertySheets=".\vc9_lame_config.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="_DEBUG" + MkTypLibCompatible="true" + SuppressStartupBanner="true" + TargetEnvironment="1" + TypeLibraryName="..\output\Debug\lameACM.tlb" + HeaderFileName="" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="../include,../mpglib,../ACM,../ACM/ddk" + PreprocessorDefinitions="_DEBUG;_BLADEDLL;_WINDOWS;WIN32;LAME_ACM" + StringPooling="true" + RuntimeLibrary="3" + StructMemberAlignment="2" + TreatWChar_tAsBuiltInType="false" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="_DEBUG" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + IgnoreImportLibrary="true" + AdditionalDependencies="libmp3lame.lib url.lib winmm.lib" + OutputFile="..\output\Debug\lameACM.acm" + AdditionalLibraryDirectories="" + IgnoreAllDefaultLibraries="false" + ModuleDefinitionFile="..\ACM\lameACM.def" + GenerateDebugInformation="true" + SubSystem="2" + ImportLibrary="$(IntDir)/$(TargetName).lib" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + Description="ACM config files" + CommandLine="copy ..\ACM\lameacm.inf $(TargetDir)*.* copy ..\ACM\lame_acm.xml $(TargetDir)*.* " + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source" + Filter="c;cpp" + > + <File + RelativePath="..\ACM\ACM.cpp" + > + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\ACM\ACMStream.cpp" + > + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\ACM\AEncodeProperties.cpp" + > + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\ACM\DecodeStream.cpp" + > + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\ACM\lameACM.def" + > + <FileConfiguration + Name="Release|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\ACM\main.cpp" + > + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + </Filter> + <Filter + Name="Include" + Filter="h" + > + <File + RelativePath="..\ACM\ACM.h" + > + </File> + <File + RelativePath="..\ACM\ACMStream.h" + > + </File> + <File + RelativePath="..\ACM\adebug.h" + > + </File> + <File + RelativePath="..\ACM\AEncodeProperties.h" + > + </File> + <File + RelativePath="..\ACM\DecodeStream.h" + > + </File> + </Filter> + <Filter + Name="Resource" + Filter="rc" + > + <File + RelativePath="..\ACM\acm.rc" + > + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\ACM\lame.ico" + > + </File> + </Filter> + <Filter + Name="Install" + Filter="inf;acm" + > + <File + RelativePath="..\ACM\LameACM.inf" + > + </File> + </Filter> + <File + RelativePath="..\ACM\readme.txt" + > + <FileConfiguration + Name="Release|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\ACM\TODO" + > + <FileConfiguration + Name="Release|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/vc_solution/vc9_lame_acm_adbg.vcproj b/vc_solution/vc9_lame_acm_adbg.vcproj new file mode 100644 index 0000000..0f6b75c --- /dev/null +++ b/vc_solution/vc9_lame_acm_adbg.vcproj @@ -0,0 +1,178 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9,00" + Name="ACM ADbg" + ProjectGUID="{0D7CAB1B-AE57-4BA1-BDBF-D7391AAA81AA}" + TargetFrameworkVersion="0" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + ConfigurationType="4" + InheritedPropertySheets=".\vc9_lame_config.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS" + StringPooling="true" + RuntimeLibrary="3" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + Culture="1036" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + OutputFile="$(IntDir)\$(ProjectName).lib" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + ConfigurationType="4" + InheritedPropertySheets=".\vc9_lame_config.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="2" + InlineFunctionExpansion="1" + PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS" + StringPooling="true" + RuntimeLibrary="2" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + Culture="1036" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + OutputFile="$(IntDir)\$(ProjectName).lib" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Sources" + Filter="cpp" + > + <File + RelativePath="..\ACM\ADbg\ADbg.cpp" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + </Filter> + <Filter + Name="Headers" + Filter="h" + > + <File + RelativePath="..\ACM\ADbg\ADbg.h" + > + </File> + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/vc_solution/vc9_lame_acm_tinyxml.vcproj b/vc_solution/vc9_lame_acm_tinyxml.vcproj new file mode 100644 index 0000000..3072ddd --- /dev/null +++ b/vc_solution/vc9_lame_acm_tinyxml.vcproj @@ -0,0 +1,250 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9,00" + Name="ACM tinyxml" + ProjectGUID="{30219289-3B7F-4E02-BC34-C1DBD08CD848}" + TargetFrameworkVersion="0" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Release|Win32" + ConfigurationType="4" + InheritedPropertySheets=".\vc9_lame_config.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="2" + InlineFunctionExpansion="1" + PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS" + StringPooling="true" + RuntimeLibrary="2" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="NDEBUG" + Culture="1036" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + OutputFile="$(IntDir)\$(ProjectName).lib" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Debug|Win32" + ConfigurationType="4" + InheritedPropertySheets=".\vc9_lame_config.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS" + StringPooling="true" + RuntimeLibrary="3" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="_DEBUG" + Culture="1036" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + OutputFile="$(IntDir)\$(ProjectName).lib" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <File + RelativePath="..\ACM\tinyxml\changes.txt" + > + <FileConfiguration + Name="Release|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\ACM\tinyxml\readme.txt" + > + <FileConfiguration + Name="Release|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\ACM\tinyxml\tinyxml.cpp" + > + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\ACM\tinyxml\tinyxml.h" + > + </File> + <File + RelativePath="..\ACM\tinyxml\tinyxmlerror.cpp" + > + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\ACM\tinyxml\tinyxmlparser.cpp" + > + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/vc_solution/vc9_lame_clients.sln b/vc_solution/vc9_lame_clients.sln new file mode 100644 index 0000000..4bf6277 --- /dev/null +++ b/vc_solution/vc9_lame_clients.sln @@ -0,0 +1,103 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual C++ Express 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ACM ADbg", "vc9_lame_acm_adbg.vcproj", "{0D7CAB1B-AE57-4BA1-BDBF-D7391AAA81AA}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ACM tinyxml", "vc9_lame_acm_tinyxml.vcproj", "{30219289-3B7F-4E02-BC34-C1DBD08CD848}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ACM", "vc9_lame_acm.vcproj", "{FC3D65E7-B7CB-406E-B6C9-0B26E30FE7F4}" + ProjectSection(ProjectDependencies) = postProject + {0D7CAB1B-AE57-4BA1-BDBF-D7391AAA81AA} = {0D7CAB1B-AE57-4BA1-BDBF-D7391AAA81AA} + {30219289-3B7F-4E02-BC34-C1DBD08CD848} = {30219289-3B7F-4E02-BC34-C1DBD08CD848} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DShow", "vc9_lame_dshow.vcproj", "{6D348A4E-8B40-4FB0-BB57-C982D51FFA01}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lame_enc_dll", "vc9_lame_dll.vcproj", "{0E4820D3-DBE3-477A-910B-7C020D6066D1}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lame_enc_dll_example", "vc9_lame_dll_example.vcproj", "{D169F06E-6607-4A9F-A075-2335717B9AB5}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lame_test", "vc9_lame_test.vcproj", "{2FE9808B-2B03-48D9-94FC-6C907D39E2AC}" + ProjectSection(ProjectDependencies) = postProject + {92BD50AA-04D6-4FBF-ACE1-468FAF6778F2} = {92BD50AA-04D6-4FBF-ACE1-468FAF6778F2} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmp3lameDLL", "vc9_libmp3lame_dll.vcproj", "{92BD50AA-04D6-4FBF-ACE1-468FAF6778F2}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + ReleaseNASM|Win32 = ReleaseNASM|Win32 + ReleaseSSE2|Win32 = ReleaseSSE2|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0D7CAB1B-AE57-4BA1-BDBF-D7391AAA81AA}.Debug|Win32.ActiveCfg = Debug|Win32 + {0D7CAB1B-AE57-4BA1-BDBF-D7391AAA81AA}.Debug|Win32.Build.0 = Debug|Win32 + {0D7CAB1B-AE57-4BA1-BDBF-D7391AAA81AA}.Release|Win32.ActiveCfg = Release|Win32 + {0D7CAB1B-AE57-4BA1-BDBF-D7391AAA81AA}.Release|Win32.Build.0 = Release|Win32 + {0D7CAB1B-AE57-4BA1-BDBF-D7391AAA81AA}.ReleaseNASM|Win32.ActiveCfg = Release|Win32 + {0D7CAB1B-AE57-4BA1-BDBF-D7391AAA81AA}.ReleaseNASM|Win32.Build.0 = Release|Win32 + {0D7CAB1B-AE57-4BA1-BDBF-D7391AAA81AA}.ReleaseSSE2|Win32.ActiveCfg = Release|Win32 + {0D7CAB1B-AE57-4BA1-BDBF-D7391AAA81AA}.ReleaseSSE2|Win32.Build.0 = Release|Win32 + {30219289-3B7F-4E02-BC34-C1DBD08CD848}.Debug|Win32.ActiveCfg = Debug|Win32 + {30219289-3B7F-4E02-BC34-C1DBD08CD848}.Debug|Win32.Build.0 = Debug|Win32 + {30219289-3B7F-4E02-BC34-C1DBD08CD848}.Release|Win32.ActiveCfg = Release|Win32 + {30219289-3B7F-4E02-BC34-C1DBD08CD848}.Release|Win32.Build.0 = Release|Win32 + {30219289-3B7F-4E02-BC34-C1DBD08CD848}.ReleaseNASM|Win32.ActiveCfg = Release|Win32 + {30219289-3B7F-4E02-BC34-C1DBD08CD848}.ReleaseNASM|Win32.Build.0 = Release|Win32 + {30219289-3B7F-4E02-BC34-C1DBD08CD848}.ReleaseSSE2|Win32.ActiveCfg = Release|Win32 + {30219289-3B7F-4E02-BC34-C1DBD08CD848}.ReleaseSSE2|Win32.Build.0 = Release|Win32 + {FC3D65E7-B7CB-406E-B6C9-0B26E30FE7F4}.Debug|Win32.ActiveCfg = Debug|Win32 + {FC3D65E7-B7CB-406E-B6C9-0B26E30FE7F4}.Debug|Win32.Build.0 = Debug|Win32 + {FC3D65E7-B7CB-406E-B6C9-0B26E30FE7F4}.Release|Win32.ActiveCfg = Release|Win32 + {FC3D65E7-B7CB-406E-B6C9-0B26E30FE7F4}.Release|Win32.Build.0 = Release|Win32 + {FC3D65E7-B7CB-406E-B6C9-0B26E30FE7F4}.ReleaseNASM|Win32.ActiveCfg = Release|Win32 + {FC3D65E7-B7CB-406E-B6C9-0B26E30FE7F4}.ReleaseNASM|Win32.Build.0 = Release|Win32 + {FC3D65E7-B7CB-406E-B6C9-0B26E30FE7F4}.ReleaseSSE2|Win32.ActiveCfg = Release|Win32 + {FC3D65E7-B7CB-406E-B6C9-0B26E30FE7F4}.ReleaseSSE2|Win32.Build.0 = Release|Win32 + {6D348A4E-8B40-4FB0-BB57-C982D51FFA01}.Debug|Win32.ActiveCfg = Debug|Win32 + {6D348A4E-8B40-4FB0-BB57-C982D51FFA01}.Debug|Win32.Build.0 = Debug|Win32 + {6D348A4E-8B40-4FB0-BB57-C982D51FFA01}.Release|Win32.ActiveCfg = Release|Win32 + {6D348A4E-8B40-4FB0-BB57-C982D51FFA01}.Release|Win32.Build.0 = Release|Win32 + {6D348A4E-8B40-4FB0-BB57-C982D51FFA01}.ReleaseNASM|Win32.ActiveCfg = Release|Win32 + {6D348A4E-8B40-4FB0-BB57-C982D51FFA01}.ReleaseNASM|Win32.Build.0 = Release|Win32 + {6D348A4E-8B40-4FB0-BB57-C982D51FFA01}.ReleaseSSE2|Win32.ActiveCfg = Release|Win32 + {6D348A4E-8B40-4FB0-BB57-C982D51FFA01}.ReleaseSSE2|Win32.Build.0 = Release|Win32 + {0E4820D3-DBE3-477A-910B-7C020D6066D1}.Debug|Win32.ActiveCfg = Debug|Win32 + {0E4820D3-DBE3-477A-910B-7C020D6066D1}.Debug|Win32.Build.0 = Debug|Win32 + {0E4820D3-DBE3-477A-910B-7C020D6066D1}.Release|Win32.ActiveCfg = Release|Win32 + {0E4820D3-DBE3-477A-910B-7C020D6066D1}.Release|Win32.Build.0 = Release|Win32 + {0E4820D3-DBE3-477A-910B-7C020D6066D1}.ReleaseNASM|Win32.ActiveCfg = Release|Win32 + {0E4820D3-DBE3-477A-910B-7C020D6066D1}.ReleaseNASM|Win32.Build.0 = Release|Win32 + {0E4820D3-DBE3-477A-910B-7C020D6066D1}.ReleaseSSE2|Win32.ActiveCfg = Release|Win32 + {0E4820D3-DBE3-477A-910B-7C020D6066D1}.ReleaseSSE2|Win32.Build.0 = Release|Win32 + {D169F06E-6607-4A9F-A075-2335717B9AB5}.Debug|Win32.ActiveCfg = Debug|Win32 + {D169F06E-6607-4A9F-A075-2335717B9AB5}.Debug|Win32.Build.0 = Debug|Win32 + {D169F06E-6607-4A9F-A075-2335717B9AB5}.Release|Win32.ActiveCfg = Release|Win32 + {D169F06E-6607-4A9F-A075-2335717B9AB5}.Release|Win32.Build.0 = Release|Win32 + {D169F06E-6607-4A9F-A075-2335717B9AB5}.ReleaseNASM|Win32.ActiveCfg = Release|Win32 + {D169F06E-6607-4A9F-A075-2335717B9AB5}.ReleaseNASM|Win32.Build.0 = Release|Win32 + {D169F06E-6607-4A9F-A075-2335717B9AB5}.ReleaseSSE2|Win32.ActiveCfg = Release|Win32 + {D169F06E-6607-4A9F-A075-2335717B9AB5}.ReleaseSSE2|Win32.Build.0 = Release|Win32 + {2FE9808B-2B03-48D9-94FC-6C907D39E2AC}.Debug|Win32.ActiveCfg = Debug|Win32 + {2FE9808B-2B03-48D9-94FC-6C907D39E2AC}.Debug|Win32.Build.0 = Debug|Win32 + {2FE9808B-2B03-48D9-94FC-6C907D39E2AC}.Release|Win32.ActiveCfg = Release|Win32 + {2FE9808B-2B03-48D9-94FC-6C907D39E2AC}.Release|Win32.Build.0 = Release|Win32 + {2FE9808B-2B03-48D9-94FC-6C907D39E2AC}.ReleaseNASM|Win32.ActiveCfg = Release|Win32 + {2FE9808B-2B03-48D9-94FC-6C907D39E2AC}.ReleaseNASM|Win32.Build.0 = Release|Win32 + {2FE9808B-2B03-48D9-94FC-6C907D39E2AC}.ReleaseSSE2|Win32.ActiveCfg = Release|Win32 + {2FE9808B-2B03-48D9-94FC-6C907D39E2AC}.ReleaseSSE2|Win32.Build.0 = Release|Win32 + {92BD50AA-04D6-4FBF-ACE1-468FAF6778F2}.Debug|Win32.ActiveCfg = Debug|Win32 + {92BD50AA-04D6-4FBF-ACE1-468FAF6778F2}.Debug|Win32.Build.0 = Debug|Win32 + {92BD50AA-04D6-4FBF-ACE1-468FAF6778F2}.Release|Win32.ActiveCfg = Release|Win32 + {92BD50AA-04D6-4FBF-ACE1-468FAF6778F2}.Release|Win32.Build.0 = Release|Win32 + {92BD50AA-04D6-4FBF-ACE1-468FAF6778F2}.ReleaseNASM|Win32.ActiveCfg = ReleaseNASM|Win32 + {92BD50AA-04D6-4FBF-ACE1-468FAF6778F2}.ReleaseNASM|Win32.Build.0 = ReleaseNASM|Win32 + {92BD50AA-04D6-4FBF-ACE1-468FAF6778F2}.ReleaseSSE2|Win32.ActiveCfg = ReleaseSSE2|Win32 + {92BD50AA-04D6-4FBF-ACE1-468FAF6778F2}.ReleaseSSE2|Win32.Build.0 = ReleaseSSE2|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/vc_solution/vc9_lame_config.vsprops b/vc_solution/vc9_lame_config.vsprops new file mode 100644 index 0000000..cbb7dcc --- /dev/null +++ b/vc_solution/vc9_lame_config.vsprops @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioPropertySheet + ProjectType="Visual C++" + Version="8.00" + Name="vc9_lame_config" + OutputDirectory="$(SolutionDir)..\output\$(ConfigurationName)" + IntermediateDirectory="$(SolutionDir)..\obj\$(ConfigurationName)\$(ProjectName)" + > + <Tool + Name="VCBscMakeTool" + OutputFile="$(IntDir)/$(ProjectName).bsc" + /> + <Tool + Name="VCCLCompilerTool" + PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATED" + StringPooling="true" + EnableFunctionLevelLinking="true" + AssemblerListingLocation="$(IntDir)\" + BrowseInformation="1" + WarningLevel="4" + DisableSpecificWarnings="4995;4996" + /> + <Tool + Name="VCLinkerTool" + LinkIncremental="1" + AdditionalLibraryDirectories="$(OutDir)" + ProgramDatabaseFile="$(OutDir)/$(TargetName).pdb" + OptimizeReferences="2" + /> +</VisualStudioPropertySheet> diff --git a/vc_solution/vc9_lame_dll.vcproj b/vc_solution/vc9_lame_dll.vcproj new file mode 100644 index 0000000..e7ca678 --- /dev/null +++ b/vc_solution/vc9_lame_dll.vcproj @@ -0,0 +1,243 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9,00" + Name="lame_enc_dll" + ProjectGUID="{0E4820D3-DBE3-477A-910B-7C020D6066D1}" + RootNamespace="lame_enc_dll" + TargetFrameworkVersion="0" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + ConfigurationType="2" + InheritedPropertySheets=".\vc9_lame_config.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + CharacterSet="2" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="_DEBUG" + MkTypLibCompatible="true" + SuppressStartupBanner="true" + TargetEnvironment="1" + TypeLibraryName="..\output\Debug/LameDll.tlb" + HeaderFileName="" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="../include" + PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LAMEMP3ENCDLL_EXPORTS" + StringPooling="true" + RuntimeLibrary="3" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="_DEBUG" + Culture="1036" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="libmp3lame.lib odbc32.lib odbccp32.lib" + OutputFile="..\output\Debug\lame_enc.dll" + AdditionalLibraryDirectories="" + GenerateDebugInformation="true" + ImportLibrary="$(OutDir)/lame_enc.lib" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + ConfigurationType="2" + InheritedPropertySheets=".\vc9_lame_config.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + CharacterSet="2" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="NDEBUG" + MkTypLibCompatible="true" + SuppressStartupBanner="true" + TargetEnvironment="1" + TypeLibraryName="..\output\Release/LameDll.tlb" + HeaderFileName="" + /> + <Tool + Name="VCCLCompilerTool" + InlineFunctionExpansion="2" + AdditionalIncludeDirectories="../include" + PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LAMEMP3ENCDLL_EXPORTS" + StringPooling="true" + RuntimeLibrary="2" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="NDEBUG" + Culture="1036" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="libmp3lame.lib" + OutputFile="..\output\Release\lame_enc.dll" + LinkIncremental="1" + AdditionalLibraryDirectories="" + ImportLibrary="$(OutDir)/lame_enc.lib" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" + > + <File + RelativePath="..\Dll\BladeMP3EncDLL.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\Dll\BladeMP3EncDLL.def" + > + <FileConfiguration + Name="Debug|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl" + > + <File + RelativePath="..\Dll\BladeMP3EncDLL.h" + > + </File> + </Filter> + <Filter + Name="Resource Files" + Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" + > + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/vc_solution/vc9_lame_dll_example.vcproj b/vc_solution/vc9_lame_dll_example.vcproj new file mode 100644 index 0000000..9655c4a --- /dev/null +++ b/vc_solution/vc9_lame_dll_example.vcproj @@ -0,0 +1,187 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9,00" + Name="lame_enc_dll_example" + ProjectGUID="{D169F06E-6607-4A9F-A075-2335717B9AB5}" + RootNamespace="lame_enc_dll_example" + TargetFrameworkVersion="0" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Release|Win32" + ConfigurationType="1" + InheritedPropertySheets=".\vc9_lame_config.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + CharacterSet="2" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + TypeLibraryName="..\obj\Release\LameMp3EncDll/Example.tlb" + HeaderFileName="" + /> + <Tool + Name="VCCLCompilerTool" + InlineFunctionExpansion="2" + PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE" + StringPooling="true" + RuntimeLibrary="2" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="NDEBUG" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalLibraryDirectories="" + SubSystem="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Debug|Win32" + ConfigurationType="1" + InheritedPropertySheets=".\vc9_lame_config.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + CharacterSet="2" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + TypeLibraryName="..\obj\Debug\LameMp3EncDll/Example.tlb" + HeaderFileName="" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE" + StringPooling="true" + RuntimeLibrary="3" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="_DEBUG" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalLibraryDirectories="" + GenerateDebugInformation="true" + SubSystem="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <File + RelativePath="..\Dll\Example.cpp" + > + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/vc_solution/vc9_lame_dshow.vcproj b/vc_solution/vc9_lame_dshow.vcproj new file mode 100644 index 0000000..9480419 --- /dev/null +++ b/vc_solution/vc9_lame_dshow.vcproj @@ -0,0 +1,487 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9,00" + Name="DShow" + ProjectGUID="{6D348A4E-8B40-4FB0-BB57-C982D51FFA01}" + TargetFrameworkVersion="0" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + ConfigurationType="2" + InheritedPropertySheets=".\vc9_lame_config.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="_DEBUG" + MkTypLibCompatible="true" + SuppressStartupBanner="true" + TargetEnvironment="1" + TypeLibraryName="..\obj\Debug/dshow.tlb" + HeaderFileName="" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="..\include,..\DShow" + PreprocessorDefinitions="DEBUG;INC_OLE2;WINVER=0x0400;_X86_=1;STRICT;_WINDOWS;WIN32;STDC_HEADERS" + StringPooling="true" + RuntimeLibrary="3" + DebugInformationFormat="3" + CallingConvention="2" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="_DEBUG" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + IgnoreImportLibrary="true" + AdditionalDependencies="libmp3lame.lib ..\DShow\strmbasD.lib vfw32.lib winmm.lib version.lib Comdlg32.lib comctl32.lib quartz.lib msvcrtd.lib" + OutputFile="..\output\Debug\lame.ax" + AdditionalLibraryDirectories="" + IgnoreAllDefaultLibraries="true" + ModuleDefinitionFile="..\DShow\Mpegac.def" + GenerateDebugInformation="true" + SubSystem="2" + EntryPointSymbol="DllEntryPoint@12" + BaseAddress="0x1c400000" + RandomizedBaseAddress="1" + ImportLibrary="$(IntDir)/$(TargetName).lib" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + ConfigurationType="2" + InheritedPropertySheets=".\vc9_lame_config.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="NDEBUG" + MkTypLibCompatible="true" + TargetEnvironment="1" + TypeLibraryName="..\obj\Release/dshow.tlb" + HeaderFileName="" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="2" + InlineFunctionExpansion="1" + AdditionalIncludeDirectories="../include,../DShow" + PreprocessorDefinitions="NDEBUG;INC_OLE2;STRICT;WINVER=0x0400;_X86_=1;_WINDOWS;WIN32;STDC_HEADERS" + StringPooling="true" + RuntimeLibrary="2" + CallingConvention="2" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="NDEBUG" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + IgnoreImportLibrary="true" + AdditionalDependencies="libmp3lame.lib ..\DShow\strmbase.lib vfw32.lib winmm.lib version.lib Comdlg32.lib comctl32.lib quartz.lib msvcrt.lib" + OutputFile="..\output\Release\lame.ax" + Version="0.3" + LinkIncremental="1" + AdditionalLibraryDirectories="" + IgnoreAllDefaultLibraries="true" + ModuleDefinitionFile="..\DShow\Mpegac.def" + SubSystem="2" + EntryPointSymbol="DllEntryPoint@12" + BaseAddress="0x1c400000" + RandomizedBaseAddress="1" + ImportLibrary="$(IntDir)/$(TargetName).lib" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90" + > + <File + RelativePath="..\DShow\aboutprp.cpp" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\DShow\Encoder.cpp" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\DShow\Mpegac.cpp" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\DShow\Mpegac.def" + > + </File> + <File + RelativePath="..\DShow\Property.rc" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\DShow\PropPage.cpp" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\DShow\PropPage_adv.cpp" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\DShow\REG.CPP" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl;fi;fd" + > + <File + RelativePath="..\DShow\aboutprp.h" + > + </File> + <File + RelativePath="..\DShow\Encoder.h" + > + </File> + <File + RelativePath="..\DShow\iaudioprops.h" + > + </File> + <File + RelativePath="..\DShow\Mpegac.h" + > + </File> + <File + RelativePath="..\DShow\PropPage.h" + > + </File> + <File + RelativePath="..\DShow\PropPage_adv.h" + > + </File> + <File + RelativePath="..\DShow\reg.h" + > + </File> + <File + RelativePath="..\DShow\resource.h" + > + </File> + <File + RelativePath="..\DShow\uids.h" + > + </File> + </Filter> + <Filter + Name="Resource Files" + Filter="ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe" + > + <File + RelativePath="..\DShow\elogo.ico" + > + </File> + </Filter> + <File + RelativePath="..\include\lame.h" + > + <FileConfiguration + Name="Debug|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\output\libmp3lame-dynamic.lib" + > + <FileConfiguration + Name="Debug|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\DShow\README" + > + <FileConfiguration + Name="Debug|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\DShow\STRMBASE.lib" + > + <FileConfiguration + Name="Debug|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/vc_solution/vc9_lame_lame.vcproj b/vc_solution/vc9_lame_lame.vcproj new file mode 100644 index 0000000..87a8faa --- /dev/null +++ b/vc_solution/vc9_lame_lame.vcproj @@ -0,0 +1,383 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9,00" + Name="app lame" + ProjectGUID="{EEF5B49E-DBD1-4E1B-8B86-C5D64FCBAD38}" + RootNamespace="lame" + TargetFrameworkVersion="0" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="ReleaseNASM|Win32" + ConfigurationType="1" + InheritedPropertySheets=".\vc9_lame_config.vsprops;.\arch_nasm.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + TypeLibraryName="..\output\ReleaseNASM/lame.tlb" + HeaderFileName="" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="3" + InlineFunctionExpansion="2" + EnableIntrinsicFunctions="true" + FavorSizeOrSpeed="1" + AdditionalIncludeDirectories="..,../mpglib,../libmp3lame,../include,../" + PreprocessorDefinitions="NDEBUG;WIN32;_WIN32;_CONSOLE;_WINDOWS;HAVE_MPGLIB;HAVE_CONFIG_H;HAVE_NASM;MMX_choose_table" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="NDEBUG;_APP=$(TargetFileName)" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + OutputFile="$(OutDir)\lame.exe" + SubSystem="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Debug|Win32" + ConfigurationType="1" + InheritedPropertySheets=".\vc9_lame_config.vsprops;.\arch_x87.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + TypeLibraryName="..\output\Debug/lame.tlb" + HeaderFileName="" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="../,../mpglib,../libmp3lame,../include" + PreprocessorDefinitions="_DEBUG;WIN32;_WIN32;_CONSOLE;_WINDOWS;HAVE_MPGLIB;HAVE_CONFIG_H" + RuntimeLibrary="1" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="_DEBUG;_APP=$(TargetFileName)" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + OutputFile="$(OutDir)\lame.exe" + GenerateDebugInformation="true" + SubSystem="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + ConfigurationType="1" + InheritedPropertySheets=".\vc9_lame_config.vsprops;.\arch_x87.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + TypeLibraryName="..\output\Release/lame.tlb" + HeaderFileName="" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="3" + InlineFunctionExpansion="2" + EnableIntrinsicFunctions="true" + FavorSizeOrSpeed="1" + AdditionalIncludeDirectories="..,../mpglib,../libmp3lame,../include,../" + PreprocessorDefinitions="NDEBUG;WIN32;_WIN32;_CONSOLE;_WINDOWS;HAVE_MPGLIB;HAVE_CONFIG_H" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="NDEBUG;_APP=$(TargetFileName)" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + OutputFile="$(OutDir)\lame.exe" + SubSystem="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="ReleaseSSE2|Win32" + ConfigurationType="1" + InheritedPropertySheets=".\vc9_lame_config.vsprops;.\arch_sse2.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + TypeLibraryName="..\output\Release/lame.tlb" + HeaderFileName="" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="3" + InlineFunctionExpansion="2" + EnableIntrinsicFunctions="true" + FavorSizeOrSpeed="1" + AdditionalIncludeDirectories="..,../mpglib,../libmp3lame,../include,../" + PreprocessorDefinitions="NDEBUG;WIN32;_WIN32;_CONSOLE;_WINDOWS;HAVE_MPGLIB;HAVE_CONFIG_H" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="NDEBUG;_APP=$(TargetFileName)" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + OutputFile="$(OutDir)\lame.exe" + SubSystem="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" + > + <File + RelativePath="..\frontend\brhist.c" + > + </File> + <File + RelativePath="..\frontend\console.c" + > + </File> + <File + RelativePath="..\frontend\get_audio.c" + > + </File> + <File + RelativePath="..\frontend\lame_main.c" + > + </File> + <File + RelativePath="..\frontend\lametime.c" + > + </File> + <File + RelativePath="..\frontend\main.c" + > + </File> + <File + RelativePath="..\frontend\parse.c" + > + </File> + <File + RelativePath="..\frontend\timestatus.c" + > + </File> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl" + > + <File + RelativePath="..\frontend\brhist.h" + > + </File> + <File + RelativePath="..\frontend\console.h" + > + </File> + <File + RelativePath="..\frontend\get_audio.h" + > + </File> + <File + RelativePath="..\frontend\lametime.h" + > + </File> + <File + RelativePath="..\frontend\main.h" + > + </File> + <File + RelativePath="..\frontend\parse.h" + > + </File> + <File + RelativePath="..\frontend\timestatus.h" + > + </File> + </Filter> + <File + RelativePath="..\libmp3lame\lame.rc" + > + </File> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/vc_solution/vc9_lame_mp3rtp.vcproj b/vc_solution/vc9_lame_mp3rtp.vcproj new file mode 100644 index 0000000..cb82813 --- /dev/null +++ b/vc_solution/vc9_lame_mp3rtp.vcproj @@ -0,0 +1,395 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9,00" + Name="app mp3rtp" + ProjectGUID="{C04BA4EA-F719-456D-A332-6C3AF92D7BEA}" + RootNamespace="mp3rtp" + TargetFrameworkVersion="0" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="ReleaseNASM|Win32" + ConfigurationType="1" + InheritedPropertySheets=".\vc9_lame_config.vsprops;.\arch_nasm.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + TypeLibraryName="..\output\ReleaseNASM/mp3rtp.tlb" + HeaderFileName="" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="3" + InlineFunctionExpansion="2" + EnableIntrinsicFunctions="true" + FavorSizeOrSpeed="1" + AdditionalIncludeDirectories="..,../mpglib,../libmp3lame,../include,../" + PreprocessorDefinitions="NDEBUG;WIN32;_WIN32;_CONSOLE;_WINDOWS;HAVE_MPGLIB;HAVE_CONFIG_H;HAVE_NASM;MMX_choose_table" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="NDEBUG;_APP=$(TargetFileName)" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="wsock32.lib" + OutputFile="$(OutDir)\mp3rtp.exe" + SubSystem="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Debug|Win32" + ConfigurationType="1" + InheritedPropertySheets=".\vc9_lame_config.vsprops;.\arch_x87.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + TypeLibraryName="..\output\Debug/mp3rtp.tlb" + HeaderFileName="" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="../,../mpglib,../libmp3lame,../include" + PreprocessorDefinitions="_DEBUG;WIN32;_WIN32;_CONSOLE;_WINDOWS;HAVE_MPGLIB;HAVE_CONFIG_H" + RuntimeLibrary="1" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="_DEBUG;_APP=$(TargetFileName)" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="wsock32.lib" + OutputFile="$(OutDir)\mp3rtp.exe" + GenerateDebugInformation="true" + SubSystem="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + ConfigurationType="1" + InheritedPropertySheets=".\vc9_lame_config.vsprops;.\arch_x87.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + TypeLibraryName="..\output\Release/mp3rtp.tlb" + HeaderFileName="" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="3" + InlineFunctionExpansion="2" + EnableIntrinsicFunctions="true" + FavorSizeOrSpeed="1" + AdditionalIncludeDirectories="..,../mpglib,../libmp3lame,../include,../" + PreprocessorDefinitions="NDEBUG;WIN32;_WIN32;_CONSOLE;_WINDOWS;HAVE_MPGLIB;HAVE_CONFIG_H" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="NDEBUG;_APP=$(TargetFileName)" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="wsock32.lib" + OutputFile="$(OutDir)\mp3rtp.exe" + SubSystem="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="ReleaseSSE2|Win32" + ConfigurationType="1" + InheritedPropertySheets=".\vc9_lame_config.vsprops;.\arch_sse2.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + TypeLibraryName="..\output\Release/mp3rtp.tlb" + HeaderFileName="" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="3" + InlineFunctionExpansion="2" + EnableIntrinsicFunctions="true" + FavorSizeOrSpeed="1" + AdditionalIncludeDirectories="..,../mpglib,../libmp3lame,../include,../" + PreprocessorDefinitions="NDEBUG;WIN32;_WIN32;_CONSOLE;_WINDOWS;HAVE_MPGLIB;HAVE_CONFIG_H" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="NDEBUG;_APP=$(TargetFileName)" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="wsock32.lib" + OutputFile="$(OutDir)\mp3rtp.exe" + SubSystem="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" + > + <File + RelativePath="..\frontend\brhist.c" + > + </File> + <File + RelativePath="..\frontend\console.c" + > + </File> + <File + RelativePath="..\frontend\get_audio.c" + > + </File> + <File + RelativePath="..\frontend\lametime.c" + > + </File> + <File + RelativePath="..\frontend\main.c" + > + </File> + <File + RelativePath="..\frontend\mp3rtp.c" + > + </File> + <File + RelativePath="..\frontend\parse.c" + > + </File> + <File + RelativePath="..\frontend\rtp.c" + > + </File> + <File + RelativePath="..\frontend\timestatus.c" + > + </File> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl" + > + <File + RelativePath="..\frontend\brhist.h" + > + </File> + <File + RelativePath="..\frontend\console.h" + > + </File> + <File + RelativePath="..\frontend\get_audio.h" + > + </File> + <File + RelativePath="..\frontend\lametime.h" + > + </File> + <File + RelativePath="..\frontend\main.h" + > + </File> + <File + RelativePath="..\frontend\parse.h" + > + </File> + <File + RelativePath="..\frontend\rtp.h" + > + </File> + <File + RelativePath="..\frontend\timestatus.h" + > + </File> + </Filter> + <File + RelativePath="..\libmp3lame\lame.rc" + > + </File> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/vc_solution/vc9_lame_mp3x.vcproj b/vc_solution/vc9_lame_mp3x.vcproj new file mode 100644 index 0000000..86844ef --- /dev/null +++ b/vc_solution/vc9_lame_mp3x.vcproj @@ -0,0 +1,421 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9,00" + Name="app mp3x" + ProjectGUID="{E745EB1A-070A-45ED-B8BD-D9F794E23CFA}" + RootNamespace="mp3x" + TargetFrameworkVersion="0" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="ReleaseNASM|Win32" + ConfigurationType="1" + InheritedPropertySheets=".\vc9_lame_config.vsprops;.\arch_nasm.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + CharacterSet="2" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + TypeLibraryName="..\output\ReleaseNASM/mp3x.tlb" + HeaderFileName="" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="3" + InlineFunctionExpansion="2" + EnableIntrinsicFunctions="true" + FavorSizeOrSpeed="1" + AdditionalIncludeDirectories="./WinGTK/gtk-plus,./WinGTK/glib-1.2,./WinGtk/src/gtk+,./WinGtk/src/glib,./WinGtk/src/gtk+/gdk,../include,../libmp3lame,../mp3x,../frontend,.." + PreprocessorDefinitions="NDEBUG;LAMEPARSE;WIN32;_CONSOLE;HAVE_MPGLIB;LAMESNDFILE;BRHIST;HAVE_CONFIG_H" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="NDEBUG;_APP=$(TargetFileName)" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="odbc32.lib odbccp32.lib gdk-1.3.lib gtk-1.3.lib glib-1.3.lib" + OutputFile="$(OutDir)\mp3x.exe" + AdditionalLibraryDirectories="./WinGtk/src/gtk+/gtk,./WinGtk/src/gtk+/gdk,./WinGtk/src/glib" + GenerateMapFile="true" + MapFileName="..\obj\ReleaseNASM\frontend/mp3x.map" + SubSystem="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Debug|Win32" + ConfigurationType="1" + InheritedPropertySheets=".\vc9_lame_config.vsprops;.\arch_x87.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + CharacterSet="2" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + TypeLibraryName="..\output\Debug/mp3x.tlb" + HeaderFileName="" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="./WinGtk/src/gtk+,./WinGtk/src/glib,./WinGtk/src/gtk+/gdk,../include,../libmp3lame,../mp3x,../frontend,.." + PreprocessorDefinitions="LAMESNDFILE;BRHIST;_DEBUG;WIN32;_CONSOLE;HAVE_MPGLIB;HAVE_CONFIG_H" + RuntimeLibrary="1" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="_DEBUG" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="odbc32.lib odbccp32.lib gdk-1.3.lib gtk-1.3.lib glib-1.3.lib" + OutputFile="$(OutDir)\mp3x.exe" + AdditionalLibraryDirectories="./WinGtk/src/gtk+/gtk,./WinGtk/src/gtk+/gdk,./WinGtk/src/glib" + GenerateDebugInformation="true" + SubSystem="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + ConfigurationType="1" + InheritedPropertySheets=".\vc9_lame_config.vsprops;.\arch_x87.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + CharacterSet="2" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + TypeLibraryName="..\output\Release/mp3x.tlb" + HeaderFileName="" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="3" + InlineFunctionExpansion="2" + EnableIntrinsicFunctions="true" + FavorSizeOrSpeed="1" + AdditionalIncludeDirectories="./WinGTK/gtk-plus,./WinGTK/glib-1.2,./WinGtk/src/gtk+,./WinGtk/src/glib,./WinGtk/src/gtk+/gdk,../include,../libmp3lame,../mp3x,../frontend,.." + PreprocessorDefinitions="NDEBUG;LAMEPARSE;WIN32;_CONSOLE;HAVE_MPGLIB;LAMESNDFILE;BRHIST;HAVE_CONFIG_H" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="NDEBUG" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="odbc32.lib odbccp32.lib gdk-1.3.lib gtk-1.3.lib glib-1.3.lib" + OutputFile="$(OutDir)\mp3x.exe" + AdditionalLibraryDirectories="./WinGtk/src/gtk+/gtk,./WinGtk/src/gtk+/gdk,./WinGtk/src/glib" + GenerateMapFile="true" + MapFileName="..\obj\Release\frontend/mp3x.map" + SubSystem="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="ReleaseSSE2|Win32" + ConfigurationType="1" + InheritedPropertySheets=".\vc9_lame_config.vsprops;.\arch_sse2.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + CharacterSet="2" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + TypeLibraryName="..\output\ReleaseSSE2/mp3x.tlb" + HeaderFileName="" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="3" + InlineFunctionExpansion="2" + EnableIntrinsicFunctions="true" + FavorSizeOrSpeed="1" + AdditionalIncludeDirectories="./WinGTK/gtk-plus,./WinGTK/glib-1.2,./WinGtk/src/gtk+,./WinGtk/src/glib,./WinGtk/src/gtk+/gdk,../include,../libmp3lame,../mp3x,../frontend,.." + PreprocessorDefinitions="NDEBUG;LAMEPARSE;WIN32;_CONSOLE;HAVE_MPGLIB;LAMESNDFILE;BRHIST;HAVE_CONFIG_H" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="NDEBUG" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="odbc32.lib odbccp32.lib gdk-1.3.lib gtk-1.3.lib glib-1.3.lib" + OutputFile="$(OutDir)\mp3x.exe" + AdditionalLibraryDirectories="./WinGtk/src/gtk+/gtk,./WinGtk/src/gtk+/gdk,./WinGtk/src/glib" + GenerateMapFile="true" + MapFileName="..\obj\ReleaseSSE2\frontend/mp3x.map" + SubSystem="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source" + Filter="c" + > + <File + RelativePath="..\frontend\brhist.c" + > + </File> + <File + RelativePath="..\frontend\console.c" + > + </File> + <File + RelativePath="..\frontend\get_audio.c" + > + </File> + <File + RelativePath="..\frontend\gpkplotting.c" + > + </File> + <File + RelativePath="..\frontend\gtkanal.c" + > + </File> + <File + RelativePath="..\frontend\lametime.c" + > + </File> + <File + RelativePath="..\frontend\main.c" + > + </File> + <File + RelativePath="..\frontend\mp3x.c" + > + </File> + <File + RelativePath="..\frontend\parse.c" + > + </File> + <File + RelativePath="..\frontend\timestatus.c" + > + </File> + </Filter> + <Filter + Name="Include" + Filter="h" + > + <File + RelativePath="..\frontend\brhist.h" + > + </File> + <File + RelativePath="..\frontend\..\configMS.h" + > + </File> + <File + RelativePath="..\frontend\console.h" + > + </File> + <File + RelativePath="..\frontend\get_audio.h" + > + </File> + <File + RelativePath="..\frontend\gpkplotting.h" + > + </File> + <File + RelativePath="..\frontend\lametime.h" + > + </File> + <File + RelativePath="..\frontend\main.h" + > + </File> + <File + RelativePath="..\frontend\parse.h" + > + </File> + <File + RelativePath="..\frontend\timestatus.h" + > + </File> + </Filter> + <File + RelativePath="..\libmp3lame\lame.rc" + > + </File> + <File + RelativePath="..\frontend\..\README.WINGTK" + > + </File> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/vc_solution/vc9_lame_test.vcproj b/vc_solution/vc9_lame_test.vcproj new file mode 100644 index 0000000..df2e6c0 --- /dev/null +++ b/vc_solution/vc9_lame_test.vcproj @@ -0,0 +1,185 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9,00" + Name="lame_test" + ProjectGUID="{2FE9808B-2B03-48D9-94FC-6C907D39E2AC}" + RootNamespace="lame_test" + TargetFrameworkVersion="0" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Release|Win32" + ConfigurationType="1" + InheritedPropertySheets=".\vc9_lame_config.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + CharacterSet="2" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + InlineFunctionExpansion="2" + AdditionalIncludeDirectories="..\include" + PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE" + StringPooling="true" + RuntimeLibrary="2" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="NDEBUG" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalLibraryDirectories="" + SubSystem="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Debug|Win32" + ConfigurationType="1" + InheritedPropertySheets=".\vc9_lame_config.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + CharacterSet="2" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="..\include" + PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE" + StringPooling="true" + RuntimeLibrary="3" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="_DEBUG" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalLibraryDirectories="" + GenerateDebugInformation="true" + SubSystem="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <File + RelativePath="..\test\lame_test.cpp" + > + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/vc_solution/vc9_libmp3lame.vcproj b/vc_solution/vc9_libmp3lame.vcproj new file mode 100644 index 0000000..79fd114 --- /dev/null +++ b/vc_solution/vc9_libmp3lame.vcproj @@ -0,0 +1,1451 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9,00" + Name="libmp3lame-static" + ProjectGUID="{20536101-3B0E-43EF-94F9-080D595DAC57}" + RootNamespace="libmp3lame" + TargetFrameworkVersion="0" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + <ToolFile + RelativePath=".\vc9_nasm.rules" + /> + </ToolFiles> + <Configurations> + <Configuration + Name="ReleaseNASM|Win32" + ConfigurationType="4" + InheritedPropertySheets=".\vc9_lame_config.vsprops;.\arch_nasm.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="NASM" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="3" + InlineFunctionExpansion="2" + EnableIntrinsicFunctions="true" + FavorSizeOrSpeed="1" + AdditionalIncludeDirectories="../mpglib,../include,.." + PreprocessorDefinitions="NDEBUG;_WINDOWS;HAVE_MPGLIB;WIN32;HAVE_CONFIG_H;HAVE_NASM;MMX_choose_table;_CRT_SECURE_NO_DEPRECATE" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + OutputFile="$(OutDir)/libmp3lame-static.lib" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + ConfigurationType="4" + InheritedPropertySheets=".\vc9_lame_config.vsprops;.\arch_x87.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="NASM" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="3" + InlineFunctionExpansion="2" + EnableIntrinsicFunctions="true" + FavorSizeOrSpeed="1" + AdditionalIncludeDirectories="../mpglib,../include,.." + PreprocessorDefinitions="NDEBUG;_WINDOWS;HAVE_MPGLIB;WIN32;HAVE_CONFIG_H" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + OutputFile="$(OutDir)/libmp3lame-static.lib" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Debug|Win32" + ConfigurationType="4" + InheritedPropertySheets=".\vc9_lame_config.vsprops;.\arch_x87.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="NASM" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="../mpglib,../include,.." + PreprocessorDefinitions="_DEBUG;_WINDOWS;HAVE_MPGLIB;WIN32;HAVE_CONFIG_H" + RuntimeLibrary="1" + ProgramDataBaseFileName="$(OutDir)\$(TargetName).pdb" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + OutputFile="$(OutDir)/libmp3lame-static.lib" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="ReleaseSSE2|Win32" + ConfigurationType="4" + InheritedPropertySheets=".\vc9_lame_config.vsprops;.\arch_sse2.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="NASM" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="3" + InlineFunctionExpansion="2" + EnableIntrinsicFunctions="true" + FavorSizeOrSpeed="1" + AdditionalIncludeDirectories="../mpglib,../include,.." + PreprocessorDefinitions="NDEBUG;_WINDOWS;HAVE_MPGLIB;WIN32;HAVE_CONFIG_H" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + OutputFile="$(OutDir)/libmp3lame-static.lib" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source" + Filter="c" + > + <File + RelativePath="..\libmp3lame\bitstream.c" + > + <FileConfiguration + Name="ReleaseNASM|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\libmp3lame\encoder.c" + > + <FileConfiguration + Name="ReleaseNASM|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\libmp3lame\fft.c" + > + <FileConfiguration + Name="ReleaseNASM|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\libmp3lame\gain_analysis.c" + > + <FileConfiguration + Name="ReleaseNASM|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\libmp3lame\id3tag.c" + > + <FileConfiguration + Name="ReleaseNASM|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\libmp3lame\lame.c" + > + <FileConfiguration + Name="ReleaseNASM|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\libmp3lame\mpglib_interface.c" + > + <FileConfiguration + Name="ReleaseNASM|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\libmp3lame\newmdct.c" + > + <FileConfiguration + Name="ReleaseNASM|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\libmp3lame\presets.c" + > + <FileConfiguration + Name="ReleaseNASM|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\libmp3lame\psymodel.c" + > + <FileConfiguration + Name="ReleaseNASM|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\libmp3lame\quantize.c" + > + <FileConfiguration + Name="ReleaseNASM|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\libmp3lame\quantize_pvt.c" + > + <FileConfiguration + Name="ReleaseNASM|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\libmp3lame\reservoir.c" + > + <FileConfiguration + Name="ReleaseNASM|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\libmp3lame\set_get.c" + > + <FileConfiguration + Name="ReleaseNASM|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\libmp3lame\tables.c" + > + <FileConfiguration + Name="ReleaseNASM|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + WarningLevel="1" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + WarningLevel="1" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + WarningLevel="1" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + WarningLevel="1" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\libmp3lame\takehiro.c" + > + <FileConfiguration + Name="ReleaseNASM|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\libmp3lame\util.c" + > + <FileConfiguration + Name="ReleaseNASM|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\libmp3lame\vbrquantize.c" + > + <FileConfiguration + Name="ReleaseNASM|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\libmp3lame\VbrTag.c" + > + <FileConfiguration + Name="ReleaseNASM|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\libmp3lame\version.c" + > + <FileConfiguration + Name="ReleaseNASM|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\libmp3lame\.\vector\xmm_quantize_sub.c" + > + <FileConfiguration + Name="ReleaseNASM|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="../libmp3lame" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="../libmp3lame" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="../libmp3lame" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="../libmp3lame" + /> + </FileConfiguration> + </File> + </Filter> + <Filter + Name="Include" + Filter="h" + > + <File + RelativePath="..\libmp3lame\bitstream.h" + > + </File> + <File + RelativePath="..\libmp3lame\..\configMS.h" + > + <FileConfiguration + Name="ReleaseNASM|Win32" + > + <Tool + Name="VCCustomBuildTool" + Description="Performing Custom Build Step on $(InputName)" + CommandLine="copy ..\configMS.h ..\config.h " + Outputs="..\config.h" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCustomBuildTool" + Description="Performing Custom Build Step on $(InputName)" + CommandLine="copy ..\configMS.h ..\config.h " + Outputs="..\config.h" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCustomBuildTool" + Description="Performing Custom Build Step on $(InputName)" + CommandLine="copy ..\configMS.h ..\config.h " + Outputs="..\config.h" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + > + <Tool + Name="VCCustomBuildTool" + Description="Performing Custom Build Step on $(InputName)" + CommandLine="copy ..\configMS.h ..\config.h " + Outputs="..\config.h" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\libmp3lame\encoder.h" + > + </File> + <File + RelativePath="..\libmp3lame\fft.h" + > + </File> + <File + RelativePath="..\libmp3lame\gain_analysis.h" + > + </File> + <File + RelativePath="..\libmp3lame\id3tag.h" + > + </File> + <File + RelativePath="..\libmp3lame\l3side.h" + > + </File> + <File + RelativePath="..\libmp3lame\lame-analysis.h" + > + </File> + <File + RelativePath="..\libmp3lame\lame_global_flags.h" + > + </File> + <File + RelativePath="..\libmp3lame\.\vector\lame_intrin.h" + > + </File> + <File + RelativePath="..\libmp3lame\lameerror.h" + > + </File> + <File + RelativePath="..\libmp3lame\machine.h" + > + </File> + <File + RelativePath="..\libmp3lame\newmdct.h" + > + </File> + <File + RelativePath="..\libmp3lame\psymodel.h" + > + </File> + <File + RelativePath="..\libmp3lame\quantize.h" + > + </File> + <File + RelativePath="..\libmp3lame\quantize_pvt.h" + > + </File> + <File + RelativePath="..\libmp3lame\reservoir.h" + > + </File> + <File + RelativePath="..\libmp3lame\set_get.h" + > + </File> + <File + RelativePath="..\libmp3lame\tables.h" + > + </File> + <File + RelativePath="..\libmp3lame\util.h" + > + </File> + <File + RelativePath="..\libmp3lame\vbrquantize.h" + > + </File> + <File + RelativePath="..\libmp3lame\VbrTag.h" + > + </File> + <File + RelativePath="..\libmp3lame\version.h" + > + </File> + </Filter> + <Filter + Name="Asm" + Filter=".nas" + > + <File + RelativePath="..\libmp3lame\i386\choose_table.nas" + > + <FileConfiguration + Name="Release|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="NASM" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="NASM" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="NASM" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\libmp3lame\i386\cpu_feat.nas" + > + <FileConfiguration + Name="Release|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="NASM" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="NASM" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="NASM" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\libmp3lame\i386\fft.nas" + > + <FileConfiguration + Name="ReleaseNASM|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="NASM" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="NASM" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="NASM" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="NASM" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\libmp3lame\i386\fft3dn.nas" + > + <FileConfiguration + Name="Release|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="NASM" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="NASM" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="NASM" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\libmp3lame\i386\fftfpu.nas" + > + <FileConfiguration + Name="ReleaseNASM|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="NASM" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="NASM" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="NASM" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="NASM" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\libmp3lame\i386\fftsse.nas" + > + <FileConfiguration + Name="Release|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="NASM" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="NASM" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="NASM" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\libmp3lame\i386\ffttbl.nas" + > + <FileConfiguration + Name="ReleaseNASM|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="NASM" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="NASM" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="NASM" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="NASM" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\libmp3lame\i386\scalar.nas" + > + <FileConfiguration + Name="ReleaseNASM|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="NASM" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="NASM" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="NASM" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="NASM" + /> + </FileConfiguration> + </File> + </Filter> + <File + RelativePath="..\include\lame.h" + > + </File> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/vc_solution/vc9_libmp3lame_dll.vcproj b/vc_solution/vc9_libmp3lame_dll.vcproj new file mode 100644 index 0000000..66bca67 --- /dev/null +++ b/vc_solution/vc9_libmp3lame_dll.vcproj @@ -0,0 +1,374 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9,00" + Name="libmp3lame" + ProjectGUID="{92BD50AA-04D6-4FBF-ACE1-468FAF6778F2}" + RootNamespace="libmp3lameDLL" + TargetFrameworkVersion="0" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + <ToolFile + RelativePath=".\vc9_nasm.rules" + /> + </ToolFiles> + <Configurations> + <Configuration + Name="Release|Win32" + ConfigurationType="2" + InheritedPropertySheets=".\vc9_lame_config.vsprops;.\arch_x87.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="NASM" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + TypeLibraryName="..\output\Release/libmp3lame_dll.tlb" + HeaderFileName="" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="3" + InlineFunctionExpansion="2" + EnableIntrinsicFunctions="true" + FavorSizeOrSpeed="1" + AdditionalIncludeDirectories="../libmp3lame,../,../mpglib,../include,.." + PreprocessorDefinitions="NDEBUG;_WINDOWS;HAVE_MPGLIB;WIN32;HAVE_CONFIG_H" + RuntimeLibrary="2" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="_VC80_UPGRADE=0x0600;_DLL=$(TargetFileName)" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + UseLibraryDependencyInputs="false" + OutputFile="$(OutDir)/libmp3lame.dll" + ModuleDefinitionFile="..\include\lame.def" + ImportLibrary="$(OutDir)/libmp3lame.lib" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="ReleaseNASM|Win32" + ConfigurationType="2" + InheritedPropertySheets=".\vc9_lame_config.vsprops;.\arch_nasm.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="NASM" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + TypeLibraryName="..\output\ReleaseNASM/libmp3lame_dll.tlb" + HeaderFileName="" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="3" + InlineFunctionExpansion="2" + EnableIntrinsicFunctions="true" + FavorSizeOrSpeed="1" + AdditionalIncludeDirectories="../libmp3lame,../,../mpglib,../include,.." + PreprocessorDefinitions="NDEBUG;_WINDOWS;HAVE_MPGLIB;HAVE_CONFIG_H;WIN32;_CRT_SECURE_NO_DEPRECATE" + RuntimeLibrary="2" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="_VC80_UPGRADE=0x0600;_DLL=$(TargetFileName)" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + UseLibraryDependencyInputs="false" + OutputFile="$(OutDir)/libmp3lame.dll" + ModuleDefinitionFile="..\include\lame.def" + ImportLibrary="$(OutDir)/libmp3lame.lib" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Debug|Win32" + ConfigurationType="2" + InheritedPropertySheets=".\vc9_lame_config.vsprops;.\arch_x87.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="NASM" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + TypeLibraryName="..\output\Debug/libmp3lame_dll.tlb" + HeaderFileName="" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="../libmp3lame,../,../mpglib,../include,.." + PreprocessorDefinitions="_DEBUG;_WINDOWS;HAVE_MPGLIB;WIN32;HAVE_CONFIG_H" + RuntimeLibrary="3" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="_VC80_UPGRADE=0x0600;_DLL=$(TargetFileName);_DEBUG" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + UseLibraryDependencyInputs="false" + OutputFile="$(OutDir)/libmp3lame.dll" + ModuleDefinitionFile="..\include\lame.def" + GenerateDebugInformation="true" + ImportLibrary="$(OutDir)/libmp3lame.lib" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="ReleaseSSE2|Win32" + ConfigurationType="2" + InheritedPropertySheets=".\vc9_lame_config.vsprops;.\arch_sse2.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="NASM" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + TypeLibraryName="..\output\Release/libmp3lame_dll.tlb" + HeaderFileName="" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="3" + InlineFunctionExpansion="2" + EnableIntrinsicFunctions="true" + FavorSizeOrSpeed="1" + AdditionalIncludeDirectories="../libmp3lame,../,../mpglib,../include,.." + PreprocessorDefinitions="NDEBUG;_WINDOWS;HAVE_MPGLIB;WIN32;HAVE_CONFIG_H" + RuntimeLibrary="2" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="_VC80_UPGRADE=0x0600;_DLL=$(TargetFileName)" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + OutputFile="$(OutDir)/libmp3lame.dll" + ModuleDefinitionFile="..\include\lame.def" + ImportLibrary="$(OutDir)/libmp3lame.lib" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <File + RelativePath="..\libmp3lame\..\include\lame.def" + > + <FileConfiguration + Name="Release|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseNASM|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\libmp3lame\lame.rc" + > + </File> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/vc_solution/vc9_mpglib.vcproj b/vc_solution/vc9_mpglib.vcproj new file mode 100644 index 0000000..133d90f --- /dev/null +++ b/vc_solution/vc9_mpglib.vcproj @@ -0,0 +1,659 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9,00" + Name="libmpghip-static" + ProjectGUID="{E2DAB91A-8248-4625-8A85-2C2C2A390DD8}" + RootNamespace="libmpghip" + TargetFrameworkVersion="0" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="ReleaseNASM|Win32" + ConfigurationType="4" + InheritedPropertySheets=".\vc9_lame_config.vsprops;.\arch_nasm.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="3" + InlineFunctionExpansion="2" + EnableIntrinsicFunctions="true" + FavorSizeOrSpeed="1" + AdditionalIncludeDirectories="../libmp3lame,../include,.." + PreprocessorDefinitions="NDEBUG;HAVE_MPGLIB;_WINDOWS;USE_LAYER_2;WIN32;HAVE_CONFIG_H" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + OutputFile="$(OutDir)/libmpghip-static.lib" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + ConfigurationType="4" + InheritedPropertySheets=".\vc9_lame_config.vsprops;.\arch_x87.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="3" + InlineFunctionExpansion="2" + EnableIntrinsicFunctions="true" + FavorSizeOrSpeed="1" + AdditionalIncludeDirectories="../libmp3lame,../include,.." + PreprocessorDefinitions="NDEBUG;HAVE_MPGLIB;_WINDOWS;USE_LAYER_2;WIN32;HAVE_CONFIG_H" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + OutputFile="$(OutDir)/libmpghip-static.lib" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Debug|Win32" + ConfigurationType="4" + InheritedPropertySheets=".\vc9_lame_config.vsprops;.\arch_x87.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="../libmp3lame,../include,.." + PreprocessorDefinitions="_DEBUG;_WINDOWS;USE_LAYER_2;HAVE_MPGLIB;WIN32;HAVE_CONFIG_H" + RuntimeLibrary="1" + ProgramDataBaseFileName="$(OutDir)\$(TargetName).pdb" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + OutputFile="$(OutDir)/libmpghip-static.lib" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="ReleaseSSE2|Win32" + ConfigurationType="4" + InheritedPropertySheets=".\vc9_lame_config.vsprops;.\arch_sse2.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="3" + InlineFunctionExpansion="2" + EnableIntrinsicFunctions="true" + FavorSizeOrSpeed="1" + AdditionalIncludeDirectories="../libmp3lame,../include,.." + PreprocessorDefinitions="NDEBUG;HAVE_MPGLIB;_WINDOWS;USE_LAYER_2;WIN32;HAVE_CONFIG_H" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + OutputFile="$(OutDir)/libmpghip-static.lib" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source" + Filter="c" + > + <File + RelativePath="..\mpglib\common.c" + > + <FileConfiguration + Name="ReleaseNASM|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\mpglib\dct64_i386.c" + > + <FileConfiguration + Name="ReleaseNASM|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\mpglib\decode_i386.c" + > + <FileConfiguration + Name="ReleaseNASM|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\mpglib\interface.c" + > + <FileConfiguration + Name="ReleaseNASM|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\mpglib\layer1.c" + > + <FileConfiguration + Name="ReleaseNASM|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\mpglib\layer2.c" + > + <FileConfiguration + Name="ReleaseNASM|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\mpglib\layer3.c" + > + <FileConfiguration + Name="ReleaseNASM|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\mpglib\tabinit.c" + > + <FileConfiguration + Name="ReleaseNASM|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + /> + </FileConfiguration> + </File> + </Filter> + <Filter + Name="Include" + Filter="h" + > + <File + RelativePath="..\mpglib\common.h" + > + </File> + <File + RelativePath="..\mpglib\..\configMS.h" + > + <FileConfiguration + Name="ReleaseNASM|Win32" + > + <Tool + Name="VCCustomBuildTool" + Description="Performing Custom Build Step on $(InputName)" + CommandLine="copy ..\configMS.h ..\config.h " + Outputs="..\config.h" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCustomBuildTool" + Description="Performing Custom Build Step on $(InputName)" + CommandLine="copy ..\configMS.h ..\config.h " + Outputs="..\config.h" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCustomBuildTool" + Description="Performing Custom Build Step on $(InputName)" + CommandLine="copy ..\configMS.h ..\config.h " + Outputs="..\config.h" + /> + </FileConfiguration> + <FileConfiguration + Name="ReleaseSSE2|Win32" + > + <Tool + Name="VCCustomBuildTool" + Description="Performing Custom Build Step on $(InputName)" + CommandLine="copy ..\configMS.h ..\config.h " + Outputs="..\config.h" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\mpglib\dct64_i386.h" + > + </File> + <File + RelativePath="..\mpglib\decode_i386.h" + > + </File> + <File + RelativePath="..\mpglib\huffman.h" + > + </File> + <File + RelativePath="..\mpglib\interface.h" + > + </File> + <File + RelativePath="..\mpglib\l2tables.h" + > + </File> + <File + RelativePath="..\mpglib\layer1.h" + > + </File> + <File + RelativePath="..\mpglib\layer2.h" + > + </File> + <File + RelativePath="..\mpglib\layer3.h" + > + </File> + <File + RelativePath="..\mpglib\mpg123.h" + > + </File> + <File + RelativePath="..\mpglib\mpglib.h" + > + </File> + <File + RelativePath="..\mpglib\tabinit.h" + > + </File> + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/vc_solution/vc9_nasm.rules b/vc_solution/vc9_nasm.rules new file mode 100644 index 0000000..8b7f64e --- /dev/null +++ b/vc_solution/vc9_nasm.rules @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="utf-8"?> +<VisualStudioToolFile + Name="NASM " + Version="8,00" + > + <Rules> + <CustomBuildRule + Name="NASM" + DisplayName="NASM" + CommandLine="nasmw [BinFormat] [IncludeDir] [Defines] -o [OutFile] $(InputPath)" + Outputs="[OutFile]" + FileExtensions="*.nas" + ExecutionDescription="Assembling $(InputName)..." + ShowOnlyRuleProperties="false" + > + <Properties> + <StringProperty + Name="OutFile" + DisplayName="output file path" + Switch="[value]" + DefaultValue="$(IntDir)\$(InputName).obj" + /> + <StringProperty + Name="BinFormat" + DisplayName="Binary format" + Switch="-f [value]" + DefaultValue="win32" + /> + <StringProperty + Name="IncludeDir" + DisplayName="Additional include directories" + Switch="-i [value]" + DefaultValue="$(InputDir)" + Delimited="true" + /> + <StringProperty + Name="Defines" + DisplayName="Defines" + Switch="-D[value]" + DefaultValue="WIN32" + Delimited="true" + Delimiters=" ;," + /> + </Properties> + </CustomBuildRule> + </Rules> +</VisualStudioToolFile>