We now have an interface for controlling everything through struct
db_entry, so let's just have the database store a db_entry directly.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
Track tags need to add themselves to the filter index and update the
library track count once added to the database.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
The Track tag needs to do some cleanup when removed from a database, so
we need to use this op when removing items.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
For allocating new database items from a given key. Tracks do not need
this function since we have special handling for creation and insertion.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
gen_tracks.sh will read a specially configured file and create a
directory containing empty tracks to use for testing.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
I replace the standard and copy constructors with one that tags a track
during construction. This lets me clean up a lot of code, and keep
tagging functions internal to the track class.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
We want to loop over the track database in several places, so let's make
this easier by just returning the database itself.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
It's easier to just pass off the library database rather than forcing
higher layers to iterate over the entire thing (including possible
invalid entries).
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
I also have to replace the "library" namespace with the "collection"
namespace to avoid naming collisions.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This function is similar to Linux's list_for_each_safe(), and lets you
iterate over a database even if the current item is removed.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
I also take the chance to modify this function slightly. Now, if a
matching item could not be found a new item will be allocated.
I added the new function db_get() if callers just want to get an item
without allocating.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
Finding an inline intersection is really easy using iterators, so I
wrote this function to modify one of the set rather than returning a new
one.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
The glib library doesn't have a dedicated "set" container, so I need to
create a wrapper around a hash table to accomplish the same results.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This helps improve filtering, since I drop all modifications to
characters (such as accents over an 'e').
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
I eventually intend to remove the file_init() function, once everything
has been converted to C.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
I also introduced a file_readf() function to make it easier to read a
formatted string from the file.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
I also introduced a file_writef() function to make it easier to write a
formatted string to the file.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
And replace it with the function file_init(). Let's take this chance to
rework parts of the unit test as well.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This change also lets me remove the destructor, since code is expected
to call file_close() when IO is complete.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
I only need one function to perform the entire conversion using
g_strdup_printf(). This helps to simplify the code before switching
over to C.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
And I replace it with a simple call to g_strdup_printf() that does the
exact same thing. Note that callers are now required to free the
returned string with g_free().
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
I replace it with calls to g_strdup_printf(). This has the additional
benefit that I can do uint conversions at the same time as other
formatting options, so this seems like a win. The only downside is that
I have to manually free the memory that glib allocates, but that's easy
enough.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
I converted the test to the new framework, and I introduced a new
"test.h" file in the source directory to help with mixing C and C++
code.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
The version test is fairly simple, since it only tests the values set in
a single header file. The remaining tests will be more challenging,
since I'll have to modify core code and the test at the same time.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
I commented out most of the file and directory modification code while I
was at it. I'll re-add these as I convert more files to C.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
I want to make the scons files simpler, so I have decided to drop down
to only one test environment. This patch disables
tests/core/Sconscript, but I'll add this back in as I make other changes
throughout the codebase.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
A long int is shorter on ARM than x86, which could cause position and
duration values to get truncated. Additionally, quering gstreamer with
a long int causes a compile error on ARM. Let's just do the right thing
and make this value an int64_t.
Signed-off-by: Anna Schumaker <anna@ocarinaproject.net>
This class will be used to push queue changes directly to the GUI.
Currently changes get mapped through the old callbacks system, which can
lead to several inefficiencies because the GUI has to look up each queue
structure in a list.
This patch implements a basic QNotifier class and provides a function
for setting a Queue's notifier.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
Unplayed tracks is a dynamic playlist generated whenever we are asked to
select the "Unplayed" playlist. Note that dynamic playlists aren't
hooked up to the other playlist functions (has, add, del, or
get_tracks). This is to avoid adding them to the index and potentially
writing out to disk.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This function converts unsigned ints into strings. This allows me to
replace several almost identical functions with one function call.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
I move the code into a new cpp file, so it is no longer a header-only
library. I also take the chance to add a for-each function for testing
iterators.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This means I no longer need to pass argc and argv parameters to core/,
so I can eventually work towards removing the Driver :: init() function.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This was used to get around layering issues with the gstreamer driver.
Now that the gstreamer implementation is in the gui code we can have it
call audio::next() directly.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
It's not used anywhere else except during this one test, so move it out
of the global include files.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
The driver is intended to be a small class, so put it in the audio code
now and we'll clean it up in future patches.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This shifts the taglib code into library.cpp. I also remove the tagdb
section of the DESIGN document.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This has been disabled for some time. I added a test for adding track
indexes to the filter upon creation, but it doesn't properly test adding
to the filter when reading from disk.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This code is really testing date and locale handling, so this patch
renames the function to match what it actually does. While I'm at it, I
also introduce some cleanups.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This returns the actual size of the database, so be careful when using
it! The intent of this function is to allow some kind of iteration when
loading databases.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
The track_db doesn't have autosaving enabled for performance reasons.
This lets us add several tracks to the database between saves, but it
also means we need to provide a commit() function.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
I'm going to need to split this value earlier to do a unique lookup when
inserting, so the constructor can take the relative path to make things
easier.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
I want to test basic reading and writing before running the functional
test, since the functional test will eventually trigger database
commits.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This makes the code a little bit cleaner, since we don't need to keep
doing lookups for each test run.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
I don't want to expose the date structure outside of the track class, so
I'll provide a comparison function instead.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This patch creates a new structure to track the last played date, which
can be expanded into a class at some future point. Additionally, I use
strftime() to calculate the current date based on the user's current
locale settings.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
I don't want anybody outside of this class changing the value, so it
shouldn't be public. I also change the primary key to use library index
instead of the full filepath while I'm at it.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
I don't think this value needs to be stored anywhere in the Track class
since it's fairly easy to calculate. Let's convert it into a function
for now and reevaluate later!
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
I provide an accessor function to keep this value from ever getting
changed outside of the Track class.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
We want to make sure that the _library size is decremented whenever a
track is removed or destroyed.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
I want to provide the Library, Artist, Album, and Genre tags to the
Track on construction to (hopefully) eliminate the Track::tag()
function.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
I also use this opportunity to create a new default constructor test for
the Track tag. This patch also disables the tags test since the tagdb
will be going away soon.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
I was only ever comparing the lowercase version of the name, so this
should be done in a single place (the GenericTag) to make maintenance
easier.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This patch moves the library_db into tags/library.cpp, where it can be
effectively managed by the Library tag. For this to work, I need to add
some extra functions to the tags namespace to:
- Create new Library tags,
- Find tags by index,
- Remove the Library at a specific index, and
- Find the actual size of the library_db.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
The genre_db should really be controlled from within the Genre tag,
so this patch adds functions to find or create Genre tags to the tags
namespace.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
The album_db should really be controlled from within the Album tag, so
this patch adds functions to find or create Album tags to the tags
namespace.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
The artist_db should really be controlled from within the Artist tag, so
this patch creates a new tags namespace containing functions that will
find or create tags as they are requested.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This tests all the basic things that the tag does: storing values and
reading / writing from file.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
- This tag now inherits from GenericTag.
- Add a Genre-specific unit test.
- Remove the genre tag section of the DESIGN file.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
Also make it inherit from the GenericTag base class. Also also, add a
unit test specific to Album tags. Finally, I remove the corresponding
section of the DESIGN file since it is no longer needed.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
core/tags.cpp was WAY too big, so I moved this code into a new file in
its own directory. I also created a new unit test just for testing the
Artist tag.
This patch disables the "tags" test since it conflicts with the
tests/core/tags/ directory. This is okay because the tagdb is gradually
being phased out!
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
I don't want anybody outside of the IndexEntry class to modify the
values in this container. This patch makes it private and provides
iterator access instead.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This variable should only be set by the Database when a DatabaseItem is
first created. This means I should hide _index from the rest of the
world to prevent accidental modifications. I also add an accessor
function for other code that needs to read _index.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
My old testing system was rather convoluted. This patch makes the
Sconscript file easier to follow.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This issue was solved in Ocarina 6.1.3, but I didn't add a unit test for
it. This patch adds a test.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
Ocarina was preserving the results set even if there were 0 search
results for the entire search string. So a search for "walllllll" would
still return results for "wall".
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
The user could search for a term that isn't stored in the filter index.
This is represented through a NULL pointer returned from the
Index.find() function. Let's check this pointer before attempting to
dereference it ...
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
Whenever a Track is destructed, library->count is decremented. This
means that even if tagging fails we need to increment library->count to
keep this value consistent.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
Without this check we could end up creating a Track for a .ini file or
some other non-audio file.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
o_collection_* was easily confused with widgets on the collection tab,
so I renamed everything to be less confusing.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This will provide an interface for accessing widgets, and make it easier
to swap out different builder files.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
I replace the /proc/self/exe method with a simple hard-coded string.
This means that binaries run from the source directory need to be run
from the root of the source directory.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This just checks that the deck was initialized. To really be complete,
it should really check that ALL core libraries are initialized.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
I move all of the core tests into the core/ directory to keep them
together. Gui unit tests will be put in new directories.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
I plan to introduce a new lib/ that sits between the gui and the backend
files (similar to how glibc sits between the kernel and userspace).
This gets the rename out of the way before I change my mind again.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This patch reworks the unit test using the TestDriver audio driver. I
also recode the audio layer to match the design and drastically clean up
the code.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This can only be hit when the tagdb has no tracks in it, since you can't
add a NULL pointer to the recent queue.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This would have to happen eventually. Might as well do it now!
I also updated the TestDriver test to match the changes I had to make.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
The driver is used to select between gstreamer playback and a fake
playback mode used only when testing.
Currently the GSTDriver has empty functions. It will be implemented as
the audio.cpp file is updated.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
TempQueues create a way to trigger deck :: write() whenever a queue
changes. This means higher layers don't need to remember to save after
changes!
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
I update the unit test and redo much of the code to be cleaner and make
more sense. One big improvement is that the recently played queue will
now be managed by the deck.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
Keeping separate directories for all of these files isn't the most
obvious way to do things. Instead, move everything into the same
directory.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
I'm about to bump the version number for the deck layer, so it makes
senes that different files need different version numbers.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
Lots of changes here! I switched from using track and library ids to
passing pointers, renamed some functions, and made the code much
cleaner.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This function is called to increment play count and set "date last
played" variables. Moving this into the Track class lets me remove an
internal callback and a few other unnecessary functions.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
I updated the code to better match how I use playlists and to make sure
that everything is tested.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
I now have a single function rather than 4 individual functions. The
code is cleaner, and I've added it to the unit test.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
It should take a Track pointer, rather than a track_id. This makes the
code easier to work with.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
... and just into the tests/ directory. I also reworked the Sconscript
to compile everything using only the lib/ files that are needed.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This might have made more sense for an earlier version of the
DatabaseEntry class, but as far as I can tell this test only checks code
that exists inside this file. This means I can removed it without
reducing code coverage.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
Looks like I missed updating a few places in the File class. I do that
now, and I also began updating the unit test to the new system.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
Add in several new features like:
- Don't exit until the specific test function completes.
- Make it easier to run named tests from C++.
- Use a macro to find line number when calling test :: equal().
- Use a macro to do basic setup and cleanup between test functions.
Also update the version test while I'm at it.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
I remove the "on_queue_changed" callback in the flag handler functions,
so changes won't trigger a save until I can update later layers.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This makes testing easier, since I'll only see the test I need and not
everything that runs before it.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
So far I have renamed variables, changed a few functions, and updated
all the code that was affected.
Oh, I also started a new unit test.
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
I only needed this to make the jump from Ocarina 5.10 -> Ocarina 6.0.
It's not needed anymore, now that 6.0 is out.
Signed-off-by: Anna Schumaker <anna@ocarinaproject.net>
This should offer a performance increase since the item to insert will
only be copied if it is not already in the database.
Signed-off-by: Anna Schumaker <anna@ocarinaproject.net>