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