mirror of
https://github.com/cookiengineer/audacity
synced 2025-09-17 16:50:26 +02:00
commit the final version of Joel Bouchat's patch for WAV and AIFF format metadata improvements
This commit is contained in:
parent
e62e7bfbc0
commit
2b7863a133
@ -59,6 +59,8 @@ WX_DECLARE_STRING_HASH_MAP(wxString, TagMap);
|
|||||||
#define TAG_YEAR wxT("YEAR")
|
#define TAG_YEAR wxT("YEAR")
|
||||||
#define TAG_GENRE wxT("GENRE")
|
#define TAG_GENRE wxT("GENRE")
|
||||||
#define TAG_COMMENTS wxT("COMMENTS")
|
#define TAG_COMMENTS wxT("COMMENTS")
|
||||||
|
#define TAG_SOFTWARE wxT("Software")
|
||||||
|
#define TAG_COPYRIGHT wxT("Copyright")
|
||||||
|
|
||||||
class Tags: public XMLTagHandler {
|
class Tags: public XMLTagHandler {
|
||||||
|
|
||||||
|
@ -86,7 +86,6 @@ public:
|
|||||||
ExportPCMOptions(wxWindow *parent, int format);
|
ExportPCMOptions(wxWindow *parent, int format);
|
||||||
void PopulateOrExchange(ShuttleGui & S);
|
void PopulateOrExchange(ShuttleGui & S);
|
||||||
void OnHeaderChoice(wxCommandEvent & evt);
|
void OnHeaderChoice(wxCommandEvent & evt);
|
||||||
void OnChoice(wxCommandEvent & event);
|
|
||||||
void OnOK(wxCommandEvent& event);
|
void OnOK(wxCommandEvent& event);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -323,8 +322,8 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
char *ConvertTo7bitASCII(wxString wxStr);
|
char *AdjustString(wxString wxStr, int sf_format);
|
||||||
bool AddStrings(AudacityProject *project, SNDFILE *sf, Tags *tags);
|
bool AddStrings(AudacityProject *project, SNDFILE *sf, Tags *tags, int sf_format);
|
||||||
void AddID3Chunk(wxString fName, Tags *tags, int sf_format);
|
void AddID3Chunk(wxString fName, Tags *tags, int sf_format);
|
||||||
|
|
||||||
};
|
};
|
||||||
@ -488,9 +487,14 @@ int ExportPCM::Export(AudacityProject *project,
|
|||||||
if (metadata == NULL)
|
if (metadata == NULL)
|
||||||
metadata = project->GetTags();
|
metadata = project->GetTags();
|
||||||
|
|
||||||
if (!AddStrings(project, sf, metadata)) { // meta data presence check
|
// Install the metata at the beginning of the file (except for
|
||||||
sf_close(sf);
|
// WAV and WAVEX formats)
|
||||||
return false;
|
if ((sf_format & SF_FORMAT_TYPEMASK) != SF_FORMAT_WAV &&
|
||||||
|
(sf_format & SF_FORMAT_TYPEMASK) != SF_FORMAT_WAVEX) {
|
||||||
|
if (!AddStrings(project, sf, metadata, sf_format)) {
|
||||||
|
sf_close(sf);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sampleFormat format;
|
sampleFormat format;
|
||||||
@ -557,6 +561,15 @@ int ExportPCM::Export(AudacityProject *project,
|
|||||||
|
|
||||||
delete[] waveTracks;
|
delete[] waveTracks;
|
||||||
|
|
||||||
|
// Install the WAV metata in a "LIST" chunk at the end of the file
|
||||||
|
if ((sf_format & SF_FORMAT_TYPEMASK) == SF_FORMAT_WAV ||
|
||||||
|
(sf_format & SF_FORMAT_TYPEMASK) == SF_FORMAT_WAVEX) {
|
||||||
|
if (!AddStrings(project, sf, metadata, sf_format)) {
|
||||||
|
sf_close(sf);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ODManager::LockLibSndFileMutex();
|
ODManager::LockLibSndFileMutex();
|
||||||
err = sf_close(sf);
|
err = sf_close(sf);
|
||||||
ODManager::UnlockLibSndFileMutex();
|
ODManager::UnlockLibSndFileMutex();
|
||||||
@ -570,7 +583,7 @@ int ExportPCM::Export(AudacityProject *project,
|
|||||||
buffer));
|
buffer));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (((sf_format & SF_FORMAT_TYPEMASK) == SF_FORMAT_AIFF) ||
|
if (((sf_format & SF_FORMAT_TYPEMASK) == SF_FORMAT_AIFF) ||
|
||||||
((sf_format & SF_FORMAT_TYPEMASK) == SF_FORMAT_WAV))
|
((sf_format & SF_FORMAT_TYPEMASK) == SF_FORMAT_WAV))
|
||||||
AddID3Chunk(fName, metadata, sf_format);
|
AddID3Chunk(fName, metadata, sf_format);
|
||||||
|
|
||||||
@ -583,13 +596,18 @@ int ExportPCM::Export(AudacityProject *project,
|
|||||||
return updateResult;
|
return updateResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *ExportPCM::ConvertTo7bitASCII(const wxString wxStr)
|
char *ExportPCM::AdjustString(const wxString wxStr, int sf_format)
|
||||||
{
|
{
|
||||||
|
bool b_aiff = false;
|
||||||
|
if ((sf_format & SF_FORMAT_TYPEMASK) == SF_FORMAT_AIFF)
|
||||||
|
b_aiff = true; // Apple AIFF file
|
||||||
|
|
||||||
|
// We must convert the string to 7 bit ASCII
|
||||||
size_t sz = wxStr.length();
|
size_t sz = wxStr.length();
|
||||||
if(sz == 0)
|
if(sz == 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
// Size for secure malloc in case of local wide char usage
|
// Size for secure malloc in case of local wide char usage
|
||||||
size_t sr = (sz+2) * 2;
|
size_t sr = (sz+4) * 2;
|
||||||
|
|
||||||
char *pDest = (char *)malloc(sr);
|
char *pDest = (char *)malloc(sr);
|
||||||
if (!pDest)
|
if (!pDest)
|
||||||
@ -664,21 +682,37 @@ char *ExportPCM::ConvertTo7bitASCII(const wxString wxStr)
|
|||||||
|
|
||||||
free(pSrc);
|
free(pSrc);
|
||||||
|
|
||||||
|
if(b_aiff) {
|
||||||
|
int len = (int)strlen(pDest);
|
||||||
|
if((len % 2) != 0) {
|
||||||
|
// In case of an odd length string, add a space char
|
||||||
|
strcat(pDest, " ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return pDest;
|
return pDest;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ExportPCM::AddStrings(AudacityProject * WXUNUSED(project), SNDFILE *sf, Tags *tags)
|
bool ExportPCM::AddStrings(AudacityProject * WXUNUSED(project), SNDFILE *sf, Tags *tags, int sf_format)
|
||||||
{
|
{
|
||||||
if (tags->HasTag(TAG_TITLE)) {
|
if (tags->HasTag(TAG_TITLE)) {
|
||||||
char * ascii7Str = ConvertTo7bitASCII(tags->GetTag(TAG_TITLE));
|
char * ascii7Str = AdjustString(tags->GetTag(TAG_TITLE), sf_format);
|
||||||
if (ascii7Str) {
|
if (ascii7Str) {
|
||||||
sf_set_string(sf, SF_STR_TITLE, ascii7Str);
|
sf_set_string(sf, SF_STR_TITLE, ascii7Str);
|
||||||
free(ascii7Str);
|
free(ascii7Str);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (tags->HasTag(TAG_ALBUM)) {
|
||||||
|
char * ascii7Str = AdjustString(tags->GetTag(TAG_ALBUM), sf_format);
|
||||||
|
if (ascii7Str) {
|
||||||
|
sf_set_string(sf, SF_STR_ALBUM, ascii7Str);
|
||||||
|
free(ascii7Str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (tags->HasTag(TAG_ARTIST)) {
|
if (tags->HasTag(TAG_ARTIST)) {
|
||||||
char * ascii7Str = ConvertTo7bitASCII(tags->GetTag(TAG_ARTIST));
|
char * ascii7Str = AdjustString(tags->GetTag(TAG_ARTIST), sf_format);
|
||||||
if (ascii7Str) {
|
if (ascii7Str) {
|
||||||
sf_set_string(sf, SF_STR_ARTIST, ascii7Str);
|
sf_set_string(sf, SF_STR_ARTIST, ascii7Str);
|
||||||
free(ascii7Str);
|
free(ascii7Str);
|
||||||
@ -686,7 +720,7 @@ bool ExportPCM::AddStrings(AudacityProject * WXUNUSED(project), SNDFILE *sf, Tag
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (tags->HasTag(TAG_COMMENTS)) {
|
if (tags->HasTag(TAG_COMMENTS)) {
|
||||||
char * ascii7Str = ConvertTo7bitASCII(tags->GetTag(TAG_COMMENTS));
|
char * ascii7Str = AdjustString(tags->GetTag(TAG_COMMENTS), sf_format);
|
||||||
if (ascii7Str) {
|
if (ascii7Str) {
|
||||||
sf_set_string(sf, SF_STR_COMMENT, ascii7Str);
|
sf_set_string(sf, SF_STR_COMMENT, ascii7Str);
|
||||||
free(ascii7Str);
|
free(ascii7Str);
|
||||||
@ -694,7 +728,7 @@ bool ExportPCM::AddStrings(AudacityProject * WXUNUSED(project), SNDFILE *sf, Tag
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (tags->HasTag(TAG_YEAR)) {
|
if (tags->HasTag(TAG_YEAR)) {
|
||||||
char * ascii7Str = ConvertTo7bitASCII(tags->GetTag(TAG_YEAR));
|
char * ascii7Str = AdjustString(tags->GetTag(TAG_YEAR), sf_format);
|
||||||
if (ascii7Str) {
|
if (ascii7Str) {
|
||||||
sf_set_string(sf, SF_STR_DATE, ascii7Str);
|
sf_set_string(sf, SF_STR_DATE, ascii7Str);
|
||||||
free(ascii7Str);
|
free(ascii7Str);
|
||||||
@ -702,29 +736,37 @@ bool ExportPCM::AddStrings(AudacityProject * WXUNUSED(project), SNDFILE *sf, Tag
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (tags->HasTag(TAG_GENRE)) {
|
if (tags->HasTag(TAG_GENRE)) {
|
||||||
char * ascii7Str = ConvertTo7bitASCII(tags->GetTag(TAG_GENRE));
|
char * ascii7Str = AdjustString(tags->GetTag(TAG_GENRE), sf_format);
|
||||||
if (ascii7Str) {
|
if (ascii7Str) {
|
||||||
sf_set_string(sf, SF_STR_GENRE, ascii7Str);
|
sf_set_string(sf, SF_STR_GENRE, ascii7Str);
|
||||||
free(ascii7Str);
|
free(ascii7Str);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tags->HasTag(wxT("Copyright"))) {
|
if (tags->HasTag(TAG_COPYRIGHT)) {
|
||||||
char * ascii7Str = ConvertTo7bitASCII(tags->GetTag(wxT("Copyright")));
|
char * ascii7Str = AdjustString(tags->GetTag(TAG_COPYRIGHT), sf_format);
|
||||||
if (ascii7Str) {
|
if (ascii7Str) {
|
||||||
sf_set_string(sf, SF_STR_COPYRIGHT, ascii7Str);
|
sf_set_string(sf, SF_STR_COPYRIGHT, ascii7Str);
|
||||||
free(ascii7Str);
|
free(ascii7Str);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tags->HasTag(wxT("Software"))) {
|
if (tags->HasTag(TAG_SOFTWARE)) {
|
||||||
char * ascii7Str = ConvertTo7bitASCII(tags->GetTag(wxT("Software")));
|
char * ascii7Str = AdjustString(tags->GetTag(TAG_SOFTWARE), sf_format);
|
||||||
if (ascii7Str) {
|
if (ascii7Str) {
|
||||||
sf_set_string(sf, SF_STR_SOFTWARE, ascii7Str);
|
sf_set_string(sf, SF_STR_SOFTWARE, ascii7Str);
|
||||||
free(ascii7Str);
|
free(ascii7Str);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (tags->HasTag(TAG_TRACK)) {
|
||||||
|
char * ascii7Str = AdjustString(tags->GetTag(TAG_TRACK), sf_format);
|
||||||
|
if (ascii7Str) {
|
||||||
|
sf_set_string(sf, SF_STR_TRACKNUMBER, ascii7Str);
|
||||||
|
free(ascii7Str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -480,6 +480,11 @@ int PCMImportFileHandle::Import(TrackFactory *trackFactory,
|
|||||||
tags->SetTag(TAG_TITLE, UTF8CTOWX(str));
|
tags->SetTag(TAG_TITLE, UTF8CTOWX(str));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
str = sf_get_string(mFile, SF_STR_ALBUM);
|
||||||
|
if (str) {
|
||||||
|
tags->SetTag(TAG_ALBUM, UTF8CTOWX(str));
|
||||||
|
}
|
||||||
|
|
||||||
str = sf_get_string(mFile, SF_STR_ARTIST);
|
str = sf_get_string(mFile, SF_STR_ARTIST);
|
||||||
if (str) {
|
if (str) {
|
||||||
tags->SetTag(TAG_ARTIST, UTF8CTOWX(str));
|
tags->SetTag(TAG_ARTIST, UTF8CTOWX(str));
|
||||||
@ -497,12 +502,22 @@ int PCMImportFileHandle::Import(TrackFactory *trackFactory,
|
|||||||
|
|
||||||
str = sf_get_string(mFile, SF_STR_COPYRIGHT);
|
str = sf_get_string(mFile, SF_STR_COPYRIGHT);
|
||||||
if (str) {
|
if (str) {
|
||||||
tags->SetTag(wxT("Copyright"), UTF8CTOWX(str));
|
tags->SetTag(TAG_COPYRIGHT, UTF8CTOWX(str));
|
||||||
}
|
}
|
||||||
|
|
||||||
str = sf_get_string(mFile, SF_STR_SOFTWARE);
|
str = sf_get_string(mFile, SF_STR_SOFTWARE);
|
||||||
if (str) {
|
if (str) {
|
||||||
tags->SetTag(wxT("Software"), UTF8CTOWX(str));
|
tags->SetTag(TAG_SOFTWARE, UTF8CTOWX(str));
|
||||||
|
}
|
||||||
|
|
||||||
|
str = sf_get_string(mFile, SF_STR_TRACKNUMBER);
|
||||||
|
if (str) {
|
||||||
|
tags->SetTag(TAG_TRACK, UTF8CTOWX(str));
|
||||||
|
}
|
||||||
|
|
||||||
|
str = sf_get_string(mFile, SF_STR_GENRE);
|
||||||
|
if (str) {
|
||||||
|
tags->SetTag(TAG_GENRE, UTF8CTOWX(str));
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(USE_LIBID3TAG)
|
#if defined(USE_LIBID3TAG)
|
||||||
@ -655,5 +670,3 @@ PCMImportFileHandle::~PCMImportFileHandle()
|
|||||||
{
|
{
|
||||||
sf_close(mFile);
|
sf_close(mFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -412,7 +412,7 @@ names[] =
|
|||||||
{
|
{
|
||||||
{ kQTMetaDataCommonKeyAuthor, wxT("Author") },
|
{ kQTMetaDataCommonKeyAuthor, wxT("Author") },
|
||||||
{ kQTMetaDataCommonKeyComment, TAG_COMMENTS },
|
{ kQTMetaDataCommonKeyComment, TAG_COMMENTS },
|
||||||
{ kQTMetaDataCommonKeyCopyright, wxT("Copyright") },
|
{ kQTMetaDataCommonKeyCopyright, TAG_COPYRIGHT },
|
||||||
{ kQTMetaDataCommonKeyDirector, wxT("Director") },
|
{ kQTMetaDataCommonKeyDirector, wxT("Director") },
|
||||||
{ kQTMetaDataCommonKeyDisplayName, wxT("Full Name") },
|
{ kQTMetaDataCommonKeyDisplayName, wxT("Full Name") },
|
||||||
{ kQTMetaDataCommonKeyInformation, wxT("Information") },
|
{ kQTMetaDataCommonKeyInformation, wxT("Information") },
|
||||||
@ -427,7 +427,7 @@ names[] =
|
|||||||
{ kQTMetaDataCommonKeyOriginalFormat, wxT("Original Format") },
|
{ kQTMetaDataCommonKeyOriginalFormat, wxT("Original Format") },
|
||||||
{ kQTMetaDataCommonKeyOriginalSource, wxT("Original Source") },
|
{ kQTMetaDataCommonKeyOriginalSource, wxT("Original Source") },
|
||||||
{ kQTMetaDataCommonKeyPerformers, wxT("Performers") },
|
{ kQTMetaDataCommonKeyPerformers, wxT("Performers") },
|
||||||
{ kQTMetaDataCommonKeySoftware, wxT("Software") },
|
{ kQTMetaDataCommonKeySoftware, TAG_SOFTWARE },
|
||||||
{ kQTMetaDataCommonKeyWriter, wxT("Writer") },
|
{ kQTMetaDataCommonKeyWriter, wxT("Writer") },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user