Hallo,
ich such mir schon seit tagen einen wolf im www und komm nicht weiter!
vieleicht kann mir ja hier jemand helfen... (bitte, bitte)
Also:
die idee ist eine MP3-datei frameweise zu lesen
(http://mpgedit.org/mpgedit/mpeg_format/mpeghdr.htm)
was soweit schon klappt.
die einzelnen (mp3)frames sollen vom betriebsystem in PCM gewandelt werden.
(also on the fly -ohne wav file auf der platte! -direkt in einen buffer.)
an dieser stelle kann eine beliebiger (dsp)filter auf die daten losgelassen
werden bevor das ergebnis als wav abgespielt wird.
meine bisherigen recherchen führten zum AudioCompressionManager
(http://msdn.microsoft.com/en-us/library/ms705349(VS.85).aspx)
der die codecs auf dem pc verwaltet. hier sollte es möglich sein
(mp3)daten in den MPEG (lame, etc) codec zu pumpen und als pcm buffer
wieder ab zu holen.? (oder bin ich aufm holzweg)
die codecs bekomme ich auch schon ausgelesen 🙂
//...
public delegate bool DriverEnumCallbackDelegate(IntPtr handle, int inst, int flags);
[DllImport("Msacm32.dll", EntryPoint = "acmDriverEnum", ExactSpelling=false)]
public extern static int DriverEnum
(
[MarshalAs(UnmanagedType.FunctionPtr)]
DriverEnumCallbackDelegate d,
int instanceValue,
int flags
);
[DllImport("Msacm32.dll", EntryPoint = "acmDriverDetails", ExactSpelling = false)]
public extern static int DriverDetails
(
IntPtr handle,
[In, Out]
DriverDetail padd,
int reserved
);
//...
private bool DriverEnumCallback(IntPtr handle, int instance, int flags)
{
DriverDetail d = new _Acm.DriverDetail();
DriverDetails(handle, d, 0);
//_Drivers.Add(new AcmDriver(handle, d));
return true;
}
//...
#region structs
[StructLayout(LayoutKind.Sequential)]
public sealed class DriverDetail
{
public int Size;
public int fccType;
public int fccComp;
public short wMid;
public short wPid;
public int vdwACM;
public int vdwDriver;
public SupportFlags fdwSupport;
public int cFormatTags;
public int cFilterTags;
public IntPtr hIcon;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=32)]
public string szShortName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string szLongName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
public string szCopyright;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string szLicensing;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 512)]
public string szFeatures;
[Flags]
public enum SupportFlags : int
{
Codec = 0x00000001,
Converter = 0x00000002,
Filter = 0x00000004,
Hardware = 0x00000008,
Async = 0x00000010,
Local = 0x40000000,
Disabled = unchecked((int)0x80000000)
}
public DriverDetail()
{
Size = Marshal.SizeOf(this);
}
public override string ToString()
{
StringBuilder sb = new StringBuilder();
sb.AppendFormat("{0}\n", szShortName);
sb.AppendFormat("{0}\n", szLongName);
sb.AppendFormat("{0}\n", szCopyright);
sb.AppendFormat("{0}\n", szLicensing);
sb.AppendFormat("{0}\n", szFeatures);
return sb.ToString();
}
}
#endregion
//...
alle weiteren versuche (z.B. acmFormatEnum) liefern nix vernünftiges mehr...??
gibts jemanden der schon erfahrungen mit multimedia api hat und mir hier weiter helfen könnte?
evtl. auch eine zusammenarbeit am projekt?
es grüßt,
ein verzweifelter
TS
Hi tomschrot
Um was geht es dir bei der Umwandlung genau? Willst du das MP3 File rein mit dem DSP Effekt versehen oder hast du noch mehr vor? Evtl. hab ich da was für dich...
Gruß MB
hallo muntablues,
im prinzip gehts um ein mini framework zum arbeiten mit mp3 (evtl. auch anderen formaten)
also input->decode->dsp->output etc...
eins hab ich bei meiner recherche gelernt: bei solchen techniken siehts mit .net ziemlich mau aus!
grüße,
ts
Hi tomschrot
In dem Falls gibt es drei Möglichkeiten:
Auf Google gibts genug Infos zu BASS und es bietet eigentlich alles was du brauchst. Sprich Mp3 (aber auch so gut wie allen andern Formate) Encoden, DSP drauf setzten, Output auf Soundkarte inkl ASIO.
Am Anfang sicher nicht einfach zu durchschauen, aber nach einer Eingewöhnung sehr sehr umfangreich. Großer Vorteil den ich für dich sehe ist, dass du freie und natürlich auch gekaufte VST Plugins einbinden kannst.
So denn
Gruß MB
hallo muntablues,
ja klar, bei bass bin ich auch schon gelandet. (benutze seit jahren den wmplay -ist mein liebster)
allerdings gibts auch gründe die dagegen sprechen:
warum eine dll + wrapper benutzen von der ich nur 5% brauche
und bass ist ja eigentlich lizenspflichtig wenn ich ein komerzielles produkt bzw. eine shareware bauen möchte (möcht ich ja eigentlich nicht, aber wer weiss....)
dann wäre ja noch der ehrgeiz es selber zu machen... (ist ja auch interessant)
aber im prinzip hast ja recht!
grüße,
ts
Hi TS
Bei einer Freeware kostet das Ding aber nix. Also wenn du eine komerzielle Freeware baust sollte es kein Problem sein. Außer du willst Geld damit verdienen, dann sind aber die Shareware Lizensen auch nicht sehr teuer.
Ich hab eine Freeware mit alles Bass dll´s und die Bass Entwickler meinten es sei kein Problem...
Gruß MB
hallo muntablues,
bass ist schon seeeeeeeeehr komfortabel.
fuchst mich aber trotzdem es selber zu basteln... 😉
-ts