MX 1 год назад
Родитель
Сommit
324b92d6ed

+ 1 - 1
non_catalog_apps/video_player/application.fam

@@ -6,7 +6,7 @@ App(
     cdefines=["APP_VIDEO_PLAYER"],
     cdefines=["APP_VIDEO_PLAYER"],
     stack_size=2 * 1024,
     stack_size=2 * 1024,
     order=90,
     order=90,
-	fap_version=(0, 2),
+	fap_version=(0, 3),
 	fap_description="An app that plays video along with sound on Flipper Zero.",
 	fap_description="An app that plays video along with sound on Flipper Zero.",
 	fap_author="LTVA",
 	fap_author="LTVA",
     fap_weburl="https://github.com/LTVA1/flipper_video_player",
     fap_weburl="https://github.com/LTVA1/flipper_video_player",

+ 6 - 1
non_catalog_apps/video_player/docs/changelog.md

@@ -1,3 +1,8 @@
+# Video Player v0.3 #
+
+## Added ##
+- Volume control with up and down arrow keys
+
 # Video Player v0.2 #
 # Video Player v0.2 #
 
 
 ## Added ##
 ## Added ##
@@ -7,4 +12,4 @@
 
 
 # Video Player v0.1 #
 # Video Player v0.1 #
 
 
-- Initial release
+- Initial release

+ 55 - 11
non_catalog_apps/video_player/video_player.c

@@ -9,7 +9,6 @@
 #include <cli/cli.h>
 #include <cli/cli.h>
 #include <gui/gui.h>
 #include <gui/gui.h>
 #include "furi_hal_rtc.h"
 #include "furi_hal_rtc.h"
-#include <expansion/expansion.h>
 
 
 void draw_callback(Canvas* canvas, void* ctx) {
 void draw_callback(Canvas* canvas, void* ctx) {
     PlayerViewModel* model = (PlayerViewModel*)ctx;
     PlayerViewModel* model = (PlayerViewModel*)ctx;
@@ -85,6 +84,14 @@ void draw_progress_bar(VideoPlayerApp* player) {
     canvas_draw_box(player->canvas, 1, 59, player->progress, 4);
     canvas_draw_box(player->canvas, 1, 59, player->progress, 4);
 }
 }
 
 
+void draw_volume_bar(VideoPlayerApp* player) {
+    canvas_set_color(player->canvas, ColorWhite);
+    canvas_draw_box(player->canvas, 122, 0, 6, 64);
+    canvas_set_color(player->canvas, ColorBlack);
+    canvas_draw_frame(player->canvas, 123, 0, 5, 64);
+    canvas_draw_box(player->canvas, 124, 64 - player->volume / 4, 4, player->volume / 4);
+}
+
 void draw_all(VideoPlayerApp* player) {
 void draw_all(VideoPlayerApp* player) {
     canvas_reset(player->canvas);
     canvas_reset(player->canvas);
 
 
@@ -100,15 +107,16 @@ void draw_all(VideoPlayerApp* player) {
         draw_progress_bar(player);
         draw_progress_bar(player);
     }
     }
 
 
+    if(player->changing_volume) {
+        draw_volume_bar(player);
+    }
+
     canvas_commit(player->canvas);
     canvas_commit(player->canvas);
 }
 }
 
 
 int32_t video_player_app(void* p) {
 int32_t video_player_app(void* p) {
     UNUSED(p);
     UNUSED(p);
 
 
-    Expansion* expansion = furi_record_open(RECORD_EXPANSION);
-    expansion_disable(expansion);
-
     Storage* storage = furi_record_open(RECORD_STORAGE);
     Storage* storage = furi_record_open(RECORD_STORAGE);
     bool st = storage_simply_mkdir(storage, APPSDATA_FOLDER);
     bool st = storage_simply_mkdir(storage, APPSDATA_FOLDER);
     st = storage_simply_mkdir(storage, VIDEO_PLAYER_FOLDER);
     st = storage_simply_mkdir(storage, VIDEO_PLAYER_FOLDER);
@@ -198,12 +206,13 @@ int32_t video_player_app(void* p) {
             if(player->quit) {
             if(player->quit) {
                 deinit_player(player);
                 deinit_player(player);
                 player_deinit_hardware();
                 player_deinit_hardware();
-                expansion_enable(expansion);
-                furi_record_close(RECORD_EXPANSION);
                 return 0;
                 return 0;
             }
             }
 
 
             player->playing = true;
             player->playing = true;
+            player->volume = 0xff;
+            player->seeking = false;
+            player->changing_volume = false;
 
 
             //vTaskPrioritySet(furi_thread_get_current_id(), FuriThreadPriorityIdle);
             //vTaskPrioritySet(furi_thread_get_current_id(), FuriThreadPriorityIdle);
             furi_thread_set_current_priority(FuriThreadPriorityIdle);
             furi_thread_set_current_priority(FuriThreadPriorityIdle);
@@ -231,7 +240,10 @@ int32_t video_player_app(void* p) {
                             player->header_size);
                             player->header_size);
                         stream_seek(player->stream, seek, StreamOffsetFromStart);
                         stream_seek(player->stream, seek, StreamOffsetFromStart);
 
 
-                        player->progress = (uint8_t)((int64_t)stream_tell(player->stream) * (int64_t)126 / ((int64_t)player->num_frames * (int64_t)player->frame_size + (int64_t)player->header_size));
+                        player->progress =
+                            (uint8_t)((int64_t)stream_tell(player->stream) * (int64_t)126 /
+                                      ((int64_t)player->num_frames * (int64_t)player->frame_size +
+                                       (int64_t)player->header_size));
 
 
                         if(event.input.type == InputTypeRelease) {
                         if(event.input.type == InputTypeRelease) {
                             player->seeking = false;
                             player->seeking = false;
@@ -250,7 +262,10 @@ int32_t video_player_app(void* p) {
                             player->header_size);
                             player->header_size);
                         stream_seek(player->stream, seek, StreamOffsetFromStart);
                         stream_seek(player->stream, seek, StreamOffsetFromStart);
 
 
-                        player->progress = (uint8_t)((int64_t)stream_tell(player->stream) * (int64_t)126 / ((int64_t)player->num_frames * (int64_t)player->frame_size + (int64_t)player->header_size));
+                        player->progress =
+                            (uint8_t)((int64_t)stream_tell(player->stream) * (int64_t)126 /
+                                      ((int64_t)player->num_frames * (int64_t)player->frame_size +
+                                       (int64_t)player->header_size));
 
 
                         if(event.input.type == InputTypeRelease) {
                         if(event.input.type == InputTypeRelease) {
                             player->seeking = false;
                             player->seeking = false;
@@ -260,6 +275,30 @@ int32_t video_player_app(void* p) {
                         furi_message_queue_put(player->event_queue, &event, 0);
                         furi_message_queue_put(player->event_queue, &event, 0);
                     }
                     }
 
 
+                    if(event.input.key == InputKeyUp) {
+                        player->changing_volume = true;
+
+                        if(player->volume < 0xff - 3) {
+                            player->volume += 4;
+                        }
+
+                        if(event.input.type == InputTypeRelease) {
+                            player->changing_volume = false;
+                        }
+                    }
+
+                    if(event.input.key == InputKeyDown) {
+                        player->changing_volume = true;
+
+                        if(player->volume > 3) {
+                            player->volume -= 4;
+                        }
+
+                        if(event.input.type == InputTypeRelease) {
+                            player->changing_volume = false;
+                        }
+                    }
+
                     if(player->playing) {
                     if(player->playing) {
                         player_start();
                         player_start();
                     }
                     }
@@ -283,6 +322,10 @@ int32_t video_player_app(void* p) {
                         stream_read(player->stream, audio_buffer, player->audio_chunk_size);
                         stream_read(player->stream, audio_buffer, player->audio_chunk_size);
                     }
                     }
 
 
+                    for(int i = 0; i < player->audio_chunk_size; i++) {
+                        audio_buffer[i] = (int)audio_buffer[i] * player->volume / 0xff;
+                    }
+
                     player->frames_played++;
                     player->frames_played++;
 
 
                     draw_all(player);
                     draw_all(player);
@@ -302,6 +345,10 @@ int32_t video_player_app(void* p) {
                         stream_read(player->stream, audio_buffer, player->audio_chunk_size);
                         stream_read(player->stream, audio_buffer, player->audio_chunk_size);
                     }
                     }
 
 
+                    for(int i = 0; i < player->audio_chunk_size; i++) {
+                        audio_buffer[i] = (int)audio_buffer[i] * player->volume / 0xff;
+                    }
+
                     player->frames_played++;
                     player->frames_played++;
 
 
                     draw_all(player);
                     draw_all(player);
@@ -322,8 +369,5 @@ int32_t video_player_app(void* p) {
         player_deinit_hardware();
         player_deinit_hardware();
     }
     }
 
 
-    expansion_enable(expansion);
-    furi_record_close(RECORD_EXPANSION);
-
     return 0;
     return 0;
 }
 }

+ 2 - 0
non_catalog_apps/video_player/video_player.h

@@ -77,12 +77,14 @@ typedef struct {
     int32_t frames_per_turn; //frames / 126, how many frames to wind forwards/backwards when seeking
     int32_t frames_per_turn; //frames / 126, how many frames to wind forwards/backwards when seeking
 
 
     uint8_t progress;
     uint8_t progress;
+    uint8_t volume;
 
 
     bool playing;
     bool playing;
 
 
     bool quit;
     bool quit;
 
 
     bool seeking; //to display progress bar
     bool seeking; //to display progress bar
+    bool changing_volume;
 
 
     bool silent;
     bool silent;
 } VideoPlayerApp;
 } VideoPlayerApp;