Playlist-Konzept

  • C++

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von KidRick.

    Playlist-Konzept

    Hey Leute,
    ich arbeite gerade an einem Audio Player (nichts großes). Nun da ich auch Playlists integrieren möchte und dafür ein eigenes Dateiformat "kreieren" möchte welches auch nur von meiner Anwendung gelesen werden kann (außer jemand anderes integriert es in seine) habe ich ein kleines Konzept ausgearbeitet. Worum ich euch bitte? Ich bin nicht der 100%-ige Profi in C++ und möchte gerne wissen wie die Idee ist, ob das vielleicht Performance lastig wird und vielleicht habt ihr ja selbst noch Ideen.

    Nunja los gehts. Folgendermaßen/Ungefähr so, wird die Playlist-Datei aufgebaut sein:

    Quellcode

    1. ​[playlist.head]
    2. name = Deep House Love
    3. genre = Deep House
    4. rating = 5
    5. sort = lf
    6. [playlist.elements]
    7. playable = "C:\\Users\\Jan\\Music\\AC Slater & Sinden - Pedal to the Floor [Free Download].mp3"

    Simpel aufgeteilt in zwei Sections (Head, Elements) und einfach lesbar soll sie sein. Nun würde ich den Header mit einer INI-Bibliothek auslesen (github.com/brofield/simpleini) und eine struct damit befüllen die folgendermaßen aussieht:

    C-Quellcode

    1. struct PlaylistHeader {
    2. QString playlist_name;
    3. QString playlist_genre;
    4. int playlist_rating;
    5. int playlist_sorting;
    6. };​

    So kann ich direkten Zugriff auf den Namen der Playlist, das Genre, die Bewertung und das Sorting (random oder like-file) haben.
    Die sogenannten Elements würde ich mit einer foreach (Q_FOREACH) Schleife auslesen, ungefähr so:

    C-Quellcode

    1. Q_FOREACH(playable_element, playlist_file) {
    2. // lese die value
    3. }​

    Hier hapert es aber aktuell, wenn ich die Value gelesen habe, wohin soll ich sie schreiben? Was soll ich mit ihr anstellen? Am besten auch eine struct á la struct Playable { QString playable_file; };? Hoffe ihr könnt mir ein bisschen weiterhelfen. Danke schonmal im Vorraus.

    Grüße
    Jan
    Software being "Done" is like lawn being "Mowed". (Jim Benson)
    structs sind eigt. das falsche in C++. Auch in C# wären sie hier falsch(du bekommst dadurch, dass strings verwendet werden in C# nicht den Stack vorteil, da structs mit strings auch auf dem Heap landen).
    In C++ tut es nichts zur Sache, theoretisch kann alles auf den Stack. C++ hat nicht die Unterscheidung wie C# zwischen struct und class. In C++ sind structs eigt. viel mehr ein Überbleibsel um Kompatibilität mit C Code zu gewährleisten. Ansonsten sind C++ structs(anders als C structs) einfach nur normale Klassen, mit denen man alles anstellen kann, was man mit C++ Klassen auch kann(Vererbung geht z.B. mit C structs nicht - C++ schon). Der einzige Unterschied zwischen class und struct ist hier der Default-Zugriffsmodifier, wobei bei Klassen alles Default private ist und bei Structs public.

    Ansonsten ja, pack es in Klassen, aber schön mit Kapselung und dann eben in einen vector pushen.

    Grundsätzlich mach dir bei soetwas erstmal nicht um die Performance gedanken, aber da du C++ anfänger ist, mach dir lieber Gedanken über das Memory, dass du auch schön hinter dir aufräumst->Smart Pointer verwenden
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    @jvbsl Hatte mich gestern Nacht mal daran gesetzt und bin so zu folgendem gekommen:

    C-Quellcode

    1. ​#include "simpleini/SimpleIni.h"
    2. #include <QApplication>
    3. #include <QMainWindow>
    4. #include <QStringList>
    5. #include <QFile>
    6. struct playlist_header {
    7. QString ph_name;
    8. QString ph_genre;
    9. QString ph_description;
    10. QString ph_sorting;
    11. };
    12. static playlist_header load_playlist_head(const char *playlist_file);
    13. static QStringList load_playlist_elements(const QString &playlist_file);
    14. int
    15. main(int argc, char *argv[]) {
    16. QApplication app(argc, argv);
    17. QMainWindow window;
    18. #if 0
    19. CSimpleIniA window_opts;
    20. window_opts.SetUnicode();
    21. window_opts.LoadFile("G:\\sample.ini");
    22. const char *hVal = window_opts.GetValue("window", "title");
    23. QString wndwTitle = hVal;
    24. window.setWindowTitle(wndwTitle);
    25. window.show();
    26. window_opts.SetValue("window", "title", "Changed.");
    27. window_opts.SaveFile("G:\\sample.ini");
    28. #endif
    29. // playlist_header _ph = load_playlist_head("G:\\sample.ini");
    30. // QStringList elements = load_playlist_elements("G:\\sample.ini");
    31. //#if 0
    32. // try on your own warranty!
    33. playlist_header _ph = load_playlist_head("G:\\hardcore_sample.ini");
    34. QStringList elements = load_playlist_elements("G:\\hardcore_sample.ini");
    35. //#endif
    36. window.setWindowTitle(_ph.ph_name + " " + _ph.ph_genre + " " + _ph.ph_sorting + " -- " + _ph.ph_description);
    37. window.show();
    38. return app.exec();
    39. }
    40. playlist_header
    41. load_playlist_head(const char *playlist_file) {
    42. playlist_header ph;
    43. CSimpleIniA _playlist_file;
    44. _playlist_file.SetUnicode();
    45. _playlist_file.LoadFile(playlist_file);
    46. ph.ph_name = _playlist_file.GetValue("playlist.head", "name");
    47. ph.ph_genre = _playlist_file.GetValue("playlist.head", "genre");
    48. ph.ph_description = _playlist_file.GetValue("playlist.head", "descr");
    49. ph.ph_sorting = _playlist_file.GetValue("playlist.head", "sort");
    50. return ph;
    51. }
    52. QStringList
    53. load_playlist_elements(const QString &playlist_file) {
    54. QStringList _elements;
    55. QFile q_playlist_file(playlist_file);
    56. if (q_playlist_file.open( QIODevice::ReadOnly )) {
    57. while (!q_playlist_file.atEnd()) {
    58. QString line = q_playlist_file.readLine();
    59. if (line.startsWith("playable")) {
    60. _elements.append(line);
    61. }
    62. }
    63. }
    64. QStringList elements;
    65. Q_FOREACH(QString _element, _elements) {
    66. QString _key("playable = ");
    67. int key_pos = _element.indexOf(_key);
    68. if (key_pos >= 0)
    69. elements.append(_element.mid(key_pos + _key.length()));
    70. }
    71. _elements.clear();
    72. return elements;
    73. }


    Das ganze wird in eine QStringList geladen und Performance/Memory technisch kann sich das glaube ich sehen lassen :) Ich werde das mit der Klasse mal umsetzen. Dachte eben das eine struct hier wohl besser gewählt wäre ;) Vielen Dank :)
    Software being "Done" is like lawn being "Mowed". (Jim Benson)