Chris Angelli
2010-Apr-21 19:50 UTC
[Flac-dev] How do you set the Application ID value in an an Application Metadata Block?
Hi, I have written an application that uses the FLAC C API to insert an application metadata block into a FLAC file. Everything appears to be working, but I have one nagging issue. I have used all my best google and source code searching skills and I cannot for the life of me find an API call to set the Application ID value in my metadata object. I am currently working around the issue by setting the value manually, but that hurts my good coding sense. (Note: I have already registered my ID.) Is there an API call to set the application metadata ID? Here's what I'm doing: myFlacMetadata = FLAC__metadata_object_new (FLAC__METADATA_TYPE_APPLICATION); FLAC__metadata_object_application_set_data (uitsFlacMetadata, myMetadata, myMetadataSize, FALSE); /* this is a BIG FAT NO NO, but I cannot for the life of me find any way in the FLAC API to set */ /* the Application block application ID, therefore I am going rogue and setting it explicitly */ myFlacMetadata->data.application.id[0] = 'M'; myFlacMetadata->data.application.id[1] = 'Y'; myFlacMetadata->data.application.id[2] = 'I'; myFlacMetadata->data.application.id[3] = 'D'; Thanks for any help. -chris -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.xiph.org/pipermail/flac-dev/attachments/20100421/f252ef98/attachment.htm
Brian Willoughby
2010-Apr-23 09:47 UTC
[Flac-dev] How do you set the Application ID value in an an Application Metadata Block?
I believe that you might be over-thinking this one. In a Smalltalk world, everything would be an object, so you wouldn't need to assign the Application ID manually. But even in C++ that's not a requirement. Since you're using C, I'm almost certain that there's nothing wrong with doing this the way you have. Think about it this way: No matter what, you're going to have to manually type in a C string "MYID" or a special 4-char constant 'MYID' or supply the individual characters in the proper order. The C string would have an extraneous trailing NULL. The 4-char constant seems to be a Mac thing, and I don't even think it's standard C, but I could be wrong. That leaves individual characters like you're doing. Another way to look at it is that even if there were an API, it would require another struct to be defined so that you could pass in the 4 character ID. It's actually fairly common to use structures to pass information to and from an API. I believe that you are using the FLAC library correctly, unless there is an obvious FLAC__metadata_object_application_set_id() call. There is one thing I would recommend, though. You should probably call FLAC__metadata_object_application_set_data() AFTER you set the Application ID in the structure. That's because passing TRUE instead of FALSE would copy the data elsewhere, and then your updates would have no effect. Better to have the code ordered so that changing that one parameter won't break everything. Brian Willoughby Sound Consulting On Apr 21, 2010, at 12:50, Chris Angelli wrote:> I have written an application that uses the FLAC C API to insert an > application metadata block into a FLAC file. Everything appears to > be working, but I have one nagging issue. > > I have used all my best google and source code searching skills and > I cannot for the life of me find an API call to set the Application > ID value in my metadata object. I am currently working around the > issue by setting the value manually, but that hurts my good coding > sense. > > (Note: I have already registered my ID.) > > Is there an API call to set the application metadata ID? > > Here's what I'm doing: > myFlacMetadata = FLAC__metadata_object_new > (FLAC__METADATA_TYPE_APPLICATION); > FLAC__metadata_object_application_set_data (uitsFlacMetadata, > myMetadata, myMetadataSize, FALSE); > > /* this is a BIG FAT NO NO, but I cannot for the life of me > find any way in the FLAC API to set */ > /* the Application block application ID, therefore I am going > rogue and setting it explicitly */ > > myFlacMetadata->data.application.id[0] = 'M'; > myFlacMetadata->data.application.id[1] = 'Y'; > myFlacMetadata->data.application.id[2] = 'I'; > myFlacMetadata->data.application.id[3] = 'D'; > > > Thanks for any help. > > -chris