Hi all the cddb module always causes a segfault on FreeBSD. I've tracked down the cause of the problem to a structure defintion which must be exceeding the available stack space for the thread (following a report from Greg Rumple) In freeamp/plm/metadata/cddb/cddb.cpp in bool CDDB::ReadMetaData(const char* url, MetaData* metadata) on line 111 is struct disc_data data; if (cddb_read_disc_data(data) < 0) return retvalue; Even when the code is not executed, space for the stucture is reserved by the compiler and this causes the seg fault. Replacing this with a Malloc fixes the problem struct disc_data *p_data; p_data = (struct disc_data*)malloc(sizeof(disc_data)); if (cddb_read_disc_data(p_data) < 0) return retvalue; There are then about 10 other refernces to data.xxx, which need to change to p_data->xxx followed by an additional free(p_data) A patch is attached. Please please can we get this committed to FreeAMP before the 2.1 release. With this fix, can play MP3s and HTTP streams on FreeBSD. Console mode only at this time, but enough to say we have a working FreeBSD solution. Thanks Roger -- Roger Hardiman Strathclyde Uni Telepresence Research Group, Glasgow, Scotland. http://www.telepresence.strath.ac.uk 0141 548 2897 [EMAIL PROTECTED]
*** plm/metadata/cddb/cddb.cpp.orig Wed Jun 21 14:34:36 2000 --- plm/metadata/cddb/cddb.cpp Sat Oct 7 14:13:16 2000 *************** bool CDDB::ReadMetaData(const char* url, *** 106,113 **** m_total_tracks = m_discinfo->disc_total_tracks; ! struct disc_data data; ! if (cddb_read_disc_data(&data) < 0) return retvalue; char *tracknumber = strrchr(url, DIR_MARKER); --- 106,114 ---- m_total_tracks = m_discinfo->disc_total_tracks; ! struct disc_data *p_data; ! p_data = (struct disc_data*)malloc(sizeof(disc_data)); ! if (cddb_read_disc_data(p_data) < 0) return retvalue; char *tracknumber = strrchr(url, DIR_MARKER); *************** bool CDDB::ReadMetaData(const char* url, *** 127,141 **** return retvalue; m_track--; ! metadata->SetAlbum(data.data_title); ! if (strlen(data.data_track[m_track].track_artist) > 0) ! metadata->SetArtist(data.data_track[m_track].track_artist); else ! metadata->SetArtist(data.data_artist); ! metadata->SetTitle(data.data_track[m_track].track_name); ! metadata->SetComment(data.data_track[m_track].track_extended); metadata->SetTrack(m_track + 1); ! metadata->SetGenre(cddb_genre(data.data_genre)); metadata->SetTime(m_discinfo->disc_track[m_track].track_length.minutes * 60 + m_discinfo->disc_track[m_track].track_length.seconds); --- 128,142 ---- return retvalue; m_track--; ! metadata->SetAlbum(p_data->data_title); ! if (strlen(p_data->data_track[m_track].track_artist) > 0) ! metadata->SetArtist(p_data->data_track[m_track].track_artist); else ! metadata->SetArtist(p_data->data_artist); ! metadata->SetTitle(p_data->data_track[m_track].track_name); ! metadata->SetComment(p_data->data_track[m_track].track_extended); metadata->SetTrack(m_track + 1); ! metadata->SetGenre(cddb_genre(p_data->data_genre)); metadata->SetTime(m_discinfo->disc_track[m_track].track_length.minutes * 60 + m_discinfo->disc_track[m_track].track_length.seconds); *************** bool CDDB::ReadMetaData(const char* url, *** 143,148 **** --- 144,150 ---- retvalue = true; delete pmo; + free(p_data); } return retvalue; }