TAG_ID3(来自 Bass 2.4.4)无法正常工作
TAG_ID3 (from Bass 2.4.4) doesn't work properly
我正在尝试使用 "BASS.dll"(通过 bass.lib 和 bass.h)从 mp3 文件中读取 ID3v1 标签。
在 .mp3 文件的标题(或艺术家)有 30 个字符之前它工作正常。
相反
Happy Times (Feat. Margaux Bos
我得到 Happy Times (Feat. Margaux BosEmigrate
添加了 Emigrate
(这是艺术家标签)。
如何在不添加艺术家标签的情况下使其正常工作?
这是我的源代码:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
#include "bass.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
BASS_Init(-1, 44000, 0, 0, 0);
if(OpenDialog1->Execute())
{
HSTREAM stream = BASS_StreamCreateFile(false, OpenDialog1->FileName.c_str(), 0, 0, 0);
TAG_ID3 *tags = (TAG_ID3*)BASS_ChannelGetTags(stream, BASS_TAG_ID3);
Edit1->Text = tags->title;
}
}
不保证 TAG_ID3
结构的文本字段以空终止符结尾,但您的代码将它们视为它们,因此当空终止符不是空终止符时,它最终会读入下一个字段当前的。要解决这个问题,您必须考虑它们的最大长度,例如:
Edit1->Text = AnsiString().sprintf("%.*s", sizeof(tags->title), tags->title);
或者:
Edit1->Text = AnsiString(tags->title, sizeof(tags->title)).TrimRight();
与所有其他文本字段相同:
id
: 3 个字符
title
: 30 个字符
artist
: 30 个字符
album
: 30 个字符
year
: 4 个字符
comment
: 30 个字符
您可以使用一个简单的模板包装器来帮助您:
template<size_t N>
String toString(char (&arr)[N])
{
return AnsiString().sprintf("%.*s", N, arr);
/* or:
return AnsiString(arr, N).TrimRight();
*/
}
Edit1->Text = toString(tags->title);
请注意,comment
字段还有一个额外注意事项:
If the 30th character is non-null whilst the 29th character is null, then the 30th character is the track number and the comment is limited to the first 28 characters.
我正在尝试使用 "BASS.dll"(通过 bass.lib 和 bass.h)从 mp3 文件中读取 ID3v1 标签。
在 .mp3 文件的标题(或艺术家)有 30 个字符之前它工作正常。
相反
Happy Times (Feat. Margaux Bos
我得到 Happy Times (Feat. Margaux BosEmigrate
添加了 Emigrate
(这是艺术家标签)。
如何在不添加艺术家标签的情况下使其正常工作?
这是我的源代码:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
#include "bass.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
BASS_Init(-1, 44000, 0, 0, 0);
if(OpenDialog1->Execute())
{
HSTREAM stream = BASS_StreamCreateFile(false, OpenDialog1->FileName.c_str(), 0, 0, 0);
TAG_ID3 *tags = (TAG_ID3*)BASS_ChannelGetTags(stream, BASS_TAG_ID3);
Edit1->Text = tags->title;
}
}
不保证 TAG_ID3
结构的文本字段以空终止符结尾,但您的代码将它们视为它们,因此当空终止符不是空终止符时,它最终会读入下一个字段当前的。要解决这个问题,您必须考虑它们的最大长度,例如:
Edit1->Text = AnsiString().sprintf("%.*s", sizeof(tags->title), tags->title);
或者:
Edit1->Text = AnsiString(tags->title, sizeof(tags->title)).TrimRight();
与所有其他文本字段相同:
id
: 3 个字符title
: 30 个字符artist
: 30 个字符album
: 30 个字符year
: 4 个字符comment
: 30 个字符
您可以使用一个简单的模板包装器来帮助您:
template<size_t N>
String toString(char (&arr)[N])
{
return AnsiString().sprintf("%.*s", N, arr);
/* or:
return AnsiString(arr, N).TrimRight();
*/
}
Edit1->Text = toString(tags->title);
请注意,comment
字段还有一个额外注意事项:
If the 30th character is non-null whilst the 29th character is null, then the 30th character is the track number and the comment is limited to the first 28 characters.