virtual file support in audiofile

"Baker, Steve" <[email protected]> Sun, 21 Apr 2002 14:19:33 +0200
Newsgroups gmane.comp.audio.audiofile
Message-ID <7CEA40C0E10C7D4FBE076AE7C3EFB78D0129DD@nlcbbms03>
I am in the process of implementing an AFvirtualfile for our audiofile
GStreamer plugin. This will allow us to completely integrate audiofile into
the GStreamer system.

However afOpenVirtualFile isn't actually implemented even though it is in
the public header.

So below is my implementation - I know there is another patch floating
around so it would be good if something was commited to CVS.

Now I get a segfault the first time one of the vfile callbacks is called
(which just happens to be vfile->tell). My callback func isn't actually
reached but vfile->tell is non null.

I suspect linking voodoo is at fault. I would appreciate suggestions on what
I could look into.

cheers

Index: openclose.c
===================================================================
RCS file: /cvs/audiofile/libaudiofile/openclose.c,v
retrieving revision 1.8
diff -u -r1.8 openclose.c
--- openclose.c	2001/08/28 20:34:46	1.8
+++ openclose.c	2002/04/21 12:06:22
@@ -261,6 +263,44 @@
 
 	if (_afOpenFile(access, vf, filename, &filehandle, setup) !=
AF_SUCCEED)
 		af_fclose(vf);
+
+	return filehandle;
+}
+
+AFfilehandle afOpenVirtualFile (AFvirtualfile *vfile, const char *mode,
AFfilesetup setup)
+{
+	AFvirtualfile	*vf;
+	AFfilehandle	filehandle;
+	int		access;
+
+	if (mode == NULL)
+	{
+		_af_error(AF_BAD_ACCMODE, "null access mode");
+		return AF_NULL_FILEHANDLE;
+	}
+
+	if (mode[0] == 'r')
+		access = _AF_READ_ACCESS;
+	else if (mode[0] == 'w')
+		access = _AF_WRITE_ACCESS;
+	else
+	{
+		_af_error(AF_BAD_ACCMODE, "unrecognized access mode '%s'",
mode);
+		return AF_NULL_FILEHANDLE;
+	}
+
+	if (vfile == NULL)
+	{
+		_af_error(AF_BAD_OPEN, "virtual file is null");
+		return AF_NULL_FILEHANDLE;
+	}
+
+	printf("about to _afOpenFile\n");
+
+	if (_afOpenFile(access, vf, NULL, &filehandle, setup) !=
AF_SUCCEED){
+		printf("_afOpenFile failed");
+		af_fclose(vf);
+	}
 
 	return filehandle;
 }