Ein neues Feature "APPEND-PAUSE" für fb2k?

Begonnen von anaono, 14. August 2013, 11:07:10

Vorheriges Thema - Nächstes Thema

fbuser

#15
Sorry, ich hatte die Adreßoperatoren beim Aufruf von get_playing_item_location() vergessen.

Der Aufruf muß dann so aussehen:

size_t playlist;
size_t index;
static_api_ptr_t<playlist_manager>()->get_playing_item_location(&playlist,&index);

grimes

#16
Ich werde das mit den bescheuerten Zeigern nie kapieren.

Neue Testversion im Anhang

Hoffentlich mit gefixten playlistenden-bug.


anaono

#17
Danke, der Bug ist weg :)

Zitat von: grimes in 15. August 2013, 17:19:10
Den vorgeschlagenen Änderungen stehe ich allesamt kritisch gegenüber.
Beispiel: Wenn es ein POSTGAP-NEW gibt, so fragt sich der Anwender wo ist das POSTGAP-OLD. Der Anwender ist verwirrt.
Play suggeriert, dass ein track gespielt wird... etc.
Millisekunden: Ist ein hoher Aufwand alles von Integer zu float umzustellen.
Zum Selbermachen: Sourcecode steht zur Verfügung.


OK, Danke, dass Du daran denkst Anwender könnten verwirrt werden, durch das nicht vorhandene %POSTGAP-OLD%. Was hälst Du von folgender Benennung?:
(B)
- %POSTGAP-OLD%, für das Original-Gap von der CD und
- %POSTGAP-NEW%, für das vom Benutzer gewünschte neue Gap.

So hat man beide Gaps klar auseinander gehalten, das Alte vom CD-Rip und das Neue, was der Anwender gerne hätte.

Oder diese Benennung?:
(C)
- %POSTGAP-ORIGINAL%, für das Original-Gap von der CD und
- %POSTGAP-USER%, für das vom Benutzer gewünschte neue Gap.

Oder diese Benennung?:
(D)
- %POSTGAP-PRIMAL%, für das ursprüngliche Original-Gap von der CD und
- %POSTGAP-USER%, für das vom Benutzer gewünschte neue Gap.


Die Benennung aus meinen Beitrag

http://www.hifi-forum.de/index.php?action=browseT&forum_id=54&thread=17408&postID=1#1

war:
(A)
- %POSTGAP%, für das Original-Gap von der CD und
- %POSTGAP-NEW%, für das vom Benutzer gewünschte neue Gap.

(B) oder (C) finde ich eindeutig besser als (A). Ich tendiere zu (C).


Zum Menüeintrag:
"Play suggeriert, dass ein track gespielt wird... "
Stimmt! Und eigentlich ist es ein Wartezustand (der entweder den Datenstrom ganz unterbricht "pausing playback" oder nur "0-Bytes" an das Ausgabegerät schickt "playing silence"). Und so weit ich das verstanden habe machst Du ein "pausing playback".

Diesmal bin ich es, der meint, dass der Menüeintrag "Postgap" den Anwender verwirren könnte, weil er nicht weiß welche Tätigkeit "Postgap" bedeutet. Ich meine "Use Postgap-new" ist leichter verständlich als ein "Postgap-new" <-- für (B) und für (C), (D) --> "Use Postgap-user".


"Zum Selbermachen: Sourcecode steht zur Verfügung."
Danke :) Damit warte ich noch;
ich muss erst noch eine ganze Menge lernen, wie das funktioniert.
Kann man das Projekt auch mit dem gcc übersetzen oder braucht man MS VC++ dafür?

grimes

#18
Neue Testversion im Anhang.

Umstellung von Millisekunden auf Sekunden mit Nachkommastellen.
Das Format ist also nun:
<POSTGAP> 3.5

Zitat von: anaono in 16. August 2013, 07:08:42
- %POSTGAP-OLD%, für das Original-Gap von der CD und
- %POSTGAP-NEW%, für das vom Benutzer gewünschte neue Gap.

Vorschlag:
%POSTGAP-OLD% für das Original-Gap von der CD
%POSTGAP% für das vom Benutzer gewünschte neue Gap

Ich werde nichts mehr an der Namensgebung ändern.
Es ist wirklich unüblich vor einem Menüpunkt noch mal "Use" zu schreiben.
Das müsstest Du dann bei jedem Menüpunkt machen.

(VC++ 2010)




anaono


Funktioniert :)


Zitat von: grimes in 16. August 2013, 08:20:10
Vorschlag:
%POSTGAP-OLD% für das Original-Gap von der CD
%POSTGAP% für das vom Benutzer gewünschte neue Gap

OK, ich vermute Du denkst so "Das was drauf steht (ist auch drin, d.h.) soll auch gemacht werden. Also braucht %POSTGAP% keinen Zusatz mehr wie USER oder NEW oder USER-DEFINED". Einversanden! Dann schlage ich folgende Benennung vor:

(E)
- %POSTGAP-INTERNAL%, für das im Track am Ende vorhandene Gap (von CD beim Rippen übernommen) und
- %POSTGAP%, für das vom Benutzer gewünschte neue Gap. (über den gleichnamigen Menüpunkt akti- und deaktivierbar)

oder (F)
- %POSTGAP-INTRACK%, ...
- %POSTGAP%, ...

oder (G)
- %POSTGAP-DEFAULT%, ...
- %POSTGAP%, für das vom Benutzer gewünschte neue Gap, das den Default ersetzen kann.

(G) gefällt mir am besten, weil es den Gegensatz zwischen wählbarem und default Verhalten betont! Was meinst Du?


Zitat von: grimes in 16. August 2013, 08:20:10
Ich werde nichts mehr an der Namensgebung ändern.
Es ist wirklich unüblich vor einem Menüpunkt noch mal "Use" zu schreiben.
Das müsstest Du dann bei jedem Menüpunkt machen.

Ich kann mit dem Menüpunkt "Postgap" sehr gut leben, denn ich weiß bereits was gemeint ist. Viele Menschen sind aber nicht so abstrakt, dass sie sofort verstehen "Postgap" bedeutet "Aktiviere das gleichnamige Tag". Sie brauchen genau so etwas als Bechreibung und würden einen Menüeintrag "Use Tag Postgap" leichter verstehen. Und ich glaube wir beide wollen den Anwender möglichst wenig verwirren.

Z.B. bin ich verwirrt durch Deine Menüeinträge "Gap tracks" und "Gap albums". Ich verstehe noch nicht ob Du vielleicht meinst "Add Gap after every track" und "Add Gap after every album"? Gibt es irgendwo eine Beschreibung Deines Plugins?


------
Ich freue mich, dass Du an der Implementierung arbeitest. Unsere Diskusion bzgl. der Namensgebung von Tags und Menüeintrag hilft mir, über Anwenderfreundlichkeit nachzudenken. Danke dafür.

Möchtest Du das ich auf die Implementierung in Deinem Plugin hinweise, auf?:

http://www.hifi-forum.de/index.php?action=browseT&back=1&sort=lpost&forum_id=54&thread=17408
http://www.hydrogenaudio.org/forums/index.php?showtopic=102223

grimes

Tipp: Gehst Du über den Menüeintag mit der Maus, so erscheint in der Statusbar eine ausführlichere Beschreibung.
Außerdem ist unter Preferences | Components | Stop after album | (rechtsklick) About nochmals eine Zusammenfassung vorhanden.

Ich werde die neue Version dann demnächst auf Hydrogenaudio veröffentlichen, wenn keine Einwände bestehen.



fooamp

#21
Zitat von: anaono in 15. August 2013, 09:34:25

Im Post #5 habe ich meine Motivation erläutert:

http://www.hifi-forum.de/index.php?action=browseT&forum_id=54&thread=17408&postID=5#5

2 Weitere Anwendungsbeispiele habe ich unter "2. Fall" und "3. Fall" beschrieben in:

http://www.hifi-forum.de/index.php?action=browseT&forum_id=54&thread=17408&postID=1#1

Danke. Verstehe. Zum ersten Punkt: Nein; zu den anderen beiden: nicht interessant für mich. - Aber offenbar sind andere anderer Meinung und haben Deine Idee dankbar aufgegriffen. Vielleicht findet sich später für mich eine Verwendungsmöglichkeit, vorerst sehe ich sie nicht. Interessant jedenfalls, welche Bedürfnisse so existieren. Ich beobachte.

anaono


Zitat von: grimes in 16. August 2013, 11:38:11
Ich werde die neue Version dann demnächst auf Hydrogenaudio veröffentlichen, wenn keine Einwände bestehen.

Warum sollte jemand etwas dagegen haben? Ich jedenfalls freue mich, wenn Du es veröffentlichst.

Der 1. Fall ist fast fertig implementiert.

Es fehlt noch der "Countdown" ...
Zitat von: grimes in 14. August 2013, 18:40:08
Zum Countdown:
Das ist schwerer zu implementieren.
Im Wesentlichen müsste die plugin-interne Variable einer globalen foobar2000-eigenen Variablen %countdown% zugewiesen werden.
Keine Ahnung, ob das geht. Ich klammere dies vorerst mal aus.


Hast Du denn Lust noch weiter zu machen?

Für den 2. Fall fehlt:

- %POSTGAP-DEFAULT%, für das im Track am Ende vorhandene Gap (das Original-Gap von CD beim Rippen übernommen)

weitere Beschreibung auf: http://www.hifi-forum.de/index.php?action=browseT&forum_id=54&thread=17408&postID=1#1


grimes

Countdown übersteigt meine momentanen Fähigkeiten. Ich komme da nicht weiter.


Fall 2: Ehrlich gesagt, kapiere ich nicht was Du vorhast.
Silence am Ende des tracks ist Bestandteil des tracks. Einen Teil eines tracks kann man höchstens mit Audacity entfernen.
Vielleicht kann man was mit foo_dsp_skip_silence machen. Das löscht aber möglicherweise jede Generalpause in klassischen Stücken.
Ist dir der Gap zwischen den tracks zu karz, so gilt Silence + %postgap% = gesamter Gap.
Um %postgap% zu bestimmen, benötigst Du die Länge von Silence um den passenden Gesamtgap zu erhalten. Die Silencelänge kannst Du meinetwegen in einen tag schreiben oder auch nicht.
Was soll ich da jetzt machen?

Vielleicht kannst Du nochmal erklären, was Du meinst.

anaono

#24
Zitat von: grimes in 16. August 2013, 20:16:14
Countdown übersteigt meine momentanen Fähigkeiten. Ich komme da nicht weiter.
Ich weiß, ich habs nur der vollständigkeithalber nochmal erwähnt, in der Hoffnung jemand anderes liest es und hat eine Idee ...


Zitat von: grimes in 16. August 2013, 20:16:14
Fall 2: ...
Vielleicht kannst Du nochmal erklären, was Du meinst.

Ja gerne:

- In  %POSTGAP-DEFAULT% steht die Länge des (beim Rippen) angehängten Gaps.

- Die Wartezeit (bis zum nächsten Play) die jetzt (im 1. Fall) = %POSTGAP% ist, wird dann (im 2. Fall) verkürzt zu %POSTGAP% - %POSTGAP-DEFAULT%
--> Das hat den Vorteil, dass in %POSTGAP% die tatsächliche Pausenlänge steht (die aus %POSTGAP-DEFAULT% + Wartezeit besteht).

- Ist %POSTGAP% < %POSTGAP-DEFAULT%, dann wird der Track einfach nach <Tracklänge> + %POSTGAP% - %POSTGAP-DEFAULT% angehalten.
  (Das Anhalten des Tracks geschieht in dem angehängte Gap, aber niemals im "eigentlichem Track" (an den der Gap beim Rippen angehängt wurde). Denn sonst müsste von der <Tracklänge> mehr abgezogen werden als %POSTGAP-DEFAULT%, d.h.: %POSTGAP% - %POSTGAP-DEFAULT% < - %POSTGAP-DEFAULT% ==> %POSTGAP% < 0 ==> was nicht erlaubt ist.)
  (Sollte das Anhalten des Tracks mit einem kurzen fadeout nachklingen, um einen Knackser zu vermeiden?)

- fehlt %POSTGAP% oder enthält es einen ungültigen Wert ==> Nichts wird gemacht, also deaktiviert
- fehlt %POSTGAP-DEFAULT% oder enthält es einen ungültigen Wert ==> %POSTGAP-DEFAULT% := 0 ==> dasselbe Verhalten wie im 1. Fall

- Gültige Werte: %POSTGAP% >= 0 und %POSTGAP-DEFAULT% >= 0 und %POSTGAP-DEFAULT% <=   <Tracklänge>

Soweit ich das sehe, besteht die Schwierigkeit darin, den aktuell spielenden Track frühzeitig zu beenden.

Ich glaube das war's.

Da das angehängte Gap (normalerweise) aus Stille besteht, kann man das Gap auch jederzeit abbrechen, ohne Information zu verlieren. D.h. man hat mit Fall 2 den "eigentlichen Track" vom angehängten Gap getrennt und kann die Länge des Postgaps frei wählen (im Fall 1 musste das "tatsächliche Postgap" >= dem angehängtem Gap sein).

grimes

Danke für die Erläuterung.

Wie wurde bei dir der Gap an den track angehängt?
Redest Du vielleicht von Cue-Sheets postgaps oder so was?
Ist der angehängte gap Teil des tracks, so könnte man vielleicht die "gesamte trackdauer - angehängte Silence" und dann den track abbrechen.
Hoch komplexe Angelegenheit. foo_seek könnte das bewerkstelligen. Ich rate ab.

Mal noch eine dumme Frage, warum machst Du keine Cue-sheets, da wird kein Gap an den track angehängt, und die Pausen sind als postgaps frei zu konfigurieren. Ich kenne mich mit Cue-Sheets allerdings nicht aus.

ZitatDieser 2. Fall ist nützlich für eine CD mit gapeless Tracks, bei deren Rip aber versehentlich Pausen (z.B. 2 Sek.) an jeden Track angehängt wurden.
Da ist wohl mächtig was schief gegangen beim Rippen?

Fazit: Das ist wohl nix für das plugin "Stop after album".

anaono

#26
Zitat von: grimes in 17. August 2013, 12:38:01
Wie wurde bei dir der Gap an den track angehängt?
Redest Du vielleicht von Cue-Sheets postgaps oder so was?
Der Gap ist am Track-Ende, es geht aber gar nicht darum, wie er dahin gekommen ist.
Aber wenn es Dich interessiert:
http://www.hifi-forum.de/index.php?action=browseT&forum_id=54&thread=17408&postID=12#12

--------
Für %POSTGAP% >= %POSTGAP-DEFAULT% brauchst Du nur die Wartezeit zu ändern auf %POSTGAP% - %POSTGAP-DEFAULT% und mit einer Fallunterscheidung if %POSTGAP% >= %POSTGAP-DEFAULT% ... den alten Code laufen zu lassen.


Zitat von: grimes in 17. August 2013, 12:38:01
Ist der angehängte gap Teil des tracks, so könnte man vielleicht die "gesamte trackdauer - angehängte Silence" und dann den track abbrechen.
Hoch komplexe Angelegenheit. foo_seek könnte das bewerkstelligen. Ich rate ab.

Für %POSTGAP% < %POSTGAP-DEFAULT% soll der Track abgebrochen werden. Und Du schreibst das ist "Hoch komplex". Falls Du also weitermachen möchtest, schlage ich vor die Komplexität zu reduzieren:

Das jetzige foo_stopafteralbum kannst Du so veröffentlichen wie es ist (das läuft ja gut, bis auf den fehlenden countdown oder ein anderes Feedback an den Anwender: das den Anwender etwas verwirren könnte).

Und für die Weiterentwicklung reduziere erst mal das Plugin radikal, d.h.
- kopiere das Plugin-Projekt unter neuem Namen, z.B. foo_user_defined_Postgap oder ein anderer Name.
- nimm alles (!!!) raus was nichts mit den Postgaps zu tun hat.
- Testen
dadurch wird der Sourcecode einfacher (zu verstehen und zu entwickeln). Später kannst Du immernoch schauen, ob das Ergebnis wieder in foo_stopafteralbum integriert werden soll (dann vielleicht modular).

Danach:
- Fallunterscheidung: if %POSTGAP% >= %POSTGAP-DEFAULT% then Fall 1 (%POSTGAP% - %POSTGAP-DEFAULT%) else neuer Code
- Testen
- neuer Code

Also falls Du Lust und Zeit hast weiterzumachen, freue ich mich.
--------


Zitat von: grimes in 17. August 2013, 12:38:01
Mal noch eine dumme Frage, warum machst Du keine Cue-sheets, da wird kein Gap an den track angehängt, und die Pausen sind als postgaps frei zu konfigurieren. Ich kenne mich mit Cue-Sheets allerdings nicht aus.
Ich verwende *.m3u-Playlisten. (fb2k kann sogar die Tracks ohne Playliste öffnen :)  ) Und Cue-Sheets sind schon etwas mühsam zu erstellen ... Ich finde es einfach sehr praktisch, dass jeder Track seine eigenen Meta-Daten enthält und keine zusätzliche Beschreibungsdatei (Cue-Sheet) notwendig ist.

Zitat von: grimes in 17. August 2013, 12:38:01
ZitatDieser 2. Fall ist nützlich für eine CD mit gapeless Tracks, bei deren Rip aber versehentlich Pausen (z.B. 2 Sek.) an jeden Track angehängt wurden.
Da ist wohl mächtig was schief gegangen beim Rippen?
So was gibt's ... und wäre doch schön, so etwas retten zu können.
Aber der Hauptgrund für Teil 2 ist "das angehängte Gap aus dem Track zu befreien" oder anders ausgedrückt "freie Wahl der Postgap-Länge", so wie oben beschrieben.

Zitat von: grimes in 17. August 2013, 12:38:01
Fazit: Das ist wohl nix für das plugin "Stop after album".
Nein, ich glaube nicht.