Запись в именованный канал как эхо

Я пытаюсь запустить mplayer в ведомом режиме и управлять им в GO. Именованный канал используется для получения позиции, поиска и т. д. Почему-то с командой echo работает, запись в go не работает.

package main

import (
    "os"
    "fmt"
    "time"
    "syscall"
    "bufio"
    "os/exec"
    . "csystem"
)

func main() {
    namedpipe := "pipe"
    syscall.Mkfifo(namedpipe, 0666)
    player := "/usr/bin/mplayer";
    playfile := os.Args[1]
    cmd := exec.Command(player,"-vo","null","-slave","-quiet",
            "-input","file="+namedpipe,playfile)
    stdout,_ := cmd.StdoutPipe()
    cmd.Start()
    go func () {
        // file, err := os.OpenFile(namedpipe, os.O_RDWR, os.ModeNamedPipe)
        file, err := os.OpenFile(namedpipe, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0777)
        if err != nil {
            fmt.Println(err)
            return
        }
        fmt.Println("pipe is open")
        defer file.Close()
        w := bufio.NewWriter(file)
        optionA := false
        optionB := true
        for ;; {
            time.Sleep(time.Second)
            if optionA {
                System("echo \"get_time_pos\" > "+namedpipe)
            }
            if optionB {
                n,err := w.Write([]byte("get_time_pos\n"))
                if err != nil {
                    fmt.Println(err)
                    return
                } else {
                    fmt.Println("write pipe ",n)
                }
            }
        }
    } ()
    defer cmd.Wait()
    scanner := bufio.NewScanner(stdout)
    for scanner.Scan() {
        text := scanner.Text()
        fmt.Println(text)
    }
}

optionA: я получаю вывод stdout, и команда echo дает мне ответ ANS_TIME_POSITION=0.9

./mplayergo file.flac
pipe is open
MPlayer 1.3.0 (Debian), built with gcc-9 (C) 2000-2016 MPlayer Team

Playing file.flac.
libavformat version 58.29.100 (external)
Audio only file format detected.
==========================================================================
Opening audio decoder: [ffmpeg] FFmpeg/libavcodec audio decoders
libavcodec version 58.54.100 (external)
AUDIO: 192000 Hz, 2 ch, s32le, 5497.4 kbit/44.74% (ratio: 687172->1536000)
Selected audio codec: [ffflac] afm: ffmpeg (FFmpeg FLAC audio)
==========================================================================
AO: [pulse] 192000Hz 2ch s32le (4 bytes per sample)
Video: no video
Starting playback...
ANS_TIME_POSITION=0.9
ANS_TIME_POSITION=1.8

вариант B: ошибок не возникает, канал открыт и пишет успешно обработано, но ответа нет.

./mplayergo file.flac
pipe is open
MPlayer 1.3.0 (Debian), built with gcc-9 (C) 2000-2016 MPlayer Team

Playing file.flac.
libavformat version 58.29.100 (external)
Audio only file format detected.
==========================================================================
Opening audio decoder: [ffmpeg] FFmpeg/libavcodec audio decoders
libavcodec version 58.54.100 (external)
AUDIO: 192000 Hz, 2 ch, s32le, 5497.4 kbit/44.74% (ratio: 687172->1536000)
Selected audio codec: [ffflac] afm: ffmpeg (FFmpeg FLAC audio)
==========================================================================
AO: [pulse] 192000Hz 2ch s32le (4 bytes per sample)
Video: no video
Starting playback...
write pipe  13
write pipe  13

Почему вариант Б не работает? Что мне не хватает?


person Rolas    schedule 01.12.2020    source источник
comment
w := bufio.NewWriter(file) создает буферизованный модуль записи, а w.Write([]byte("get_time_pos\n")) может не сбрасываться в file. Если вам действительно нужен bufio.Writer (для чего? зачем буфер?), вам придется сбросить его после записи.   -  person Volker    schedule 01.12.2020
comment
w.Flush() отсутствует после записи! @Волкер Спасибо!   -  person Rolas    schedule 01.12.2020
comment
На заметку: вам не нужно ;; в for { ... } ;-)   -  person kostix    schedule 01.12.2020


Ответы (1)


Комментарий @Volker решает проблему. w.Flush() отсутствует после записи.

Мне не нужен буфер, поэтому

io.WriteString(file,"get_time_pos\n") 

является лучшим решением.

person Rolas    schedule 01.12.2020