Merge pull request #1 from veroxzik/master
Fixes flickering, adds irrklang .net 4 and removes irrklang c++.
This commit was merged in pull request #1.
This commit is contained in:
@@ -89,12 +89,12 @@
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>C:\Users\otaku\source\repos\BAKKA Editor\BAKKA Editor\irrKlang-64bit-1.6.0\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link />
|
||||
<Link>
|
||||
<AdditionalDependencies>irrKlang.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>C:\Users\otaku\source\repos\BAKKA Editor\BAKKA Editor\irrKlang-64bit-1.6.0\lib\Winx64-visualStudio;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<EntryPointSymbol>main</EntryPointSymbol>
|
||||
</Link>
|
||||
@@ -118,12 +118,12 @@
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>C:\Users\otaku\source\repos\BAKKA Editor\BAKKA Editor\irrKlang-64bit-1.6.0\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link />
|
||||
<Link>
|
||||
<AdditionalDependencies>irrKlang.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>C:\Users\otaku\source\repos\BAKKA Editor\BAKKA Editor\irrKlang-64bit-1.6.0\lib\Winx64-visualStudio;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<EntryPointSymbol>main</EntryPointSymbol>
|
||||
</Link>
|
||||
@@ -133,7 +133,7 @@
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="irrKlang.NET4">
|
||||
<HintPath>O:\Wacca_Stuff\Charting\irrKlang-64bit-1.6.0\bin\dotnet-4-64\irrKlang.NET4.dll</HintPath>
|
||||
<HintPath>irrKlang-64bit-1.6.0\lib\dotnet-4-64\irrKlang.NET4.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Data" />
|
||||
|
||||
+55
-33
@@ -1,5 +1,4 @@
|
||||
#pragma once
|
||||
#pragma comment(lib, "irrKlang.lib") // link with irrKlang.dll
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <fstream>
|
||||
@@ -8,7 +7,6 @@
|
||||
#include <vector>
|
||||
#include <stack>
|
||||
#include <algorithm>
|
||||
#include <irrKlang.h>
|
||||
#include <stdio.h>
|
||||
#include <conio.h>
|
||||
#include <thread>
|
||||
@@ -134,6 +132,7 @@ namespace BAKKAEditor {
|
||||
using namespace System::Drawing;
|
||||
using namespace System::IO;
|
||||
using namespace System::Threading;
|
||||
using namespace System::Reflection;
|
||||
|
||||
/// <summary>
|
||||
/// Summary for MyForm
|
||||
@@ -144,9 +143,6 @@ namespace BAKKAEditor {
|
||||
MyForm(void)
|
||||
{
|
||||
InitializeComponent();
|
||||
//
|
||||
//TODO: Add the constructor code here
|
||||
//
|
||||
}
|
||||
|
||||
protected:
|
||||
@@ -165,6 +161,8 @@ namespace BAKKAEditor {
|
||||
ISoundEngine SoundEngine;
|
||||
ISound^ currentlyPlayingSong = SoundEngine.Play2D(stdStringToSystemString(songFilePath), true, true);
|
||||
ISound^ currentlyPlayingTickSound = SoundEngine.Play2D(stdStringToSystemString(tickFilePath), false, true);
|
||||
BufferedGraphicsContext^ bufferedGfxContext;
|
||||
BufferedGraphics^ bufferedGfx;
|
||||
protected:
|
||||
private: System::Windows::Forms::ToolStripMenuItem^ fileToolStripMenuItem;
|
||||
private: System::Windows::Forms::ToolStripMenuItem^ newToolStripMenuItem;
|
||||
@@ -329,6 +327,7 @@ private: System::Windows::Forms::Label^ songFileName;
|
||||
private: System::Windows::Forms::Button^ selectSongFile;
|
||||
private: System::Windows::Forms::OpenFileDialog^ openFileDialogSong;
|
||||
private: System::Windows::Forms::Label^ VolumeLabel;
|
||||
private: System::Windows::Forms::Timer^ timer1;
|
||||
private: System::Windows::Forms::TrackBar^ SongVolume;
|
||||
|
||||
private: System::ComponentModel::BackgroundWorker^ backgroundWorkerSong;
|
||||
@@ -541,6 +540,7 @@ private: System::Windows::Forms::CheckBox^ HighlightCheckBox;
|
||||
this->backgroundWorker1 = (gcnew System::ComponentModel::BackgroundWorker());
|
||||
this->backgroundWorker2 = (gcnew System::ComponentModel::BackgroundWorker());
|
||||
this->panel1 = (gcnew System::Windows::Forms::Panel());
|
||||
this->timer1 = (gcnew System::Windows::Forms::Timer(this->components));
|
||||
this->menuStrip->SuspendLayout();
|
||||
this->NoteTypeBox->SuspendLayout();
|
||||
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->VisualHispeed))->BeginInit();
|
||||
@@ -1653,6 +1653,12 @@ private: System::Windows::Forms::CheckBox^ HighlightCheckBox;
|
||||
this->panel1->Controls->Add(this->CurrentObjectText);
|
||||
this->panel1->Name = L"panel1";
|
||||
//
|
||||
// timer1
|
||||
//
|
||||
this->timer1->Enabled = true;
|
||||
this->timer1->Interval = 20;
|
||||
this->timer1->Tick += gcnew System::EventHandler(this, &MyForm::timer1_Tick);
|
||||
//
|
||||
// MyForm
|
||||
//
|
||||
this->AllowDrop = true;
|
||||
@@ -3617,6 +3623,13 @@ private: System::Windows::Forms::CheckBox^ HighlightCheckBox;
|
||||
//InitialSettingsPane->Width = (this->Width - NoteTypeBox->Width - 36);
|
||||
//Point position(NoteTypeBox->Width + 12, 27);
|
||||
//InitialSettingsPane->Location = position;
|
||||
|
||||
// Update BufferedGraphics size
|
||||
bufferedGfxContext->MaximumBuffer = Drawing::Size(CirclePanel->Width + 1, CirclePanel->Height + 1);
|
||||
bufferedGfx = bufferedGfxContext->Allocate(CirclePanel->CreateGraphics(),
|
||||
Drawing::Rectangle(0, 0, CirclePanel->Width, CirclePanel->Height));
|
||||
DrawToGraphics(bufferedGfx->Graphics);
|
||||
|
||||
RefreshPaint();
|
||||
}
|
||||
private: System::Void MeasureNum_ValueChanged(System::Object^ sender, System::EventArgs^ e) {
|
||||
@@ -3760,14 +3773,11 @@ private: System::Windows::Forms::CheckBox^ HighlightCheckBox;
|
||||
}
|
||||
}
|
||||
private: System::Void CirclePanel_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) {
|
||||
//Note graphics
|
||||
Graphics^ notesGraphics = e->Graphics;
|
||||
BufferedGraphics^ BufferedNotesGraphics;
|
||||
//Configure buffer context
|
||||
BufferedGraphicsContext^ context = BufferedGraphicsManager::Current;
|
||||
context->MaximumBuffer = System::Drawing::Size(CirclePanel->Width + 1, CirclePanel->Height + 1);
|
||||
bufferedGfx->Render(e->Graphics);
|
||||
}
|
||||
|
||||
void DrawToGraphics(Graphics^ g) {
|
||||
System::Drawing::Rectangle PanelRect(0, 0, CirclePanel->Width, CirclePanel->Height);
|
||||
BufferedNotesGraphics = context->Allocate(CirclePanel->CreateGraphics(), PanelRect);
|
||||
//Pens for drawing parts of circle
|
||||
float widthOfBasePen = (float)CirclePanel->Width * (4.f / 600.f); //sizes are essentially the pixel width if the box is 600x600
|
||||
float widthOfLinesPen = (float)CirclePanel->Width * (2.f / 600.f);
|
||||
@@ -3802,7 +3812,7 @@ private: System::Windows::Forms::CheckBox^ HighlightCheckBox;
|
||||
System::Drawing::Size size(sizeOfRect, sizeOfRect);
|
||||
System::Drawing::Rectangle Rect(location, size);
|
||||
//Drawing mode
|
||||
BufferedNotesGraphics->Graphics->SmoothingMode = Drawing2D::SmoothingMode::HighSpeed;
|
||||
g->SmoothingMode = Drawing2D::SmoothingMode::HighSpeed;
|
||||
//Current time
|
||||
float currentTime;
|
||||
if (scrollBarChanged) {
|
||||
@@ -3826,7 +3836,7 @@ private: System::Windows::Forms::CheckBox^ HighlightCheckBox;
|
||||
|
||||
//Make Background Transparent
|
||||
SolidBrush^ backgroundBrush = gcnew SolidBrush(this->BackColor);
|
||||
BufferedNotesGraphics->Graphics->FillRectangle(backgroundBrush, PanelRect);
|
||||
g->FillRectangle(backgroundBrush, PanelRect);
|
||||
|
||||
//Draw pre-existing mask
|
||||
std::map<float, std::list<std::pair<int, int>>>::iterator mapitr = mapOfMasks.lower_bound(currentTime);
|
||||
@@ -3839,7 +3849,7 @@ private: System::Windows::Forms::CheckBox^ HighlightCheckBox;
|
||||
for (std::list<std::pair<int, int>>::iterator listITR = mapitr->second.begin(); listITR != mapitr->second.end(); listITR++) {
|
||||
maskStartAngle = -((float)listITR->first * 6);
|
||||
maskArcLength = -(((float)listITR->second - (float)listITR->first) * 6);
|
||||
BufferedNotesGraphics->Graphics->FillPie(MaskBrush, Rect, maskStartAngle, maskArcLength);
|
||||
g->FillPie(MaskBrush, Rect, maskStartAngle, maskArcLength);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3850,7 +3860,7 @@ private: System::Windows::Forms::CheckBox^ HighlightCheckBox;
|
||||
for (std::list<std::pair<int, int>>::iterator listITR = mapitr->second.begin(); listITR != mapitr->second.end(); listITR++) {
|
||||
maskStartAngle = -((float)listITR->first * 6);
|
||||
maskArcLength = -(((float)listITR->second - (float)listITR->first) * 6);
|
||||
BufferedNotesGraphics->Graphics->FillPie(MaskBrush, Rect, maskStartAngle, maskArcLength);
|
||||
g->FillPie(MaskBrush, Rect, maskStartAngle, maskArcLength);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3860,7 +3870,7 @@ private: System::Windows::Forms::CheckBox^ HighlightCheckBox;
|
||||
for (std::list<std::pair<int, int>>::iterator listITR = mapitr->second.begin(); listITR != mapitr->second.end(); listITR++) {
|
||||
maskStartAngle = -((float)listITR->first * 6);
|
||||
maskArcLength = -(((float)listITR->second - (float)listITR->first) * 6);
|
||||
BufferedNotesGraphics->Graphics->FillPie(MaskBrush, Rect, maskStartAngle, maskArcLength);
|
||||
g->FillPie(MaskBrush, Rect, maskStartAngle, maskArcLength);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3868,15 +3878,15 @@ private: System::Windows::Forms::CheckBox^ HighlightCheckBox;
|
||||
//Draw selected mask
|
||||
if (SelectedLineType == 1 && Rect.Width >= 1) {
|
||||
if (SelectedNoteTypeVisual == 12) {
|
||||
BufferedNotesGraphics->Graphics->FillPie(MaskBrush, Rect, startAngle, arcLength);
|
||||
g->FillPie(MaskBrush, Rect, startAngle, arcLength);
|
||||
}
|
||||
if (SelectedNoteTypeVisual == 13) {
|
||||
BufferedNotesGraphics->Graphics->FillPie(MaskRemoveBrush, Rect, startAngle, arcLength);
|
||||
g->FillPie(MaskRemoveBrush, Rect, startAngle, arcLength);
|
||||
}
|
||||
}
|
||||
|
||||
//Switch Drawing mode
|
||||
BufferedNotesGraphics->Graphics->SmoothingMode = Drawing2D::SmoothingMode::AntiAlias;
|
||||
g->SmoothingMode = Drawing2D::SmoothingMode::AntiAlias;
|
||||
|
||||
//Draw measure circle
|
||||
float nearestMeasure = std::ceil(currentTime);
|
||||
@@ -3893,13 +3903,13 @@ private: System::Windows::Forms::CheckBox^ HighlightCheckBox;
|
||||
System::Drawing::Size sizeFut(sizeOfRectFut, sizeOfRectFut);
|
||||
System::Drawing::Rectangle RectFut(locationFut, sizeFut);
|
||||
if (RectFut.Width >= 1) {
|
||||
BufferedNotesGraphics->Graphics->DrawEllipse(CircleBeatPen, RectFut);
|
||||
g->DrawEllipse(CircleBeatPen, RectFut);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//Draw base circle
|
||||
BufferedNotesGraphics->Graphics->DrawEllipse(CircleBasePen, Rect);
|
||||
g->DrawEllipse(CircleBasePen, Rect);
|
||||
|
||||
//Draw Degree Lines
|
||||
for (int i = 0; i < 360; i += 6) { //i is the angle n degrees
|
||||
@@ -3923,7 +3933,7 @@ private: System::Windows::Forms::CheckBox^ HighlightCheckBox;
|
||||
yEnd = (innerRadius * sin(degToRad)) + yCenterOfCircle;
|
||||
PointF coordPointEnd(xEnd, yEnd);
|
||||
|
||||
BufferedNotesGraphics->Graphics->DrawLine(CircleLinesPen, coordPointStart, coordPointEnd);
|
||||
g->DrawLine(CircleLinesPen, coordPointStart, coordPointEnd);
|
||||
}
|
||||
|
||||
//Draw future holds
|
||||
@@ -3953,14 +3963,14 @@ private: System::Windows::Forms::CheckBox^ HighlightCheckBox;
|
||||
System::Drawing::Size sizeFut(sizeOfRectFut, sizeOfRectFut);
|
||||
System::Drawing::Rectangle RectFut(locationFut, sizeFut);
|
||||
if (RectFut.Width >= 1) {
|
||||
BufferedNotesGraphics->Graphics->DrawArc(CircleNotePen, RectFut, futStartAngle, futArcLength); //Draw hold
|
||||
g->DrawArc(CircleNotePen, RectFut, futStartAngle, futArcLength); //Draw hold
|
||||
|
||||
if (listofNotesitr->noteType == 25) { //If bonus hold
|
||||
CircleNotePen->Color = BonusColor;
|
||||
CircleNotePen->Width += highlightWidth;
|
||||
futStartAngle += 2; //increase size for highlight
|
||||
futArcLength -= 4;
|
||||
BufferedNotesGraphics->Graphics->DrawArc(CircleNotePen, RectFut, futStartAngle, futArcLength); //Draw highlight
|
||||
g->DrawArc(CircleNotePen, RectFut, futStartAngle, futArcLength); //Draw highlight
|
||||
}
|
||||
if (HighlightCheckBox->Checked) {
|
||||
if (islistITREqualToViewITR(listofNotesitr)) {
|
||||
@@ -3968,7 +3978,7 @@ private: System::Windows::Forms::CheckBox^ HighlightCheckBox;
|
||||
CircleNotePen->Width += highlightWidth;
|
||||
futStartAngle += 2; //increase size for highlight
|
||||
futArcLength -= 4;
|
||||
BufferedNotesGraphics->Graphics->DrawArc(CircleNotePen, RectFut, futStartAngle, futArcLength); //Draw highlight
|
||||
g->DrawArc(CircleNotePen, RectFut, futStartAngle, futArcLength); //Draw highlight
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4008,14 +4018,14 @@ private: System::Windows::Forms::CheckBox^ HighlightCheckBox;
|
||||
System::Drawing::Size sizeFut(sizeOfRectFut, sizeOfRectFut);
|
||||
System::Drawing::Rectangle RectFut(locationFut, sizeFut);
|
||||
if (RectFut.Width >= 1) {
|
||||
BufferedNotesGraphics->Graphics->DrawArc(CircleNotePen, RectFut, futStartAngle, futArcLength); //Draw note
|
||||
g->DrawArc(CircleNotePen, RectFut, futStartAngle, futArcLength); //Draw note
|
||||
|
||||
if (listofNotesitr->noteType >= 20) { //If bonus note
|
||||
CircleNotePen->Color = BonusColor;
|
||||
CircleNotePen->Width += highlightWidth;
|
||||
futStartAngle += 2; //increase size for highlight
|
||||
futArcLength -= 4;
|
||||
BufferedNotesGraphics->Graphics->DrawArc(CircleNotePen, RectFut, futStartAngle, futArcLength); //Draw highlight
|
||||
g->DrawArc(CircleNotePen, RectFut, futStartAngle, futArcLength); //Draw highlight
|
||||
}
|
||||
if (HighlightCheckBox->Checked) {
|
||||
if (islistITREqualToViewITR(listofNotesitr)) {
|
||||
@@ -4023,7 +4033,7 @@ private: System::Windows::Forms::CheckBox^ HighlightCheckBox;
|
||||
CircleNotePen->Width += highlightWidth;
|
||||
futStartAngle += 2; //increase size for highlight
|
||||
futArcLength -= 4;
|
||||
BufferedNotesGraphics->Graphics->DrawArc(CircleNotePen, RectFut, futStartAngle, futArcLength); //Draw highlight
|
||||
g->DrawArc(CircleNotePen, RectFut, futStartAngle, futArcLength); //Draw highlight
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4041,11 +4051,8 @@ private: System::Windows::Forms::CheckBox^ HighlightCheckBox;
|
||||
if (SelectedLineType == 1 && Rect.Width >= 1) {
|
||||
CircleNotePen->Color = returnColor(SelectedNoteTypeVisual);
|
||||
CircleNotePen->Width = widthOfNotePen;
|
||||
BufferedNotesGraphics->Graphics->DrawArc(CircleNotePen, Rect, startAngle, arcLength);
|
||||
g->DrawArc(CircleNotePen, Rect, startAngle, arcLength);
|
||||
}
|
||||
|
||||
//Draw Buffer to screen
|
||||
BufferedNotesGraphics->Render(notesGraphics);
|
||||
}
|
||||
bool islistITREqualToViewITR(std::list<NotesNode>::iterator listITR) {
|
||||
if (listITR->beat != viewNotesITR->beat)
|
||||
@@ -4270,6 +4277,18 @@ private: System::Windows::Forms::CheckBox^ HighlightCheckBox;
|
||||
SetStyle(ControlStyles::OptimizedDoubleBuffer, true);
|
||||
SetStyle(ControlStyles::UserPaint, true);
|
||||
SetStyle(ControlStyles::AllPaintingInWmPaint, true);
|
||||
|
||||
// Initialize BufferedGraphics
|
||||
bufferedGfxContext = BufferedGraphicsManager::Current;
|
||||
bufferedGfxContext->MaximumBuffer = Drawing::Size(CirclePanel->Width + 1, CirclePanel->Height + 1);
|
||||
bufferedGfx = bufferedGfxContext->Allocate(CirclePanel->CreateGraphics(),
|
||||
Drawing::Rectangle(0, 0, CirclePanel->Width, CirclePanel->Height));
|
||||
DrawToGraphics(bufferedGfx->Graphics);
|
||||
|
||||
// Force double buffering on CirlcePanel
|
||||
Type^ controlType = CirclePanel->GetType();
|
||||
PropertyInfo^ pi = controlType->GetProperty("DoubleBuffered", BindingFlags::Instance | BindingFlags::NonPublic);
|
||||
pi->SetValue(CirclePanel, true);
|
||||
}
|
||||
private: System::Void CirclePanel_Scroll(System::Object^ sender, System::Windows::Forms::ScrollEventArgs^ e) {
|
||||
if (e->ScrollOrientation == ScrollOrientation::VerticalScroll) {
|
||||
@@ -4329,5 +4348,8 @@ private: System::Windows::Forms::CheckBox^ HighlightCheckBox;
|
||||
private: System::Void HighlightCheckBox_CheckedChanged(System::Object^ sender, System::EventArgs^ e) {
|
||||
RefreshPaint();
|
||||
}
|
||||
private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e) {
|
||||
DrawToGraphics(bufferedGfx->Graphics);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
+296
-1238
File diff suppressed because it is too large
Load Diff
@@ -1,78 +0,0 @@
|
||||
// Copyright (C) 2002-2018 Nikolaus Gebhardt
|
||||
// This file is part of the "irrKlang" library.
|
||||
// For conditions of distribution and use, see copyright notice in irrKlang.h
|
||||
|
||||
#ifndef __E_IRRKLANG_SOUND_ENGINE_OPTIONS_H_INCLUDED__
|
||||
#define __E_IRRKLANG_SOUND_ENGINE_OPTIONS_H_INCLUDED__
|
||||
|
||||
namespace irrklang
|
||||
{
|
||||
//! An enumeration for all options for starting up the sound engine
|
||||
/** When using createIrrKlangDevice, use a combination of this these
|
||||
as 'options' parameter to start up the engine. By default, irrKlang
|
||||
uses ESEO_DEFAULT_OPTIONS, which is set to the combination
|
||||
ESEO_MULTI_THREADED | ESEO_LOAD_PLUGINS | ESEO_USE_3D_BUFFERS | ESEO_PRINT_DEBUG_INFO_TO_DEBUGGER | ESEO_PRINT_DEBUG_INFO_TO_STDOUT. */
|
||||
enum E_SOUND_ENGINE_OPTIONS
|
||||
{
|
||||
//! If specified (default), it will make irrKlang run in a separate thread.
|
||||
/** Using this flag, irrKlang will update
|
||||
all streams, sounds, 3d positions and whatever automaticly. You also don't need to call ISoundEngine::update()
|
||||
if irrKlang is running multithreaded. However, if you want to run irrKlang in the same thread
|
||||
as your application (for easier debugging for example), don't set this. But you need to call ISoundEngine::update()
|
||||
as often as you can (at least about 2-3 times per second) to make irrKlang update everything correctly then. */
|
||||
ESEO_MULTI_THREADED = 0x01,
|
||||
|
||||
//! If the window of the application doesn't have the focus, irrKlang will be silent if this has been set.
|
||||
/** This will only work when irrKlang is using the DirectSound output driver. */
|
||||
ESEO_MUTE_IF_NOT_FOCUSED = 0x02,
|
||||
|
||||
//! Automaticly loads external plugins when starting up.
|
||||
/** Plugins usually are .dll, .so or .dylib
|
||||
files named for example ikpMP3.dll (= short for irrKlangPluginMP3) which are executed
|
||||
after the startup of the sound engine and modify it for example to make it possible
|
||||
to play back mp3 files. Plugins are being loaded from the current working directory
|
||||
as well as from the position where the .exe using the irrKlang library resides.
|
||||
It is also possible to load the plugins after the engine has started up using
|
||||
ISoundEngine::loadPlugins(). */
|
||||
ESEO_LOAD_PLUGINS = 0x04,
|
||||
|
||||
//! Uses 3D sound buffers instead of emulating them when playing 3d sounds (default).
|
||||
/** If this flag is not specified, all buffers will by created
|
||||
in 2D only and 3D positioning will be emulated in software, making the engine run
|
||||
faster if hardware 3d audio is slow on the system. */
|
||||
ESEO_USE_3D_BUFFERS = 0x08,
|
||||
|
||||
//! Prints debug messages to the debugger window.
|
||||
/** irrKlang will print debug info and status messages to any windows debugger supporting
|
||||
OutputDebugString() (like VisualStudio).
|
||||
This is useful if your application does not capture any console output (see ESEO_PRINT_DEBUG_INFO_TO_STDOUT). */
|
||||
ESEO_PRINT_DEBUG_INFO_TO_DEBUGGER = 0x10,
|
||||
|
||||
//! Prints debug messages to stdout (the ConsoleWindow).
|
||||
/** irrKlang will print debug info and status messages stdout, the console window in Windows. */
|
||||
ESEO_PRINT_DEBUG_INFO_TO_STDOUT = 0x20,
|
||||
|
||||
//! Uses linear rolloff for 3D sound.
|
||||
/** If specified, instead of the default logarithmic one, irrKlang will
|
||||
use a linear rolloff model which influences the attenuation
|
||||
of the sounds over distance. The volume is interpolated linearly between the MinDistance
|
||||
and MaxDistance, making it possible to adjust sounds more easily although this is not
|
||||
physically correct.
|
||||
Note that this option may not work when used together with the ESEO_USE_3D_BUFFERS
|
||||
option when using Direct3D for example, irrKlang will then turn off ESEO_USE_3D_BUFFERS
|
||||
automaticly to be able to use this option and write out a warning. */
|
||||
ESEO_LINEAR_ROLLOFF = 0x40,
|
||||
|
||||
//! Default parameters when starting up the engine.
|
||||
ESEO_DEFAULT_OPTIONS = ESEO_MULTI_THREADED | ESEO_LOAD_PLUGINS | ESEO_USE_3D_BUFFERS | ESEO_PRINT_DEBUG_INFO_TO_DEBUGGER | ESEO_PRINT_DEBUG_INFO_TO_STDOUT,
|
||||
|
||||
//! Never used, it only forces the compiler to compile these enumeration values to 32 bit.
|
||||
/** Don't use this. */
|
||||
ESEO_FORCE_32_BIT = 0x7fffffff
|
||||
};
|
||||
|
||||
} // end namespace irrklang
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,59 +0,0 @@
|
||||
// Copyright (C) 2002-2018 Nikolaus Gebhardt
|
||||
// This file is part of the "irrKlang" library.
|
||||
// For conditions of distribution and use, see copyright notice in irrKlang.h
|
||||
|
||||
#ifndef __E_IRRKLANG_SOUND_OUTPUT_DRIVERS_H_INCLUDED__
|
||||
#define __E_IRRKLANG_SOUND_OUTPUT_DRIVERS_H_INCLUDED__
|
||||
|
||||
namespace irrklang
|
||||
{
|
||||
//! An enumeration for all types of supported sound drivers
|
||||
/** Values of this enumeration can be used as parameter when calling createIrrKlangDevice(). */
|
||||
enum E_SOUND_OUTPUT_DRIVER
|
||||
{
|
||||
//! Autodetects the best sound driver for the system
|
||||
ESOD_AUTO_DETECT = 0,
|
||||
|
||||
//! DirectSound8 sound output driver, windows only.
|
||||
/** In contrast to ESOD_DIRECT_SOUND, this supports sophisticated sound effects
|
||||
but may not be available on old windows versions. It behaves very similar
|
||||
to ESOD_DIRECT_SOUND but also supports DX8 sound effects.*/
|
||||
ESOD_DIRECT_SOUND_8,
|
||||
|
||||
//! DirectSound sound output driver, windows only.
|
||||
/** This uses DirectSound 3 or above, if available. If DX8 sound effects
|
||||
are needed, use ESOD_DIRECT_SOUND_8 instead. The
|
||||
ESOD_DIRECT_SOUND driver may be available on more and older windows
|
||||
versions than ESOD_DIRECT_SOUND_8.*/
|
||||
ESOD_DIRECT_SOUND,
|
||||
|
||||
//! WinMM sound output driver, windows only.
|
||||
/** Supports the ISoundMixedOutputReceiver interface using setMixedDataOutputReceiver. */
|
||||
ESOD_WIN_MM,
|
||||
|
||||
//! ALSA sound output driver, linux only.
|
||||
/** When using ESOD_ALSA in createIrrKlangDevice(), it is possible to set the third parameter,
|
||||
'deviceID' to the name of specific ALSA pcm device, to the irrKlang force to use this one.
|
||||
Set it to 'default', or 'plug:hw' or whatever you need it to be.
|
||||
Supports the ISoundMixedOutputReceiver interface using setMixedDataOutputReceiver. */
|
||||
ESOD_ALSA,
|
||||
|
||||
//! Core Audio sound output driver, mac os only.
|
||||
/** Supports the ISoundMixedOutputReceiver interface using setMixedDataOutputReceiver. */
|
||||
ESOD_CORE_AUDIO,
|
||||
|
||||
//! Null driver, creating no sound output
|
||||
ESOD_NULL,
|
||||
|
||||
//! Amount of built-in sound output drivers
|
||||
ESOD_COUNT,
|
||||
|
||||
//! This enumeration literal is never used, it only forces the compiler to
|
||||
//! compile these enumeration values to 32 bit.
|
||||
ESOD_FORCE_32_BIT = 0x7fffffff
|
||||
};
|
||||
|
||||
} // end namespace irrklang
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
// Copyright (C) 2002-2018 Nikolaus Gebhardt
|
||||
// This file is part of the "irrKlang" library.
|
||||
// For conditions of distribution and use, see copyright notice in irrKlang.h
|
||||
|
||||
#ifndef __E_IRRKLANG_STREAM_MODES_H_INCLUDED__
|
||||
#define __E_IRRKLANG_STREAM_MODES_H_INCLUDED__
|
||||
|
||||
namespace irrklang
|
||||
{
|
||||
//! An enumeration for all types of supported stream modes
|
||||
enum E_STREAM_MODE
|
||||
{
|
||||
//! Autodetects the best stream mode for a specified audio data.
|
||||
ESM_AUTO_DETECT = 0,
|
||||
|
||||
//! Streams the audio data when needed.
|
||||
ESM_STREAMING,
|
||||
|
||||
//! Loads the whole audio data into the memory.
|
||||
ESM_NO_STREAMING,
|
||||
|
||||
//! This enumeration literal is never used, it only forces the compiler to
|
||||
//! compile these enumeration values to 32 bit.
|
||||
ESM_FORCE_32_BIT = 0x7fffffff
|
||||
};
|
||||
|
||||
} // end namespace irrklang
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,110 +0,0 @@
|
||||
// Copyright (C) 2002-2018 Nikolaus Gebhardt
|
||||
// This file is part of the "irrKlang" library.
|
||||
// For conditions of distribution and use, see copyright notice in irrKlang.h
|
||||
|
||||
#ifndef __I_IRRKLANG_AUDIO_RECORDER_H_INCLUDED__
|
||||
#define __I_IRRKLANG_AUDIO_RECORDER_H_INCLUDED__
|
||||
|
||||
#include "ik_IRefCounted.h"
|
||||
#include "ik_ISoundSource.h"
|
||||
|
||||
|
||||
namespace irrklang
|
||||
{
|
||||
class ICapturedAudioDataReceiver;
|
||||
|
||||
//! Interface to an audio recorder. Create it using the createIrrKlangAudioRecorder() function.
|
||||
/** It creates sound sources into an ISoundEngine which then can be played there.
|
||||
See @ref recordingAudio for an example on how to use this. */
|
||||
class IAudioRecorder : public virtual IRefCounted
|
||||
{
|
||||
public:
|
||||
|
||||
//! Starts recording audio.
|
||||
/** Clears all possibly previously recorded buffered audio data and starts to record.
|
||||
When finished recording audio data, call stopRecordingAudio().
|
||||
All recorded audio data gets stored into an internal audio buffer, which
|
||||
can then be accessed for example using addSoundSourceFromRecordedAudio() or
|
||||
getRecordedAudioData(). For recording audio data not into an internal audio
|
||||
buffer, use startRecordingCustomHandledAudio().
|
||||
\param sampleRate: Sample rate of the recorded audio.
|
||||
\param sampleFormat: Sample format of the recorded audio.
|
||||
\param channelCount: Amount of audio channels.
|
||||
\return Returns true if successfully started recording and false if not.*/
|
||||
virtual bool startRecordingBufferedAudio(ik_s32 sampleRate=22000,
|
||||
ESampleFormat sampleFormat=ESF_S16,
|
||||
ik_s32 channelCount=1) = 0;
|
||||
|
||||
//! Starts recording audio.
|
||||
/** Clears all possibly previously recorded buffered audio data and starts to record
|
||||
audio data, which is delivered to a custom user callback interface.
|
||||
When finished recording audio data, call stopRecordingAudio(). If instead of
|
||||
recording the data to the receiver interface recording into a managed buffer
|
||||
is wished, use startRecordingBufferedAudio() instead.
|
||||
\param receiver: Interface to be implemented by the user, gets called once for each
|
||||
captured audio data chunk.
|
||||
\param sampleRate: Sample rate of the recorded audio.
|
||||
\param sampleFormat: Sample format of the recorded audio.
|
||||
\param channelCount: Amount of audio channels.
|
||||
\return Returns true if successfully started recording and false if not. */
|
||||
virtual bool startRecordingCustomHandledAudio(ICapturedAudioDataReceiver* receiver,
|
||||
ik_s32 sampleRate=22000,
|
||||
ESampleFormat sampleFormat=ESF_S16,
|
||||
ik_s32 channelCount=1) = 0;
|
||||
|
||||
//! Stops recording audio.
|
||||
virtual void stopRecordingAudio() = 0;
|
||||
|
||||
//! Creates a sound source for the recorded audio data.
|
||||
/** The returned sound source pointer then can be used to play back the recorded audio data
|
||||
using ISoundEngine::play2D(). This method only will succeed if the audio was recorded using
|
||||
startRecordingBufferedAudio() and audio recording is currently stopped.
|
||||
\param soundName Name of the virtual sound file (e.g. "someRecordedAudio"). You can also use this
|
||||
name when calling play3D() or play2D(). */
|
||||
virtual ISoundSource* addSoundSourceFromRecordedAudio(const char* soundName) = 0;
|
||||
|
||||
//! Clears recorded audio data buffer, freeing memory.
|
||||
/** This method will only succeed if audio recording is currently stopped. */
|
||||
virtual void clearRecordedAudioDataBuffer() = 0;
|
||||
|
||||
//! Returns if the recorder is currently recording audio.
|
||||
virtual bool isRecording() = 0;
|
||||
|
||||
//! Returns the audio format of the recorded audio data.
|
||||
/** Also contains informations about the length of the recorded audio stream. */
|
||||
virtual SAudioStreamFormat getAudioFormat() = 0;
|
||||
|
||||
//! Returns a pointer to the recorded audio data.
|
||||
/** This method will only succeed if audio recording is currently stopped and
|
||||
something was recorded previously using startRecordingBufferedAudio().
|
||||
The lenght of the buffer can be retrieved using
|
||||
getAudioFormat().getSampleDataSize(). Note that the pointer is only valid
|
||||
as long as not clearRecordedAudioDataBuffer() is called or another sample is
|
||||
recorded.*/
|
||||
virtual void* getRecordedAudioData() = 0;
|
||||
|
||||
//! returns the name of the sound driver, like 'ALSA' for the alsa device.
|
||||
/** Possible returned strings are "NULL", "ALSA", "CoreAudio", "winMM",
|
||||
"DirectSound" and "DirectSound8". */
|
||||
virtual const char* getDriverName() = 0;
|
||||
};
|
||||
|
||||
|
||||
//! Interface to be implemented by the user if access to the recorded audio data is needed.
|
||||
/** Is used as parameter in IAudioRecorder::startRecordingCustomHandledAudio. */
|
||||
class ICapturedAudioDataReceiver : public IRefCounted
|
||||
{
|
||||
public:
|
||||
|
||||
//! Gets called once for each captured audio data chunk.
|
||||
/** See IAudioRecorder::startRecordingCustomHandledAudio for details.
|
||||
\param audioData: Pointer to a part of the recorded audio data
|
||||
\param lengthInBytes: Amount of bytes in the audioData buffer.*/
|
||||
virtual void OnReceiveAudioDataStreamChunk(unsigned char* audioData, unsigned long lengthInBytes) = 0;
|
||||
};
|
||||
|
||||
|
||||
} // end namespace irrklang
|
||||
|
||||
|
||||
#endif
|
||||
@@ -1,49 +0,0 @@
|
||||
// Copyright (C) 2002-2018 Nikolaus Gebhardt
|
||||
// This file is part of the "irrKlang" library.
|
||||
// For conditions of distribution and use, see copyright notice in irrKlang.h
|
||||
|
||||
#ifndef __I_IRRKLANG_AUDIO_STREAM_H_INCLUDED__
|
||||
#define __I_IRRKLANG_AUDIO_STREAM_H_INCLUDED__
|
||||
|
||||
#include "ik_IRefCounted.h"
|
||||
#include "ik_SAudioStreamFormat.h"
|
||||
|
||||
namespace irrklang
|
||||
{
|
||||
|
||||
|
||||
//! Reads and decodes audio data into an usable audio stream for the ISoundEngine
|
||||
class IAudioStream : public IRefCounted
|
||||
{
|
||||
public:
|
||||
|
||||
//! destructor
|
||||
virtual ~IAudioStream() {};
|
||||
|
||||
//! returns format of the audio stream
|
||||
virtual SAudioStreamFormat getFormat() = 0;
|
||||
|
||||
//! sets the position of the audio stream.
|
||||
/** For example to let the stream be read from the beginning of the file again,
|
||||
setPosition(0) would be called. This is usually done be the sound engine to
|
||||
loop a stream after if has reached the end. Return true if sucessful and 0 if not.
|
||||
\param pos: Position in frames.*/
|
||||
virtual bool setPosition(ik_s32 pos) = 0;
|
||||
|
||||
//! returns true if the audio stream is seekable
|
||||
/* Some file formats like (MODs) don't support seeking */
|
||||
virtual bool getIsSeekingSupported() { return true; }
|
||||
|
||||
//! tells the audio stream to read frameCountToRead audio frames into the specified buffer
|
||||
/** \param target: Target data buffer to the method will write the read frames into. The
|
||||
specified buffer will be at least getFormat().getFrameSize()*frameCountToRead bytes big.
|
||||
\param frameCountToRead: amount of frames to be read.
|
||||
\returns Returns amount of frames really read. Should be frameCountToRead in most cases. */
|
||||
virtual ik_s32 readFrames(void* target, ik_s32 frameCountToRead) = 0;
|
||||
};
|
||||
|
||||
|
||||
} // end namespace irrklang
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
// Copyright (C) 2002-2018 Nikolaus Gebhardt
|
||||
// This file is part of the "irrKlang" library.
|
||||
// For conditions of distribution and use, see copyright notice in irrKlang.h
|
||||
|
||||
#ifndef __I_IRRKLANG_AUDIO_STREAM_LOADER_H_INCLUDED__
|
||||
#define __I_IRRKLANG_AUDIO_STREAM_LOADER_H_INCLUDED__
|
||||
|
||||
#include "ik_IRefCounted.h"
|
||||
#include "ik_IFileReader.h"
|
||||
|
||||
namespace irrklang
|
||||
{
|
||||
|
||||
class IAudioStream;
|
||||
|
||||
//! Class which is able to create an audio file stream from a file.
|
||||
class IAudioStreamLoader : public IRefCounted
|
||||
{
|
||||
public:
|
||||
|
||||
//! destructor
|
||||
virtual ~IAudioStreamLoader() {};
|
||||
|
||||
//! Returns true if the file maybe is able to be loaded by this class.
|
||||
/** This decision should be based only on the file extension (e.g. ".wav"). The given
|
||||
filename string is guaranteed to be lower case. */
|
||||
virtual bool isALoadableFileExtension(const ik_c8* fileName) = 0;
|
||||
|
||||
//! Creates an audio file input stream from a file
|
||||
/** \return Pointer to the created audio stream. Returns 0 if loading failed.
|
||||
If you no longer need the stream, you should call IAudioFileStream::drop().
|
||||
See IRefCounted::drop() for more information. */
|
||||
virtual IAudioStream* createAudioStream(IFileReader* file) = 0;
|
||||
};
|
||||
|
||||
|
||||
} // end namespace irrklang
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
// Copyright (C) 2002-2018 Nikolaus Gebhardt
|
||||
// This file is part of the "irrKlang" library.
|
||||
// For conditions of distribution and use, see copyright notice in irrKlang.h
|
||||
|
||||
#ifndef __I_IRRKLANG_FILE_FACTORY_H_INCLUDED__
|
||||
#define __I_IRRKLANG_FILE_FACTORY_H_INCLUDED__
|
||||
|
||||
#include "ik_IRefCounted.h"
|
||||
|
||||
namespace irrklang
|
||||
{
|
||||
class IFileReader;
|
||||
|
||||
//! Interface to overwrite file access in irrKlang.
|
||||
/** Derive your own class from IFileFactory, overwrite the createFileReader()
|
||||
method and return your own implemented IFileReader to overwrite file access of irrKlang.
|
||||
Use ISoundEngine::addFileFactory() to let irrKlang know about your class.
|
||||
Example code can be found in the tutorial 04.OverrideFileAccess.
|
||||
*/
|
||||
class IFileFactory : public virtual IRefCounted
|
||||
{
|
||||
public:
|
||||
|
||||
virtual ~IFileFactory() {};
|
||||
|
||||
//! Opens a file for read access.
|
||||
/** Derive your own class from IFileFactory, overwrite this
|
||||
method and return your own implemented IFileReader to overwrite file access of irrKlang.
|
||||
Use ISoundEngine::addFileFactory() to let irrKlang know about your class.
|
||||
Example code can be found in the tutorial 04.OverrideFileAccess.
|
||||
\param filename Name of file to open.
|
||||
\return Returns a pointer to the created file interface.
|
||||
The returned pointer should be dropped when no longer needed.
|
||||
See IRefCounted::drop() for more information. Returns 0 if file cannot be opened. */
|
||||
virtual IFileReader* createFileReader(const ik_c8* filename) = 0;
|
||||
};
|
||||
|
||||
} // end namespace irrklang
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,50 +0,0 @@
|
||||
// Copyright (C) 2002-2018 Nikolaus Gebhardt
|
||||
// This file is part of the "irrKlang" library.
|
||||
// For conditions of distribution and use, see copyright notice in irrKlang.h
|
||||
|
||||
#ifndef __I_IRRKLANG_READ_FILE_H_INCLUDED__
|
||||
#define __I_IRRKLANG_READ_FILE_H_INCLUDED__
|
||||
|
||||
#include "ik_IRefCounted.h"
|
||||
|
||||
namespace irrklang
|
||||
{
|
||||
|
||||
//! Interface providing read acess to a file.
|
||||
class IFileReader : public virtual IRefCounted
|
||||
{
|
||||
public:
|
||||
|
||||
virtual ~IFileReader() {};
|
||||
|
||||
//! Reads an amount of bytes from the file.
|
||||
//! \param buffer: Pointer to buffer where to read bytes will be written to.
|
||||
//! \param sizeToRead: Amount of bytes to read from the file.
|
||||
//! \return Returns how much bytes were read.
|
||||
virtual ik_s32 read(void* buffer, ik_u32 sizeToRead) = 0;
|
||||
|
||||
//! Changes position in file, returns true if successful.
|
||||
//! \param finalPos: Destination position in the file.
|
||||
//! \param relativeMovement: If set to true, the position in the file is
|
||||
//! changed relative to current position. Otherwise the position is changed
|
||||
//! from beginning of file.
|
||||
//! \return Returns true if successful, otherwise false.
|
||||
virtual bool seek(ik_s32 finalPos, bool relativeMovement = false) = 0;
|
||||
|
||||
//! Returns size of file.
|
||||
//! \return Returns the size of the file in bytes.
|
||||
virtual ik_s32 getSize() = 0;
|
||||
|
||||
//! Returns the current position in the file.
|
||||
//! \return Returns the current position in the file in bytes.
|
||||
virtual ik_s32 getPos() = 0;
|
||||
|
||||
//! Returns name of file.
|
||||
//! \return Returns the file name as zero terminated character string.
|
||||
virtual const ik_c8* getFileName() = 0;
|
||||
};
|
||||
|
||||
} // end namespace irrklang
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,119 +0,0 @@
|
||||
// Copyright (C) 2002-2018 Nikolaus Gebhardt
|
||||
// This file is part of the "irrKlang" library.
|
||||
// For conditions of distribution and use, see copyright notice in irrKlang.h
|
||||
|
||||
#ifndef __I_IRRKLANG_IREFERENCE_COUNTED_H_INCLUDED__
|
||||
#define __I_IRRKLANG_IREFERENCE_COUNTED_H_INCLUDED__
|
||||
|
||||
#include "ik_irrKlangTypes.h"
|
||||
|
||||
namespace irrklang
|
||||
{
|
||||
//! Base class of most objects of the irrKlang.
|
||||
/** This class provides reference counting through the methods grab() and drop().
|
||||
It also is able to store a debug string for every instance of an object.
|
||||
Most objects of irrKlang are derived from IRefCounted, and so they are reference counted.
|
||||
|
||||
When you receive an object in irrKlang (for example an ISound using play2D() or
|
||||
play3D()), and you no longer need the object, you have
|
||||
to call drop(). This will destroy the object, if grab() was not called
|
||||
in another part of you program, because this part still needs the object.
|
||||
Note, that you only don't need to call drop() for all objects you receive, it
|
||||
will be explicitely noted in the documentation.
|
||||
|
||||
A simple example:
|
||||
|
||||
If you want to play a sound, you may want to call the method
|
||||
ISoundEngine::play2D. You call
|
||||
ISound* mysound = engine->play2D("foobar.mp3", false, false true);
|
||||
If you no longer need the sound interface, call mysound->drop(). The
|
||||
sound may still play on after this because the engine still has a reference
|
||||
to that sound, but you can be sure that it's memory will be released as soon
|
||||
the sound is no longer used.
|
||||
|
||||
If you want to add a sound source, you may want to call a method
|
||||
ISoundEngine::addSoundSourceFromFile. You do this like
|
||||
ISoundSource* mysource = engine->addSoundSourceFromFile("example.jpg");
|
||||
You will not have to drop the pointer to the source, because
|
||||
sound sources are managed by the engine (it will live as long as the sound engine) and
|
||||
the documentation says so.
|
||||
*/
|
||||
class IRefCounted
|
||||
{
|
||||
public:
|
||||
|
||||
//! Constructor.
|
||||
IRefCounted()
|
||||
: ReferenceCounter(1)
|
||||
{
|
||||
}
|
||||
|
||||
//! Destructor.
|
||||
virtual ~IRefCounted()
|
||||
{
|
||||
}
|
||||
|
||||
//! Grabs the object. Increments the reference counter by one.
|
||||
//! Someone who calls grab() to an object, should later also call
|
||||
//! drop() to it. If an object never gets as much drop() as grab()
|
||||
//! calls, it will never be destroyed.
|
||||
//! The IRefCounted class provides a basic reference counting mechanism
|
||||
//! with its methods grab() and drop(). Most objects of irrklang
|
||||
//! are derived from IRefCounted, and so they are reference counted.
|
||||
//!
|
||||
//! When you receive an object in irrKlang (for example an ISound using play2D() or
|
||||
//! play3D()), and you no longer need the object, you have
|
||||
//! to call drop(). This will destroy the object, if grab() was not called
|
||||
//! in another part of you program, because this part still needs the object.
|
||||
//! Note, that you only don't need to call drop() for all objects you receive, it
|
||||
//! will be explicitely noted in the documentation.
|
||||
//!
|
||||
//! A simple example:
|
||||
//!
|
||||
//! If you want to play a sound, you may want to call the method
|
||||
//! ISoundEngine::play2D. You call
|
||||
//! ISound* mysound = engine->play2D("foobar.mp3", false, false true);
|
||||
//! If you no longer need the sound interface, call mysound->drop(). The
|
||||
//! sound may still play on after this because the engine still has a reference
|
||||
//! to that sound, but you can be sure that it's memory will be released as soon
|
||||
//! the sound is no longer used.
|
||||
void grab() { ++ReferenceCounter; }
|
||||
|
||||
//! When you receive an object in irrKlang (for example an ISound using play2D() or
|
||||
//! play3D()), and you no longer need the object, you have
|
||||
//! to call drop(). This will destroy the object, if grab() was not called
|
||||
//! in another part of you program, because this part still needs the object.
|
||||
//! Note, that you only don't need to call drop() for all objects you receive, it
|
||||
//! will be explicitely noted in the documentation.
|
||||
//!
|
||||
//! A simple example:
|
||||
//!
|
||||
//! If you want to play a sound, you may want to call the method
|
||||
//! ISoundEngine::play2D. You call
|
||||
//! ISound* mysound = engine->play2D("foobar.mp3", false, false true);
|
||||
//! If you no longer need the sound interface, call mysound->drop(). The
|
||||
//! sound may still play on after this because the engine still has a reference
|
||||
//! to that sound, but you can be sure that it's memory will be released as soon
|
||||
//! the sound is no longer used.
|
||||
bool drop()
|
||||
{
|
||||
--ReferenceCounter;
|
||||
|
||||
if (!ReferenceCounter)
|
||||
{
|
||||
delete this;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
ik_s32 ReferenceCounter;
|
||||
};
|
||||
|
||||
} // end namespace irr
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,194 +0,0 @@
|
||||
// Copyright (C) 2002-2018 Nikolaus Gebhardt
|
||||
// This file is part of the "irrKlang" library.
|
||||
// For conditions of distribution and use, see copyright notice in irrKlang.h
|
||||
|
||||
#ifndef __I_IRRKLANG_SOUND_H_INCLUDED__
|
||||
#define __I_IRRKLANG_SOUND_H_INCLUDED__
|
||||
|
||||
#include "ik_IVirtualRefCounted.h"
|
||||
#include "ik_ISoundEffectControl.h"
|
||||
#include "ik_vec3d.h"
|
||||
|
||||
|
||||
namespace irrklang
|
||||
{
|
||||
class ISoundSource;
|
||||
class ISoundStopEventReceiver;
|
||||
|
||||
//! Represents a sound which is currently played.
|
||||
/** The sound can be stopped, its volume or pan changed, effects added/removed
|
||||
and similar using this interface.
|
||||
Creating sounds is done using ISoundEngine::play2D() or ISoundEngine::play3D().
|
||||
More informations about the source of a sound can be obtained from the ISoundSource
|
||||
interface. */
|
||||
class ISound : public IVirtualRefCounted
|
||||
{
|
||||
public:
|
||||
|
||||
//! returns source of the sound which stores the filename and other informations about that sound
|
||||
/** \return Returns the sound source poitner of this sound. May return 0 if the sound source
|
||||
has been removed.*/
|
||||
virtual ISoundSource* getSoundSource() = 0;
|
||||
|
||||
//! returns if the sound is paused
|
||||
virtual void setIsPaused( bool paused = true) = 0;
|
||||
|
||||
//! returns if the sound is paused
|
||||
virtual bool getIsPaused() = 0;
|
||||
|
||||
//! Will stop the sound and free its resources.
|
||||
/** If you just want to pause the sound, use setIsPaused().
|
||||
After calling stop(), isFinished() will usually return true.
|
||||
Be sure to also call ->drop() once you are done.*/
|
||||
virtual void stop() = 0;
|
||||
|
||||
//! returns volume of the sound, a value between 0 (mute) and 1 (full volume).
|
||||
/** (this volume gets multiplied with the master volume of the sound engine
|
||||
and other parameters like distance to listener when played as 3d sound) */
|
||||
virtual ik_f32 getVolume() = 0;
|
||||
|
||||
//! sets the volume of the sound, a value between 0 (mute) and 1 (full volume).
|
||||
/** This volume gets multiplied with the master volume of the sound engine
|
||||
and other parameters like distance to listener when played as 3d sound. */
|
||||
virtual void setVolume(ik_f32 volume) = 0;
|
||||
|
||||
//! sets the pan of the sound. Takes a value between -1 and 1, 0 is center.
|
||||
virtual void setPan(ik_f32 pan) = 0;
|
||||
|
||||
//! returns the pan of the sound. Takes a value between -1 and 1, 0 is center.
|
||||
virtual ik_f32 getPan() = 0;
|
||||
|
||||
//! returns if the sound has been started to play looped
|
||||
virtual bool isLooped() = 0;
|
||||
|
||||
//! changes the loop mode of the sound.
|
||||
/** If the sound is playing looped and it is changed to not-looped, then it
|
||||
will stop playing after the loop has finished.
|
||||
If it is not looped and changed to looped, the sound will start repeating to be
|
||||
played when it reaches its end.
|
||||
Invoking this method will not have an effect when the sound already has stopped. */
|
||||
virtual void setIsLooped(bool looped) = 0;
|
||||
|
||||
//! returns if the sound has finished playing.
|
||||
/** Don't mix this up with isPaused(). isFinished() returns if the sound has been
|
||||
finished playing. If it has, is maybe already have been removed from the playing list of the
|
||||
sound engine and calls to any other of the methods of ISound will not have any result.
|
||||
If you call stop() to a playing sound will result that this function will return true
|
||||
when invoked. */
|
||||
virtual bool isFinished() = 0;
|
||||
|
||||
//! Sets the minimal distance if this is a 3D sound.
|
||||
/** Changes the distance at which the 3D sound stops getting louder. This works
|
||||
like this: As a listener approaches a 3D sound source, the sound gets louder.
|
||||
Past a certain point, it is not reasonable for the volume to continue to increase.
|
||||
Either the maximum (zero) has been reached, or the nature of the sound source
|
||||
imposes a logical limit. This is the minimum distance for the sound source.
|
||||
Similarly, the maximum distance for a sound source is the distance beyond
|
||||
which the sound does not get any quieter.
|
||||
The default minimum distance is 1, the default max distance is a huge number like 1000000000.0f. */
|
||||
virtual void setMinDistance(ik_f32 min) = 0;
|
||||
|
||||
//! Returns the minimal distance if this is a 3D sound.
|
||||
/** See setMinDistance() for details. */
|
||||
virtual ik_f32 getMinDistance() = 0;
|
||||
|
||||
//! Sets the maximal distance if this is a 3D sound.
|
||||
/** Changing this value is usually not necessary. Use setMinDistance() instead.
|
||||
Don't change this value if you don't know what you are doing: This value causes the sound
|
||||
to stop attenuating after it reaches the max distance. Most people think that this sets the
|
||||
volume of the sound to 0 after this distance, but this is not true. Only change the
|
||||
minimal distance (using for example setMinDistance()) to influence this.
|
||||
The maximum distance for a sound source is the distance beyond which the sound does not get any quieter.
|
||||
The default minimum distance is 1, the default max distance is a huge number like 1000000000.0f. */
|
||||
virtual void setMaxDistance(ik_f32 max) = 0;
|
||||
|
||||
//! Returns the maximal distance if this is a 3D sound.
|
||||
/** See setMaxDistance() for details. */
|
||||
virtual ik_f32 getMaxDistance() = 0;
|
||||
|
||||
//! sets the position of the sound in 3d space
|
||||
virtual void setPosition(vec3df position) = 0;
|
||||
|
||||
//! returns the position of the sound in 3d space
|
||||
virtual vec3df getPosition() = 0;
|
||||
|
||||
//! sets the position of the sound in 3d space, needed for Doppler effects.
|
||||
/** To use doppler effects use ISound::setVelocity to set a sounds velocity,
|
||||
ISoundEngine::setListenerPosition() to set the listeners velocity and
|
||||
ISoundEngine::setDopplerEffectParameters() to adjust two parameters influencing
|
||||
the doppler effects intensity. */
|
||||
virtual void setVelocity(vec3df vel) = 0;
|
||||
|
||||
//! returns the velocity of the sound in 3d space, needed for Doppler effects.
|
||||
/** To use doppler effects use ISound::setVelocity to set a sounds velocity,
|
||||
ISoundEngine::setListenerPosition() to set the listeners velocity and
|
||||
ISoundEngine::setDopplerEffectParameters() to adjust two parameters influencing
|
||||
the doppler effects intensity. */
|
||||
virtual vec3df getVelocity() = 0;
|
||||
|
||||
//! returns the current play position of the sound in milliseconds.
|
||||
/** \return Returns -1 if not implemented or possible for this sound for example
|
||||
because it already has been stopped and freed internally or similar. */
|
||||
virtual ik_u32 getPlayPosition() = 0;
|
||||
|
||||
//! sets the current play position of the sound in milliseconds.
|
||||
/** \param pos Position in milliseconds. Must be between 0 and the value returned
|
||||
by getPlayPosition().
|
||||
\return Returns true successful. False is returned for example if the sound already finished
|
||||
playing and is stopped or the audio source is not seekable, for example if it
|
||||
is an internet stream or a a file format not supporting seeking (a .MOD file for example).
|
||||
A file can be tested if it can bee seeking using ISoundSource::getIsSeekingSupported(). */
|
||||
virtual bool setPlayPosition(ik_u32 pos) = 0;
|
||||
|
||||
//! Sets the playback speed (frequency) of the sound.
|
||||
/** Plays the sound at a higher or lower speed, increasing or decreasing its
|
||||
frequency which makes it sound lower or higher.
|
||||
Note that this feature is not available on all sound output drivers (it is on the
|
||||
DirectSound drivers at least), and it does not work together with the
|
||||
'enableSoundEffects' parameter of ISoundEngine::play2D and ISoundEngine::play3D when
|
||||
using DirectSound.
|
||||
\param speed Factor of the speed increase or decrease. 2 is twice as fast,
|
||||
0.5 is only half as fast. The default is 1.0.
|
||||
\return Returns true if sucessful, false if not. The current sound driver might not
|
||||
support changing the playBack speed, or the sound was started with the
|
||||
'enableSoundEffects' parameter. */
|
||||
virtual bool setPlaybackSpeed(ik_f32 speed = 1.0f) = 0;
|
||||
|
||||
//! Returns the playback speed set by setPlaybackSpeed(). Default: 1.0f.
|
||||
/** See setPlaybackSpeed() for details */
|
||||
virtual ik_f32 getPlaybackSpeed() = 0;
|
||||
|
||||
//! returns the play length of the sound in milliseconds.
|
||||
/** Returns -1 if not known for this sound for example because its decoder
|
||||
does not support length reporting or it is a file stream of unknown size.
|
||||
Note: You can also use ISoundSource::getPlayLength() to get the length of
|
||||
a sound without actually needing to play it. */
|
||||
virtual ik_u32 getPlayLength() = 0;
|
||||
|
||||
//! Returns the sound effect control interface for this sound.
|
||||
/** Sound effects such as Chorus, Distorsions, Echo, Reverb and similar can
|
||||
be controlled using this. The interface pointer is only valid as long as the ISound pointer is valid.
|
||||
If the ISound pointer gets dropped (IVirtualRefCounted::drop()), the ISoundEffects
|
||||
may not be used any more.
|
||||
\return Returns a pointer to the sound effects interface if available. The sound
|
||||
has to be started via ISoundEngine::play2D() or ISoundEngine::play3D(),
|
||||
with the flag enableSoundEffects=true, otherwise 0 will be returned. Note that
|
||||
if the output driver does not support sound effects, 0 will be returned as well.*/
|
||||
virtual ISoundEffectControl* getSoundEffectControl() = 0;
|
||||
|
||||
//! Sets the sound stop event receiver, an interface which gets called if a sound has finished playing.
|
||||
/** This event is guaranteed to be called when the sound or sound stream is finished,
|
||||
either because the sound reached its playback end, its sound source was removed,
|
||||
ISoundEngine::stopAllSounds() has been called or the whole engine was deleted.
|
||||
There is an example on how to use events in irrklang at @ref events .
|
||||
\param receiver Interface to a user implementation of the sound receiver. This interface
|
||||
should be as long valid as the sound exists or another stop event receiver is set.
|
||||
Set this to null to set no sound stop event receiver.
|
||||
\param userData: A iser data pointer, can be null. */
|
||||
virtual void setSoundStopEventReceiver(ISoundStopEventReceiver* reciever, void* userData=0) = 0;
|
||||
};
|
||||
|
||||
} // end namespace irrklang
|
||||
|
||||
|
||||
#endif
|
||||
@@ -1,41 +0,0 @@
|
||||
// Copyright (C) 2002-2018 Nikolaus Gebhardt
|
||||
// This file is part of the "irrKlang" library.
|
||||
// For conditions of distribution and use, see copyright notice in irrKlang.h
|
||||
|
||||
#ifndef __I_IRRKLANG_SOUND_DEVICE_LIST_H_INCLUDED__
|
||||
#define __I_IRRKLANG_SOUND_DEVICE_LIST_H_INCLUDED__
|
||||
|
||||
#include "ik_IRefCounted.h"
|
||||
|
||||
namespace irrklang
|
||||
{
|
||||
|
||||
//! A list of sound devices for a sound driver. Use irrklang::createSoundDeviceList() to create this list.
|
||||
/** The function createIrrKlangDevice() has a parameter 'deviceID' which takes the value returned by
|
||||
ISoundDeviceList::getDeviceID() and uses that device then.
|
||||
The list of devices in ISoundDeviceList usually also includes the default device which is the first
|
||||
entry and has an empty deviceID string ("") and the description "default device".
|
||||
There is some example code on how to use the ISoundDeviceList in @ref enumeratingDevices.*/
|
||||
class ISoundDeviceList : public IRefCounted
|
||||
{
|
||||
public:
|
||||
|
||||
//! Returns amount of enumerated devices in the list.
|
||||
virtual ik_s32 getDeviceCount() = 0;
|
||||
|
||||
//! Returns the ID of the device. Use this string to identify this device in createIrrKlangDevice().
|
||||
/** \param index Index of the device, a value between 0 and ISoundDeviceList::getDeviceCount()-1.
|
||||
\return Returns a pointer to a string identifying the device. The string will only as long valid
|
||||
as long as the ISoundDeviceList exists. */
|
||||
virtual const char* getDeviceID(ik_s32 index) = 0;
|
||||
|
||||
//! Returns description of the device.
|
||||
/** \param index Index of the device, a value between 0 and ISoundDeviceList::getDeviceCount()-1. */
|
||||
virtual const char* getDeviceDescription(ik_s32 index) = 0;
|
||||
};
|
||||
|
||||
|
||||
} // end namespace irrklang
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,243 +0,0 @@
|
||||
// Copyright (C) 2002-2018 Nikolaus Gebhardt
|
||||
// This file is part of the "irrKlang" library.
|
||||
// For conditions of distribution and use, see copyright notice in irrKlang.h
|
||||
|
||||
#ifndef __I_IRRKLANG_SOUND_EFFECT_CONTROL_H_INCLUDED__
|
||||
#define __I_IRRKLANG_SOUND_EFFECT_CONTROL_H_INCLUDED__
|
||||
|
||||
#include "ik_IVirtualRefCounted.h"
|
||||
#include "ik_vec3d.h"
|
||||
|
||||
|
||||
namespace irrklang
|
||||
{
|
||||
//! Interface to control the active sound effects (echo, reverb,...) of an ISound object, a playing sound.
|
||||
/** Sound effects such as chorus, distorsions, echo, reverb and similar can
|
||||
be controlled using this. An instance of this interface can be obtained via
|
||||
ISound::getSoundEffectControl(). The sound containing this interface has to be started via
|
||||
ISoundEngine::play2D() or ISoundEngine::play3D() with the flag enableSoundEffects=true,
|
||||
otherwise no acccess to this interface will be available.
|
||||
For the DirectSound driver, these are effects available since DirectSound8. For most
|
||||
effects, sounds should have a sample rate of 44 khz and should be at least
|
||||
150 milli seconds long for optimal quality when using the DirectSound driver.
|
||||
Note that the interface pointer is only valid as long as
|
||||
the ISound pointer is valid. If the ISound pointer gets dropped (IVirtualRefCounted::drop()),
|
||||
the ISoundEffects may not be used any more. */
|
||||
class ISoundEffectControl
|
||||
{
|
||||
public:
|
||||
|
||||
//! Disables all active sound effects
|
||||
virtual void disableAllEffects() = 0;
|
||||
|
||||
//! Enables the chorus sound effect or adjusts its values.
|
||||
/** Chorus is a voice-doubling effect created by echoing the
|
||||
original sound with a slight delay and slightly modulating the delay of the echo.
|
||||
If this sound effect is already enabled, calling this only modifies the parameters of the active effect.
|
||||
\param fWetDryMix Ratio of wet (processed) signal to dry (unprocessed) signal. Minimal Value:0, Maximal Value:100.0f;
|
||||
\param fDepth Percentage by which the delay time is modulated by the low-frequency oscillator, in hundredths of a percentage point. Minimal Value:0, Maximal Value:100.0f;
|
||||
\param fFeedback Percentage of output signal to feed back into the effect's input. Minimal Value:-99, Maximal Value:99.0f;
|
||||
\param fFrequency Frequency of the LFO. Minimal Value:0, Maximal Value:10.0f;
|
||||
\param sinusWaveForm True for sinus wave form, false for triangle.
|
||||
\param fDelay Number of milliseconds the input is delayed before it is played back. Minimal Value:0, Maximal Value:20.0f;
|
||||
\param lPhase Phase differential between left and right LFOs. Possible values:
|
||||
-180, -90, 0, 90, 180
|
||||
\return Returns true if successful. */
|
||||
virtual bool enableChorusSoundEffect(ik_f32 fWetDryMix = 50,
|
||||
ik_f32 fDepth = 10,
|
||||
ik_f32 fFeedback = 25,
|
||||
ik_f32 fFrequency = 1.1,
|
||||
bool sinusWaveForm = true,
|
||||
ik_f32 fDelay = 16,
|
||||
ik_s32 lPhase = 90) = 0;
|
||||
|
||||
//! removes the sound effect from the sound
|
||||
virtual void disableChorusSoundEffect() = 0;
|
||||
|
||||
//! returns if the sound effect is active on the sound
|
||||
virtual bool isChorusSoundEffectEnabled() = 0;
|
||||
|
||||
//! Enables the Compressor sound effect or adjusts its values.
|
||||
/** Compressor is a reduction in the fluctuation of a signal above a certain amplitude.
|
||||
If this sound effect is already enabled, calling this only modifies the parameters of the active effect.
|
||||
\param fGain Output gain of signal after Compressor. Minimal Value:-60, Maximal Value:60.0f;
|
||||
\param fAttack Time before Compressor reaches its full value. Minimal Value:0.01, Maximal Value:500.0f;
|
||||
\param fRelease Speed at which Compressor is stopped after input drops below fThreshold. Minimal Value:50, Maximal Value:3000.0f;
|
||||
\param fThreshold Point at which Compressor begins, in decibels. Minimal Value:-60, Maximal Value:0.0f;
|
||||
\param fRatio Compressor ratio. Minimal Value:1, Maximal Value:100.0f;
|
||||
\param fPredelay Time after lThreshold is reached before attack phase is started, in milliseconds. Minimal Value:0, Maximal Value:4.0f;
|
||||
\return Returns true if successful. */
|
||||
virtual bool enableCompressorSoundEffect( ik_f32 fGain = 0,
|
||||
ik_f32 fAttack = 10,
|
||||
ik_f32 fRelease = 200,
|
||||
ik_f32 fThreshold = -20,
|
||||
ik_f32 fRatio = 3,
|
||||
ik_f32 fPredelay = 4) = 0;
|
||||
|
||||
//! removes the sound effect from the sound
|
||||
virtual void disableCompressorSoundEffect() = 0;
|
||||
|
||||
//! returns if the sound effect is active on the sound
|
||||
virtual bool isCompressorSoundEffectEnabled() = 0;
|
||||
|
||||
//! Enables the Distortion sound effect or adjusts its values.
|
||||
/** Distortion is achieved by adding harmonics to the signal in such a way that,
|
||||
If this sound effect is already enabled, calling this only modifies the parameters of the active effect.
|
||||
as the level increases, the top of the waveform becomes squared off or clipped.
|
||||
\param fGain Amount of signal change after distortion. Minimal Value:-60, Maximal Value:0;
|
||||
\param fEdge Percentage of distortion intensity. Minimal Value:0, Maximal Value:100;
|
||||
\param fPostEQCenterFrequency Center frequency of harmonic content addition. Minimal Value:100, Maximal Value:8000;
|
||||
\param fPostEQBandwidth Width of frequency band that determines range of harmonic content addition. Minimal Value:100, Maximal Value:8000;
|
||||
\param fPreLowpassCutoff Filter cutoff for high-frequency harmonics attenuation. Minimal Value:100, Maximal Value:8000;
|
||||
\return Returns true if successful. */
|
||||
virtual bool enableDistortionSoundEffect(ik_f32 fGain = -18,
|
||||
ik_f32 fEdge = 15,
|
||||
ik_f32 fPostEQCenterFrequency = 2400,
|
||||
ik_f32 fPostEQBandwidth = 2400,
|
||||
ik_f32 fPreLowpassCutoff = 8000) = 0;
|
||||
|
||||
//! removes the sound effect from the sound
|
||||
virtual void disableDistortionSoundEffect() = 0;
|
||||
|
||||
//! returns if the sound effect is active on the sound
|
||||
virtual bool isDistortionSoundEffectEnabled() = 0;
|
||||
|
||||
//! Enables the Echo sound effect or adjusts its values.
|
||||
/** An echo effect causes an entire sound to be repeated after a fixed delay.
|
||||
If this sound effect is already enabled, calling this only modifies the parameters of the active effect.
|
||||
\param fWetDryMix Ratio of wet (processed) signal to dry (unprocessed) signal. Minimal Value:0, Maximal Value:100.0f;
|
||||
\param fFeedback Percentage of output fed back into input. Minimal Value:0, Maximal Value:100.0f;
|
||||
\param fLeftDelay Delay for left channel, in milliseconds. Minimal Value:1, Maximal Value:2000.0f;
|
||||
\param fRightDelay Delay for right channel, in milliseconds. Minimal Value:1, Maximal Value:2000.0f;
|
||||
\param lPanDelay Value that specifies whether to swap left and right delays with each successive echo. Minimal Value:0, Maximal Value:1;
|
||||
\return Returns true if successful. */
|
||||
virtual bool enableEchoSoundEffect(ik_f32 fWetDryMix = 50,
|
||||
ik_f32 fFeedback = 50,
|
||||
ik_f32 fLeftDelay = 500,
|
||||
ik_f32 fRightDelay = 500,
|
||||
ik_s32 lPanDelay = 0) = 0;
|
||||
|
||||
//! removes the sound effect from the sound
|
||||
virtual void disableEchoSoundEffect() = 0;
|
||||
|
||||
//! returns if the sound effect is active on the sound
|
||||
virtual bool isEchoSoundEffectEnabled() = 0;
|
||||
|
||||
//! Enables the Flanger sound effect or adjusts its values.
|
||||
/** Flange is an echo effect in which the delay between the original
|
||||
signal and its echo is very short and varies over time. The result is
|
||||
sometimes referred to as a sweeping sound. The term flange originated
|
||||
with the practice of grabbing the flanges of a tape reel to change the speed.
|
||||
If this sound effect is already enabled, calling this only modifies the parameters of the active effect.
|
||||
\param fWetDryMix Ratio of wet (processed) signal to dry (unprocessed) signal. Minimal Value:0, Maximal Value:100.0f;
|
||||
\param fDepth Percentage by which the delay time is modulated by the low-frequency oscillator, in hundredths of a percentage point. Minimal Value:0, Maximal Value:100.0f;
|
||||
\param fFeedback Percentage of output signal to feed back into the effect's input. Minimal Value:-99, Maximal Value:99.0f;
|
||||
\param fFrequency Frequency of the LFO. Minimal Value:0, Maximal Value:10.0f;
|
||||
\param triangleWaveForm True for triangle wave form, false for square.
|
||||
\param fDelay Number of milliseconds the input is delayed before it is played back. Minimal Value:0, Maximal Value:20.0f;
|
||||
\param lPhase Phase differential between left and right LFOs. Possible values:
|
||||
-180, -90, 0, 90, 180
|
||||
\return Returns true if successful. */
|
||||
virtual bool enableFlangerSoundEffect(ik_f32 fWetDryMix = 50,
|
||||
ik_f32 fDepth = 100,
|
||||
ik_f32 fFeedback = -50,
|
||||
ik_f32 fFrequency = 0.25f,
|
||||
bool triangleWaveForm = true,
|
||||
ik_f32 fDelay = 2,
|
||||
ik_s32 lPhase = 0) = 0;
|
||||
|
||||
//! removes the sound effect from the sound
|
||||
virtual void disableFlangerSoundEffect() = 0;
|
||||
|
||||
//! returns if the sound effect is active on the sound
|
||||
virtual bool isFlangerSoundEffectEnabled() = 0;
|
||||
|
||||
//! Enables the Gargle sound effect or adjusts its values.
|
||||
/** The gargle effect modulates the amplitude of the signal.
|
||||
If this sound effect is already enabled, calling this only modifies the parameters of the active effect.
|
||||
\param rateHz Rate of modulation, in Hertz. Minimal Value:1, Maximal Value:1000
|
||||
\param sinusWaveForm True for sinus wave form, false for triangle.
|
||||
\return Returns true if successful. */
|
||||
virtual bool enableGargleSoundEffect(ik_s32 rateHz = 20, bool sinusWaveForm = true) = 0;
|
||||
|
||||
//! removes the sound effect from the sound
|
||||
virtual void disableGargleSoundEffect() = 0;
|
||||
|
||||
//! returns if the sound effect is active on the sound
|
||||
virtual bool isGargleSoundEffectEnabled() = 0;
|
||||
|
||||
//! Enables the Interactive 3D Level 2 reverb sound effect or adjusts its values.
|
||||
/** An implementation of the listener properties in the I3DL2 specification. Source properties are not supported.
|
||||
If this sound effect is already enabled, calling this only modifies the parameters of the active effect.
|
||||
\param lRoom Attenuation of the room effect, in millibels (mB). Interval: [-10000, 0] Default: -1000 mB
|
||||
\param lRoomHF Attenuation of the room high-frequency effect. Interval: [-10000, 0] default: 0 mB
|
||||
\param flRoomRolloffFactor Rolloff factor for the reflected signals. Interval: [0.0, 10.0] default: 0.0
|
||||
\param flDecayTime Decay time, in seconds. Interval: [0.1, 20.0] default: 1.49s
|
||||
\param flDecayHFRatio Ratio of the decay time at high frequencies to the decay time at low frequencies. Interval: [0.1, 2.0] default: 0.83
|
||||
\param lReflections Attenuation of early reflections relative to lRoom. Interval: [-10000, 1000] default: -2602 mB
|
||||
\param flReflectionsDelay Delay time of the first reflection relative to the direct path in seconds. Interval: [0.0, 0.3] default: 0.007 s
|
||||
\param lReverb Attenuation of late reverberation relative to lRoom, in mB. Interval: [-10000, 2000] default: 200 mB
|
||||
\param flReverbDelay Time limit between the early reflections and the late reverberation relative to the time of the first reflection. Interval: [0.0, 0.1] default: 0.011 s
|
||||
\param flDiffusion Echo density in the late reverberation decay in percent. Interval: [0.0, 100.0] default: 100.0 %
|
||||
\param flDensity Modal density in the late reverberation decay, in percent. Interval: [0.0, 100.0] default: 100.0 %
|
||||
\param flHFReference Reference high frequency, in hertz. Interval: [20.0, 20000.0] default: 5000.0 Hz
|
||||
\return Returns true if successful. */
|
||||
virtual bool enableI3DL2ReverbSoundEffect(ik_s32 lRoom = -1000,
|
||||
ik_s32 lRoomHF = -100,
|
||||
ik_f32 flRoomRolloffFactor = 0,
|
||||
ik_f32 flDecayTime = 1.49f,
|
||||
ik_f32 flDecayHFRatio = 0.83f,
|
||||
ik_s32 lReflections = -2602,
|
||||
ik_f32 flReflectionsDelay = 0.007f,
|
||||
ik_s32 lReverb = 200,
|
||||
ik_f32 flReverbDelay = 0.011f,
|
||||
ik_f32 flDiffusion = 100.0f,
|
||||
ik_f32 flDensity = 100.0f,
|
||||
ik_f32 flHFReference = 5000.0f ) = 0;
|
||||
|
||||
//! removes the sound effect from the sound
|
||||
virtual void disableI3DL2ReverbSoundEffect() = 0;
|
||||
|
||||
//! returns if the sound effect is active on the sound
|
||||
virtual bool isI3DL2ReverbSoundEffectEnabled() = 0;
|
||||
|
||||
//! Enables the ParamEq sound effect or adjusts its values.
|
||||
/** Parametric equalizer amplifies or attenuates signals of a given frequency.
|
||||
If this sound effect is already enabled, calling this only modifies the parameters of the active effect.
|
||||
\param fCenter Center frequency, in hertz, The default value is 8000. Minimal Value:80, Maximal Value:16000.0f
|
||||
\param fBandwidth Bandwidth, in semitones, The default value is 12. Minimal Value:1.0f, Maximal Value:36.0f
|
||||
\param fGain Gain, default value is 0. Minimal Value:-15.0f, Maximal Value:15.0f
|
||||
\return Returns true if successful. */
|
||||
virtual bool enableParamEqSoundEffect(ik_f32 fCenter = 8000,
|
||||
ik_f32 fBandwidth = 12,
|
||||
ik_f32 fGain = 0) = 0;
|
||||
|
||||
//! removes the sound effect from the sound
|
||||
virtual void disableParamEqSoundEffect() = 0;
|
||||
|
||||
//! returns if the sound effect is active on the sound
|
||||
virtual bool isParamEqSoundEffectEnabled() = 0;
|
||||
|
||||
//! Enables the Waves Reverb sound effect or adjusts its values.
|
||||
/** \param fInGain Input gain of signal, in decibels (dB). Min/Max: [-96.0,0.0] Default: 0.0 dB.
|
||||
If this sound effect is already enabled, calling this only modifies the parameters of the active effect.
|
||||
\param fReverbMix Reverb mix, in dB. Min/Max: [-96.0,0.0] Default: 0.0 dB
|
||||
\param fReverbTime Reverb time, in milliseconds. Min/Max: [0.001,3000.0] Default: 1000.0 ms
|
||||
\param fHighFreqRTRatio High-frequency reverb time ratio. Min/Max: [0.001,0.999] Default: 0.001
|
||||
\return Returns true if successful. */
|
||||
virtual bool enableWavesReverbSoundEffect(ik_f32 fInGain = 0,
|
||||
ik_f32 fReverbMix = 0,
|
||||
ik_f32 fReverbTime = 1000,
|
||||
ik_f32 fHighFreqRTRatio = 0.001f) = 0;
|
||||
|
||||
//! removes the sound effect from the sound
|
||||
virtual void disableWavesReverbSoundEffect() = 0;
|
||||
|
||||
//! returns if the sound effect is active on the sound
|
||||
virtual bool isWavesReverbSoundEffectEnabled() = 0;
|
||||
};
|
||||
|
||||
} // end namespace irrklang
|
||||
|
||||
|
||||
#endif
|
||||
@@ -1,436 +0,0 @@
|
||||
// Copyright (C) 2002-2018 Nikolaus Gebhardt
|
||||
// This file is part of the "irrKlang" library.
|
||||
// For conditions of distribution and use, see copyright notice in irrKlang.h
|
||||
|
||||
#ifndef __I_IRRKLANG_SOUND_ENGINE_H_INCLUDED__
|
||||
#define __I_IRRKLANG_SOUND_ENGINE_H_INCLUDED__
|
||||
|
||||
#include "ik_IRefCounted.h"
|
||||
#include "ik_vec3d.h"
|
||||
#include "ik_ISoundSource.h"
|
||||
#include "ik_ISound.h"
|
||||
#include "ik_EStreamModes.h"
|
||||
#include "ik_IFileFactory.h"
|
||||
#include "ik_ISoundMixedOutputReceiver.h"
|
||||
|
||||
|
||||
namespace irrklang
|
||||
{
|
||||
class IAudioStreamLoader;
|
||||
struct SInternalAudioInterface;
|
||||
|
||||
//! Interface to the sound engine, for playing 3d and 2d sound and music.
|
||||
/** This is the main interface of irrKlang. You usually would create this using
|
||||
the createIrrKlangDevice() function.
|
||||
*/
|
||||
class ISoundEngine : public virtual irrklang::IRefCounted
|
||||
{
|
||||
public:
|
||||
|
||||
//! returns the name of the sound driver, like 'ALSA' for the alsa device
|
||||
/** Possible returned strings are "NULL", "ALSA", "CoreAudio", "winMM",
|
||||
"DirectSound" and "DirectSound8". */
|
||||
virtual const char* getDriverName() = 0;
|
||||
|
||||
//! loads a sound source (if not loaded already) from a file and plays it.
|
||||
/** \param sourceFileName Filename of sound, like "sounds/test.wav" or "foobar.ogg".
|
||||
\param playLooped plays the sound in loop mode. If set to 'false', the sound is played once, then stopped and deleted from the internal playing list. Calls to
|
||||
ISound have no effect after such a non looped sound has been stopped automaticly.
|
||||
\param startPaused starts the sound paused. This implies that track=true. Use this if you want to modify some of the playing
|
||||
parameters before the sound actually plays. Usually you would set this parameter to true, then use the ISound interface to
|
||||
modify some of the sound parameters and then call ISound::setPaused(false);
|
||||
Note: You need to call ISound::drop() when setting this parameter to true and you don't need the ISound
|
||||
object anymore. See 'return' for details.
|
||||
\param track Makes it possible to track the sound. Causes the method to return an ISound interface. See 'return' for details.
|
||||
\param streamMode Specifies if the file should be streamed or loaded completely into memory for playing.
|
||||
ESM_AUTO_DETECT sets this to autodetection. Note: if the sound has been loaded or played before into the
|
||||
engine, this parameter has no effect.
|
||||
\param enableSoundEffects Makes it possible to use sound effects such as chorus, distorsions, echo,
|
||||
reverb and similar for this sound. Sound effects can then be controlled via ISound::getSoundEffectControl().
|
||||
Only enable if necessary.
|
||||
\return Only returns a pointer to an ISound if the parameters 'track', 'startPaused' or
|
||||
'enableSoundEffects' have been set to true. Note: if this method returns an ISound as result,
|
||||
you HAVE to call ISound::drop() after you don't need the ISound interface anymore. Otherwise this
|
||||
will cause memory waste. This method also may return 0 altough 'track', 'startPaused' or
|
||||
'enableSoundEffects' have been set to true, if the sound could not be played.*/
|
||||
virtual ISound* play2D(const char* soundFileName,
|
||||
bool playLooped = false,
|
||||
bool startPaused = false,
|
||||
bool track = false,
|
||||
E_STREAM_MODE streamMode = ESM_AUTO_DETECT,
|
||||
bool enableSoundEffects = false) = 0;
|
||||
|
||||
//! Plays a sound source as 2D sound with its default settings stored in ISoundSource.
|
||||
/** An ISoundSource object will be created internally when playing a sound the first time,
|
||||
or can be added with getSoundSource().
|
||||
\param source The sound source, specifiying sound file source and default settings for this file.
|
||||
Use the other ISoundEngine::play2D() overloads if you want to specify a filename string instead of this.
|
||||
\param playLooped plays the sound in loop mode. If set to 'false', the sound is played once, then stopped and deleted from the internal playing list. Calls to
|
||||
ISound have no effect after such a non looped sound has been stopped automaticly.
|
||||
\param startPaused starts the sound paused. This implies that track=true. Use this if you want to modify some of the playing
|
||||
parameters before the sound actually plays. Usually you would set this parameter to true, then use the ISound interface to
|
||||
modify some of the sound parameters and then call ISound::setPaused(false);
|
||||
Note: You need to call ISound::drop() when setting this parameter to true and you don't need the ISound
|
||||
object anymore. See 'return' for details.
|
||||
\param track Makes it possible to track the sound. Causes the method to return an ISound interface. See 'return' for details.
|
||||
\param enableSoundEffects Makes it possible to use sound effects such as chorus, distorsions, echo,
|
||||
reverb and similar for this sound. Sound effects can then be controlled via ISound::getSoundEffectControl().
|
||||
Only enable if necessary.
|
||||
\return Only returns a pointer to an ISound if the parameters 'track', 'startPaused' or
|
||||
'enableSoundEffects' have been set to true. Note: if this method returns an ISound as result,
|
||||
you HAVE to call ISound::drop() after you don't need the ISound interface anymore. Otherwise this
|
||||
will cause memory waste. This method also may return 0 altough 'track', 'startPaused' or
|
||||
'enableSoundEffects' have been set to true, if the sound could not be played.*/
|
||||
virtual ISound* play2D(ISoundSource* source,
|
||||
bool playLooped = false,
|
||||
bool startPaused = false,
|
||||
bool track = false,
|
||||
bool enableSoundEffects = false) = 0;
|
||||
|
||||
//! Loads a sound source (if not loaded already) from a file and plays it as 3D sound.
|
||||
/** There is some example code on how to work with 3D sound at @ref sound3d.
|
||||
\param sourceFileName Filename of sound, like "sounds/test.wav" or "foobar.ogg".
|
||||
\param pos Position of the 3D sound.
|
||||
\param playLooped plays the sound in loop mode. If set to 'false', the sound is played once, then stopped and deleted from the internal playing list. Calls to
|
||||
ISound have no effect after such a non looped sound has been stopped automaticly.
|
||||
\param startPaused starts the sound paused. This implies that track=true. Use this if you want to modify some of the playing
|
||||
parameters before the sound actually plays. Usually you would set this parameter to true, then use the ISound interface to
|
||||
modify some of the sound parameters and then call ISound::setPaused(false);
|
||||
Note: You need to call ISound::drop() when setting this parameter to true and you don't need the ISound
|
||||
object anymore. See 'return' for details.
|
||||
\param track Makes it possible to track the sound. Causes the method to return an ISound interface. See 'return' for details.
|
||||
\param streamMode Specifies if the file should be streamed or loaded completely into memory for playing.
|
||||
ESM_AUTO_DETECT sets this to autodetection. Note: if the sound has been loaded or played before into the
|
||||
engine, this parameter has no effect.
|
||||
\param enableSoundEffects Makes it possible to use sound effects such as chorus, distorsions, echo,
|
||||
reverb and similar for this sound. Sound effects can then be controlled via ISound::getSoundEffectControl().
|
||||
Only enable if necessary.
|
||||
\return Only returns a pointer to an ISound if the parameters 'track', 'startPaused' or
|
||||
'enableSoundEffects' have been set to true. Note: if this method returns an ISound as result,
|
||||
you HAVE to call ISound::drop() after you don't need the ISound interface anymore. Otherwise this
|
||||
will cause memory waste. This method also may return 0 altough 'track', 'startPaused' or
|
||||
'enableSoundEffects' have been set to true, if the sound could not be played.*/
|
||||
virtual ISound* play3D(const char* soundFileName, vec3df pos,
|
||||
bool playLooped = false,
|
||||
bool startPaused = false,
|
||||
bool track = false,
|
||||
E_STREAM_MODE streamMode = ESM_AUTO_DETECT,
|
||||
bool enableSoundEffects = false) = 0;
|
||||
|
||||
//! Plays a sound source as 3D sound with its default settings stored in ISoundSource.
|
||||
/** An ISoundSource object will be created internally when playing a sound the first time,
|
||||
or can be added with getSoundSource(). There is some example code on how to work with 3D sound @ref sound3d.
|
||||
\param source The sound source, specifiying sound file source and default settings for this file.
|
||||
Use the other ISoundEngine::play2D() overloads if you want to specify a filename string instead of this.
|
||||
\param pos Position of the 3D sound.
|
||||
\param playLooped plays the sound in loop mode. If set to 'false', the sound is played once, then stopped and deleted from the internal playing list. Calls to
|
||||
ISound have no effect after such a non looped sound has been stopped automaticly.
|
||||
\param startPaused starts the sound paused. This implies that track=true. Use this if you want to modify some of the playing
|
||||
parameters before the sound actually plays. Usually you would set this parameter to true, then use the ISound interface to
|
||||
modify some of the sound parameters and then call ISound::setPaused(false);
|
||||
Note: You need to call ISound::drop() when setting this parameter to true and you don't need the ISound
|
||||
object anymore. See 'return' for details.
|
||||
\param track Makes it possible to track the sound. Causes the method to return an ISound interface. See 'return' for details.
|
||||
\param enableSoundEffects Makes it possible to use sound effects such as chorus, distorsions, echo,
|
||||
reverb and similar for this sound. Sound effects can then be controlled via ISound::getSoundEffectControl().
|
||||
Only enable if necessary.
|
||||
\return Only returns a pointer to an ISound if the parameters 'track', 'startPaused' or
|
||||
'enableSoundEffects' have been set to true. Note: if this method returns an ISound as result,
|
||||
you HAVE to call ISound::drop() after you don't need the ISound interface anymore. Otherwise this
|
||||
will cause memory waste. This method also may return 0 altough 'track', 'startPaused' or
|
||||
'enableSoundEffects' have been set to true, if the sound could not be played.*/
|
||||
virtual ISound* play3D(ISoundSource* source, vec3df pos,
|
||||
bool playLooped = false,
|
||||
bool startPaused = false,
|
||||
bool track = false,
|
||||
bool enableSoundEffects = false) = 0;
|
||||
|
||||
//! Stops all currently playing sounds.
|
||||
virtual void stopAllSounds() = 0;
|
||||
|
||||
//! Pauses or unpauses all currently playing sounds.
|
||||
virtual void setAllSoundsPaused( bool bPaused = true ) = 0;
|
||||
|
||||
//! Gets a sound source by sound name. Adds the sound source as file into the sound engine if not loaded already.
|
||||
/** Please note: For performance reasons most ISoundEngine implementations will
|
||||
not try to load the sound when calling this method, but only when play() is called
|
||||
with this sound source as parameter.
|
||||
\param addIfNotFound if 'true' adds the sound source to the list and returns the interface to it
|
||||
if it cannot be found in the sound source list. If 'false', returns 0 if the sound
|
||||
source is not in the list and does not modify the list. Default value: true.
|
||||
\return Returns the sound source or 0 if not available.
|
||||
Note: Don't call drop() to this pointer, it will be managed by irrKlang and
|
||||
exist as long as you don't delete irrKlang or call removeSoundSource(). However,
|
||||
you are free to call grab() if you want and drop() it then later of course. */
|
||||
virtual ISoundSource* getSoundSource(const ik_c8* soundName, bool addIfNotFound=true) = 0;
|
||||
|
||||
//! Returns a sound source by index.
|
||||
/** \param idx: Index of the loaded sound source, must by smaller than getSoundSourceCount().
|
||||
\return Returns the sound source or 0 if not available.
|
||||
Note: Don't call drop() to this pointer, it will be managed by irrKlang and
|
||||
exist as long as you don't delete irrKlang or call removeSoundSource(). However,
|
||||
you are free to call grab() if you want and drop() it then later of course. */
|
||||
virtual ISoundSource* getSoundSource(ik_s32 index) = 0;
|
||||
|
||||
//! Returns amount of loaded sound sources.
|
||||
virtual ik_s32 getSoundSourceCount() = 0;
|
||||
|
||||
//! Adds sound source into the sound engine as file.
|
||||
/** \param fileName Name of the sound file (e.g. "sounds/something.mp3"). You can also use this
|
||||
name when calling play3D() or play2D().
|
||||
\param mode Streaming mode for this sound source
|
||||
\param preload If this flag is set to false (which is default) the sound engine will
|
||||
not try to load the sound file when calling this method, but only when play() is called
|
||||
with this sound source as parameter. Otherwise the sound will be preloaded.
|
||||
\return Returns the pointer to the added sound source or 0 if not sucessful because for
|
||||
example a sound already existed with that name. If not successful, the reason will be printed
|
||||
into the log. Note: Don't call drop() to this pointer, it will be managed by irrKlang and
|
||||
exist as long as you don't delete irrKlang or call removeSoundSource(). However,
|
||||
you are free to call grab() if you want and drop() it then later of course. */
|
||||
virtual ISoundSource* addSoundSourceFromFile(const ik_c8* fileName, E_STREAM_MODE mode=ESM_AUTO_DETECT,
|
||||
bool preload=false) = 0;
|
||||
|
||||
//! Adds a sound source into the sound engine as memory source.
|
||||
/** Note: This method only accepts a file (.wav, .ogg, etc) which is totally loaded into memory.
|
||||
If you want to add a sound source from decoded plain PCM data in memory, use addSoundSourceFromPCMData() instead.
|
||||
\param memory Pointer to the memory to be treated as loaded sound file.
|
||||
\param sizeInBytes Size of the memory chunk, in bytes.
|
||||
\param soundName Name of the virtual sound file (e.g. "sounds/something.mp3"). You can also use this
|
||||
name when calling play3D() or play2D(). Hint: If you include the extension of the original file
|
||||
like .ogg, .mp3 or .wav at the end of the filename, irrKlang will be able to decide better what
|
||||
file format it is and might be able to start playback faster.
|
||||
\param copyMemory If set to true which is default, the memory block is copied
|
||||
and stored in the engine, after calling addSoundSourceFromMemory() the memory pointer can be deleted
|
||||
savely. If set to false, the memory is not copied and the user takes the responsibility that
|
||||
the memory block pointed to remains there as long as the sound engine or at least this sound
|
||||
source exists.
|
||||
\return Returns the pointer to the added sound source or 0 if not sucessful because for example a sound already
|
||||
existed with that name. If not successful, the reason will be printed into the log.
|
||||
Note: Don't call drop() to this pointer, it will be managed by irrKlang and exist as long as you don't
|
||||
delete irrKlang or call removeSoundSource(). However, you are free to call grab() if you
|
||||
want and drop() it then later of course. */
|
||||
virtual ISoundSource* addSoundSourceFromMemory(void* memory, ik_s32 sizeInBytes, const ik_c8* soundName,
|
||||
bool copyMemory=true) = 0;
|
||||
|
||||
|
||||
//! Adds a sound source into the sound engine from plain PCM data in memory.
|
||||
/** \param memory Pointer to the memory to be treated as loaded sound file.
|
||||
\param sizeInBytes Size of the memory chunk, in bytes.
|
||||
\param soundName Name of the virtual sound file (e.g. "sounds/something.mp3"). You can also use this
|
||||
name when calling play3D() or play2D().
|
||||
\param copyMemory If set to true which is default, the memory block is copied
|
||||
and stored in the engine, after calling addSoundSourceFromPCMData() the memory pointer can be deleted
|
||||
savely. If set to true, the memory is not copied and the user takes the responsibility that
|
||||
the memory block pointed to remains there as long as the sound engine or at least this sound
|
||||
source exists.
|
||||
\return Returns the pointer to the added sound source or 0 if not sucessful because for
|
||||
example a sound already existed with that name. If not successful, the reason will be printed
|
||||
into the log. */
|
||||
virtual ISoundSource* addSoundSourceFromPCMData(void* memory, ik_s32 sizeInBytes,
|
||||
const ik_c8* soundName, SAudioStreamFormat format,
|
||||
bool copyMemory=true) = 0;
|
||||
|
||||
//! Adds a sound source as alias for an existing sound source, but with a different name or optional different default settings.
|
||||
/** This is useful if you want to play multiple sounds but each sound isn't necessarily one single file.
|
||||
Also useful if you want to or play the same sound using different names, volumes or min and max 3D distances.
|
||||
\param baseSource The sound source where this sound source should be based on. This sound
|
||||
source will use the baseSource as base to access the file and similar, but it will have its
|
||||
own name and its own default settings.
|
||||
\param soundName Name of the new sound source to be added.
|
||||
\return Returns the pointer to the added sound source or 0 if not sucessful because for
|
||||
example a sound already existed with that name. If not successful, the reason will be printed
|
||||
into the log.*/
|
||||
virtual ISoundSource* addSoundSourceAlias(ISoundSource* baseSource, const ik_c8* soundName) = 0;
|
||||
|
||||
//! Removes a sound source from the engine, freeing the memory it occupies.
|
||||
/** This will also cause all currently playing sounds of this source to be stopped.
|
||||
Also note that if the source has been removed successfully, the value returned
|
||||
by getSoundSourceCount() will have been decreased by one.
|
||||
Removing sound sources is only necessary if you know you won't use a lot of non-streamed
|
||||
sounds again. Sound sources of streamed sounds do not cost a lot of memory.*/
|
||||
virtual void removeSoundSource(ISoundSource* source) = 0;
|
||||
|
||||
//! Removes a sound source from the engine, freeing the memory it occupies.
|
||||
/** This will also cause all currently playing sounds of this source to be stopped.
|
||||
Also note that if the source has been removed successfully, the value returned
|
||||
by getSoundSourceCount() will have been decreased by one.
|
||||
Removing sound sources is only necessary if you know you won't use a lot of non-streamed
|
||||
sounds again. Sound sources of streamed sounds do not cost a lot of memory. */
|
||||
virtual void removeSoundSource(const ik_c8* name) = 0;
|
||||
|
||||
//! Removes all sound sources from the engine
|
||||
/** This will also cause all sounds to be stopped.
|
||||
Removing sound sources is only necessary if you know you won't use a lot of non-streamed
|
||||
sounds again. Sound sources of streamed sounds do not cost a lot of memory. */
|
||||
virtual void removeAllSoundSources() = 0;
|
||||
|
||||
//! Sets master sound volume. This value is multiplied with all sounds played.
|
||||
/** \param volume 0 (silent) to 1.0f (full volume) */
|
||||
virtual void setSoundVolume(ik_f32 volume) = 0;
|
||||
|
||||
//! Returns master sound volume.
|
||||
/* A value between 0.0 and 1.0. Default is 1.0. Can be changed using setSoundVolume(). */
|
||||
virtual ik_f32 getSoundVolume() = 0;
|
||||
|
||||
//! Sets the current listener 3d position.
|
||||
/** When playing sounds in 3D, updating the position of the listener every frame should be
|
||||
done using this function.
|
||||
\param pos Position of the camera or listener.
|
||||
\param lookdir Direction vector where the camera or listener is looking into. If you have a
|
||||
camera position and a target 3d point where it is looking at, this would be cam->getTarget() - cam->getAbsolutePosition().
|
||||
\param velPerSecond The velocity per second describes the speed of the listener and
|
||||
is only needed for doppler effects.
|
||||
\param upvector Vector pointing 'up', so the engine can decide where is left and right.
|
||||
This vector is usually (0,1,0).*/
|
||||
virtual void setListenerPosition(const vec3df& pos,
|
||||
const vec3df& lookdir,
|
||||
const vec3df& velPerSecond = vec3df(0,0,0),
|
||||
const vec3df& upVector = vec3df(0,1,0)) = 0;
|
||||
|
||||
//! Updates the audio engine. This should be called several times per frame if irrKlang was started in single thread mode.
|
||||
/** This updates the 3d positions of the sounds as well as their volumes, effects,
|
||||
streams and other stuff. Call this several times per frame (the more the better) if you
|
||||
specified irrKlang to run single threaded. Otherwise it is not necessary to use this method.
|
||||
This method is being called by the scene manager automaticly if you are using one, so
|
||||
you might want to ignore this. */
|
||||
virtual void update() = 0;
|
||||
|
||||
//! Returns if a sound with the specified name is currently playing.
|
||||
virtual bool isCurrentlyPlaying(const char* soundName) = 0;
|
||||
|
||||
//! Returns if a sound with the specified source is currently playing.
|
||||
virtual bool isCurrentlyPlaying(ISoundSource* source) = 0;
|
||||
|
||||
//! Stops all sounds of a specific sound source
|
||||
virtual void stopAllSoundsOfSoundSource(ISoundSource* source) = 0;
|
||||
|
||||
//! Registers a new audio stream loader in the sound engine.
|
||||
/** Use this to enhance the audio engine to support other or new file formats.
|
||||
To do this, implement your own IAudioStreamLoader interface and register it
|
||||
with this method */
|
||||
virtual void registerAudioStreamLoader(IAudioStreamLoader* loader) = 0;
|
||||
|
||||
//! Returns if irrKlang is running in the same thread as the application or is using multithreading.
|
||||
/** This basicly returns the flag set by the user when creating the sound engine.*/
|
||||
virtual bool isMultiThreaded() const = 0;
|
||||
|
||||
//! Adds a file factory to the sound engine, making it possible to override file access of the sound engine.
|
||||
/** Derive your own class from IFileFactory, overwrite the createFileReader()
|
||||
method and return your own implemented IFileReader to overwrite file access of irrKlang. */
|
||||
virtual void addFileFactory(IFileFactory* fileFactory) = 0;
|
||||
|
||||
//! Sets the default minimal distance for 3D sounds.
|
||||
/** This value influences how loud a sound is heard based on its distance.
|
||||
See ISound::setMinDistance() for details about what the min distance is.
|
||||
It is also possible to influence this default value for every sound file
|
||||
using ISoundSource::setDefaultMinDistance().
|
||||
This method only influences the initial distance value of sounds. For changing the
|
||||
distance after the sound has been started to play, use ISound::setMinDistance() and ISound::setMaxDistance().
|
||||
\param minDistance Default minimal distance for 3d sounds. The default value is 1.0f.*/
|
||||
virtual void setDefault3DSoundMinDistance(ik_f32 minDistance) = 0;
|
||||
|
||||
//! Returns the default minimal distance for 3D sounds.
|
||||
/** This value influences how loud a sound is heard based on its distance.
|
||||
You can change it using setDefault3DSoundMinDistance().
|
||||
See ISound::setMinDistance() for details about what the min distance is.
|
||||
It is also possible to influence this default value for every sound file
|
||||
using ISoundSource::setDefaultMinDistance().
|
||||
\return Default minimal distance for 3d sounds. The default value is 1.0f. */
|
||||
virtual ik_f32 getDefault3DSoundMinDistance() = 0;
|
||||
|
||||
//! Sets the default maximal distance for 3D sounds.
|
||||
/** Changing this value is usually not necessary. Use setDefault3DSoundMinDistance() instead.
|
||||
Don't change this value if you don't know what you are doing: This value causes the sound
|
||||
to stop attenuating after it reaches the max distance. Most people think that this sets the
|
||||
volume of the sound to 0 after this distance, but this is not true. Only change the
|
||||
minimal distance (using for example setDefault3DSoundMinDistance()) to influence this.
|
||||
See ISound::setMaxDistance() for details about what the max distance is.
|
||||
It is also possible to influence this default value for every sound file
|
||||
using ISoundSource::setDefaultMaxDistance().
|
||||
This method only influences the initial distance value of sounds. For changing the
|
||||
distance after the sound has been started to play, use ISound::setMinDistance() and ISound::setMaxDistance().
|
||||
\param maxDistance Default maximal distance for 3d sounds. The default value is 1000000000.0f. */
|
||||
virtual void setDefault3DSoundMaxDistance(ik_f32 maxDistance) = 0;
|
||||
|
||||
//! Returns the default maximal distance for 3D sounds.
|
||||
/** This value influences how loud a sound is heard based on its distance.
|
||||
You can change it using setDefault3DSoundmaxDistance(), but
|
||||
changing this value is usually not necessary. This value causes the sound
|
||||
to stop attenuating after it reaches the max distance. Most people think that this sets the
|
||||
volume of the sound to 0 after this distance, but this is not true. Only change the
|
||||
minimal distance (using for example setDefault3DSoundMinDistance()) to influence this.
|
||||
See ISound::setMaxDistance() for details about what the max distance is.
|
||||
It is also possible to influence this default value for every sound file
|
||||
using ISoundSource::setDefaultMaxDistance().
|
||||
\return Default maximal distance for 3d sounds. The default value is 1000000000.0f. */
|
||||
virtual ik_f32 getDefault3DSoundMaxDistance() = 0;
|
||||
|
||||
//! Sets a rolloff factor which influences the amount of attenuation that is applied to 3D sounds.
|
||||
/** The rolloff factor can range from 0.0 to 10.0, where 0 is no rolloff. 1.0 is the default
|
||||
rolloff factor set, the value which we also experience in the real world. A value of 2 would mean
|
||||
twice the real-world rolloff. */
|
||||
virtual void setRolloffFactor(ik_f32 rolloff) = 0;
|
||||
|
||||
//! Sets parameters affecting the doppler effect.
|
||||
/** \param dopplerFactor is a value between 0 and 10 which multiplies the doppler
|
||||
effect. Default value is 1.0, which is the real world doppler effect, and 10.0f
|
||||
would be ten times the real world doppler effect.
|
||||
\param distanceFactor is the number of meters in a vector unit. The default value
|
||||
is 1.0. Doppler effects are calculated in meters per second, with this parameter,
|
||||
this can be changed, all velocities and positions are influenced by this. If
|
||||
the measurement should be in foot instead of meters, set this value to 0.3048f
|
||||
for example.*/
|
||||
virtual void setDopplerEffectParameters(ik_f32 dopplerFactor=1.0f, ik_f32 distanceFactor=1.0f) = 0;
|
||||
|
||||
//! Loads irrKlang plugins from a custom path.
|
||||
/** Plugins usually are .dll, .so or .dylib
|
||||
files named for example ikpMP3.dll (= short for irrKlangPluginMP3) which
|
||||
make it possible to play back mp3 files. Plugins are being
|
||||
loaded from the current working directory at startup of the sound engine
|
||||
if the parameter ESEO_LOAD_PLUGINS is set (which it is by default), but
|
||||
using this method, it is possible to load plugins from a custom path in addition.
|
||||
\param path Path to the plugin directory, like "C:\games\somegamegame\irrklangplugins".
|
||||
\return returns true if sucessful or fals if not, for example because the path could
|
||||
not be found. */
|
||||
virtual bool loadPlugins(const ik_c8* path) = 0;
|
||||
|
||||
//! Returns a pointer to internal sound engine pointers, like the DirectSound interface.
|
||||
/** Use this with caution. This is only exposed to make it possible for other libraries
|
||||
such as Video playback packages to extend or use the sound driver irrklang uses. */
|
||||
virtual const SInternalAudioInterface& getInternalAudioInterface() = 0;
|
||||
|
||||
//! Sets the OutputMixedDataReceiver, so you can receive the pure mixed output audio data while it is being played.
|
||||
/** This can be used to store the sound output as .wav file or for creating a Oscillograph or similar.
|
||||
This works only with software based audio drivers, that is ESOD_WIN_MM, ESOD_ALSA, and ESOD_CORE_AUDIO.
|
||||
Returns true if sucessful and fals if the current audio driver doesn't support this feature. Set this to null
|
||||
again once you don't need it anymore. */
|
||||
virtual bool setMixedDataOutputReceiver(ISoundMixedOutputReceiver* receiver) = 0;
|
||||
};
|
||||
|
||||
|
||||
//! structure for returning pointers to the internal audio interface.
|
||||
/** Use ISoundEngine::getInternalAudioInterface() to get this. */
|
||||
struct SInternalAudioInterface
|
||||
{
|
||||
//! IDirectSound interface, this is not null when using the ESOD_DIRECT_SOUND audio driver
|
||||
void* pIDirectSound;
|
||||
|
||||
//! IDirectSound8 interface, this is not null when using the ESOD_DIRECT_SOUND8 audio driver
|
||||
void* pIDirectSound8;
|
||||
|
||||
//! HWaveout interface, this is not null when using the ESOD_WIN_MM audio driver
|
||||
void* pWinMM_HWaveOut;
|
||||
|
||||
//! ALSA PCM Handle interface, this is not null when using the ESOD_ALSA audio driver
|
||||
void* pALSA_SND_PCM;
|
||||
|
||||
//! AudioDeviceID handle, this is not null when using the ESOD_CORE_AUDIO audio driver
|
||||
ik_u32 pCoreAudioDeciceID;
|
||||
};
|
||||
|
||||
|
||||
|
||||
} // end namespace irrklang
|
||||
|
||||
|
||||
#endif
|
||||
@@ -1,46 +0,0 @@
|
||||
// Copyright (C) 2002-2018 Nikolaus Gebhardt
|
||||
// This file is part of the "irrKlang" library.
|
||||
// For conditions of distribution and use, see copyright notice in irrKlang.h
|
||||
|
||||
#ifndef __I_IRRKLANG_SOUND_MIXED_OUTPUT_RECEIVER_H_INCLUDED__
|
||||
#define __I_IRRKLANG_SOUND_MIXED_OUTPUT_RECEIVER_H_INCLUDED__
|
||||
|
||||
#include "ik_IRefCounted.h"
|
||||
#include "ik_SAudioStreamFormat.h"
|
||||
|
||||
|
||||
namespace irrklang
|
||||
{
|
||||
|
||||
|
||||
//! Interface to be implemented by the user, which recieves the mixed output when it it played by the sound engine.
|
||||
/** This can be used to store the sound output as .wav file or for creating a Oscillograph or similar.
|
||||
Simply implement your own class derived from ISoundMixedOutputReceiver and use ISoundEngine::setMixedDataOutputReceiver
|
||||
to let the audio driver know about it. */
|
||||
class ISoundMixedOutputReceiver
|
||||
{
|
||||
public:
|
||||
|
||||
//! destructor
|
||||
virtual ~ISoundMixedOutputReceiver() {};
|
||||
|
||||
//! Called when a chunk of sound has been mixed and is about to be played.
|
||||
/** Note: This is called from the playing thread of the sound library, so you need to
|
||||
make everything you are doing in this method thread safe. Additionally, it would
|
||||
be a good idea to do nothing complicated in your implementation and return as fast as possible,
|
||||
otherwise sound output may be stuttering.
|
||||
\param data representing the sound frames which just have been mixed. Sound data always
|
||||
consists of two interleaved sound channels at 16bit per frame.
|
||||
\param byteCount Amount of bytes of the data
|
||||
\param playbackrate The playback rate at samples per second (usually something like 44000).
|
||||
This value will not change and always be the same for an instance of an ISoundEngine. */
|
||||
virtual void OnAudioDataReady(const void* data, int byteCount, int playbackrate) = 0;
|
||||
|
||||
};
|
||||
|
||||
|
||||
} // end namespace irrklang
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,167 +0,0 @@
|
||||
// Copyright (C) 2002-2018 Nikolaus Gebhardt
|
||||
// This file is part of the "irrKlang" library.
|
||||
// For conditions of distribution and use, see copyright notice in irrKlang.h
|
||||
|
||||
#ifndef __I_IRRKLANG_IRR_SOUND_SOURCE_H_INCLUDED__
|
||||
#define __I_IRRKLANG_IRR_SOUND_SOURCE_H_INCLUDED__
|
||||
|
||||
#include "ik_IVirtualRefCounted.h"
|
||||
#include "ik_vec3d.h"
|
||||
#include "ik_EStreamModes.h"
|
||||
#include "ik_SAudioStreamFormat.h"
|
||||
|
||||
|
||||
namespace irrklang
|
||||
{
|
||||
|
||||
//! A sound source describes an input file (.ogg, .mp3, .wav or similar) and its default settings.
|
||||
/** It provides some informations about the sound source like the play lenght and
|
||||
can have default settings for volume, distances for 3d etc. There is some example code on how
|
||||
to use Sound sources at @ref soundSources.*/
|
||||
class ISoundSource : public IVirtualRefCounted
|
||||
{
|
||||
public:
|
||||
|
||||
//! Returns the name of the sound source (usually, this is the file name)
|
||||
virtual const ik_c8* getName() = 0;
|
||||
|
||||
//! Sets the stream mode which should be used for a sound played from this source.
|
||||
/** Note that if this is set to ESM_NO_STREAMING, the engine still might decide
|
||||
to stream the sound if it is too big. The threashold for this can be
|
||||
adjusted using ISoundSource::setForcedStreamingThreshold(). */
|
||||
virtual void setStreamMode(E_STREAM_MODE mode) = 0;
|
||||
|
||||
//! Returns the detected or set type of the sound with wich the sound will be played.
|
||||
/** Note: If the returned type is ESM_AUTO_DETECT, this mode will change after the
|
||||
sound has been played the first time. */
|
||||
virtual E_STREAM_MODE getStreamMode() = 0;
|
||||
|
||||
//! Returns the play length of the sound in milliseconds.
|
||||
/** Returns -1 if not known for this sound for example because its decoder
|
||||
does not support lenght reporting or it is a file stream of unknown size.
|
||||
Note: If the sound never has been played before, the sound engine will have to open
|
||||
the file and try to get the play lenght from there, so this call could take a bit depending
|
||||
on the type of file. */
|
||||
virtual ik_u32 getPlayLength() = 0;
|
||||
|
||||
//! Returns informations about the sound source: channel count (mono/stereo), frame count, sample rate, etc.
|
||||
/** \return Returns the structure filled with 0 or negative values if not known for this sound for example because
|
||||
because the file could not be opened or similar.
|
||||
Note: If the sound never has been played before, the sound engine will have to open
|
||||
the file and try to get the play lenght from there, so this call could take a bit depending
|
||||
on the type of file. */
|
||||
virtual SAudioStreamFormat getAudioFormat() = 0;
|
||||
|
||||
//! Returns if sounds played from this source will support seeking via ISound::setPlayPosition().
|
||||
/* If a sound is seekable depends on the file type and the audio format. For example MOD files
|
||||
cannot be seeked currently.
|
||||
\return Returns true of the sound source supports setPlayPosition() and false if not.
|
||||
Note: If the sound never has been played before, the sound engine will have to open
|
||||
the file and try to get the information from there, so this call could take a bit depending
|
||||
on the type of file. */
|
||||
virtual bool getIsSeekingSupported() = 0;
|
||||
|
||||
//! Sets the default volume for a sound played from this source.
|
||||
/** The default value of this is 1.0f.
|
||||
Note that the default volume is being multiplied with the master volume
|
||||
of ISoundEngine, change this via ISoundEngine::setSoundVolume().
|
||||
//! \param volume 0 (silent) to 1.0f (full volume). Default value is 1.0f. */
|
||||
virtual void setDefaultVolume(ik_f32 volume=1.0f) = 0;
|
||||
|
||||
//! Returns the default volume for a sound played from this source.
|
||||
/** You can influence this default volume value using setDefaultVolume().
|
||||
Note that the default volume is being multiplied with the master volume
|
||||
of ISoundEngine, change this via ISoundEngine::setSoundVolume().
|
||||
//! \return 0 (silent) to 1.0f (full volume). Default value is 1.0f. */
|
||||
virtual ik_f32 getDefaultVolume() = 0;
|
||||
|
||||
//! sets the default minimal distance for 3D sounds played from this source.
|
||||
/** This value influences how loud a sound is heard based on its distance.
|
||||
See ISound::setMinDistance() for details about what the min distance is.
|
||||
This method only influences the initial distance value of sounds. For changing the
|
||||
distance while the sound is playing, use ISound::setMinDistance() and ISound::setMaxDistance().
|
||||
\param minDistance: Default minimal distance for 3D sounds from this source. Set it to a negative
|
||||
value to let sounds of this source use the engine level default min distance, which
|
||||
can be set via ISoundEngine::setDefault3DSoundMinDistance(). Default value is -1, causing
|
||||
the default min distance of the sound engine to take effect. */
|
||||
virtual void setDefaultMinDistance(ik_f32 minDistance) = 0;
|
||||
|
||||
//! Returns the default minimal distance for 3D sounds played from this source.
|
||||
/** This value influences how loud a sound is heard based on its distance.
|
||||
See ISound::setMinDistance() for details about what the minimal distance is.
|
||||
\return Default minimal distance for 3d sounds from this source. If setDefaultMinDistance()
|
||||
was set to a negative value, it will return the default value set in the engine,
|
||||
using ISoundEngine::setDefault3DSoundMinDistance(). Default value is -1, causing
|
||||
the default min distance of the sound engine to take effect. */
|
||||
virtual ik_f32 getDefaultMinDistance() = 0;
|
||||
|
||||
//! Sets the default maximal distance for 3D sounds played from this source.
|
||||
/** Changing this value is usually not necessary. Use setDefaultMinDistance() instead.
|
||||
Don't change this value if you don't know what you are doing: This value causes the sound
|
||||
to stop attenuating after it reaches the max distance. Most people think that this sets the
|
||||
volume of the sound to 0 after this distance, but this is not true. Only change the
|
||||
minimal distance (using for example setDefaultMinDistance()) to influence this.
|
||||
See ISound::setMaxDistance() for details about what the max distance is.
|
||||
This method only influences the initial distance value of sounds. For changing the
|
||||
distance while the sound is played, use ISound::setMinDistance()
|
||||
and ISound::setMaxDistance().
|
||||
\param maxDistance Default maximal distance for 3D sounds from this source. Set it to a negative
|
||||
value to let sounds of this source use the engine level default max distance, which
|
||||
can be set via ISoundEngine::setDefault3DSoundMaxDistance(). Default value is -1, causing
|
||||
the default max distance of the sound engine to take effect. */
|
||||
virtual void setDefaultMaxDistance(ik_f32 maxDistance) = 0;
|
||||
|
||||
//! returns the default maxmial distance for 3D sounds played from this source.
|
||||
/** This value influences how loud a sound is heard based on its distance.
|
||||
Changing this value is usually not necessary. Use setDefaultMinDistance() instead.
|
||||
Don't change this value if you don't know what you are doing: This value causes the sound
|
||||
to stop attenuating after it reaches the max distance. Most people think that this sets the
|
||||
volume of the sound to 0 after this distance, but this is not true. Only change the
|
||||
minimal distance (using for example setDefaultMinDistance()) to influence this.
|
||||
See ISound::setMaxDistance() for details about what the max distance is.
|
||||
\return Default maximal distance for 3D sounds from this source. If setDefaultMaxDistance()
|
||||
was set to a negative value, it will return the default value set in the engine,
|
||||
using ISoundEngine::setDefault3DSoundMaxDistance(). Default value is -1, causing
|
||||
the default max distance of the sound engine to take effect. */
|
||||
virtual ik_f32 getDefaultMaxDistance() = 0;
|
||||
|
||||
//! Forces the sound to be reloaded at next replay.
|
||||
/** Sounds which are not played as streams are buffered to make it possible to
|
||||
replay them without much overhead. If the sound file is altered after the sound
|
||||
has been played the first time, the engine won't play the changed file then.
|
||||
Calling this method makes the engine reload the file before the file is played
|
||||
the next time.*/
|
||||
virtual void forceReloadAtNextUse() = 0;
|
||||
|
||||
//! Sets the threshold size where irrKlang decides to force streaming a file independent of the user specified setting.
|
||||
/** When specifying ESM_NO_STREAMING for playing back a sound file, irrKlang will
|
||||
ignore this setting if the file is bigger than this threshold and stream the file
|
||||
anyway. Please note that if an audio format loader is not able to return the
|
||||
size of a sound source and returns -1 as length, this will be ignored as well
|
||||
and streaming has to be forced.
|
||||
\param threshold: New threshold. The value is specified in uncompressed bytes and its default value is
|
||||
about one Megabyte. Set to 0 or a negative value to disable stream forcing. */
|
||||
virtual void setForcedStreamingThreshold(ik_s32 thresholdBytes) = 0;
|
||||
|
||||
//! Returns the threshold size where irrKlang decides to force streaming a file independent of the user specified setting.
|
||||
/** The value is specified in uncompressed bytes and its default value is
|
||||
about one Megabyte. See setForcedStreamingThreshold() for details. */
|
||||
virtual ik_s32 getForcedStreamingThreshold() = 0;
|
||||
|
||||
//! Returns a pointer to the loaded and decoded sample data.
|
||||
/** \return Returns a pointer to the sample data. The data is provided in decoded PCM data. The
|
||||
exact format can be retrieved using getAudioFormat(). Use getAudioFormat().getSampleDataSize()
|
||||
for getting the amount of bytes. The returned pointer will only be valid as long as the sound
|
||||
source exists.
|
||||
This function will only return a pointer to the data if the
|
||||
audio file is not streamed, namely ESM_NO_STREAMING. Otherwise this function will return 0.
|
||||
Note: If the sound never has been played before, the sound engine will have to open
|
||||
the file and decode audio data from there, so this call could take a bit depending
|
||||
on the type of the file.*/
|
||||
virtual void* getSampleData() = 0;
|
||||
};
|
||||
|
||||
} // end namespace irrklang
|
||||
|
||||
|
||||
#endif
|
||||
@@ -1,72 +0,0 @@
|
||||
// Copyright (C) 2002-2018 Nikolaus Gebhardt
|
||||
// This file is part of the "irrKlang" library.
|
||||
// For conditions of distribution and use, see copyright notice in irrKlang.h
|
||||
|
||||
#ifndef __I_IRRKLANG_SOUND_STOP_EVENT_RECEIVER_H_INCLUDED__
|
||||
#define __I_IRRKLANG_SOUND_STOP_EVENT_RECEIVER_H_INCLUDED__
|
||||
|
||||
#include "ik_IRefCounted.h"
|
||||
#include "ik_SAudioStreamFormat.h"
|
||||
|
||||
|
||||
namespace irrklang
|
||||
{
|
||||
|
||||
|
||||
//! An enumeration listing all reasons for a fired sound stop event
|
||||
enum E_STOP_EVENT_CAUSE
|
||||
{
|
||||
//! The sound stop event was fired because the sound finished playing
|
||||
ESEC_SOUND_FINISHED_PLAYING = 0,
|
||||
|
||||
//! The sound stop event was fired because the sound was stopped by the user, calling ISound::stop().
|
||||
ESEC_SOUND_STOPPED_BY_USER,
|
||||
|
||||
//! The sound stop event was fired because the source of the sound was removed, for example
|
||||
//! because irrKlang was shut down or the user called ISoundEngine::removeSoundSource().
|
||||
ESEC_SOUND_STOPPED_BY_SOURCE_REMOVAL,
|
||||
|
||||
//! This enumeration literal is never used, it only forces the compiler to
|
||||
//! compile these enumeration values to 32 bit.
|
||||
ESEC_FORCE_32_BIT = 0x7fffffff
|
||||
};
|
||||
|
||||
|
||||
//! Interface to be implemented by the user, which recieves sound stop events.
|
||||
/** The interface has only one method to be implemented by the user: OnSoundStopped().
|
||||
Implement this interface and set it via ISound::setSoundStopEventReceiver().
|
||||
The sound stop event is guaranteed to be called when a sound or sound stream is finished,
|
||||
either because the sound reached its playback end, its sound source was removed,
|
||||
ISoundEngine::stopAllSounds() has been called or the whole engine was deleted. */
|
||||
class ISoundStopEventReceiver
|
||||
{
|
||||
public:
|
||||
|
||||
//! destructor
|
||||
virtual ~ISoundStopEventReceiver() {};
|
||||
|
||||
//! Called when a sound has stopped playing.
|
||||
/** This is the only method to be implemented by the user.
|
||||
The sound stop event is guaranteed to be called when a sound or sound stream is finished,
|
||||
either because the sound reached its playback end, its sound source was removed,
|
||||
ISoundEngine::stopAllSounds() has been called or the whole engine was deleted.
|
||||
Please note: Sound events will occur in a different thread when the engine runs in
|
||||
multi threaded mode (default). In single threaded mode, the event will happen while
|
||||
the user thread is calling ISoundEngine::update().
|
||||
\param sound: Sound which has been stopped.
|
||||
\param reason: The reason why the sound stop event was fired. Usually, this will be ESEC_SOUND_FINISHED_PLAYING.
|
||||
When the sound was aborded by calling ISound::stop() or ISoundEngine::stopAllSounds();, this would be
|
||||
ESEC_SOUND_STOPPED_BY_USER. If irrKlang was deleted or the sound source was removed, the value is
|
||||
ESEC_SOUND_STOPPED_BY_SOURCE_REMOVAL.
|
||||
\param userData: userData pointer set by the user when registering the interface
|
||||
via ISound::setSoundStopEventReceiver(). */
|
||||
virtual void OnSoundStopped(ISound* sound, E_STOP_EVENT_CAUSE reason, void* userData) = 0;
|
||||
|
||||
};
|
||||
|
||||
|
||||
} // end namespace irrklang
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,48 +0,0 @@
|
||||
// Copyright (C) 2002-2018 Nikolaus Gebhardt
|
||||
// This file is part of the "irrKlang" library.
|
||||
// For conditions of distribution and use, see copyright notice in irrKlang.h
|
||||
|
||||
#ifndef __I_IRRKLANG_VIRTUAL_UNKNOWN_H_INCLUDED__
|
||||
#define __I_IRRKLANG_VIRTUAL_UNKNOWN_H_INCLUDED__
|
||||
|
||||
#include "ik_irrKlangTypes.h"
|
||||
|
||||
|
||||
namespace irrklang
|
||||
{
|
||||
|
||||
//! Reference counting base class for objects in the Irrlicht Engine similar to IRefCounted.
|
||||
/** See IRefCounted for the basics of this class.
|
||||
The difference to IRefCounted is that the class has to implement reference counting
|
||||
for itself.
|
||||
*/
|
||||
class IVirtualRefCounted
|
||||
{
|
||||
public:
|
||||
|
||||
//! Destructor.
|
||||
virtual ~IVirtualRefCounted()
|
||||
{
|
||||
}
|
||||
|
||||
//! Grabs the object. Increments the reference counter by one.
|
||||
/** To be implemented by the derived class. If you don't want to
|
||||
implement this, use the class IRefCounted instead. See IRefCounted::grab() for details
|
||||
of this method. */
|
||||
virtual void grab() = 0;
|
||||
|
||||
//! Drops the object. Decrements the reference counter by one.
|
||||
/** To be implemented by the derived class. If you don't want to
|
||||
implement this, use the class IRefCounted instead. See IRefCounted::grab() for details
|
||||
of this method. */
|
||||
virtual bool drop() = 0;
|
||||
};
|
||||
|
||||
|
||||
|
||||
} // end namespace irrklang
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,71 +0,0 @@
|
||||
// Copyright (C) 2002-2018 Nikolaus Gebhardt
|
||||
// This file is part of the "irrKlang" library.
|
||||
// For conditions of distribution and use, see copyright notice in irrKlang.h
|
||||
|
||||
#ifndef __S_IRRKLANG_AUDIO_STREAM_FORMAT_H_INCLUDED__
|
||||
#define __S_IRRKLANG_AUDIO_STREAM_FORMAT_H_INCLUDED__
|
||||
|
||||
#include "ik_IRefCounted.h"
|
||||
|
||||
|
||||
namespace irrklang
|
||||
{
|
||||
|
||||
//! audio sample data format enumeration for supported formats
|
||||
enum ESampleFormat
|
||||
{
|
||||
//! one unsigned byte (0;255)
|
||||
ESF_U8,
|
||||
|
||||
//! 16 bit, signed (-32k;32k)
|
||||
ESF_S16
|
||||
};
|
||||
|
||||
|
||||
//! structure describing an audio stream format with helper functions
|
||||
struct SAudioStreamFormat
|
||||
{
|
||||
//! channels, 1 for mono, 2 for stereo
|
||||
ik_s32 ChannelCount;
|
||||
|
||||
//! amount of frames in the sample data or stream.
|
||||
/** If the stream has an unknown lenght, this is -1 */
|
||||
ik_s32 FrameCount;
|
||||
|
||||
//! samples per second
|
||||
ik_s32 SampleRate;
|
||||
|
||||
//! format of the sample data
|
||||
ESampleFormat SampleFormat;
|
||||
|
||||
//! returns the size of a sample of the data described by the stream data in bytes
|
||||
inline ik_s32 getSampleSize() const
|
||||
{
|
||||
return (SampleFormat == ESF_U8) ? 1 : 2;
|
||||
}
|
||||
|
||||
//! returns the frame size of the stream data in bytes
|
||||
inline ik_s32 getFrameSize() const
|
||||
{
|
||||
return ChannelCount * getSampleSize();
|
||||
}
|
||||
|
||||
//! returns the size of the sample data in bytes
|
||||
/* Returns an invalid negative value when the stream has an unknown lenght */
|
||||
inline ik_s32 getSampleDataSize() const
|
||||
{
|
||||
return getFrameSize() * FrameCount;
|
||||
}
|
||||
|
||||
//! returns amount of bytes per second
|
||||
inline ik_s32 getBytesPerSecond() const
|
||||
{
|
||||
return getFrameSize() * SampleRate;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
} // end namespace irrklang
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,96 +0,0 @@
|
||||
// Copyright (C) 2002-2018 Nikolaus Gebhardt
|
||||
// This file is part of the "irrKlang" library.
|
||||
// For conditions of distribution and use, see copyright notice in irrKlang.h
|
||||
|
||||
#ifndef __IRRKLANG_TYPES_H_INCLUDED__
|
||||
#define __IRRKLANG_TYPES_H_INCLUDED__
|
||||
|
||||
|
||||
namespace irrklang
|
||||
{
|
||||
|
||||
//! 8 bit unsigned variable.
|
||||
/** This is a typedef for unsigned char, it ensures portability of the engine. */
|
||||
typedef unsigned char ik_u8;
|
||||
|
||||
//! 8 bit signed variable.
|
||||
/** This is a typedef for signed char, it ensures portability of the engine. */
|
||||
typedef signed char ik_s8;
|
||||
|
||||
//! 8 bit character variable.
|
||||
/** This is a typedef for char, it ensures portability of the engine. */
|
||||
typedef char ik_c8;
|
||||
|
||||
|
||||
|
||||
//! 16 bit unsigned variable.
|
||||
/** This is a typedef for unsigned short, it ensures portability of the engine. */
|
||||
typedef unsigned short ik_u16;
|
||||
|
||||
//! 16 bit signed variable.
|
||||
/** This is a typedef for signed short, it ensures portability of the engine. */
|
||||
typedef signed short ik_s16;
|
||||
|
||||
|
||||
|
||||
//! 32 bit unsigned variable.
|
||||
/** This is a typedef for unsigned int, it ensures portability of the engine. */
|
||||
typedef unsigned int ik_u32;
|
||||
|
||||
//! 32 bit signed variable.
|
||||
/** This is a typedef for signed int, it ensures portability of the engine. */
|
||||
typedef signed int ik_s32;
|
||||
|
||||
|
||||
|
||||
//! 32 bit floating point variable.
|
||||
/** This is a typedef for float, it ensures portability of the engine. */
|
||||
typedef float ik_f32;
|
||||
|
||||
//! 64 bit floating point variable.
|
||||
/** This is a typedef for double, it ensures portability of the engine. */
|
||||
typedef double ik_f64;
|
||||
|
||||
|
||||
|
||||
// some constants
|
||||
|
||||
const ik_f32 IK_ROUNDING_ERROR_32 = 0.000001f;
|
||||
const ik_f64 IK_PI64 = 3.1415926535897932384626433832795028841971693993751;
|
||||
const ik_f32 IK_PI32 = 3.14159265359f;
|
||||
const ik_f32 IK_RADTODEG = 180.0f / IK_PI32;
|
||||
const ik_f32 IK_DEGTORAD = IK_PI32 / 180.0f;
|
||||
const ik_f64 IK_RADTODEG64 = 180.0 / IK_PI64;
|
||||
const ik_f64 IK_DEGTORAD64 = IK_PI64 / 180.0;
|
||||
|
||||
//! returns if a float equals the other one, taking floating
|
||||
//! point rounding errors into account
|
||||
inline bool equalsfloat(const ik_f32 a, const ik_f32 b, const ik_f32 tolerance = IK_ROUNDING_ERROR_32)
|
||||
{
|
||||
return (a + tolerance > b) && (a - tolerance < b);
|
||||
}
|
||||
|
||||
} // end irrklang namespace
|
||||
|
||||
// ensure wchar_t type is existing for unicode support
|
||||
#include <wchar.h>
|
||||
|
||||
// define the wchar_t type if not already built in.
|
||||
#ifdef _MSC_VER // microsoft compiler
|
||||
#ifndef _WCHAR_T_DEFINED
|
||||
//! A 16 bit wide character type.
|
||||
/**
|
||||
Defines the wchar_t-type.
|
||||
In VS6, its not possible to tell
|
||||
the standard compiler to treat wchar_t as a built-in type, and
|
||||
sometimes we just don't want to include the huge stdlib.h or wchar.h,
|
||||
so we'll use this.
|
||||
*/
|
||||
typedef unsigned short wchar_t;
|
||||
#define _WCHAR_T_DEFINED
|
||||
#endif // wchar is not defined
|
||||
#endif // microsoft compiler
|
||||
|
||||
|
||||
#endif // __IRR_TYPES_H_INCLUDED__
|
||||
|
||||
@@ -1,261 +0,0 @@
|
||||
// Copyright (C) 2002-2018 Nikolaus Gebhardt
|
||||
// This file is part of the "irrKlang" library.
|
||||
// For conditions of distribution and use, see copyright notice in irrKlang.h
|
||||
|
||||
#ifndef __IRR_IRRKLANG_VEC_3D_H_INCLUDED__
|
||||
#define __IRR_IRRKLANG_VEC_3D_H_INCLUDED__
|
||||
|
||||
#include <math.h>
|
||||
#include "ik_irrKlangTypes.h"
|
||||
|
||||
|
||||
namespace irrklang
|
||||
{
|
||||
|
||||
//! a 3d vector template class for representing vectors and points in 3d
|
||||
template <class T>
|
||||
class vec3d
|
||||
{
|
||||
public:
|
||||
|
||||
vec3d(): X(0), Y(0), Z(0) {};
|
||||
vec3d(T nx, T ny, T nz) : X(nx), Y(ny), Z(nz) {};
|
||||
vec3d(const vec3d<T>& other) :X(other.X), Y(other.Y), Z(other.Z) {};
|
||||
|
||||
//! constructor creating an irrklang vec3d from an irrlicht vector.
|
||||
#ifdef __IRR_POINT_3D_H_INCLUDED__
|
||||
template<class B>
|
||||
vec3d(const B& other) :X(other.X), Y(other.Y), Z(other.Z) {};
|
||||
#endif // __IRR_POINT_3D_H_INCLUDED__
|
||||
|
||||
// operators
|
||||
|
||||
vec3d<T> operator-() const { return vec3d<T>(-X, -Y, -Z); }
|
||||
|
||||
vec3d<T>& operator=(const vec3d<T>& other) { X = other.X; Y = other.Y; Z = other.Z; return *this; }
|
||||
|
||||
vec3d<T> operator+(const vec3d<T>& other) const { return vec3d<T>(X + other.X, Y + other.Y, Z + other.Z); }
|
||||
vec3d<T>& operator+=(const vec3d<T>& other) { X+=other.X; Y+=other.Y; Z+=other.Z; return *this; }
|
||||
|
||||
vec3d<T> operator-(const vec3d<T>& other) const { return vec3d<T>(X - other.X, Y - other.Y, Z - other.Z); }
|
||||
vec3d<T>& operator-=(const vec3d<T>& other) { X-=other.X; Y-=other.Y; Z-=other.Z; return *this; }
|
||||
|
||||
vec3d<T> operator*(const vec3d<T>& other) const { return vec3d<T>(X * other.X, Y * other.Y, Z * other.Z); }
|
||||
vec3d<T>& operator*=(const vec3d<T>& other) { X*=other.X; Y*=other.Y; Z*=other.Z; return *this; }
|
||||
vec3d<T> operator*(const T v) const { return vec3d<T>(X * v, Y * v, Z * v); }
|
||||
vec3d<T>& operator*=(const T v) { X*=v; Y*=v; Z*=v; return *this; }
|
||||
|
||||
vec3d<T> operator/(const vec3d<T>& other) const { return vec3d<T>(X / other.X, Y / other.Y, Z / other.Z); }
|
||||
vec3d<T>& operator/=(const vec3d<T>& other) { X/=other.X; Y/=other.Y; Z/=other.Z; return *this; }
|
||||
vec3d<T> operator/(const T v) const { T i=(T)1.0/v; return vec3d<T>(X * i, Y * i, Z * i); }
|
||||
vec3d<T>& operator/=(const T v) { T i=(T)1.0/v; X*=i; Y*=i; Z*=i; return *this; }
|
||||
|
||||
bool operator<=(const vec3d<T>&other) const { return X<=other.X && Y<=other.Y && Z<=other.Z;};
|
||||
bool operator>=(const vec3d<T>&other) const { return X>=other.X && Y>=other.Y && Z>=other.Z;};
|
||||
|
||||
bool operator==(const vec3d<T>& other) const { return other.X==X && other.Y==Y && other.Z==Z; }
|
||||
bool operator!=(const vec3d<T>& other) const { return other.X!=X || other.Y!=Y || other.Z!=Z; }
|
||||
|
||||
// functions
|
||||
|
||||
//! returns if this vector equalsfloat the other one, taking floating point rounding errors into account
|
||||
bool equals(const vec3d<T>& other)
|
||||
{
|
||||
return equalsfloat(X, other.X) &&
|
||||
equalsfloat(Y, other.Y) &&
|
||||
equalsfloat(Z, other.Z);
|
||||
}
|
||||
|
||||
void set(const T nx, const T ny, const T nz) {X=nx; Y=ny; Z=nz; }
|
||||
void set(const vec3d<T>& p) { X=p.X; Y=p.Y; Z=p.Z;}
|
||||
|
||||
//! Returns length of the vector.
|
||||
ik_f64 getLength() const { return sqrt(X*X + Y*Y + Z*Z); }
|
||||
|
||||
//! Returns squared length of the vector.
|
||||
/** This is useful because it is much faster then
|
||||
getLength(). */
|
||||
ik_f64 getLengthSQ() const { return X*X + Y*Y + Z*Z; }
|
||||
|
||||
//! Returns the dot product with another vector.
|
||||
T dotProduct(const vec3d<T>& other) const
|
||||
{
|
||||
return X*other.X + Y*other.Y + Z*other.Z;
|
||||
}
|
||||
|
||||
//! Returns distance from an other point.
|
||||
/** Here, the vector is interpreted as point in 3 dimensional space. */
|
||||
ik_f64 getDistanceFrom(const vec3d<T>& other) const
|
||||
{
|
||||
ik_f64 vx = X - other.X; ik_f64 vy = Y - other.Y; ik_f64 vz = Z - other.Z;
|
||||
return sqrt(vx*vx + vy*vy + vz*vz);
|
||||
}
|
||||
|
||||
//! Returns squared distance from an other point.
|
||||
/** Here, the vector is interpreted as point in 3 dimensional space. */
|
||||
ik_f32 getDistanceFromSQ(const vec3d<T>& other) const
|
||||
{
|
||||
ik_f32 vx = X - other.X; ik_f32 vy = Y - other.Y; ik_f32 vz = Z - other.Z;
|
||||
return (vx*vx + vy*vy + vz*vz);
|
||||
}
|
||||
|
||||
//! Calculates the cross product with another vector
|
||||
vec3d<T> crossProduct(const vec3d<T>& p) const
|
||||
{
|
||||
return vec3d<T>(Y * p.Z - Z * p.Y, Z * p.X - X * p.Z, X * p.Y - Y * p.X);
|
||||
}
|
||||
|
||||
//! Returns if this vector interpreted as a point is on a line between two other points.
|
||||
/** It is assumed that the point is on the line. */
|
||||
bool isBetweenPoints(const vec3d<T>& begin, const vec3d<T>& end) const
|
||||
{
|
||||
ik_f32 f = (ik_f32)(end - begin).getLengthSQ();
|
||||
return (ik_f32)getDistanceFromSQ(begin) < f &&
|
||||
(ik_f32)getDistanceFromSQ(end) < f;
|
||||
}
|
||||
|
||||
//! Normalizes the vector.
|
||||
vec3d<T>& normalize()
|
||||
{
|
||||
T l = (T)getLength();
|
||||
if (l == 0)
|
||||
return *this;
|
||||
|
||||
l = (T)1.0 / l;
|
||||
X *= l;
|
||||
Y *= l;
|
||||
Z *= l;
|
||||
return *this;
|
||||
}
|
||||
|
||||
//! Sets the lenght of the vector to a new value
|
||||
void setLength(T newlength)
|
||||
{
|
||||
normalize();
|
||||
*this *= newlength;
|
||||
}
|
||||
|
||||
//! Inverts the vector.
|
||||
void invert()
|
||||
{
|
||||
X *= -1.0f;
|
||||
Y *= -1.0f;
|
||||
Z *= -1.0f;
|
||||
}
|
||||
|
||||
//! Rotates the vector by a specified number of degrees around the Y
|
||||
//! axis and the specified center.
|
||||
//! \param degrees: Number of degrees to rotate around the Y axis.
|
||||
//! \param center: The center of the rotation.
|
||||
void rotateXZBy(ik_f64 degrees, const vec3d<T>& center)
|
||||
{
|
||||
degrees *= IK_DEGTORAD64;
|
||||
T cs = (T)cos(degrees);
|
||||
T sn = (T)sin(degrees);
|
||||
X -= center.X;
|
||||
Z -= center.Z;
|
||||
set(X*cs - Z*sn, Y, X*sn + Z*cs);
|
||||
X += center.X;
|
||||
Z += center.Z;
|
||||
}
|
||||
|
||||
//! Rotates the vector by a specified number of degrees around the Z
|
||||
//! axis and the specified center.
|
||||
//! \param degrees: Number of degrees to rotate around the Z axis.
|
||||
//! \param center: The center of the rotation.
|
||||
void rotateXYBy(ik_f64 degrees, const vec3d<T>& center)
|
||||
{
|
||||
degrees *= IK_DEGTORAD64;
|
||||
T cs = (T)cos(degrees);
|
||||
T sn = (T)sin(degrees);
|
||||
X -= center.X;
|
||||
Y -= center.Y;
|
||||
set(X*cs - Y*sn, X*sn + Y*cs, Z);
|
||||
X += center.X;
|
||||
Y += center.Y;
|
||||
}
|
||||
|
||||
//! Rotates the vector by a specified number of degrees around the X
|
||||
//! axis and the specified center.
|
||||
//! \param degrees: Number of degrees to rotate around the X axis.
|
||||
//! \param center: The center of the rotation.
|
||||
void rotateYZBy(ik_f64 degrees, const vec3d<T>& center)
|
||||
{
|
||||
degrees *= IK_DEGTORAD64;
|
||||
T cs = (T)cos(degrees);
|
||||
T sn = (T)sin(degrees);
|
||||
Z -= center.Z;
|
||||
Y -= center.Y;
|
||||
set(X, Y*cs - Z*sn, Y*sn + Z*cs);
|
||||
Z += center.Z;
|
||||
Y += center.Y;
|
||||
}
|
||||
|
||||
//! Returns interpolated vector.
|
||||
/** \param other: other vector to interpolate between
|
||||
\param d: value between 0.0f and 1.0f. */
|
||||
vec3d<T> getInterpolated(const vec3d<T>& other, ik_f32 d) const
|
||||
{
|
||||
ik_f32 inv = 1.0f - d;
|
||||
return vec3d<T>(other.X*inv + X*d,
|
||||
other.Y*inv + Y*d,
|
||||
other.Z*inv + Z*d);
|
||||
}
|
||||
|
||||
//! Gets the Y and Z rotations of a vector.
|
||||
/** Thanks to Arras on the Irrlicht forums to add this method.
|
||||
\return A vector representing the rotation in degrees of
|
||||
this vector. The Z component of the vector will always be 0. */
|
||||
vec3d<T> getHorizontalAngle()
|
||||
{
|
||||
vec3d<T> angle;
|
||||
|
||||
angle.Y = (T)atan2(X, Z);
|
||||
angle.Y *= (ik_f32)IK_RADTODEG;
|
||||
|
||||
if (angle.Y < 0.0f) angle.Y += 360.0f;
|
||||
if (angle.Y >= 360.0f) angle.Y -= 360.0f;
|
||||
|
||||
ik_f32 z1 = (T)sqrt(X*X + Z*Z);
|
||||
|
||||
angle.X = (T)atan2(z1, Y);
|
||||
angle.X *= (ik_f32)IK_RADTODEG;
|
||||
angle.X -= 90.0f;
|
||||
|
||||
if (angle.X < 0.0f) angle.X += 360.0f;
|
||||
if (angle.X >= 360) angle.X -= 360.0f;
|
||||
|
||||
return angle;
|
||||
}
|
||||
|
||||
//! Fills an array of 4 values with the vector data (usually floats).
|
||||
/** Useful for setting in shader constants for example. The fourth value
|
||||
will always be 0. */
|
||||
void getAs4Values(T* array)
|
||||
{
|
||||
array[0] = X;
|
||||
array[1] = Y;
|
||||
array[2] = Z;
|
||||
array[3] = 0;
|
||||
}
|
||||
|
||||
|
||||
// member variables
|
||||
|
||||
T X, Y, Z;
|
||||
};
|
||||
|
||||
|
||||
//! Typedef for a ik_f32 3d vector, a vector using floats for X, Y and Z
|
||||
typedef vec3d<ik_f32> vec3df;
|
||||
|
||||
//! Typedef for an integer 3d vector, a vector using ints for X, Y and Z
|
||||
typedef vec3d<ik_s32> vec3di;
|
||||
|
||||
template<class S, class T> vec3d<T> operator*(const S scalar, const vec3d<T>& vector) { return vector*scalar; }
|
||||
|
||||
} // end namespace irrklang
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,42 +0,0 @@
|
||||
// Copyright (C) 2002-2007 Nikolaus Gebhardt
|
||||
// This file is part of the "irrKlang" library.
|
||||
// For conditions of distribution and use, see copyright notice in irrKlang.h
|
||||
|
||||
#include "CIrrKlangAudioStreamLoaderMP3.h"
|
||||
#include "CIrrKlangAudioStreamMP3.h"
|
||||
#include <string.h>
|
||||
|
||||
|
||||
namespace irrklang
|
||||
{
|
||||
|
||||
|
||||
CIrrKlangAudioStreamLoaderMP3::CIrrKlangAudioStreamLoaderMP3()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//! Returns true if the file maybe is able to be loaded by this class.
|
||||
bool CIrrKlangAudioStreamLoaderMP3::isALoadableFileExtension(const ik_c8* fileName)
|
||||
{
|
||||
return strstr(fileName, ".mp3") != 0;
|
||||
}
|
||||
|
||||
|
||||
//! Creates an audio file input stream from a file
|
||||
IAudioStream* CIrrKlangAudioStreamLoaderMP3::createAudioStream(irrklang::IFileReader* file)
|
||||
{
|
||||
CIrrKlangAudioStreamMP3* stream = new CIrrKlangAudioStreamMP3(file);
|
||||
|
||||
if (stream && !stream->isOK())
|
||||
{
|
||||
stream->drop();
|
||||
stream = 0;
|
||||
}
|
||||
|
||||
return stream;
|
||||
}
|
||||
|
||||
|
||||
} // end namespace irrklang
|
||||
|
||||
@@ -1,32 +0,0 @@
|
||||
// Copyright (C) 2002-2007 Nikolaus Gebhardt
|
||||
// This file is part of the "irrKlang" library.
|
||||
// For conditions of distribution and use, see copyright notice in irrKlang.h
|
||||
|
||||
#ifndef __C_IRRKLANG_AUDIO_STREAM_LOADER_MP3_H_INCLUDED__
|
||||
#define __C_IRRKLANG_AUDIO_STREAM_LOADER_MP3_H_INCLUDED__
|
||||
|
||||
#include <ik_IAudioStreamLoader.h>
|
||||
|
||||
namespace irrklang
|
||||
{
|
||||
//! Class which is able to create an audio file stream from a file.
|
||||
class CIrrKlangAudioStreamLoaderMP3 : public IAudioStreamLoader
|
||||
{
|
||||
public:
|
||||
|
||||
CIrrKlangAudioStreamLoaderMP3();
|
||||
|
||||
//! Returns true if the file maybe is able to be loaded by this class.
|
||||
/** This decision should be based only on the file extension (e.g. ".wav") */
|
||||
virtual bool isALoadableFileExtension(const ik_c8* fileName);
|
||||
|
||||
//! Creates an audio file input stream from a file
|
||||
/** \return Pointer to the created audio stream. Returns 0 if loading failed.
|
||||
If you no longer need the stream, you should call IAudioFileStream::drop().
|
||||
See IRefCounted::drop() for more information. */
|
||||
virtual IAudioStream* createAudioStream(irrklang::IFileReader* file);
|
||||
};
|
||||
|
||||
} // end namespace irrklang
|
||||
|
||||
#endif
|
||||
@@ -1,397 +0,0 @@
|
||||
// Copyright (C) 2002-2007 Nikolaus Gebhardt
|
||||
// Part of the code for this plugin for irrKlang is based on:
|
||||
// MP3 input for Audiere by Matt Campbell <mattcampbell@pobox.com>, based on
|
||||
// libavcodec from ffmpeg (http://ffmpeg.sourceforge.net/).
|
||||
// See license.txt for license details of this plugin.
|
||||
|
||||
#include "CIrrKlangAudioStreamMP3.h"
|
||||
#include <memory.h>
|
||||
#include <stdlib.h> // free, malloc and realloc
|
||||
#include <string.h>
|
||||
|
||||
namespace irrklang
|
||||
{
|
||||
|
||||
CIrrKlangAudioStreamMP3::CIrrKlangAudioStreamMP3(IFileReader* file)
|
||||
: File(file), TheMPAuDecContext(0), InputPosition(0), InputLength(0),
|
||||
DecodeBuffer(0), FirstFrameRead(false), EndOfFileReached(0),
|
||||
FileBegin(0), Position(0)
|
||||
{
|
||||
if (File)
|
||||
{
|
||||
File->grab();
|
||||
|
||||
TheMPAuDecContext = new MPAuDecContext();
|
||||
|
||||
if (!TheMPAuDecContext || mpaudec_init(TheMPAuDecContext) < 0)
|
||||
{
|
||||
File->drop();
|
||||
File = 0;
|
||||
delete TheMPAuDecContext;
|
||||
TheMPAuDecContext = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
// init, get format
|
||||
|
||||
DecodeBuffer = new ik_u8[MPAUDEC_MAX_AUDIO_FRAME_SIZE];
|
||||
|
||||
if (File->getSize()>0)
|
||||
{
|
||||
// seekable file, now parse file to get size
|
||||
// (needed to make it possible for the engine to loop a stream correctly)
|
||||
|
||||
skipID3IfNecessary();
|
||||
|
||||
TheMPAuDecContext->parse_only = 1;
|
||||
Format.FrameCount = 0;
|
||||
|
||||
while(!EndOfFileReached)
|
||||
{
|
||||
if (!decodeFrame())
|
||||
break;
|
||||
|
||||
Format.FrameCount += TheMPAuDecContext->frame_size;
|
||||
|
||||
if (!EndOfFileReached /*&& File->isSeekable()*/ )
|
||||
{
|
||||
// to be able to seek in the stream, store offsets and sizes
|
||||
|
||||
SFramePositionData data;
|
||||
data.size = TheMPAuDecContext->frame_size;
|
||||
data.offset = File->getPos() - (InputLength - InputPosition) - TheMPAuDecContext->coded_frame_size;
|
||||
|
||||
FramePositionData.push_back(data);
|
||||
}
|
||||
}
|
||||
|
||||
TheMPAuDecContext->parse_only = 0;
|
||||
setPosition(0);
|
||||
}
|
||||
else
|
||||
decodeFrame(); // decode first frame to read audio format
|
||||
|
||||
if (!TheMPAuDecContext->channels ||
|
||||
!TheMPAuDecContext->sample_rate )
|
||||
{
|
||||
File->drop();
|
||||
File = 0;
|
||||
delete TheMPAuDecContext;
|
||||
TheMPAuDecContext = 0;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CIrrKlangAudioStreamMP3::~CIrrKlangAudioStreamMP3()
|
||||
{
|
||||
if (File)
|
||||
File->drop();
|
||||
|
||||
if (TheMPAuDecContext)
|
||||
{
|
||||
mpaudec_clear(TheMPAuDecContext);
|
||||
delete TheMPAuDecContext;
|
||||
}
|
||||
|
||||
delete [] DecodeBuffer;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//! returns format of the audio stream
|
||||
SAudioStreamFormat CIrrKlangAudioStreamMP3::getFormat()
|
||||
{
|
||||
return Format;
|
||||
}
|
||||
|
||||
|
||||
//! tells the audio stream to read n audio frames into the specified buffer
|
||||
ik_s32 CIrrKlangAudioStreamMP3::readFrames(void* target, ik_s32 frameCountToRead)
|
||||
{
|
||||
const int frameSize = Format.getFrameSize();
|
||||
|
||||
int framesRead = 0;
|
||||
ik_u8* out = (ik_u8*)target;
|
||||
|
||||
while (framesRead < frameCountToRead)
|
||||
{
|
||||
// no more samples? ask the MP3 for more
|
||||
if (DecodedQueue.getSize() < frameSize)
|
||||
{
|
||||
if (!decodeFrame() || EndOfFileReached)
|
||||
return framesRead;
|
||||
|
||||
// if the buffer is still empty, we are done
|
||||
if (DecodedQueue.getSize() < frameSize)
|
||||
return framesRead;
|
||||
}
|
||||
|
||||
const int framesLeft = frameCountToRead - framesRead;
|
||||
const int dequeSize = DecodedQueue.getSize() / frameSize;
|
||||
const int framesToRead = framesLeft < dequeSize ? framesLeft : dequeSize;
|
||||
|
||||
DecodedQueue.read(out, framesToRead * frameSize);
|
||||
|
||||
out += framesToRead * frameSize;
|
||||
framesRead += framesToRead;
|
||||
Position += framesToRead;
|
||||
}
|
||||
|
||||
return framesRead;
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool CIrrKlangAudioStreamMP3::decodeFrame()
|
||||
{
|
||||
int outputSize = 0;
|
||||
|
||||
while (!outputSize)
|
||||
{
|
||||
if (InputPosition == InputLength)
|
||||
{
|
||||
InputPosition = 0;
|
||||
InputLength = File->read(InputBuffer, IKP_MP3_INPUT_BUFFER_SIZE);
|
||||
|
||||
if (InputLength == 0)
|
||||
{
|
||||
EndOfFileReached = true;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
int rv = mpaudec_decode_frame( TheMPAuDecContext, (ik_s16*)DecodeBuffer,
|
||||
&outputSize,
|
||||
(ik_u8*)InputBuffer + InputPosition,
|
||||
InputLength - InputPosition);
|
||||
|
||||
if (rv < 0)
|
||||
return false;
|
||||
|
||||
InputPosition += rv;
|
||||
} // end while
|
||||
|
||||
if (!FirstFrameRead)
|
||||
{
|
||||
Format.ChannelCount = TheMPAuDecContext->channels;
|
||||
Format.SampleRate = TheMPAuDecContext->sample_rate;
|
||||
Format.SampleFormat = ESF_S16;
|
||||
Format.FrameCount = -1; // unknown lenght
|
||||
|
||||
FirstFrameRead = true;
|
||||
}
|
||||
else
|
||||
if (TheMPAuDecContext->channels != Format.ChannelCount ||
|
||||
TheMPAuDecContext->sample_rate != Format.SampleRate)
|
||||
{
|
||||
// Can't handle format changes mid-stream.
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!TheMPAuDecContext->parse_only)
|
||||
{
|
||||
if (outputSize < 0)
|
||||
{
|
||||
// Couldn't decode this frame. Too bad, already lost it.
|
||||
// This should only happen when seeking.
|
||||
|
||||
outputSize = TheMPAuDecContext->frame_size;
|
||||
memset(DecodeBuffer, 0, outputSize * Format.getFrameSize());
|
||||
}
|
||||
|
||||
DecodedQueue.write(DecodeBuffer, outputSize);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//! sets the position of the audio stream.
|
||||
/** For example to let the stream be read from the beginning of the file again,
|
||||
setPosition(0) would be called. This is usually done be the sound engine to
|
||||
loop a stream after if has reached the end. Return true if sucessful and 0 if not. */
|
||||
bool CIrrKlangAudioStreamMP3::setPosition(ik_s32 pos)
|
||||
{
|
||||
if (!File || !TheMPAuDecContext)
|
||||
return false;
|
||||
|
||||
if (pos == 0)
|
||||
{
|
||||
// usually done for looping, just reset to start
|
||||
|
||||
File->seek(FileBegin); // skip possible ID3 header
|
||||
|
||||
EndOfFileReached = false;
|
||||
|
||||
DecodedQueue.clear();
|
||||
|
||||
MPAuDecContext oldContext = *TheMPAuDecContext;
|
||||
|
||||
mpaudec_clear(TheMPAuDecContext);
|
||||
mpaudec_init(TheMPAuDecContext);
|
||||
|
||||
TheMPAuDecContext->bit_rate = oldContext.bit_rate;
|
||||
TheMPAuDecContext->channels = oldContext.channels;
|
||||
TheMPAuDecContext->frame_size = oldContext.frame_size;
|
||||
TheMPAuDecContext->sample_rate = oldContext.sample_rate;
|
||||
|
||||
InputPosition = 0;
|
||||
InputLength = 0;
|
||||
Position = 0;
|
||||
CurrentFramePosition = 0;
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// user wants to seek in the stream, so do this here
|
||||
|
||||
int scan_position = 0;
|
||||
int target_frame = 0;
|
||||
int frame_count = (int)FramePositionData.size();
|
||||
|
||||
while (target_frame < frame_count)
|
||||
{
|
||||
int frame_size = FramePositionData[target_frame].size;
|
||||
|
||||
if (pos <= scan_position + frame_size)
|
||||
break;
|
||||
else
|
||||
{
|
||||
scan_position += frame_size;
|
||||
target_frame++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const int MAX_FRAME_DEPENDENCY = 10;
|
||||
target_frame = std::max(0, target_frame - MAX_FRAME_DEPENDENCY);
|
||||
setPosition(0);
|
||||
|
||||
File->seek(FramePositionData[target_frame].offset, false);
|
||||
|
||||
int i;
|
||||
for (i = 0; i < target_frame; i++)
|
||||
{
|
||||
if (i>=(int)FramePositionData.size())
|
||||
{
|
||||
// internal error
|
||||
setPosition(0);
|
||||
return false;
|
||||
}
|
||||
|
||||
Position += FramePositionData[i].size;
|
||||
}
|
||||
|
||||
if (!decodeFrame() || EndOfFileReached)
|
||||
{
|
||||
setPosition(0);
|
||||
return false;
|
||||
}
|
||||
|
||||
int frames_to_consume = pos - Position; // PCM frames now
|
||||
if (frames_to_consume > 0)
|
||||
{
|
||||
ik_u8 *buf = new ik_u8[frames_to_consume * Format.getFrameSize()];
|
||||
readFrames(buf, frames_to_consume);
|
||||
delete[] buf;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
CIrrKlangAudioStreamMP3::QueueBuffer::QueueBuffer()
|
||||
{
|
||||
Capacity = 256;
|
||||
Size = 0;
|
||||
|
||||
Buffer = (ik_u8*)malloc(Capacity);
|
||||
}
|
||||
|
||||
|
||||
CIrrKlangAudioStreamMP3::QueueBuffer::~QueueBuffer()
|
||||
{
|
||||
free(Buffer);
|
||||
}
|
||||
|
||||
int CIrrKlangAudioStreamMP3::QueueBuffer::getSize()
|
||||
{
|
||||
return Size;
|
||||
}
|
||||
|
||||
void CIrrKlangAudioStreamMP3::QueueBuffer::write(const void* buffer, int size)
|
||||
{
|
||||
bool needRealloc = false;
|
||||
|
||||
while (size + Size > Capacity)
|
||||
{
|
||||
Capacity *= 2;
|
||||
needRealloc = true;
|
||||
}
|
||||
|
||||
if (needRealloc)
|
||||
{
|
||||
Buffer = (ik_u8*)realloc(Buffer, Capacity);
|
||||
}
|
||||
|
||||
memcpy(Buffer + Size, buffer, size);
|
||||
Size += size;
|
||||
}
|
||||
|
||||
|
||||
int CIrrKlangAudioStreamMP3::QueueBuffer::read(void* buffer, int size)
|
||||
{
|
||||
int toRead = size < Size ? size : Size;
|
||||
|
||||
memcpy(buffer, Buffer, toRead);
|
||||
memmove(Buffer, Buffer + toRead, Size - toRead);
|
||||
|
||||
Size -= toRead;
|
||||
return toRead;
|
||||
}
|
||||
|
||||
|
||||
void CIrrKlangAudioStreamMP3::QueueBuffer::clear()
|
||||
{
|
||||
Size = 0;
|
||||
}
|
||||
|
||||
|
||||
void CIrrKlangAudioStreamMP3::skipID3IfNecessary()
|
||||
{
|
||||
char header[10];
|
||||
int read = File->read(&header, 10);
|
||||
|
||||
if (read == 10 &&
|
||||
header[0] == 'I' && header[1] == 'D' && header[2] == '3')
|
||||
{
|
||||
int versionMajor = header[3];
|
||||
int versionMinor = header[4];
|
||||
int flags = header[5];
|
||||
|
||||
// IDv2 size looks like the following: ID3v2 size 4 * %0xxxxxxx.
|
||||
// Sick, but that's how it works.
|
||||
|
||||
int size = 0;
|
||||
size = (header[6] & 0x7f) << (3*7);
|
||||
size |= (header[7] & 0x7f) << (2*7);
|
||||
size |= (header[8] & 0x7f) << (1*7);
|
||||
size |= (header[9] & 0x7f) ;
|
||||
|
||||
size += 10; // header size
|
||||
|
||||
FileBegin = size;
|
||||
File->seek(FileBegin);
|
||||
}
|
||||
else
|
||||
File->seek(0);
|
||||
}
|
||||
|
||||
|
||||
} // end namespace irrklang
|
||||
@@ -1,106 +0,0 @@
|
||||
// Copyright (C) 2002-2007 Nikolaus Gebhardt
|
||||
// Part of the code for this plugin for irrKlang is based on:
|
||||
// MP3 input for Audiere by Matt Campbell <mattcampbell@pobox.com>, based on
|
||||
// libavcodec from ffmpeg (http://ffmpeg.sourceforge.net/).
|
||||
// See license.txt for license details of this plugin.
|
||||
|
||||
#ifndef __C_IRRKLANG_AUDIO_STREAM_MP3_H_INCLUDED__
|
||||
#define __C_IRRKLANG_AUDIO_STREAM_MP3_H_INCLUDED__
|
||||
|
||||
#include <ik_IAudioStream.h>
|
||||
#include <ik_IFileReader.h>
|
||||
#include <vector>
|
||||
#include "decoder/mpaudec.h"
|
||||
|
||||
namespace irrklang
|
||||
{
|
||||
const int IKP_MP3_INPUT_BUFFER_SIZE = 4096;
|
||||
|
||||
//! Reads and decodes audio data into an usable audio stream for the ISoundEngine
|
||||
/** To extend irrKlang with new audio format decoders, the only thing needed to do
|
||||
is implementing the IAudioStream interface. All the code available in this class is only for
|
||||
mp3 decoding and may make this class look a bit more complicated then it actually is. */
|
||||
class CIrrKlangAudioStreamMP3 : public IAudioStream
|
||||
{
|
||||
public:
|
||||
|
||||
CIrrKlangAudioStreamMP3(IFileReader* file);
|
||||
~CIrrKlangAudioStreamMP3();
|
||||
|
||||
//! returns format of the audio stream
|
||||
virtual SAudioStreamFormat getFormat();
|
||||
|
||||
//! tells the audio stream to read n audio frames into the specified buffer
|
||||
/** \param target: Target data buffer to the method will write the read frames into. The
|
||||
specified buffer will be getFormat().getFrameSize()*frameCount big.
|
||||
\param frameCount: amount of frames to be read.
|
||||
\returns Returns amount of frames really read. Should be frameCountToRead in most cases. */
|
||||
virtual ik_s32 readFrames(void* target, ik_s32 frameCountToRead);
|
||||
|
||||
//! sets the position of the audio stream.
|
||||
/** For example to let the stream be read from the beginning of the file again,
|
||||
setPosition(0) would be called. This is usually done be the sound engine to
|
||||
loop a stream after if has reached the end. Return true if sucessful and 0 if not. */
|
||||
virtual bool setPosition(ik_s32 pos);
|
||||
|
||||
// just for the CIrrKlangAudioStreamLoaderMP3 to let him know if loading worked
|
||||
bool isOK() { return File != 0; }
|
||||
|
||||
protected:
|
||||
|
||||
ik_s32 readFrameForMP3(void* target, ik_s32 frameCountToRead, bool parseOnly=false);
|
||||
bool decodeFrame();
|
||||
void skipID3IfNecessary();
|
||||
|
||||
irrklang::IFileReader* File;
|
||||
SAudioStreamFormat Format;
|
||||
|
||||
// mpaudec specific
|
||||
MPAuDecContext* TheMPAuDecContext;
|
||||
|
||||
ik_u8 InputBuffer[IKP_MP3_INPUT_BUFFER_SIZE];
|
||||
|
||||
int InputPosition;
|
||||
int InputLength;
|
||||
int Position;
|
||||
ik_u8* DecodeBuffer;
|
||||
ik_s32 FileBegin;
|
||||
ik_u32 CurrentFramePosition;
|
||||
|
||||
bool FirstFrameRead;
|
||||
bool EndOfFileReached;
|
||||
|
||||
// helper class for managing the streaming decoded audio data
|
||||
class QueueBuffer
|
||||
{
|
||||
public:
|
||||
|
||||
QueueBuffer();
|
||||
~QueueBuffer();
|
||||
|
||||
int getSize();
|
||||
void write(const void* buffer, int size);
|
||||
int read(void* buffer, int size);
|
||||
void clear();
|
||||
|
||||
private:
|
||||
|
||||
ik_u8* Buffer;
|
||||
int Capacity;
|
||||
int Size;
|
||||
};
|
||||
|
||||
struct SFramePositionData
|
||||
{
|
||||
int offset;
|
||||
int size;
|
||||
};
|
||||
|
||||
std::vector<SFramePositionData> FramePositionData;
|
||||
QueueBuffer DecodedQueue;
|
||||
};
|
||||
|
||||
|
||||
} // end namespace irrklang
|
||||
|
||||
#endif
|
||||
@@ -1,273 +0,0 @@
|
||||
/*
|
||||
* Common bit i/o utils
|
||||
* Copyright (c) 2000, 2001 Fabrice Bellard.
|
||||
*
|
||||
* 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 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
|
||||
*
|
||||
* Modified by Matt Campbell <mattcampbell@pobox.com> for the stand-alone
|
||||
* mpaudec library. Based on common.c from libavcodec.
|
||||
*/
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
/**
|
||||
* init GetBitContext.
|
||||
* @param buffer bitstream buffer
|
||||
* @param bit_size the size of the buffer in bits
|
||||
*/
|
||||
void init_get_bits(GetBitContext *s,
|
||||
const uint8_t *buffer, int bit_size)
|
||||
{
|
||||
s->buffer= buffer;
|
||||
s->size_in_bits= bit_size;
|
||||
s->index=0;
|
||||
}
|
||||
|
||||
unsigned int show_bits(const GetBitContext *s, int n)
|
||||
{
|
||||
int i;
|
||||
unsigned int result = 0;
|
||||
assert(s->size_in_bits - s->index >= n);
|
||||
for (i = s->index; i < s->index + n; i++) {
|
||||
int byte_index = i / 8;
|
||||
unsigned int right_shift = 7 - (i % 8);
|
||||
uint8_t byte = s->buffer[byte_index];
|
||||
uint8_t bit;
|
||||
result <<= 1;
|
||||
if (right_shift == 0)
|
||||
bit = byte & 0x1;
|
||||
else
|
||||
bit = (byte >> right_shift) & 0x1;
|
||||
result |= (unsigned int)bit;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void skip_bits(GetBitContext *s, int n)
|
||||
{
|
||||
s->index += n;
|
||||
}
|
||||
|
||||
unsigned int get_bits(GetBitContext *s, int n)
|
||||
{
|
||||
unsigned int result = show_bits(s, n);
|
||||
skip_bits(s, n);
|
||||
return result;
|
||||
}
|
||||
|
||||
int get_bits_count(const GetBitContext *s)
|
||||
{
|
||||
return s->index;
|
||||
}
|
||||
|
||||
/* VLC decoding */
|
||||
|
||||
/*#define DEBUG_VLC*/
|
||||
|
||||
#define GET_DATA(v, table, i, wrap, size) \
|
||||
{\
|
||||
const uint8_t *ptr = (const uint8_t *)table + i * wrap;\
|
||||
switch(size) {\
|
||||
case 1:\
|
||||
v = *(const uint8_t *)ptr;\
|
||||
break;\
|
||||
case 2:\
|
||||
v = *(const uint16_t *)ptr;\
|
||||
break;\
|
||||
default:\
|
||||
v = *(const uint32_t *)ptr;\
|
||||
break;\
|
||||
}\
|
||||
}
|
||||
|
||||
|
||||
static int alloc_table(VLC *vlc, int size)
|
||||
{
|
||||
int index;
|
||||
index = vlc->table_size;
|
||||
vlc->table_size += size;
|
||||
if (vlc->table_size > vlc->table_allocated) {
|
||||
vlc->table_allocated += (1 << vlc->bits);
|
||||
vlc->table = realloc(vlc->table,
|
||||
sizeof(VLC_TYPE) * 2 * vlc->table_allocated);
|
||||
if (!vlc->table)
|
||||
return -1;
|
||||
}
|
||||
return index;
|
||||
}
|
||||
|
||||
static int build_table(VLC *vlc, int table_nb_bits,
|
||||
int nb_codes,
|
||||
const void *bits, int bits_wrap, int bits_size,
|
||||
const void *codes, int codes_wrap, int codes_size,
|
||||
uint32_t code_prefix, int n_prefix)
|
||||
{
|
||||
int i, j, k, n, table_size, table_index, nb, n1, index;
|
||||
uint32_t code;
|
||||
VLC_TYPE (*table)[2];
|
||||
|
||||
table_size = 1 << table_nb_bits;
|
||||
table_index = alloc_table(vlc, table_size);
|
||||
#ifdef DEBUG_VLC
|
||||
printf("new table index=%d size=%d code_prefix=%x n=%d\n",
|
||||
table_index, table_size, code_prefix, n_prefix);
|
||||
#endif
|
||||
if (table_index < 0)
|
||||
return -1;
|
||||
table = &vlc->table[table_index];
|
||||
|
||||
for(i=0;i<table_size;i++) {
|
||||
table[i][1] = 0; /*bits*/
|
||||
table[i][0] = -1; /*codes*/
|
||||
}
|
||||
|
||||
/* first pass: map codes and compute auxillary table sizes */
|
||||
for(i=0;i<nb_codes;i++) {
|
||||
GET_DATA(n, bits, i, bits_wrap, bits_size);
|
||||
GET_DATA(code, codes, i, codes_wrap, codes_size);
|
||||
/* we accept tables with holes */
|
||||
if (n <= 0)
|
||||
continue;
|
||||
#if defined(DEBUG_VLC) && 0
|
||||
printf("i=%d n=%d code=0x%x\n", i, n, code);
|
||||
#endif
|
||||
/* if code matches the prefix, it is in the table */
|
||||
n -= n_prefix;
|
||||
if (n > 0 && (code >> n) == code_prefix) {
|
||||
if (n <= table_nb_bits) {
|
||||
/* no need to add another table */
|
||||
j = (code << (table_nb_bits - n)) & (table_size - 1);
|
||||
nb = 1 << (table_nb_bits - n);
|
||||
for(k=0;k<nb;k++) {
|
||||
#ifdef DEBUG_VLC
|
||||
printf("%4x: code=%d n=%d\n",
|
||||
j, i, n);
|
||||
#endif
|
||||
assert(table[j][1] /*bits*/ == 0);
|
||||
table[j][1] = n; /*bits*/
|
||||
table[j][0] = i; /*code*/
|
||||
j++;
|
||||
}
|
||||
} else {
|
||||
n -= table_nb_bits;
|
||||
j = (code >> n) & ((1 << table_nb_bits) - 1);
|
||||
#ifdef DEBUG_VLC
|
||||
printf("%4x: n=%d (subtable)\n",
|
||||
j, n);
|
||||
#endif
|
||||
/* compute table size */
|
||||
n1 = -table[j][1]; /*bits*/
|
||||
if (n > n1)
|
||||
n1 = n;
|
||||
table[j][1] = -n1; /*bits*/
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* second pass : fill auxillary tables recursively */
|
||||
for(i=0;i<table_size;i++) {
|
||||
n = table[i][1]; /*bits*/
|
||||
if (n < 0) {
|
||||
n = -n;
|
||||
if (n > table_nb_bits) {
|
||||
n = table_nb_bits;
|
||||
table[i][1] = -n; /*bits*/
|
||||
}
|
||||
index = build_table(vlc, n, nb_codes,
|
||||
bits, bits_wrap, bits_size,
|
||||
codes, codes_wrap, codes_size,
|
||||
(code_prefix << table_nb_bits) | i,
|
||||
n_prefix + table_nb_bits);
|
||||
if (index < 0)
|
||||
return -1;
|
||||
/* note: realloc has been done, so reload tables */
|
||||
table = &vlc->table[table_index];
|
||||
table[i][0] = index; /*code*/
|
||||
}
|
||||
}
|
||||
return table_index;
|
||||
}
|
||||
|
||||
|
||||
/* Build VLC decoding tables suitable for use with get_vlc().
|
||||
|
||||
'nb_bits' set thee decoding table size (2^nb_bits) entries. The
|
||||
bigger it is, the faster is the decoding. But it should not be too
|
||||
big to save memory and L1 cache. '9' is a good compromise.
|
||||
|
||||
'nb_codes' : number of vlcs codes
|
||||
|
||||
'bits' : table which gives the size (in bits) of each vlc code.
|
||||
|
||||
'codes' : table which gives the bit pattern of of each vlc code.
|
||||
|
||||
'xxx_wrap' : give the number of bytes between each entry of the
|
||||
'bits' or 'codes' tables.
|
||||
|
||||
'xxx_size' : gives the number of bytes of each entry of the 'bits'
|
||||
or 'codes' tables.
|
||||
|
||||
'wrap' and 'size' allows to use any memory configuration and types
|
||||
(byte/word/long) to store the 'bits' and 'codes' tables.
|
||||
*/
|
||||
int init_vlc(VLC *vlc, int nb_bits, int nb_codes,
|
||||
const void *bits, int bits_wrap, int bits_size,
|
||||
const void *codes, int codes_wrap, int codes_size)
|
||||
{
|
||||
vlc->bits = nb_bits;
|
||||
vlc->table = NULL;
|
||||
vlc->table_allocated = 0;
|
||||
vlc->table_size = 0;
|
||||
#ifdef DEBUG_VLC
|
||||
printf("build table nb_codes=%d\n", nb_codes);
|
||||
#endif
|
||||
|
||||
if (build_table(vlc, nb_bits, nb_codes,
|
||||
bits, bits_wrap, bits_size,
|
||||
codes, codes_wrap, codes_size,
|
||||
0, 0) < 0) {
|
||||
free(vlc->table);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void free_vlc(VLC *vlc)
|
||||
{
|
||||
free(vlc->table);
|
||||
}
|
||||
|
||||
int get_vlc(GetBitContext *s, const VLC *vlc)
|
||||
{
|
||||
int code = 0;
|
||||
int depth = 0, max_depth = 3;
|
||||
int n, index, bits = vlc->bits;
|
||||
|
||||
do {
|
||||
index = show_bits(s, bits) + code;
|
||||
code = vlc->table[index][0];
|
||||
n = vlc->table[index][1];
|
||||
depth++;
|
||||
|
||||
if (n < 0 && depth < max_depth) {
|
||||
skip_bits(s, bits);
|
||||
bits = -n;
|
||||
}
|
||||
} while (n < 0 && depth < max_depth);
|
||||
|
||||
skip_bits(s, n);
|
||||
return code;
|
||||
}
|
||||
@@ -1,86 +0,0 @@
|
||||
/* Based on common.h from libavcodec. Modified extensively by Matt Campbell
|
||||
<mattcampbell@pobox.com> for the stand-alone mpaudec library. */
|
||||
|
||||
#ifndef INTERNAL_H
|
||||
#define INTERNAL_H
|
||||
|
||||
#if defined(_WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__)
|
||||
# define CONFIG_WIN32
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <math.h>
|
||||
#include <stddef.h>
|
||||
#include "mpaudec.h"
|
||||
|
||||
#ifndef M_PI
|
||||
#define M_PI 3.14159265358979323846
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_WIN32
|
||||
|
||||
/* windows */
|
||||
|
||||
typedef unsigned short uint16_t;
|
||||
typedef signed short int16_t;
|
||||
typedef unsigned char uint8_t;
|
||||
typedef unsigned int uint32_t;
|
||||
typedef unsigned __int64 uint64_t;
|
||||
typedef signed char int8_t;
|
||||
typedef signed int int32_t;
|
||||
typedef signed __int64 int64_t;
|
||||
|
||||
# ifdef _DEBUG
|
||||
# define DEBUG
|
||||
# endif
|
||||
|
||||
/* CONFIG_WIN32 end */
|
||||
#else
|
||||
|
||||
/* unix */
|
||||
|
||||
#include <inttypes.h>
|
||||
|
||||
#endif /* !CONFIG_WIN32 */
|
||||
|
||||
/* debug stuff */
|
||||
|
||||
#if !defined(DEBUG) && !defined(NDEBUG)
|
||||
# define NDEBUG
|
||||
#endif
|
||||
#include <assert.h>
|
||||
|
||||
/* bit input */
|
||||
|
||||
typedef struct GetBitContext {
|
||||
const uint8_t *buffer;
|
||||
int index;
|
||||
int size_in_bits;
|
||||
} GetBitContext;
|
||||
|
||||
int get_bits_count(const GetBitContext *s);
|
||||
|
||||
#define VLC_TYPE int16_t
|
||||
|
||||
typedef struct VLC {
|
||||
int bits;
|
||||
VLC_TYPE (*table)[2];
|
||||
int table_size, table_allocated;
|
||||
} VLC;
|
||||
|
||||
unsigned int get_bits(GetBitContext *s, int n);
|
||||
unsigned int show_bits(const GetBitContext *s, int n);
|
||||
void skip_bits(GetBitContext *s, int n);
|
||||
void init_get_bits(GetBitContext *s,
|
||||
const uint8_t *buffer, int buffer_size);
|
||||
|
||||
int init_vlc(VLC *vlc, int nb_bits, int nb_codes,
|
||||
const void *bits, int bits_wrap, int bits_size,
|
||||
const void *codes, int codes_wrap, int codes_size);
|
||||
void free_vlc(VLC *vlc);
|
||||
int get_vlc(GetBitContext *s, const VLC *vlc);
|
||||
|
||||
#endif /* INTERNAL_H */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,34 +0,0 @@
|
||||
/* Portions based on avcodec.h from libavcodec. */
|
||||
|
||||
#ifndef MPAUDEC_H
|
||||
#define MPAUDEC_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* in bytes */
|
||||
#define MPAUDEC_MAX_AUDIO_FRAME_SIZE 4608
|
||||
|
||||
typedef struct MPAuDecContext {
|
||||
int bit_rate;
|
||||
int layer;
|
||||
int sample_rate;
|
||||
int channels;
|
||||
int frame_size;
|
||||
void *priv_data;
|
||||
int parse_only;
|
||||
int coded_frame_size;
|
||||
} MPAuDecContext;
|
||||
|
||||
int mpaudec_init(MPAuDecContext *mpctx);
|
||||
int mpaudec_decode_frame(MPAuDecContext * mpctx,
|
||||
void *data, int *data_size,
|
||||
const unsigned char * buf, int buf_size);
|
||||
void mpaudec_clear(MPAuDecContext *mpctx);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* MPAUDEC_H */
|
||||
@@ -1,772 +0,0 @@
|
||||
/* Modified slightly by Matt Campbell <mattcampbell@pobox.com> for the
|
||||
stand-alone mpaudec library. Based on mpegaudiodectab.h from libavcodec. */
|
||||
|
||||
static const uint16_t mpa_bitrate_tab[2][3][15] = {
|
||||
{ {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}
|
||||
}
|
||||
};
|
||||
|
||||
static const uint16_t mpa_freq_tab[3] = { 44100, 48000, 32000 };
|
||||
|
||||
/*******************************************************/
|
||||
/* half mpeg encoding window (full precision) */
|
||||
static const int32_t mpa_enwindow[257] = {
|
||||
0, -1, -1, -1, -1, -1, -1, -2,
|
||||
-2, -2, -2, -3, -3, -4, -4, -5,
|
||||
-5, -6, -7, -7, -8, -9, -10, -11,
|
||||
-13, -14, -16, -17, -19, -21, -24, -26,
|
||||
-29, -31, -35, -38, -41, -45, -49, -53,
|
||||
-58, -63, -68, -73, -79, -85, -91, -97,
|
||||
-104, -111, -117, -125, -132, -139, -147, -154,
|
||||
-161, -169, -176, -183, -190, -196, -202, -208,
|
||||
213, 218, 222, 225, 227, 228, 228, 227,
|
||||
224, 221, 215, 208, 200, 189, 177, 163,
|
||||
146, 127, 106, 83, 57, 29, -2, -36,
|
||||
-72, -111, -153, -197, -244, -294, -347, -401,
|
||||
-459, -519, -581, -645, -711, -779, -848, -919,
|
||||
-991, -1064, -1137, -1210, -1283, -1356, -1428, -1498,
|
||||
-1567, -1634, -1698, -1759, -1817, -1870, -1919, -1962,
|
||||
-2001, -2032, -2057, -2075, -2085, -2087, -2080, -2063,
|
||||
2037, 2000, 1952, 1893, 1822, 1739, 1644, 1535,
|
||||
1414, 1280, 1131, 970, 794, 605, 402, 185,
|
||||
-45, -288, -545, -814, -1095, -1388, -1692, -2006,
|
||||
-2330, -2663, -3004, -3351, -3705, -4063, -4425, -4788,
|
||||
-5153, -5517, -5879, -6237, -6589, -6935, -7271, -7597,
|
||||
-7910, -8209, -8491, -8755, -8998, -9219, -9416, -9585,
|
||||
-9727, -9838, -9916, -9959, -9966, -9935, -9863, -9750,
|
||||
-9592, -9389, -9139, -8840, -8492, -8092, -7640, -7134,
|
||||
6574, 5959, 5288, 4561, 3776, 2935, 2037, 1082,
|
||||
70, -998, -2122, -3300, -4533, -5818, -7154, -8540,
|
||||
-9975,-11455,-12980,-14548,-16155,-17799,-19478,-21189,
|
||||
-22929,-24694,-26482,-28289,-30112,-31947,-33791,-35640,
|
||||
-37489,-39336,-41176,-43006,-44821,-46617,-48390,-50137,
|
||||
-51853,-53534,-55178,-56778,-58333,-59838,-61289,-62684,
|
||||
-64019,-65290,-66494,-67629,-68692,-69679,-70590,-71420,
|
||||
-72169,-72835,-73415,-73908,-74313,-74630,-74856,-74992,
|
||||
75038,
|
||||
};
|
||||
|
||||
/*******************************************************/
|
||||
/* layer 2 tables */
|
||||
|
||||
static const int sblimit_table[5] = { 27 , 30 , 8, 12 , 30 };
|
||||
|
||||
static const int quant_steps[17] = {
|
||||
3, 5, 7, 9, 15,
|
||||
31, 63, 127, 255, 511,
|
||||
1023, 2047, 4095, 8191, 16383,
|
||||
32767, 65535
|
||||
};
|
||||
|
||||
/* we use a negative value if grouped */
|
||||
static const int quant_bits[17] = {
|
||||
-5, -7, 3, -10, 4,
|
||||
5, 6, 7, 8, 9,
|
||||
10, 11, 12, 13, 14,
|
||||
15, 16
|
||||
};
|
||||
|
||||
/* encoding tables which give the quantization index. Note how it is
|
||||
possible to store them efficiently ! */
|
||||
static const unsigned char alloc_table_0[] = {
|
||||
4, 0, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
|
||||
4, 0, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
|
||||
4, 0, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
|
||||
4, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16,
|
||||
4, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16,
|
||||
4, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16,
|
||||
4, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16,
|
||||
4, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16,
|
||||
4, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16,
|
||||
4, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16,
|
||||
4, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16,
|
||||
3, 0, 1, 2, 3, 4, 5, 16,
|
||||
3, 0, 1, 2, 3, 4, 5, 16,
|
||||
3, 0, 1, 2, 3, 4, 5, 16,
|
||||
3, 0, 1, 2, 3, 4, 5, 16,
|
||||
3, 0, 1, 2, 3, 4, 5, 16,
|
||||
3, 0, 1, 2, 3, 4, 5, 16,
|
||||
3, 0, 1, 2, 3, 4, 5, 16,
|
||||
3, 0, 1, 2, 3, 4, 5, 16,
|
||||
3, 0, 1, 2, 3, 4, 5, 16,
|
||||
3, 0, 1, 2, 3, 4, 5, 16,
|
||||
3, 0, 1, 2, 3, 4, 5, 16,
|
||||
3, 0, 1, 2, 3, 4, 5, 16,
|
||||
2, 0, 1, 16,
|
||||
2, 0, 1, 16,
|
||||
2, 0, 1, 16,
|
||||
2, 0, 1, 16,
|
||||
};
|
||||
|
||||
static const unsigned char alloc_table_1[] = {
|
||||
4, 0, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
|
||||
4, 0, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
|
||||
4, 0, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
|
||||
4, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16,
|
||||
4, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16,
|
||||
4, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16,
|
||||
4, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16,
|
||||
4, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16,
|
||||
4, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16,
|
||||
4, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16,
|
||||
4, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16,
|
||||
3, 0, 1, 2, 3, 4, 5, 16,
|
||||
3, 0, 1, 2, 3, 4, 5, 16,
|
||||
3, 0, 1, 2, 3, 4, 5, 16,
|
||||
3, 0, 1, 2, 3, 4, 5, 16,
|
||||
3, 0, 1, 2, 3, 4, 5, 16,
|
||||
3, 0, 1, 2, 3, 4, 5, 16,
|
||||
3, 0, 1, 2, 3, 4, 5, 16,
|
||||
3, 0, 1, 2, 3, 4, 5, 16,
|
||||
3, 0, 1, 2, 3, 4, 5, 16,
|
||||
3, 0, 1, 2, 3, 4, 5, 16,
|
||||
3, 0, 1, 2, 3, 4, 5, 16,
|
||||
3, 0, 1, 2, 3, 4, 5, 16,
|
||||
2, 0, 1, 16,
|
||||
2, 0, 1, 16,
|
||||
2, 0, 1, 16,
|
||||
2, 0, 1, 16,
|
||||
2, 0, 1, 16,
|
||||
2, 0, 1, 16,
|
||||
2, 0, 1, 16,
|
||||
};
|
||||
|
||||
static const unsigned char alloc_table_2[] = {
|
||||
4, 0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
|
||||
4, 0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
|
||||
3, 0, 1, 3, 4, 5, 6, 7,
|
||||
3, 0, 1, 3, 4, 5, 6, 7,
|
||||
3, 0, 1, 3, 4, 5, 6, 7,
|
||||
3, 0, 1, 3, 4, 5, 6, 7,
|
||||
3, 0, 1, 3, 4, 5, 6, 7,
|
||||
3, 0, 1, 3, 4, 5, 6, 7,
|
||||
};
|
||||
|
||||
static const unsigned char alloc_table_3[] = {
|
||||
4, 0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
|
||||
4, 0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
|
||||
3, 0, 1, 3, 4, 5, 6, 7,
|
||||
3, 0, 1, 3, 4, 5, 6, 7,
|
||||
3, 0, 1, 3, 4, 5, 6, 7,
|
||||
3, 0, 1, 3, 4, 5, 6, 7,
|
||||
3, 0, 1, 3, 4, 5, 6, 7,
|
||||
3, 0, 1, 3, 4, 5, 6, 7,
|
||||
3, 0, 1, 3, 4, 5, 6, 7,
|
||||
3, 0, 1, 3, 4, 5, 6, 7,
|
||||
3, 0, 1, 3, 4, 5, 6, 7,
|
||||
3, 0, 1, 3, 4, 5, 6, 7,
|
||||
};
|
||||
|
||||
static const unsigned char alloc_table_4[] = {
|
||||
4, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
|
||||
4, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
|
||||
4, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
|
||||
4, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
|
||||
3, 0, 1, 3, 4, 5, 6, 7,
|
||||
3, 0, 1, 3, 4, 5, 6, 7,
|
||||
3, 0, 1, 3, 4, 5, 6, 7,
|
||||
3, 0, 1, 3, 4, 5, 6, 7,
|
||||
3, 0, 1, 3, 4, 5, 6, 7,
|
||||
3, 0, 1, 3, 4, 5, 6, 7,
|
||||
3, 0, 1, 3, 4, 5, 6, 7,
|
||||
2, 0, 1, 3,
|
||||
2, 0, 1, 3,
|
||||
2, 0, 1, 3,
|
||||
2, 0, 1, 3,
|
||||
2, 0, 1, 3,
|
||||
2, 0, 1, 3,
|
||||
2, 0, 1, 3,
|
||||
2, 0, 1, 3,
|
||||
2, 0, 1, 3,
|
||||
2, 0, 1, 3,
|
||||
2, 0, 1, 3,
|
||||
2, 0, 1, 3,
|
||||
2, 0, 1, 3,
|
||||
2, 0, 1, 3,
|
||||
2, 0, 1, 3,
|
||||
2, 0, 1, 3,
|
||||
2, 0, 1, 3,
|
||||
2, 0, 1, 3,
|
||||
2, 0, 1, 3,
|
||||
};
|
||||
|
||||
static const unsigned char *alloc_tables[5] =
|
||||
{ alloc_table_0, alloc_table_1, alloc_table_2, alloc_table_3, alloc_table_4, };
|
||||
|
||||
/*******************************************************/
|
||||
/* layer 3 tables */
|
||||
|
||||
/* layer3 scale factor size */
|
||||
static const uint8_t slen_table[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 },
|
||||
};
|
||||
|
||||
/* number of lsf scale factors for a given size */
|
||||
static const uint8_t lsf_nsf_table[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 } },
|
||||
};
|
||||
|
||||
/* mpegaudio layer 3 huffman tables */
|
||||
|
||||
static const uint16_t mpa_huffcodes_1[4] = {
|
||||
0x0001, 0x0001, 0x0001, 0x0000,
|
||||
};
|
||||
|
||||
static const uint8_t mpa_huffbits_1[4] = {
|
||||
1, 3, 2, 3,
|
||||
};
|
||||
|
||||
static const uint16_t mpa_huffcodes_2[9] = {
|
||||
0x0001, 0x0002, 0x0001, 0x0003, 0x0001, 0x0001, 0x0003, 0x0002,
|
||||
0x0000,
|
||||
};
|
||||
|
||||
static const uint8_t mpa_huffbits_2[9] = {
|
||||
1, 3, 6, 3, 3, 5, 5, 5,
|
||||
6,
|
||||
};
|
||||
|
||||
static const uint16_t mpa_huffcodes_3[9] = {
|
||||
0x0003, 0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0003, 0x0002,
|
||||
0x0000,
|
||||
};
|
||||
|
||||
static const uint8_t mpa_huffbits_3[9] = {
|
||||
2, 2, 6, 3, 2, 5, 5, 5,
|
||||
6,
|
||||
};
|
||||
|
||||
static const uint16_t mpa_huffcodes_5[16] = {
|
||||
0x0001, 0x0002, 0x0006, 0x0005, 0x0003, 0x0001, 0x0004, 0x0004,
|
||||
0x0007, 0x0005, 0x0007, 0x0001, 0x0006, 0x0001, 0x0001, 0x0000,
|
||||
};
|
||||
|
||||
static const uint8_t mpa_huffbits_5[16] = {
|
||||
1, 3, 6, 7, 3, 3, 6, 7,
|
||||
6, 6, 7, 8, 7, 6, 7, 8,
|
||||
};
|
||||
|
||||
static const uint16_t mpa_huffcodes_6[16] = {
|
||||
0x0007, 0x0003, 0x0005, 0x0001, 0x0006, 0x0002, 0x0003, 0x0002,
|
||||
0x0005, 0x0004, 0x0004, 0x0001, 0x0003, 0x0003, 0x0002, 0x0000,
|
||||
};
|
||||
|
||||
static const uint8_t mpa_huffbits_6[16] = {
|
||||
3, 3, 5, 7, 3, 2, 4, 5,
|
||||
4, 4, 5, 6, 6, 5, 6, 7,
|
||||
};
|
||||
|
||||
static const uint16_t mpa_huffcodes_7[36] = {
|
||||
0x0001, 0x0002, 0x000a, 0x0013, 0x0010, 0x000a, 0x0003, 0x0003,
|
||||
0x0007, 0x000a, 0x0005, 0x0003, 0x000b, 0x0004, 0x000d, 0x0011,
|
||||
0x0008, 0x0004, 0x000c, 0x000b, 0x0012, 0x000f, 0x000b, 0x0002,
|
||||
0x0007, 0x0006, 0x0009, 0x000e, 0x0003, 0x0001, 0x0006, 0x0004,
|
||||
0x0005, 0x0003, 0x0002, 0x0000,
|
||||
};
|
||||
|
||||
static const uint8_t mpa_huffbits_7[36] = {
|
||||
1, 3, 6, 8, 8, 9, 3, 4,
|
||||
6, 7, 7, 8, 6, 5, 7, 8,
|
||||
8, 9, 7, 7, 8, 9, 9, 9,
|
||||
7, 7, 8, 9, 9, 10, 8, 8,
|
||||
9, 10, 10, 10,
|
||||
};
|
||||
|
||||
static const uint16_t mpa_huffcodes_8[36] = {
|
||||
0x0003, 0x0004, 0x0006, 0x0012, 0x000c, 0x0005, 0x0005, 0x0001,
|
||||
0x0002, 0x0010, 0x0009, 0x0003, 0x0007, 0x0003, 0x0005, 0x000e,
|
||||
0x0007, 0x0003, 0x0013, 0x0011, 0x000f, 0x000d, 0x000a, 0x0004,
|
||||
0x000d, 0x0005, 0x0008, 0x000b, 0x0005, 0x0001, 0x000c, 0x0004,
|
||||
0x0004, 0x0001, 0x0001, 0x0000,
|
||||
};
|
||||
|
||||
static const uint8_t mpa_huffbits_8[36] = {
|
||||
2, 3, 6, 8, 8, 9, 3, 2,
|
||||
4, 8, 8, 8, 6, 4, 6, 8,
|
||||
8, 9, 8, 8, 8, 9, 9, 10,
|
||||
8, 7, 8, 9, 10, 10, 9, 8,
|
||||
9, 9, 11, 11,
|
||||
};
|
||||
|
||||
static const uint16_t mpa_huffcodes_9[36] = {
|
||||
0x0007, 0x0005, 0x0009, 0x000e, 0x000f, 0x0007, 0x0006, 0x0004,
|
||||
0x0005, 0x0005, 0x0006, 0x0007, 0x0007, 0x0006, 0x0008, 0x0008,
|
||||
0x0008, 0x0005, 0x000f, 0x0006, 0x0009, 0x000a, 0x0005, 0x0001,
|
||||
0x000b, 0x0007, 0x0009, 0x0006, 0x0004, 0x0001, 0x000e, 0x0004,
|
||||
0x0006, 0x0002, 0x0006, 0x0000,
|
||||
};
|
||||
|
||||
static const uint8_t mpa_huffbits_9[36] = {
|
||||
3, 3, 5, 6, 8, 9, 3, 3,
|
||||
4, 5, 6, 8, 4, 4, 5, 6,
|
||||
7, 8, 6, 5, 6, 7, 7, 8,
|
||||
7, 6, 7, 7, 8, 9, 8, 7,
|
||||
8, 8, 9, 9,
|
||||
};
|
||||
|
||||
static const uint16_t mpa_huffcodes_10[64] = {
|
||||
0x0001, 0x0002, 0x000a, 0x0017, 0x0023, 0x001e, 0x000c, 0x0011,
|
||||
0x0003, 0x0003, 0x0008, 0x000c, 0x0012, 0x0015, 0x000c, 0x0007,
|
||||
0x000b, 0x0009, 0x000f, 0x0015, 0x0020, 0x0028, 0x0013, 0x0006,
|
||||
0x000e, 0x000d, 0x0016, 0x0022, 0x002e, 0x0017, 0x0012, 0x0007,
|
||||
0x0014, 0x0013, 0x0021, 0x002f, 0x001b, 0x0016, 0x0009, 0x0003,
|
||||
0x001f, 0x0016, 0x0029, 0x001a, 0x0015, 0x0014, 0x0005, 0x0003,
|
||||
0x000e, 0x000d, 0x000a, 0x000b, 0x0010, 0x0006, 0x0005, 0x0001,
|
||||
0x0009, 0x0008, 0x0007, 0x0008, 0x0004, 0x0004, 0x0002, 0x0000,
|
||||
};
|
||||
|
||||
static const uint8_t mpa_huffbits_10[64] = {
|
||||
1, 3, 6, 8, 9, 9, 9, 10,
|
||||
3, 4, 6, 7, 8, 9, 8, 8,
|
||||
6, 6, 7, 8, 9, 10, 9, 9,
|
||||
7, 7, 8, 9, 10, 10, 9, 10,
|
||||
8, 8, 9, 10, 10, 10, 10, 10,
|
||||
9, 9, 10, 10, 11, 11, 10, 11,
|
||||
8, 8, 9, 10, 10, 10, 11, 11,
|
||||
9, 8, 9, 10, 10, 11, 11, 11,
|
||||
};
|
||||
|
||||
static const uint16_t mpa_huffcodes_11[64] = {
|
||||
0x0003, 0x0004, 0x000a, 0x0018, 0x0022, 0x0021, 0x0015, 0x000f,
|
||||
0x0005, 0x0003, 0x0004, 0x000a, 0x0020, 0x0011, 0x000b, 0x000a,
|
||||
0x000b, 0x0007, 0x000d, 0x0012, 0x001e, 0x001f, 0x0014, 0x0005,
|
||||
0x0019, 0x000b, 0x0013, 0x003b, 0x001b, 0x0012, 0x000c, 0x0005,
|
||||
0x0023, 0x0021, 0x001f, 0x003a, 0x001e, 0x0010, 0x0007, 0x0005,
|
||||
0x001c, 0x001a, 0x0020, 0x0013, 0x0011, 0x000f, 0x0008, 0x000e,
|
||||
0x000e, 0x000c, 0x0009, 0x000d, 0x000e, 0x0009, 0x0004, 0x0001,
|
||||
0x000b, 0x0004, 0x0006, 0x0006, 0x0006, 0x0003, 0x0002, 0x0000,
|
||||
};
|
||||
|
||||
static const uint8_t mpa_huffbits_11[64] = {
|
||||
2, 3, 5, 7, 8, 9, 8, 9,
|
||||
3, 3, 4, 6, 8, 8, 7, 8,
|
||||
5, 5, 6, 7, 8, 9, 8, 8,
|
||||
7, 6, 7, 9, 8, 10, 8, 9,
|
||||
8, 8, 8, 9, 9, 10, 9, 10,
|
||||
8, 8, 9, 10, 10, 11, 10, 11,
|
||||
8, 7, 7, 8, 9, 10, 10, 10,
|
||||
8, 7, 8, 9, 10, 10, 10, 10,
|
||||
};
|
||||
|
||||
static const uint16_t mpa_huffcodes_12[64] = {
|
||||
0x0009, 0x0006, 0x0010, 0x0021, 0x0029, 0x0027, 0x0026, 0x001a,
|
||||
0x0007, 0x0005, 0x0006, 0x0009, 0x0017, 0x0010, 0x001a, 0x000b,
|
||||
0x0011, 0x0007, 0x000b, 0x000e, 0x0015, 0x001e, 0x000a, 0x0007,
|
||||
0x0011, 0x000a, 0x000f, 0x000c, 0x0012, 0x001c, 0x000e, 0x0005,
|
||||
0x0020, 0x000d, 0x0016, 0x0013, 0x0012, 0x0010, 0x0009, 0x0005,
|
||||
0x0028, 0x0011, 0x001f, 0x001d, 0x0011, 0x000d, 0x0004, 0x0002,
|
||||
0x001b, 0x000c, 0x000b, 0x000f, 0x000a, 0x0007, 0x0004, 0x0001,
|
||||
0x001b, 0x000c, 0x0008, 0x000c, 0x0006, 0x0003, 0x0001, 0x0000,
|
||||
};
|
||||
|
||||
static const uint8_t mpa_huffbits_12[64] = {
|
||||
4, 3, 5, 7, 8, 9, 9, 9,
|
||||
3, 3, 4, 5, 7, 7, 8, 8,
|
||||
5, 4, 5, 6, 7, 8, 7, 8,
|
||||
6, 5, 6, 6, 7, 8, 8, 8,
|
||||
7, 6, 7, 7, 8, 8, 8, 9,
|
||||
8, 7, 8, 8, 8, 9, 8, 9,
|
||||
8, 7, 7, 8, 8, 9, 9, 10,
|
||||
9, 8, 8, 9, 9, 9, 9, 10,
|
||||
};
|
||||
|
||||
static const uint16_t mpa_huffcodes_13[256] = {
|
||||
0x0001, 0x0005, 0x000e, 0x0015, 0x0022, 0x0033, 0x002e, 0x0047,
|
||||
0x002a, 0x0034, 0x0044, 0x0034, 0x0043, 0x002c, 0x002b, 0x0013,
|
||||
0x0003, 0x0004, 0x000c, 0x0013, 0x001f, 0x001a, 0x002c, 0x0021,
|
||||
0x001f, 0x0018, 0x0020, 0x0018, 0x001f, 0x0023, 0x0016, 0x000e,
|
||||
0x000f, 0x000d, 0x0017, 0x0024, 0x003b, 0x0031, 0x004d, 0x0041,
|
||||
0x001d, 0x0028, 0x001e, 0x0028, 0x001b, 0x0021, 0x002a, 0x0010,
|
||||
0x0016, 0x0014, 0x0025, 0x003d, 0x0038, 0x004f, 0x0049, 0x0040,
|
||||
0x002b, 0x004c, 0x0038, 0x0025, 0x001a, 0x001f, 0x0019, 0x000e,
|
||||
0x0023, 0x0010, 0x003c, 0x0039, 0x0061, 0x004b, 0x0072, 0x005b,
|
||||
0x0036, 0x0049, 0x0037, 0x0029, 0x0030, 0x0035, 0x0017, 0x0018,
|
||||
0x003a, 0x001b, 0x0032, 0x0060, 0x004c, 0x0046, 0x005d, 0x0054,
|
||||
0x004d, 0x003a, 0x004f, 0x001d, 0x004a, 0x0031, 0x0029, 0x0011,
|
||||
0x002f, 0x002d, 0x004e, 0x004a, 0x0073, 0x005e, 0x005a, 0x004f,
|
||||
0x0045, 0x0053, 0x0047, 0x0032, 0x003b, 0x0026, 0x0024, 0x000f,
|
||||
0x0048, 0x0022, 0x0038, 0x005f, 0x005c, 0x0055, 0x005b, 0x005a,
|
||||
0x0056, 0x0049, 0x004d, 0x0041, 0x0033, 0x002c, 0x002b, 0x002a,
|
||||
0x002b, 0x0014, 0x001e, 0x002c, 0x0037, 0x004e, 0x0048, 0x0057,
|
||||
0x004e, 0x003d, 0x002e, 0x0036, 0x0025, 0x001e, 0x0014, 0x0010,
|
||||
0x0035, 0x0019, 0x0029, 0x0025, 0x002c, 0x003b, 0x0036, 0x0051,
|
||||
0x0042, 0x004c, 0x0039, 0x0036, 0x0025, 0x0012, 0x0027, 0x000b,
|
||||
0x0023, 0x0021, 0x001f, 0x0039, 0x002a, 0x0052, 0x0048, 0x0050,
|
||||
0x002f, 0x003a, 0x0037, 0x0015, 0x0016, 0x001a, 0x0026, 0x0016,
|
||||
0x0035, 0x0019, 0x0017, 0x0026, 0x0046, 0x003c, 0x0033, 0x0024,
|
||||
0x0037, 0x001a, 0x0022, 0x0017, 0x001b, 0x000e, 0x0009, 0x0007,
|
||||
0x0022, 0x0020, 0x001c, 0x0027, 0x0031, 0x004b, 0x001e, 0x0034,
|
||||
0x0030, 0x0028, 0x0034, 0x001c, 0x0012, 0x0011, 0x0009, 0x0005,
|
||||
0x002d, 0x0015, 0x0022, 0x0040, 0x0038, 0x0032, 0x0031, 0x002d,
|
||||
0x001f, 0x0013, 0x000c, 0x000f, 0x000a, 0x0007, 0x0006, 0x0003,
|
||||
0x0030, 0x0017, 0x0014, 0x0027, 0x0024, 0x0023, 0x0035, 0x0015,
|
||||
0x0010, 0x0017, 0x000d, 0x000a, 0x0006, 0x0001, 0x0004, 0x0002,
|
||||
0x0010, 0x000f, 0x0011, 0x001b, 0x0019, 0x0014, 0x001d, 0x000b,
|
||||
0x0011, 0x000c, 0x0010, 0x0008, 0x0001, 0x0001, 0x0000, 0x0001,
|
||||
};
|
||||
|
||||
static const uint8_t mpa_huffbits_13[256] = {
|
||||
1, 4, 6, 7, 8, 9, 9, 10,
|
||||
9, 10, 11, 11, 12, 12, 13, 13,
|
||||
3, 4, 6, 7, 8, 8, 9, 9,
|
||||
9, 9, 10, 10, 11, 12, 12, 12,
|
||||
6, 6, 7, 8, 9, 9, 10, 10,
|
||||
9, 10, 10, 11, 11, 12, 13, 13,
|
||||
7, 7, 8, 9, 9, 10, 10, 10,
|
||||
10, 11, 11, 11, 11, 12, 13, 13,
|
||||
8, 7, 9, 9, 10, 10, 11, 11,
|
||||
10, 11, 11, 12, 12, 13, 13, 14,
|
||||
9, 8, 9, 10, 10, 10, 11, 11,
|
||||
11, 11, 12, 11, 13, 13, 14, 14,
|
||||
9, 9, 10, 10, 11, 11, 11, 11,
|
||||
11, 12, 12, 12, 13, 13, 14, 14,
|
||||
10, 9, 10, 11, 11, 11, 12, 12,
|
||||
12, 12, 13, 13, 13, 14, 16, 16,
|
||||
9, 8, 9, 10, 10, 11, 11, 12,
|
||||
12, 12, 12, 13, 13, 14, 15, 15,
|
||||
10, 9, 10, 10, 11, 11, 11, 13,
|
||||
12, 13, 13, 14, 14, 14, 16, 15,
|
||||
10, 10, 10, 11, 11, 12, 12, 13,
|
||||
12, 13, 14, 13, 14, 15, 16, 17,
|
||||
11, 10, 10, 11, 12, 12, 12, 12,
|
||||
13, 13, 13, 14, 15, 15, 15, 16,
|
||||
11, 11, 11, 12, 12, 13, 12, 13,
|
||||
14, 14, 15, 15, 15, 16, 16, 16,
|
||||
12, 11, 12, 13, 13, 13, 14, 14,
|
||||
14, 14, 14, 15, 16, 15, 16, 16,
|
||||
13, 12, 12, 13, 13, 13, 15, 14,
|
||||
14, 17, 15, 15, 15, 17, 16, 16,
|
||||
12, 12, 13, 14, 14, 14, 15, 14,
|
||||
15, 15, 16, 16, 19, 18, 19, 16,
|
||||
};
|
||||
|
||||
static const uint16_t mpa_huffcodes_15[256] = {
|
||||
0x0007, 0x000c, 0x0012, 0x0035, 0x002f, 0x004c, 0x007c, 0x006c,
|
||||
0x0059, 0x007b, 0x006c, 0x0077, 0x006b, 0x0051, 0x007a, 0x003f,
|
||||
0x000d, 0x0005, 0x0010, 0x001b, 0x002e, 0x0024, 0x003d, 0x0033,
|
||||
0x002a, 0x0046, 0x0034, 0x0053, 0x0041, 0x0029, 0x003b, 0x0024,
|
||||
0x0013, 0x0011, 0x000f, 0x0018, 0x0029, 0x0022, 0x003b, 0x0030,
|
||||
0x0028, 0x0040, 0x0032, 0x004e, 0x003e, 0x0050, 0x0038, 0x0021,
|
||||
0x001d, 0x001c, 0x0019, 0x002b, 0x0027, 0x003f, 0x0037, 0x005d,
|
||||
0x004c, 0x003b, 0x005d, 0x0048, 0x0036, 0x004b, 0x0032, 0x001d,
|
||||
0x0034, 0x0016, 0x002a, 0x0028, 0x0043, 0x0039, 0x005f, 0x004f,
|
||||
0x0048, 0x0039, 0x0059, 0x0045, 0x0031, 0x0042, 0x002e, 0x001b,
|
||||
0x004d, 0x0025, 0x0023, 0x0042, 0x003a, 0x0034, 0x005b, 0x004a,
|
||||
0x003e, 0x0030, 0x004f, 0x003f, 0x005a, 0x003e, 0x0028, 0x0026,
|
||||
0x007d, 0x0020, 0x003c, 0x0038, 0x0032, 0x005c, 0x004e, 0x0041,
|
||||
0x0037, 0x0057, 0x0047, 0x0033, 0x0049, 0x0033, 0x0046, 0x001e,
|
||||
0x006d, 0x0035, 0x0031, 0x005e, 0x0058, 0x004b, 0x0042, 0x007a,
|
||||
0x005b, 0x0049, 0x0038, 0x002a, 0x0040, 0x002c, 0x0015, 0x0019,
|
||||
0x005a, 0x002b, 0x0029, 0x004d, 0x0049, 0x003f, 0x0038, 0x005c,
|
||||
0x004d, 0x0042, 0x002f, 0x0043, 0x0030, 0x0035, 0x0024, 0x0014,
|
||||
0x0047, 0x0022, 0x0043, 0x003c, 0x003a, 0x0031, 0x0058, 0x004c,
|
||||
0x0043, 0x006a, 0x0047, 0x0036, 0x0026, 0x0027, 0x0017, 0x000f,
|
||||
0x006d, 0x0035, 0x0033, 0x002f, 0x005a, 0x0052, 0x003a, 0x0039,
|
||||
0x0030, 0x0048, 0x0039, 0x0029, 0x0017, 0x001b, 0x003e, 0x0009,
|
||||
0x0056, 0x002a, 0x0028, 0x0025, 0x0046, 0x0040, 0x0034, 0x002b,
|
||||
0x0046, 0x0037, 0x002a, 0x0019, 0x001d, 0x0012, 0x000b, 0x000b,
|
||||
0x0076, 0x0044, 0x001e, 0x0037, 0x0032, 0x002e, 0x004a, 0x0041,
|
||||
0x0031, 0x0027, 0x0018, 0x0010, 0x0016, 0x000d, 0x000e, 0x0007,
|
||||
0x005b, 0x002c, 0x0027, 0x0026, 0x0022, 0x003f, 0x0034, 0x002d,
|
||||
0x001f, 0x0034, 0x001c, 0x0013, 0x000e, 0x0008, 0x0009, 0x0003,
|
||||
0x007b, 0x003c, 0x003a, 0x0035, 0x002f, 0x002b, 0x0020, 0x0016,
|
||||
0x0025, 0x0018, 0x0011, 0x000c, 0x000f, 0x000a, 0x0002, 0x0001,
|
||||
0x0047, 0x0025, 0x0022, 0x001e, 0x001c, 0x0014, 0x0011, 0x001a,
|
||||
0x0015, 0x0010, 0x000a, 0x0006, 0x0008, 0x0006, 0x0002, 0x0000,
|
||||
};
|
||||
|
||||
static const uint8_t mpa_huffbits_15[256] = {
|
||||
3, 4, 5, 7, 7, 8, 9, 9,
|
||||
9, 10, 10, 11, 11, 11, 12, 13,
|
||||
4, 3, 5, 6, 7, 7, 8, 8,
|
||||
8, 9, 9, 10, 10, 10, 11, 11,
|
||||
5, 5, 5, 6, 7, 7, 8, 8,
|
||||
8, 9, 9, 10, 10, 11, 11, 11,
|
||||
6, 6, 6, 7, 7, 8, 8, 9,
|
||||
9, 9, 10, 10, 10, 11, 11, 11,
|
||||
7, 6, 7, 7, 8, 8, 9, 9,
|
||||
9, 9, 10, 10, 10, 11, 11, 11,
|
||||
8, 7, 7, 8, 8, 8, 9, 9,
|
||||
9, 9, 10, 10, 11, 11, 11, 12,
|
||||
9, 7, 8, 8, 8, 9, 9, 9,
|
||||
9, 10, 10, 10, 11, 11, 12, 12,
|
||||
9, 8, 8, 9, 9, 9, 9, 10,
|
||||
10, 10, 10, 10, 11, 11, 11, 12,
|
||||
9, 8, 8, 9, 9, 9, 9, 10,
|
||||
10, 10, 10, 11, 11, 12, 12, 12,
|
||||
9, 8, 9, 9, 9, 9, 10, 10,
|
||||
10, 11, 11, 11, 11, 12, 12, 12,
|
||||
10, 9, 9, 9, 10, 10, 10, 10,
|
||||
10, 11, 11, 11, 11, 12, 13, 12,
|
||||
10, 9, 9, 9, 10, 10, 10, 10,
|
||||
11, 11, 11, 11, 12, 12, 12, 13,
|
||||
11, 10, 9, 10, 10, 10, 11, 11,
|
||||
11, 11, 11, 11, 12, 12, 13, 13,
|
||||
11, 10, 10, 10, 10, 11, 11, 11,
|
||||
11, 12, 12, 12, 12, 12, 13, 13,
|
||||
12, 11, 11, 11, 11, 11, 11, 11,
|
||||
12, 12, 12, 12, 13, 13, 12, 13,
|
||||
12, 11, 11, 11, 11, 11, 11, 12,
|
||||
12, 12, 12, 12, 13, 13, 13, 13,
|
||||
};
|
||||
|
||||
static const uint16_t mpa_huffcodes_16[256] = {
|
||||
0x0001, 0x0005, 0x000e, 0x002c, 0x004a, 0x003f, 0x006e, 0x005d,
|
||||
0x00ac, 0x0095, 0x008a, 0x00f2, 0x00e1, 0x00c3, 0x0178, 0x0011,
|
||||
0x0003, 0x0004, 0x000c, 0x0014, 0x0023, 0x003e, 0x0035, 0x002f,
|
||||
0x0053, 0x004b, 0x0044, 0x0077, 0x00c9, 0x006b, 0x00cf, 0x0009,
|
||||
0x000f, 0x000d, 0x0017, 0x0026, 0x0043, 0x003a, 0x0067, 0x005a,
|
||||
0x00a1, 0x0048, 0x007f, 0x0075, 0x006e, 0x00d1, 0x00ce, 0x0010,
|
||||
0x002d, 0x0015, 0x0027, 0x0045, 0x0040, 0x0072, 0x0063, 0x0057,
|
||||
0x009e, 0x008c, 0x00fc, 0x00d4, 0x00c7, 0x0183, 0x016d, 0x001a,
|
||||
0x004b, 0x0024, 0x0044, 0x0041, 0x0073, 0x0065, 0x00b3, 0x00a4,
|
||||
0x009b, 0x0108, 0x00f6, 0x00e2, 0x018b, 0x017e, 0x016a, 0x0009,
|
||||
0x0042, 0x001e, 0x003b, 0x0038, 0x0066, 0x00b9, 0x00ad, 0x0109,
|
||||
0x008e, 0x00fd, 0x00e8, 0x0190, 0x0184, 0x017a, 0x01bd, 0x0010,
|
||||
0x006f, 0x0036, 0x0034, 0x0064, 0x00b8, 0x00b2, 0x00a0, 0x0085,
|
||||
0x0101, 0x00f4, 0x00e4, 0x00d9, 0x0181, 0x016e, 0x02cb, 0x000a,
|
||||
0x0062, 0x0030, 0x005b, 0x0058, 0x00a5, 0x009d, 0x0094, 0x0105,
|
||||
0x00f8, 0x0197, 0x018d, 0x0174, 0x017c, 0x0379, 0x0374, 0x0008,
|
||||
0x0055, 0x0054, 0x0051, 0x009f, 0x009c, 0x008f, 0x0104, 0x00f9,
|
||||
0x01ab, 0x0191, 0x0188, 0x017f, 0x02d7, 0x02c9, 0x02c4, 0x0007,
|
||||
0x009a, 0x004c, 0x0049, 0x008d, 0x0083, 0x0100, 0x00f5, 0x01aa,
|
||||
0x0196, 0x018a, 0x0180, 0x02df, 0x0167, 0x02c6, 0x0160, 0x000b,
|
||||
0x008b, 0x0081, 0x0043, 0x007d, 0x00f7, 0x00e9, 0x00e5, 0x00db,
|
||||
0x0189, 0x02e7, 0x02e1, 0x02d0, 0x0375, 0x0372, 0x01b7, 0x0004,
|
||||
0x00f3, 0x0078, 0x0076, 0x0073, 0x00e3, 0x00df, 0x018c, 0x02ea,
|
||||
0x02e6, 0x02e0, 0x02d1, 0x02c8, 0x02c2, 0x00df, 0x01b4, 0x0006,
|
||||
0x00ca, 0x00e0, 0x00de, 0x00da, 0x00d8, 0x0185, 0x0182, 0x017d,
|
||||
0x016c, 0x0378, 0x01bb, 0x02c3, 0x01b8, 0x01b5, 0x06c0, 0x0004,
|
||||
0x02eb, 0x00d3, 0x00d2, 0x00d0, 0x0172, 0x017b, 0x02de, 0x02d3,
|
||||
0x02ca, 0x06c7, 0x0373, 0x036d, 0x036c, 0x0d83, 0x0361, 0x0002,
|
||||
0x0179, 0x0171, 0x0066, 0x00bb, 0x02d6, 0x02d2, 0x0166, 0x02c7,
|
||||
0x02c5, 0x0362, 0x06c6, 0x0367, 0x0d82, 0x0366, 0x01b2, 0x0000,
|
||||
0x000c, 0x000a, 0x0007, 0x000b, 0x000a, 0x0011, 0x000b, 0x0009,
|
||||
0x000d, 0x000c, 0x000a, 0x0007, 0x0005, 0x0003, 0x0001, 0x0003,
|
||||
};
|
||||
|
||||
static const uint8_t mpa_huffbits_16[256] = {
|
||||
1, 4, 6, 8, 9, 9, 10, 10,
|
||||
11, 11, 11, 12, 12, 12, 13, 9,
|
||||
3, 4, 6, 7, 8, 9, 9, 9,
|
||||
10, 10, 10, 11, 12, 11, 12, 8,
|
||||
6, 6, 7, 8, 9, 9, 10, 10,
|
||||
11, 10, 11, 11, 11, 12, 12, 9,
|
||||
8, 7, 8, 9, 9, 10, 10, 10,
|
||||
11, 11, 12, 12, 12, 13, 13, 10,
|
||||
9, 8, 9, 9, 10, 10, 11, 11,
|
||||
11, 12, 12, 12, 13, 13, 13, 9,
|
||||
9, 8, 9, 9, 10, 11, 11, 12,
|
||||
11, 12, 12, 13, 13, 13, 14, 10,
|
||||
10, 9, 9, 10, 11, 11, 11, 11,
|
||||
12, 12, 12, 12, 13, 13, 14, 10,
|
||||
10, 9, 10, 10, 11, 11, 11, 12,
|
||||
12, 13, 13, 13, 13, 15, 15, 10,
|
||||
10, 10, 10, 11, 11, 11, 12, 12,
|
||||
13, 13, 13, 13, 14, 14, 14, 10,
|
||||
11, 10, 10, 11, 11, 12, 12, 13,
|
||||
13, 13, 13, 14, 13, 14, 13, 11,
|
||||
11, 11, 10, 11, 12, 12, 12, 12,
|
||||
13, 14, 14, 14, 15, 15, 14, 10,
|
||||
12, 11, 11, 11, 12, 12, 13, 14,
|
||||
14, 14, 14, 14, 14, 13, 14, 11,
|
||||
12, 12, 12, 12, 12, 13, 13, 13,
|
||||
13, 15, 14, 14, 14, 14, 16, 11,
|
||||
14, 12, 12, 12, 13, 13, 14, 14,
|
||||
14, 16, 15, 15, 15, 17, 15, 11,
|
||||
13, 13, 11, 12, 14, 14, 13, 14,
|
||||
14, 15, 16, 15, 17, 15, 14, 11,
|
||||
9, 8, 8, 9, 9, 10, 10, 10,
|
||||
11, 11, 11, 11, 11, 11, 11, 8,
|
||||
};
|
||||
|
||||
static const uint16_t mpa_huffcodes_24[256] = {
|
||||
0x000f, 0x000d, 0x002e, 0x0050, 0x0092, 0x0106, 0x00f8, 0x01b2,
|
||||
0x01aa, 0x029d, 0x028d, 0x0289, 0x026d, 0x0205, 0x0408, 0x0058,
|
||||
0x000e, 0x000c, 0x0015, 0x0026, 0x0047, 0x0082, 0x007a, 0x00d8,
|
||||
0x00d1, 0x00c6, 0x0147, 0x0159, 0x013f, 0x0129, 0x0117, 0x002a,
|
||||
0x002f, 0x0016, 0x0029, 0x004a, 0x0044, 0x0080, 0x0078, 0x00dd,
|
||||
0x00cf, 0x00c2, 0x00b6, 0x0154, 0x013b, 0x0127, 0x021d, 0x0012,
|
||||
0x0051, 0x0027, 0x004b, 0x0046, 0x0086, 0x007d, 0x0074, 0x00dc,
|
||||
0x00cc, 0x00be, 0x00b2, 0x0145, 0x0137, 0x0125, 0x010f, 0x0010,
|
||||
0x0093, 0x0048, 0x0045, 0x0087, 0x007f, 0x0076, 0x0070, 0x00d2,
|
||||
0x00c8, 0x00bc, 0x0160, 0x0143, 0x0132, 0x011d, 0x021c, 0x000e,
|
||||
0x0107, 0x0042, 0x0081, 0x007e, 0x0077, 0x0072, 0x00d6, 0x00ca,
|
||||
0x00c0, 0x00b4, 0x0155, 0x013d, 0x012d, 0x0119, 0x0106, 0x000c,
|
||||
0x00f9, 0x007b, 0x0079, 0x0075, 0x0071, 0x00d7, 0x00ce, 0x00c3,
|
||||
0x00b9, 0x015b, 0x014a, 0x0134, 0x0123, 0x0110, 0x0208, 0x000a,
|
||||
0x01b3, 0x0073, 0x006f, 0x006d, 0x00d3, 0x00cb, 0x00c4, 0x00bb,
|
||||
0x0161, 0x014c, 0x0139, 0x012a, 0x011b, 0x0213, 0x017d, 0x0011,
|
||||
0x01ab, 0x00d4, 0x00d0, 0x00cd, 0x00c9, 0x00c1, 0x00ba, 0x00b1,
|
||||
0x00a9, 0x0140, 0x012f, 0x011e, 0x010c, 0x0202, 0x0179, 0x0010,
|
||||
0x014f, 0x00c7, 0x00c5, 0x00bf, 0x00bd, 0x00b5, 0x00ae, 0x014d,
|
||||
0x0141, 0x0131, 0x0121, 0x0113, 0x0209, 0x017b, 0x0173, 0x000b,
|
||||
0x029c, 0x00b8, 0x00b7, 0x00b3, 0x00af, 0x0158, 0x014b, 0x013a,
|
||||
0x0130, 0x0122, 0x0115, 0x0212, 0x017f, 0x0175, 0x016e, 0x000a,
|
||||
0x028c, 0x015a, 0x00ab, 0x00a8, 0x00a4, 0x013e, 0x0135, 0x012b,
|
||||
0x011f, 0x0114, 0x0107, 0x0201, 0x0177, 0x0170, 0x016a, 0x0006,
|
||||
0x0288, 0x0142, 0x013c, 0x0138, 0x0133, 0x012e, 0x0124, 0x011c,
|
||||
0x010d, 0x0105, 0x0200, 0x0178, 0x0172, 0x016c, 0x0167, 0x0004,
|
||||
0x026c, 0x012c, 0x0128, 0x0126, 0x0120, 0x011a, 0x0111, 0x010a,
|
||||
0x0203, 0x017c, 0x0176, 0x0171, 0x016d, 0x0169, 0x0165, 0x0002,
|
||||
0x0409, 0x0118, 0x0116, 0x0112, 0x010b, 0x0108, 0x0103, 0x017e,
|
||||
0x017a, 0x0174, 0x016f, 0x016b, 0x0168, 0x0166, 0x0164, 0x0000,
|
||||
0x002b, 0x0014, 0x0013, 0x0011, 0x000f, 0x000d, 0x000b, 0x0009,
|
||||
0x0007, 0x0006, 0x0004, 0x0007, 0x0005, 0x0003, 0x0001, 0x0003,
|
||||
};
|
||||
|
||||
static const uint8_t mpa_huffbits_24[256] = {
|
||||
4, 4, 6, 7, 8, 9, 9, 10,
|
||||
10, 11, 11, 11, 11, 11, 12, 9,
|
||||
4, 4, 5, 6, 7, 8, 8, 9,
|
||||
9, 9, 10, 10, 10, 10, 10, 8,
|
||||
6, 5, 6, 7, 7, 8, 8, 9,
|
||||
9, 9, 9, 10, 10, 10, 11, 7,
|
||||
7, 6, 7, 7, 8, 8, 8, 9,
|
||||
9, 9, 9, 10, 10, 10, 10, 7,
|
||||
8, 7, 7, 8, 8, 8, 8, 9,
|
||||
9, 9, 10, 10, 10, 10, 11, 7,
|
||||
9, 7, 8, 8, 8, 8, 9, 9,
|
||||
9, 9, 10, 10, 10, 10, 10, 7,
|
||||
9, 8, 8, 8, 8, 9, 9, 9,
|
||||
9, 10, 10, 10, 10, 10, 11, 7,
|
||||
10, 8, 8, 8, 9, 9, 9, 9,
|
||||
10, 10, 10, 10, 10, 11, 11, 8,
|
||||
10, 9, 9, 9, 9, 9, 9, 9,
|
||||
9, 10, 10, 10, 10, 11, 11, 8,
|
||||
10, 9, 9, 9, 9, 9, 9, 10,
|
||||
10, 10, 10, 10, 11, 11, 11, 8,
|
||||
11, 9, 9, 9, 9, 10, 10, 10,
|
||||
10, 10, 10, 11, 11, 11, 11, 8,
|
||||
11, 10, 9, 9, 9, 10, 10, 10,
|
||||
10, 10, 10, 11, 11, 11, 11, 8,
|
||||
11, 10, 10, 10, 10, 10, 10, 10,
|
||||
10, 10, 11, 11, 11, 11, 11, 8,
|
||||
11, 10, 10, 10, 10, 10, 10, 10,
|
||||
11, 11, 11, 11, 11, 11, 11, 8,
|
||||
12, 10, 10, 10, 10, 10, 10, 11,
|
||||
11, 11, 11, 11, 11, 11, 11, 8,
|
||||
8, 7, 7, 7, 7, 7, 7, 7,
|
||||
7, 7, 7, 8, 8, 8, 8, 4,
|
||||
};
|
||||
|
||||
static const HuffTable mpa_huff_tables[16] = {
|
||||
{ 1, NULL, NULL },
|
||||
{ 2, mpa_huffbits_1, mpa_huffcodes_1 },
|
||||
{ 3, mpa_huffbits_2, mpa_huffcodes_2 },
|
||||
{ 3, mpa_huffbits_3, mpa_huffcodes_3 },
|
||||
{ 4, mpa_huffbits_5, mpa_huffcodes_5 },
|
||||
{ 4, mpa_huffbits_6, mpa_huffcodes_6 },
|
||||
{ 6, mpa_huffbits_7, mpa_huffcodes_7 },
|
||||
{ 6, mpa_huffbits_8, mpa_huffcodes_8 },
|
||||
{ 6, mpa_huffbits_9, mpa_huffcodes_9 },
|
||||
{ 8, mpa_huffbits_10, mpa_huffcodes_10 },
|
||||
{ 8, mpa_huffbits_11, mpa_huffcodes_11 },
|
||||
{ 8, mpa_huffbits_12, mpa_huffcodes_12 },
|
||||
{ 16, mpa_huffbits_13, mpa_huffcodes_13 },
|
||||
{ 16, mpa_huffbits_15, mpa_huffcodes_15 },
|
||||
{ 16, mpa_huffbits_16, mpa_huffcodes_16 },
|
||||
{ 16, mpa_huffbits_24, mpa_huffcodes_24 },
|
||||
};
|
||||
|
||||
static const uint8_t mpa_huff_data[32][2] = {
|
||||
{ 0, 0 },
|
||||
{ 1, 0 },
|
||||
{ 2, 0 },
|
||||
{ 3, 0 },
|
||||
{ 0, 0 },
|
||||
{ 4, 0 },
|
||||
{ 5, 0 },
|
||||
{ 6, 0 },
|
||||
{ 7, 0 },
|
||||
{ 8, 0 },
|
||||
{ 9, 0 },
|
||||
{ 10, 0 },
|
||||
{ 11, 0 },
|
||||
{ 12, 0 },
|
||||
{ 0, 0 },
|
||||
{ 13, 0 },
|
||||
{ 14, 1 },
|
||||
{ 14, 2 },
|
||||
{ 14, 3 },
|
||||
{ 14, 4 },
|
||||
{ 14, 6 },
|
||||
{ 14, 8 },
|
||||
{ 14, 10 },
|
||||
{ 14, 13 },
|
||||
{ 15, 4 },
|
||||
{ 15, 5 },
|
||||
{ 15, 6 },
|
||||
{ 15, 7 },
|
||||
{ 15, 8 },
|
||||
{ 15, 9 },
|
||||
{ 15, 11 },
|
||||
{ 15, 13 },
|
||||
};
|
||||
|
||||
|
||||
/* huffman tables for quadrules */
|
||||
static uint8_t mpa_quad_codes[2][16] = {
|
||||
{ 1, 5, 4, 5, 6, 5, 4, 4, 7, 3, 6, 0, 7, 2, 3, 1, },
|
||||
{ 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, },
|
||||
};
|
||||
|
||||
static uint8_t mpa_quad_bits[2][16] = {
|
||||
{ 1, 4, 4, 5, 4, 6, 5, 6, 4, 5, 5, 6, 5, 6, 6, 6, },
|
||||
{ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, },
|
||||
};
|
||||
|
||||
/* band size tables */
|
||||
static const uint8_t band_size_long[9][22] = {
|
||||
{ 4, 4, 4, 4, 4, 4, 6, 6, 8, 8, 10,
|
||||
12, 16, 20, 24, 28, 34, 42, 50, 54, 76, 158, }, /* 44100 */
|
||||
{ 4, 4, 4, 4, 4, 4, 6, 6, 6, 8, 10,
|
||||
12, 16, 18, 22, 28, 34, 40, 46, 54, 54, 192, }, /* 48000 */
|
||||
{ 4, 4, 4, 4, 4, 4, 6, 6, 8, 10, 12,
|
||||
16, 20, 24, 30, 38, 46, 56, 68, 84, 102, 26, }, /* 32000 */
|
||||
{ 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16,
|
||||
20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54, }, /* 22050 */
|
||||
{ 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16,
|
||||
18, 22, 26, 32, 38, 46, 52, 64, 70, 76, 36, }, /* 24000 */
|
||||
{ 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16,
|
||||
20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54, }, /* 16000 */
|
||||
{ 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16,
|
||||
20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54, }, /* 11025 */
|
||||
{ 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16,
|
||||
20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54, }, /* 12000 */
|
||||
{ 12, 12, 12, 12, 12, 12, 16, 20, 24, 28, 32,
|
||||
40, 48, 56, 64, 76, 90, 2, 2, 2, 2, 2, }, /* 8000 */
|
||||
};
|
||||
|
||||
static const uint8_t band_size_short[9][13] = {
|
||||
{ 4, 4, 4, 4, 6, 8, 10, 12, 14, 18, 22, 30, 56, }, /* 44100 */
|
||||
{ 4, 4, 4, 4, 6, 6, 10, 12, 14, 16, 20, 26, 66, }, /* 48000 */
|
||||
{ 4, 4, 4, 4, 6, 8, 12, 16, 20, 26, 34, 42, 12, }, /* 32000 */
|
||||
{ 4, 4, 4, 6, 6, 8, 10, 14, 18, 26, 32, 42, 18, }, /* 22050 */
|
||||
{ 4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 32, 44, 12, }, /* 24000 */
|
||||
{ 4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 30, 40, 18, }, /* 16000 */
|
||||
{ 4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 30, 40, 18, }, /* 11025 */
|
||||
{ 4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 30, 40, 18, }, /* 12000 */
|
||||
{ 8, 8, 8, 12, 16, 20, 24, 28, 36, 2, 2, 2, 26, }, /* 8000 */
|
||||
};
|
||||
|
||||
static const uint8_t mpa_pretab[2][22] = {
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0 },
|
||||
};
|
||||
|
||||
/* table for alias reduction (XXX: store it as integer !) */
|
||||
static const float ci_table[8] = {
|
||||
-0.6f, -0.535f, -0.33f, -0.185f, -0.095f, -0.041f, -0.0142f, -0.0037f,
|
||||
};
|
||||
@@ -1,17 +0,0 @@
|
||||
/* Modified slightly by Matt Campbell <mattcampbell@pobox.com> for the
|
||||
stand-alone mpaudec library. Based on mpegaudio.h from libavcodec. */
|
||||
|
||||
/* max frame size, in samples */
|
||||
#define MPA_FRAME_SIZE 1152
|
||||
|
||||
/* max compressed frame size */
|
||||
#define MPA_MAX_CODED_FRAME_SIZE 1792
|
||||
|
||||
#define MPA_MAX_CHANNELS 2
|
||||
|
||||
#define SBLIMIT 32 /* number of subbands */
|
||||
|
||||
#define MPA_STEREO 0
|
||||
#define MPA_JSTEREO 1
|
||||
#define MPA_DUAL 2
|
||||
#define MPA_MONO 3
|
||||
@@ -1,41 +0,0 @@
|
||||
|
||||
#include <irrKlang.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "CIrrKlangAudioStreamLoaderMP3.h"
|
||||
|
||||
using namespace irrklang;
|
||||
|
||||
// this is the only function needed to be implemented for the plugin, it gets
|
||||
// called by irrKlang when loaded.
|
||||
// In this plugin, we create an audiostream loader class and register
|
||||
// it at the engine, but a plugin can do anything.
|
||||
// Be sure to name the function 'irrKlangPluginInit' and let the dll start with 'ikp'.
|
||||
|
||||
#ifdef WIN32
|
||||
// Windows version
|
||||
__declspec(dllexport) void __stdcall irrKlangPluginInit(ISoundEngine* engine, const char* version)
|
||||
#else
|
||||
// Linux version
|
||||
void irrKlangPluginInit(ISoundEngine* engine, const char* version)
|
||||
#endif
|
||||
{
|
||||
// do some version security check to be sure that this plugin isn't begin used
|
||||
// by some newer irrKlang version with changed interfaces which could possibily
|
||||
// cause crashes.
|
||||
|
||||
if (strcmp(version, IRR_KLANG_VERSION))
|
||||
{
|
||||
printf("This MP3 plugin only supports irrKlang version %s, mp3 playback disabled.\n", IRR_KLANG_VERSION);
|
||||
return;
|
||||
}
|
||||
|
||||
// create and register the loader
|
||||
|
||||
CIrrKlangAudioStreamLoaderMP3* loader = new CIrrKlangAudioStreamLoaderMP3();
|
||||
engine->registerAudioStreamLoader(loader);
|
||||
loader->drop();
|
||||
|
||||
// that's it, that's all.
|
||||
}
|
||||
|
||||
@@ -1,458 +0,0 @@
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 2.1, February 1999
|
||||
|
||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 Lesser GPL. It also counts
|
||||
as the successor of the GNU Library Public License, version 2, hence
|
||||
the version number 2.1.]
|
||||
|
||||
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 Lesser General Public License, applies to some
|
||||
specially designated software packages--typically libraries--of the
|
||||
Free Software Foundation and other authors who decide to use it. You
|
||||
can use it too, but we suggest you first think carefully about whether
|
||||
this license or the ordinary General Public License is the better
|
||||
strategy to use in any particular case, based on the explanations below.
|
||||
|
||||
When we speak of free software, we are referring to freedom of use,
|
||||
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 and use pieces of
|
||||
it in new free programs; and that you are informed that you can do
|
||||
these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
distributors to deny you these rights or to ask you to surrender these
|
||||
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 other code 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.
|
||||
|
||||
We protect your rights with a two-step method: (1) we copyright the
|
||||
library, and (2) we offer you this license, which gives you legal
|
||||
permission to copy, distribute and/or modify the library.
|
||||
|
||||
To protect each distributor, we want to make it very clear that
|
||||
there is no warranty for the free library. Also, if the library is
|
||||
modified by someone else and passed on, the recipients should know
|
||||
that what they have is not the original version, so that the original
|
||||
author's reputation will not be affected by problems that might be
|
||||
introduced by others.
|
||||
|
||||
Finally, software patents pose a constant threat to the existence of
|
||||
any free program. We wish to make sure that a company cannot
|
||||
effectively restrict the users of a free program by obtaining a
|
||||
restrictive license from a patent holder. Therefore, we insist that
|
||||
any patent license obtained for a version of the library must be
|
||||
consistent with the full freedom of use specified in this license.
|
||||
|
||||
Most GNU software, including some libraries, is covered by the
|
||||
ordinary GNU General Public License. This license, the GNU Lesser
|
||||
General Public License, applies to certain designated libraries, and
|
||||
is quite different from the ordinary General Public License. We use
|
||||
this license for certain libraries in order to permit linking those
|
||||
libraries into non-free programs.
|
||||
|
||||
When a program is linked with a library, whether statically or using
|
||||
a shared library, the combination of the two is legally speaking a
|
||||
combined work, a derivative of the original library. The ordinary
|
||||
General Public License therefore permits such linking only if the
|
||||
entire combination fits its criteria of freedom. The Lesser General
|
||||
Public License permits more lax criteria for linking other code with
|
||||
the library.
|
||||
|
||||
We call this license the "Lesser" General Public License because it
|
||||
does Less to protect the user's freedom than the ordinary General
|
||||
Public License. It also provides other free software developers Less
|
||||
of an advantage over competing non-free programs. These disadvantages
|
||||
are the reason we use the ordinary General Public License for many
|
||||
libraries. However, the Lesser license provides advantages in certain
|
||||
special circumstances.
|
||||
|
||||
For example, on rare occasions, there may be a special need to
|
||||
encourage the widest possible use of a certain library, so that it becomes
|
||||
a de-facto standard. To achieve this, non-free programs must be
|
||||
allowed to use the library. A more frequent case is that a free
|
||||
library does the same job as widely used non-free libraries. In this
|
||||
case, there is little to gain by limiting the free library to free
|
||||
software only, so we use the Lesser General Public License.
|
||||
|
||||
In other cases, permission to use a particular library in non-free
|
||||
programs enables a greater number of people to use a large body of
|
||||
free software. For example, permission to use the GNU C Library in
|
||||
non-free programs enables many more people to use the whole GNU
|
||||
operating system, as well as its variant, the GNU/Linux operating
|
||||
system.
|
||||
|
||||
Although the Lesser General Public License is Less protective of the
|
||||
users' freedom, it does ensure that the user of a program that is
|
||||
linked with the Library has the freedom and the wherewithal to run
|
||||
that program using a modified version of the Library.
|
||||
|
||||
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, whereas the latter must
|
||||
be combined with the library in order to run.
|
||||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library or other
|
||||
program which contains a notice placed by the copyright holder or
|
||||
other authorized party saying it may be distributed under the terms of
|
||||
this Lesser 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 combine 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) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (1) uses at run time a
|
||||
copy of the library already present on the user's computer system,
|
||||
rather than copying library functions into the executable, and (2)
|
||||
will operate properly with a modified version of the library, if
|
||||
the user installs one, as long as the modified version is
|
||||
interface-compatible with the version that the work was made with.
|
||||
|
||||
c) 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.
|
||||
|
||||
d) 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.
|
||||
|
||||
e) 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 materials to be 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 with
|
||||
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 Lesser 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
|
||||
@@ -1,7 +0,0 @@
|
||||
ikpMP3 is a plugin for irrKlang.
|
||||
Copyright (C) 2002-2007 Nikolaus Gebhardt
|
||||
Part of the code for this plugin for irrKlang is based on:
|
||||
MP3 input for Audiere by Matt Campbell <mattcampbell@pobox.com>, based on
|
||||
libavcodec from ffmpeg (http://ffmpeg.sourceforge.net/).
|
||||
See license.txt for license details of this plugin.
|
||||
|
||||
Reference in New Issue
Block a user