xref: /openbmc/qemu/replay/replay-audio.c (revision 3d4d16f4)
1*3d4d16f4SPavel Dovgalyuk /*
2*3d4d16f4SPavel Dovgalyuk  * replay-audio.c
3*3d4d16f4SPavel Dovgalyuk  *
4*3d4d16f4SPavel Dovgalyuk  * Copyright (c) 2010-2017 Institute for System Programming
5*3d4d16f4SPavel Dovgalyuk  *                         of the Russian Academy of Sciences.
6*3d4d16f4SPavel Dovgalyuk  *
7*3d4d16f4SPavel Dovgalyuk  * This work is licensed under the terms of the GNU GPL, version 2 or later.
8*3d4d16f4SPavel Dovgalyuk  * See the COPYING file in the top-level directory.
9*3d4d16f4SPavel Dovgalyuk  *
10*3d4d16f4SPavel Dovgalyuk  */
11*3d4d16f4SPavel Dovgalyuk 
12*3d4d16f4SPavel Dovgalyuk #include "qemu/osdep.h"
13*3d4d16f4SPavel Dovgalyuk #include "qemu/error-report.h"
14*3d4d16f4SPavel Dovgalyuk #include "sysemu/replay.h"
15*3d4d16f4SPavel Dovgalyuk #include "replay-internal.h"
16*3d4d16f4SPavel Dovgalyuk #include "sysemu/sysemu.h"
17*3d4d16f4SPavel Dovgalyuk #include "audio/audio.h"
18*3d4d16f4SPavel Dovgalyuk 
19*3d4d16f4SPavel Dovgalyuk void replay_audio_out(int *played)
20*3d4d16f4SPavel Dovgalyuk {
21*3d4d16f4SPavel Dovgalyuk     if (replay_mode == REPLAY_MODE_RECORD) {
22*3d4d16f4SPavel Dovgalyuk         replay_save_instructions();
23*3d4d16f4SPavel Dovgalyuk         replay_mutex_lock();
24*3d4d16f4SPavel Dovgalyuk         replay_put_event(EVENT_AUDIO_OUT);
25*3d4d16f4SPavel Dovgalyuk         replay_put_dword(*played);
26*3d4d16f4SPavel Dovgalyuk         replay_mutex_unlock();
27*3d4d16f4SPavel Dovgalyuk     } else if (replay_mode == REPLAY_MODE_PLAY) {
28*3d4d16f4SPavel Dovgalyuk         replay_account_executed_instructions();
29*3d4d16f4SPavel Dovgalyuk         replay_mutex_lock();
30*3d4d16f4SPavel Dovgalyuk         if (replay_next_event_is(EVENT_AUDIO_OUT)) {
31*3d4d16f4SPavel Dovgalyuk             *played = replay_get_dword();
32*3d4d16f4SPavel Dovgalyuk             replay_finish_event();
33*3d4d16f4SPavel Dovgalyuk             replay_mutex_unlock();
34*3d4d16f4SPavel Dovgalyuk         } else {
35*3d4d16f4SPavel Dovgalyuk             replay_mutex_unlock();
36*3d4d16f4SPavel Dovgalyuk             error_report("Missing audio out event in the replay log");
37*3d4d16f4SPavel Dovgalyuk             abort();
38*3d4d16f4SPavel Dovgalyuk         }
39*3d4d16f4SPavel Dovgalyuk     }
40*3d4d16f4SPavel Dovgalyuk }
41*3d4d16f4SPavel Dovgalyuk 
42*3d4d16f4SPavel Dovgalyuk void replay_audio_in(int *recorded, void *samples, int *wpos, int size)
43*3d4d16f4SPavel Dovgalyuk {
44*3d4d16f4SPavel Dovgalyuk     int pos;
45*3d4d16f4SPavel Dovgalyuk     uint64_t left, right;
46*3d4d16f4SPavel Dovgalyuk     if (replay_mode == REPLAY_MODE_RECORD) {
47*3d4d16f4SPavel Dovgalyuk         replay_save_instructions();
48*3d4d16f4SPavel Dovgalyuk         replay_mutex_lock();
49*3d4d16f4SPavel Dovgalyuk         replay_put_event(EVENT_AUDIO_IN);
50*3d4d16f4SPavel Dovgalyuk         replay_put_dword(*recorded);
51*3d4d16f4SPavel Dovgalyuk         replay_put_dword(*wpos);
52*3d4d16f4SPavel Dovgalyuk         for (pos = (*wpos - *recorded + size) % size ; pos != *wpos
53*3d4d16f4SPavel Dovgalyuk              ; pos = (pos + 1) % size) {
54*3d4d16f4SPavel Dovgalyuk             audio_sample_to_uint64(samples, pos, &left, &right);
55*3d4d16f4SPavel Dovgalyuk             replay_put_qword(left);
56*3d4d16f4SPavel Dovgalyuk             replay_put_qword(right);
57*3d4d16f4SPavel Dovgalyuk         }
58*3d4d16f4SPavel Dovgalyuk         replay_mutex_unlock();
59*3d4d16f4SPavel Dovgalyuk     } else if (replay_mode == REPLAY_MODE_PLAY) {
60*3d4d16f4SPavel Dovgalyuk         replay_account_executed_instructions();
61*3d4d16f4SPavel Dovgalyuk         replay_mutex_lock();
62*3d4d16f4SPavel Dovgalyuk         if (replay_next_event_is(EVENT_AUDIO_IN)) {
63*3d4d16f4SPavel Dovgalyuk             *recorded = replay_get_dword();
64*3d4d16f4SPavel Dovgalyuk             *wpos = replay_get_dword();
65*3d4d16f4SPavel Dovgalyuk             for (pos = (*wpos - *recorded + size) % size ; pos != *wpos
66*3d4d16f4SPavel Dovgalyuk                  ; pos = (pos + 1) % size) {
67*3d4d16f4SPavel Dovgalyuk                 left = replay_get_qword();
68*3d4d16f4SPavel Dovgalyuk                 right = replay_get_qword();
69*3d4d16f4SPavel Dovgalyuk                 audio_sample_from_uint64(samples, pos, left, right);
70*3d4d16f4SPavel Dovgalyuk             }
71*3d4d16f4SPavel Dovgalyuk             replay_finish_event();
72*3d4d16f4SPavel Dovgalyuk             replay_mutex_unlock();
73*3d4d16f4SPavel Dovgalyuk         } else {
74*3d4d16f4SPavel Dovgalyuk             replay_mutex_unlock();
75*3d4d16f4SPavel Dovgalyuk             error_report("Missing audio in event in the replay log");
76*3d4d16f4SPavel Dovgalyuk             abort();
77*3d4d16f4SPavel Dovgalyuk         }
78*3d4d16f4SPavel Dovgalyuk     }
79*3d4d16f4SPavel Dovgalyuk }
80